(decode_options): -t implies -c.
[bpt/emacs.git] / lib-src / emacsclient.c
index 0356735..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':
@@ -495,7 +493,7 @@ 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;\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\
@@ -516,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)
@@ -539,7 +538,6 @@ 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"
@@ -556,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
@@ -895,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));
 }
 
 
@@ -1040,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, '\\'))
@@ -1270,7 +1255,6 @@ main (argc, argv)
   char *cwd, *str;
   char string[BUFSIZ+1];
 
-  main_argc = argc;
   main_argv = argv;
   progname = argv[0];
 
@@ -1302,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)
     {
@@ -1347,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)
         {
@@ -1466,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);
@@ -1502,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. */