From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Juanma Barranquero" Newsgroups: gmane.emacs.devel Subject: Messages in non-console mode in emacsclient.c Date: Tue, 21 Nov 2006 17:38:30 +0100 Message-ID: NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Trace: sea.gmane.org 1164127149 21597 80.91.229.2 (21 Nov 2006 16:39:09 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Tue, 21 Nov 2006 16:39:09 +0000 (UTC) Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Nov 21 17:39:08 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1GmYe2-0000f1-6G for ged-emacs-devel@m.gmane.org; Tue, 21 Nov 2006 17:38:51 +0100 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GmYe1-00084B-H9 for ged-emacs-devel@m.gmane.org; Tue, 21 Nov 2006 11:38:49 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1GmYdo-00081Y-1m for emacs-devel@gnu.org; Tue, 21 Nov 2006 11:38:36 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1GmYdm-0007zi-TX for emacs-devel@gnu.org; Tue, 21 Nov 2006 11:38:35 -0500 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GmYdm-0007zZ-Pj for emacs-devel@gnu.org; Tue, 21 Nov 2006 11:38:34 -0500 Original-Received: from [66.249.82.238] (helo=wx-out-0506.google.com) by monty-python.gnu.org with esmtp (Exim 4.52) id 1GmYdm-0007Pu-0H for emacs-devel@gnu.org; Tue, 21 Nov 2006 11:38:34 -0500 Original-Received: by wx-out-0506.google.com with SMTP id t10so2340701wxc for ; Tue, 21 Nov 2006 08:38:31 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition; b=IZQKi9et0V06RgDkfZPWlyKePZSKmfuXDaG2qn7lPCgxTl9wFHN92G6yn1zQlL/4DKdKyjJurupjQcQmPLK9eJRnkm6lyDuXcluOo5ZtAkAok/BBAVAoRDP72ms9Pfgw9FTXorO2h+mZzSADlG0LZX2tQTkTOElDTgSXe1N+ap0= Original-Received: by 10.90.31.19 with SMTP id e19mr5548661age.1164127111374; Tue, 21 Nov 2006 08:38:31 -0800 (PST) Original-Received: by 10.35.95.18 with HTTP; Tue, 21 Nov 2006 08:38:30 -0800 (PST) Original-To: "Emacs Devel" Content-Disposition: inline X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:62596 Archived-At: 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 + + * emacsclient.c: Include . + [WINDOWSNT]: Include . + (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 * 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 # include + # include # define NO_SOCKETS_IN_FILE_SYSTEM *************** *** 58,63 **** --- 59,65 ---- #undef signal + #include #include #include #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); }