emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Messages in non-console mode in emacsclient.c


From: Juanma Barranquero
Subject: Messages in non-console mode in emacsclient.c
Date: Tue, 21 Nov 2006 17:38:30 +0100

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  <address@hidden>
+
+       * 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  <address@hidden>

        * 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);
     }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]