(decode_options): -t implies -c.
[bpt/emacs.git] / lib-src / emacsclient.c
index 8e8cb9b..0293594 100644 (file)
@@ -6,7 +6,7 @@ This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -81,25 +81,6 @@ Boston, MA 02110-1301, USA.  */
 #include <signal.h>
 #include <errno.h>
 
-/* From lisp.h */
-#ifndef DIRECTORY_SEP
-#define DIRECTORY_SEP '/'
-#endif
-#ifndef IS_DIRECTORY_SEP
-#define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
-#endif
-#ifndef IS_DEVICE_SEP
-#ifndef DEVICE_SEP
-#define IS_DEVICE_SEP(_c_) 0
-#else
-#define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
-#endif
-#endif
-#ifndef IS_ANY_SEP
-#define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
-#endif
-
-
 \f
 char *getenv (), *getwd ();
 char *(getcwd) ();
@@ -132,9 +113,6 @@ char *(getcwd) ();
 /* Name used to invoke this program.  */
 char *progname;
 
-/* The first argument to main. */
-int main_argc;
-
 /* The second argument to main. */
 char **main_argv;
 
@@ -144,8 +122,8 @@ int nowait = 0;
 /* Nonzero means args are expressions to be evaluated.  --eval.  */
 int eval = 0;
 
-/* Nonzero means don't open a new frame.  --current-frame.  */
-int current_frame = 0;
+/* Nonzero means don't open a new frame.  Inverse of --create-frame.  */
+int current_frame = 1;
 
 /* Nonzero means open a new graphical frame. */
 int window_system = 0;
@@ -178,7 +156,7 @@ struct option longopts[] =
   { "help",    no_argument,       NULL, 'H' },
   { "version", no_argument,       NULL, 'V' },
   { "tty",     no_argument,       NULL, 't' },
-  { "current-frame", no_argument,  NULL, 'c' },
+  { "create-frame", no_argument,   NULL, 'c' },
   { "alternate-editor", required_argument, NULL, 'a' },
 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
   { "socket-name",     required_argument, NULL, 's' },
@@ -221,6 +199,25 @@ xstrdup (const char *s)
 /* From sysdep.c */
 #if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
 
+/* From lisp.h */
+#ifndef DIRECTORY_SEP
+#define DIRECTORY_SEP '/'
+#endif
+#ifndef IS_DIRECTORY_SEP
+#define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
+#endif
+#ifndef IS_DEVICE_SEP
+#ifndef DEVICE_SEP
+#define IS_DEVICE_SEP(_c_) 0
+#else
+#define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
+#endif
+#endif
+#ifndef IS_ANY_SEP
+#define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
+#endif
+
+
 /* Return the current working directory.  Returns NULL on errors.
    Any other returned value must be freed with free. This is used
    only when get_current_dir_name is not defined on the system.  */
@@ -311,7 +308,7 @@ w32_window_app ()
 }
 
 /*
-  execvp wrapper for Windows. Quotes arguments with embedded spaces.
+  execvp wrapper for Windows.  Quotes arguments with embedded spaces.
 
   This is necessary due to the broken implementation of exec* routines in
   the Microsoft libraries: they concatenate the arguments together without
@@ -439,10 +436,11 @@ decode_options (argc, argv)
 
         case 't':
           tty = 1;
+         current_frame = 0;
           break;
 
         case 'c':
-          current_frame = 1;
+          current_frame = 0;
           break;
 
        case 'H':
@@ -462,7 +460,7 @@ decode_options (argc, argv)
   else
     tty = 1;
 #endif
-  
+
   /* --no-wait implies --current-frame on ttys when there are file
        arguments or expressions given.  */
   if (nowait && tty && argc - optind > 0)
@@ -482,27 +480,32 @@ decode_options (argc, argv)
 void
 print_help_and_exit ()
 {
+  /* Spaces and tabs are significant in this message; they're chosen so the
+     message aligns properly both in a tty and in a Windows message box.
+     Please try to preserve them; otherwise the output is very hard to read
+     when using emacsclientw.  */
   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\
 \n\
 The following OPTIONS are accepted:\n\
--V, --version           Just print version info and return\n\
--H, --help              Print this usage information message\n\
--t, --tty               Open a new Emacs frame on the current terminal\n\
--c, --current-frame    Do not create a new frame; use the current Emacs frame\n\
--e, --eval              Evaluate the FILE arguments as ELisp expressions\n\
--n, --no-wait           Don't wait for the server to return\n\
--d, --display=DISPLAY   Visit the file in the given display\n"
+-V, --version          Just print version info and return\n\
+-H, --help             Print this usage information message\n\
+-t, --tty              Open a new Emacs frame on the current terminal\n\
+-c, --create-frame     Create a new frame instead of trying to\n\
+                       use the current Emacs frame\n\
+-e, --eval             Evaluate the FILE arguments as ELisp expressions\n\
+-n, --no-wait          Don't wait for the server to return\n\
+-d, --display=DISPLAY  Visit the file in the given display\n"
 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
 "-s, --socket-name=FILENAME\n\
-                        Set filename of the UNIX socket for communication\n"
+                       Set filename of the UNIX socket for communication\n"
 #endif
 "-f, --server-file=FILENAME\n\
-                        Set filename of the TCP authentication file\n\
+                       Set filename of the TCP authentication file\n\
 -a, --alternate-editor=EDITOR\n\
-                        Editor to fallback to if the server is not running\n\
+                       Editor to fallback to if the server is not running\n\
 \n\
 Report bugs to bug-gnu-emacs@gnu.org.\n", progname);
   exit (EXIT_SUCCESS);
@@ -511,6 +514,7 @@ Report bugs to bug-gnu-emacs@gnu.org.\n", progname);
 /*
   Try to run a different command, or --if no alternate editor is
   defined-- exit with an errorcode.
+  Uses argv, but gets it from the global variable main_argv.
 */
 void
 fail (void)
@@ -534,11 +538,10 @@ main (argc, argv)
      int argc;
      char **argv;
 {
-  main_argc = argc;
   main_argv = argv;
   progname = argv[0];
   message (TRUE, "%s: Sorry, the Emacs server is supported only\n"
-          "on systems with Berkeley sockets.\n", 
+          "on systems with Berkeley sockets.\n",
           argv[0]);
   fail ();
 }
@@ -551,8 +554,6 @@ main (argc, argv)
 # include <sys/types.h>
 # include <sys/socket.h>
 # include <sys/un.h>
-# include <sys/stat.h>
-# include <errno.h>
 #endif
 
 #define AUTH_KEY_LENGTH      64
@@ -890,17 +891,7 @@ set_tcp_socket ()
 static int
 strprefix (char *prefix, char *string)
 {
-  int i;
-  if (! prefix)
-    return 1;
-
-  if (!string)
-    return 0;
-
-  for (i = 0; prefix[i]; i++)
-    if (!string[i] || string[i] != prefix[i])
-      return 0;
-  return 1;
+  return !strncmp (prefix, string, strlen (prefix));
 }
 
 
@@ -976,7 +967,7 @@ handle_sigtstp (int signalnum)
 {
   int old_errno = errno;
   sigset_t set;
-  
+
   if (emacs_socket)
     send_to_emacs (emacs_socket, "-suspend \n");
 
@@ -1035,7 +1026,6 @@ set_local_socket ()
     int sock_status = 0;
     int default_sock = !socket_name;
     int saved_errno = 0;
-
     char *server_name = "server";
 
     if (socket_name && !index (socket_name, '/') && !index (socket_name, '\\'))
@@ -1145,9 +1135,9 @@ HSOCKET
 set_socket ()
 {
   HSOCKET s;
-  
+
   INITIALIZE ();
-  
+
 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
   /* Explicit --socket-name argument.  */
   if (socket_name)
@@ -1170,12 +1160,12 @@ set_socket ()
       s = set_tcp_socket ();
       if ((s != INVALID_SOCKET) || alternate_editor)
        return s;
+
       message (TRUE, "%s: error accessing server file \"%s\"",
               progname, server_file);
       exit (EXIT_FAILURE);
     }
-  
+
 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
   /* Implicit local socket.  */
   s = set_local_socket ();
@@ -1265,7 +1255,6 @@ main (argc, argv)
   char *cwd, *str;
   char string[BUFSIZ+1];
 
-  main_argc = argc;
   main_argv = argv;
   progname = argv[0];
 
@@ -1297,11 +1286,6 @@ main (argc, argv)
   w32_give_focus ();
 #endif
 
-  /* First of all, send our version number for verification. */
-  send_to_emacs (emacs_socket, "-version ");
-  send_to_emacs (emacs_socket, VERSION);
-  send_to_emacs (emacs_socket, " ");
-
   /* Send over our environment. */
   if (!current_frame)
     {
@@ -1332,7 +1316,7 @@ main (argc, argv)
 
   if (current_frame)
     send_to_emacs (emacs_socket, "-current-frame ");
-  
+
   if (display)
     {
       send_to_emacs (emacs_socket, "-display ");
@@ -1342,11 +1326,11 @@ main (argc, argv)
 
   if (tty)
     {
+      char *type = getenv ("TERM");
       char *tty_name = NULL;
 #ifndef WINDOWSNT
       tty_name = ttyname (fileno (stdin));
 #endif
-      char *type = getenv ("TERM");
 
       if (! tty_name)
         {
@@ -1461,11 +1445,7 @@ main (argc, argv)
       while (p > string && *p == '\n')
         *p-- = 0;
 
-      if (strprefix ("-good-version ", string))
-        {
-          /* -good-version: The versions match. */
-        }
-      else if (strprefix ("-emacs-pid ", string))
+      if (strprefix ("-emacs-pid ", string))
         {
           /* -emacs-pid PID: The process id of the Emacs process. */
           emacs_pid = strtol (string + strlen ("-emacs-pid"), NULL, 10);
@@ -1497,7 +1477,7 @@ main (argc, argv)
           fprintf (stderr, "*ERROR*: %s", str);
           needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
         }
-#ifndef WINDOWSNT
+#ifdef SIGSTOP
       else if (strprefix ("-suspend ", string))
         {
           /* -suspend: Suspend this terminal, i.e., stop the process. */