unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Juanma Barranquero" <lekktu@gmail.com>
Subject: Messages in non-console mode in emacsclient.c
Date: Tue, 21 Nov 2006 17:38:30 +0100	[thread overview]
Message-ID: <f7ccd24b0611210838y30456097v8b0c1774f49825a@mail.gmail.com> (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);
      }

             reply	other threads:[~2006-11-21 16:38 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-21 16:38 Juanma Barranquero [this message]
2006-11-21 17:20 ` Messages in non-console mode in emacsclient.c Lennart Borgman
2006-11-21 18:06   ` Juanma Barranquero
2006-11-22 13:16 ` Richard Stallman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f7ccd24b0611210838y30456097v8b0c1774f49825a@mail.gmail.com \
    --to=lekktu@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).