unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Messages in non-console mode in emacsclient.c
@ 2006-11-21 16:38 Juanma Barranquero
  2006-11-21 17:20 ` Lennart Borgman
  2006-11-22 13:16 ` Richard Stallman
  0 siblings, 2 replies; 4+ messages in thread
From: Juanma Barranquero @ 2006-11-21 16:38 UTC (permalink / raw)


Leaving aside the issue of extending emacsclient.c, there's still an
uninstalled patch by Lennart that I'd like to propose for inclusion.

Its purpose is allowing emacsclient to output messages when run in
Windows mode (i.e., as emacsclientw.exe).

To that end, it changes all printf/fprintf/perror calls to use a new
variadic function message(), which outputs to stdin/stderr in console
mode, or uses MessageBox if (WINDOWSNT && window mode).

It shouldn't mean any trouble, unless compiling on very old C
compilers without stdarg.h support (and in that case we could use
varargs.h under suitable #ifdef protection).

                    /L/e/k/t/u


Index: lib-src/ChangeLog
===================================================================
RCS file: /cvsroot/emacs/emacs/lib-src/ChangeLog,v
retrieving revision 2.352
diff -c -r2.352 ChangeLog
*** lib-src/ChangeLog	19 Nov 2006 23:40:07 -0000	2.352
--- lib-src/ChangeLog	21 Nov 2006 10:22:37 -0000
***************
*** 1,3 ****
--- 1,13 ----
+ 2006-11-21  Lennart Borgman  <lennart.borgman.073@student.lu.se>
+
+ 	* emacsclient.c: Include <stdarg.h>.
+ 	[WINDOWSNT]: Include <windows.h>.
+ 	(w32_check_console_app): New function.
+ 	(message): New function.
+ 	(decode_options, print_help_and_exit, fail, main)
+ 	(initialize_sockets, get_server_config, set_tcp_socket)
+ 	(set_local_socket, set_socket): Use message().
+
  2006-11-13  Jason Rumney  <jasonr@gnu.org>

  	* emacsclient.c [WINDOWSNT]: Let config.h define HAVE_SOCKETS and
Index: lib-src/emacsclient.c
===================================================================
RCS file: /cvsroot/emacs/emacs/lib-src/emacsclient.c,v
retrieving revision 1.91
diff -c -r1.91 emacsclient.c
*** lib-src/emacsclient.c	13 Nov 2006 11:30:08 -0000	1.91
--- lib-src/emacsclient.c	21 Nov 2006 10:09:22 -0000
***************
*** 34,39 ****
--- 34,40 ----

  # include <malloc.h>
  # include <stdlib.h>
+ # include <windows.h>

  # define NO_SOCKETS_IN_FILE_SYSTEM

***************
*** 58,63 ****
--- 59,65 ----

  #undef signal

+ #include <stdarg.h>
  #include <ctype.h>
  #include <stdio.h>
  #include "getopt.h"
***************
*** 144,149 ****
--- 146,201 ----
    { 0, 0, 0, 0 }
  };

+ /* Message functions. */
+
+ #ifdef WINDOWSNT
+ /* I first tried to check for STDOUT.  The check did not work,
+    I get a valid handle also in nonconsole apps.
+    Instead I test for console title, which seems to work.  */
+ int
+ w32_window_app()
+ {
+   static int window_app = -1;
+   char szTitle[MAX_PATH];
+
+   if (window_app < 0)
+     window_app = (GetConsoleTitleA (szTitle, MAX_PATH) == 0);
+
+   return window_app;
+ }
+ #endif
+
+ void
+ message (int is_error, char *message, ...)
+ {
+   char buf [2048];
+   char *msg = buf;
+   va_list args;
+
+   va_start (args, message);
+
+   if (is_error)
+     {
+       sprintf (buf, "%s: ", progname);
+       msg = strchr (buf, '\0');
+     }
+
+   vsprintf (msg, message, args);
+   va_end (args);
+
+ #ifdef WINDOWSNT
+   if (w32_window_app ())
+     {
+       if (is_error)
+ 	MessageBox (NULL, msg, "Emacsclient ERROR", MB_ICONERROR);
+       else
+ 	MessageBox (NULL, msg, "Emacsclient", MB_ICONINFORMATION);
+     }
+   else
+ #endif
+     fprintf (is_error ? stderr : stdout, msg);
+ }
+
  /* Decode the options from argv and argc.
     The global variable `optind' will say how many arguments we used up.  */

***************
*** 201,207 ****
  	  break;

  	case 'V':
! 	  printf ("emacsclient %s\n", VERSION);
  	  exit (EXIT_SUCCESS);
  	  break;

--- 253,259 ----
  	  break;

  	case 'V':
! 	  message (FALSE, "emacsclient %s\n", VERSION);
  	  exit (EXIT_SUCCESS);
  	  break;

***************
*** 210,216 ****
  	  break;

  	default:
! 	  fprintf (stderr, "Try `%s --help' for more information\n", progname);
  	  exit (EXIT_FAILURE);
  	  break;
  	}
--- 262,268 ----
  	  break;

  	default:
! 	  message (TRUE, "Try `%s --help' for more information\n", progname);
  	  exit (EXIT_FAILURE);
  	  break;
  	}
***************
*** 220,226 ****
  void
  print_help_and_exit ()
  {
!   printf (
  	  "Usage: %s [OPTIONS] FILE...\n\
  Tell the Emacs server to visit the specified files.\n\
  Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
--- 272,278 ----
  void
  print_help_and_exit ()
  {
!   message (FALSE,
  	  "Usage: %s [OPTIONS] FILE...\n\
  Tell the Emacs server to visit the specified files.\n\
  Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
***************
*** 261,267 ****
        argv[i] = (char *)alternate_editor;
  #endif
        execvp (alternate_editor, argv + i);
!       fprintf (stderr, "%s: error executing alternate editor \"%s\"\n",
                 progname, alternate_editor);
      }
    exit (EXIT_FAILURE);
--- 313,319 ----
        argv[i] = (char *)alternate_editor;
  #endif
        execvp (alternate_editor, argv + i);
!       message (TRUE, "%s: error executing alternate editor \"%s\"\n",
                 progname, alternate_editor);
      }
    exit (EXIT_FAILURE);
***************
*** 275,283 ****
       int argc;
       char **argv;
  {
!   fprintf (stderr, "%s: Sorry, the Emacs server is supported only\n",
  	   argv[0]);
-   fprintf (stderr, "on systems with Berkeley sockets.\n");

    fail (argc, argv);
  }
--- 327,334 ----
       int argc;
       char **argv;
  {
!   message (TRUE, "%s: Sorry, the Emacs server is supported only\non
systems with Berkely sockets.\n",
  	   argv[0]);

    fail (argc, argv);
  }
***************
*** 426,432 ****

    if (WSAStartup (MAKEWORD (2, 0), &wsaData))
      {
!       fprintf (stderr, "%s: error initializing WinSock2", progname);
        exit (EXIT_FAILURE);
      }

--- 477,483 ----

    if (WSAStartup (MAKEWORD (2, 0), &wsaData))
      {
!       message (TRUE, "%s: error initializing WinSock2", progname);
        exit (EXIT_FAILURE);
      }

***************
*** 482,488 ****
      }
    else
      {
!       fprintf (stderr, "%s: invalid configuration info", progname);
        exit (EXIT_FAILURE);
      }

--- 533,539 ----
      }
    else
      {
!       message (TRUE, "%s: invalid configuration info", progname);
        exit (EXIT_FAILURE);
      }

***************
*** 492,498 ****

    if (! fread (authentication, AUTH_KEY_LENGTH, 1, config))
      {
!       fprintf (stderr, "%s: cannot read authentication info", progname);
        exit (EXIT_FAILURE);
      }

--- 543,549 ----

    if (! fread (authentication, AUTH_KEY_LENGTH, 1, config))
      {
!       message (TRUE, "%s: cannot read authentication info", progname);
        exit (EXIT_FAILURE);
      }

***************
*** 537,543 ****
      return INVALID_SOCKET;

    if (server.sin_addr.s_addr != inet_addr ("127.0.0.1"))
!     fprintf (stderr, "%s: connected to remote socket at %s\n",
               progname, inet_ntoa (server.sin_addr));

    /*
--- 588,594 ----
      return INVALID_SOCKET;

    if (server.sin_addr.s_addr != inet_addr ("127.0.0.1"))
!     message (TRUE, "%s: connected to remote socket at %s\n",
               progname, inet_ntoa (server.sin_addr));

    /*
***************
*** 545,552 ****
     */
    if ((s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
      {
!       fprintf (stderr, "%s: ", progname);
!       perror ("socket");
        return INVALID_SOCKET;
      }

--- 596,602 ----
     */
    if ((s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
      {
!       message (TRUE, "%s: socket: %s\n", progname, strerror (errno));
        return INVALID_SOCKET;
      }

***************
*** 555,562 ****
     */
    if (connect (s, (struct sockaddr *) &server, sizeof server) < 0)
      {
!       fprintf (stderr, "%s: ", progname);
!       perror ("connect");
        return INVALID_SOCKET;
      }

--- 605,611 ----
     */
    if (connect (s, (struct sockaddr *) &server, sizeof server) < 0)
      {
!       message (TRUE, "%s: connect: %s\n", progname, strerror (errno));
        return INVALID_SOCKET;
      }

***************
*** 608,615 ****

    if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
      {
!       fprintf (stderr, "%s: ", progname);
!       perror ("socket");
        return INVALID_SOCKET;
      }

--- 657,663 ----

    if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
      {
!       message (TRUE, "%s: socket: %s\n", progname, strerror (errno));
        return INVALID_SOCKET;
      }

***************
*** 639,645 ****
        strcpy (server.sun_path, socket_name);
      else
        {
! 	fprintf (stderr, "%s: socket-name %s too long",
  		 progname, socket_name);
  	exit (EXIT_FAILURE);
        }
--- 687,693 ----
        strcpy (server.sun_path, socket_name);
      else
        {
! 	message (TRUE, "%s: socket-name %s too long",
  		 progname, socket_name);
  	exit (EXIT_FAILURE);
        }
***************
*** 674,680 ****
  		  strcpy (server.sun_path, socket_name);
  		else
  		  {
! 		    fprintf (stderr, "%s: socket-name %s too long",
  			     progname, socket_name);
  		    exit (EXIT_FAILURE);
  		  }
--- 722,728 ----
  		  strcpy (server.sun_path, socket_name);
  		else
  		  {
! 		    message (TRUE, "%s: socket-name %s too long",
  			     progname, socket_name);
  		    exit (EXIT_FAILURE);
  		  }
***************
*** 694,700 ****
             we are root. */
          if (0 != geteuid ())
            {
!             fprintf (stderr, "%s: Invalid socket owner\n", progname);
  	    return INVALID_SOCKET;
            }
          break;
--- 742,748 ----
             we are root. */
          if (0 != geteuid ())
            {
!             message (TRUE, "%s: Invalid socket owner\n", progname);
  	    return INVALID_SOCKET;
            }
          break;
***************
*** 702,713 ****
        case 2:
          /* `stat' failed */
          if (saved_errno == ENOENT)
!           fprintf (stderr,
                     "%s: can't find socket; have you started the server?\n\
  To start the server in Emacs, type \"M-x server-start\".\n",
  		   progname);
          else
!           fprintf (stderr, "%s: can't stat %s: %s\n",
  		   progname, server.sun_path, strerror (saved_errno));
          return INVALID_SOCKET;
        }
--- 750,761 ----
        case 2:
          /* `stat' failed */
          if (saved_errno == ENOENT)
!           message (TRUE,
                     "%s: can't find socket; have you started the server?\n\
  To start the server in Emacs, type \"M-x server-start\".\n",
  		   progname);
          else
!           message (TRUE, "%s: can't stat %s: %s\n",
  		   progname, server.sun_path, strerror (saved_errno));
          return INVALID_SOCKET;
        }
***************
*** 716,723 ****
    if (connect (s, (struct sockaddr *) &server, strlen (server.sun_path) + 2)
        < 0)
      {
!       fprintf (stderr, "%s: ", progname);
!       perror ("connect");
        return INVALID_SOCKET;
      }

--- 764,770 ----
    if (connect (s, (struct sockaddr *) &server, strlen (server.sun_path) + 2)
        < 0)
      {
!       message (TRUE, "%s: connect: %s\n", progname, strerror (errno));
        return INVALID_SOCKET;
      }

***************
*** 740,746 ****
        if ((s != INVALID_SOCKET) || alternate_editor)
          return s;

!       fprintf (stderr, "%s: error accessing socket \"%s\"",
                 progname, socket_name);
        exit (EXIT_FAILURE);
      }
--- 787,793 ----
        if ((s != INVALID_SOCKET) || alternate_editor)
          return s;

!       message (TRUE, "%s: error accessing socket \"%s\"",
                 progname, socket_name);
        exit (EXIT_FAILURE);
      }
***************
*** 756,762 ****
        if ((s != INVALID_SOCKET) || alternate_editor)
          return s;

!       fprintf (stderr, "%s: error accessing server file \"%s\"",
                 progname, server_file);
        exit (EXIT_FAILURE);
      }
--- 803,809 ----
        if ((s != INVALID_SOCKET) || alternate_editor)
          return s;

!       message (TRUE, "%s: error accessing server file \"%s\"",
                 progname, server_file);
        exit (EXIT_FAILURE);
      }
***************
*** 775,781 ****
      return s;

    /* No implicit or explicit socket, and no alternate editor.  */
!   fprintf (stderr, "%s: No socket or alternate editor.  Please use:\n\n"
  #ifndef NO_SOCKETS_IN_FILE_SYSTEM
  "\t--socket-name\n"
  #endif
--- 822,828 ----
      return s;

    /* No implicit or explicit socket, and no alternate editor.  */
!   message (TRUE, "%s: No socket or alternate editor.  Please use:\n\n"
  #ifndef NO_SOCKETS_IN_FILE_SYSTEM
  "\t--socket-name\n"
  #endif
***************
*** 802,809 ****

    if ((argc - optind < 1) && !eval)
      {
!       fprintf (stderr, "%s: file name or argument required\n", progname);
!       fprintf (stderr, "Try `%s --help' for more information\n", progname);
        exit (EXIT_FAILURE);
      }

--- 849,856 ----

    if ((argc - optind < 1) && !eval)
      {
!       message (TRUE, "%s: file name or argument required\nTry `%s
--help' for more information\n",
!               progname, progname);
        exit (EXIT_FAILURE);
      }

***************
*** 819,828 ****
      {
        /* getwd puts message in STRING if it fails.  */
  #ifdef HAVE_GETCWD
!       fprintf (stderr, "%s: %s (%s)\n", progname,
  	       "Cannot get current working directory", strerror (errno));
  #else
!       fprintf (stderr, "%s: %s (%s)\n", progname, string, strerror (errno));
  #endif
        fail (argc, argv);
      }
--- 866,875 ----
      {
        /* getwd puts message in STRING if it fails.  */
  #ifdef HAVE_GETCWD
!       message (TRUE, "%s: %s (%s)\n", progname,
  	       "Cannot get current working directory", strerror (errno));
  #else
!       message (TRUE, "%s: %s (%s)\n", progname, string, strerror (errno));
  #endif
        fail (argc, argv);
      }

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2006-11-22 13:16 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-11-21 16:38 Messages in non-console mode in emacsclient.c Juanma Barranquero
2006-11-21 17:20 ` Lennart Borgman
2006-11-21 18:06   ` Juanma Barranquero
2006-11-22 13:16 ` Richard Stallman

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).