Annotation of GNUtools/emacs/etc/emacsclient.c, revision 1.1.1.1

1.1       root        1: /* Client process that communicates with GNU Emacs acting as server.
                      2:    Copyright (C) 1986, 1987 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU Emacs.
                      5: 
                      6: GNU Emacs is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 1, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU Emacs is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU Emacs; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     19: 
                     20: 
                     21: #define NO_SHORTNAMES
                     22: #include "../src/config.h"
                     23: #undef read
                     24: #undef write
                     25: #undef open
                     26: #ifdef close
                     27: #undef close
                     28: #endif
                     29: 
                     30: 
                     31: #if !defined(BSD) && !defined(HAVE_SYSVIPC)
                     32: #include <stdio.h>
                     33: 
                     34: main (argc, argv)
                     35:      int argc;
                     36:      char **argv;
                     37: {
                     38:   fprintf (stderr, "%s: Sorry, the Emacs server is supported only\n",
                     39:           argv[0]);
                     40:   fprintf (stderr, "on systems with Berkeley sockets or System V IPC.\n");
                     41:   exit (1);
                     42: }
                     43: 
                     44: #else /* BSD or HAVE_SYSVIPC */
                     45: 
                     46: #if defined(BSD) && ! defined (HAVE_SYSVIPC)
                     47: /* BSD code is very different from SYSV IPC code */
                     48: 
                     49: #include <sys/types.h>
                     50: #include <sys/socket.h>
                     51: #include <sys/un.h>
                     52: #include <stdio.h>
                     53: #include <errno.h>
                     54: #include <sys/stat.h>
                     55: 
                     56: extern int sys_nerr;
                     57: extern char *sys_errlist[];
                     58: extern int errno;
                     59: 
                     60: main (argc, argv)
                     61:      int argc;
                     62:      char **argv;
                     63: {
                     64:   char system_name[32];
                     65:   int s, i;
                     66:   FILE *out;
                     67:   struct sockaddr_un server;
                     68:   char *homedir, *cwd, *str;
                     69:   char string[BUFSIZ];
                     70:   struct stat statbfr;
                     71: 
                     72:   char *getenv (), *getwd ();
                     73: 
                     74:   if (argc < 2)
                     75:     {
                     76:       fprintf (stderr, "Usage: %s filename\n", argv[0]);
                     77:       exit (1);
                     78:     }
                     79: 
                     80:   /* 
                     81:    * Open up an AF_UNIX socket in this person's home directory
                     82:    */
                     83: 
                     84:   if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
                     85:     {
                     86:       fprintf (stderr, "%s: ", argv[0]);
                     87:       perror ("socket");
                     88:       exit (1);
                     89:     }
                     90:   server.sun_family = AF_UNIX;
                     91: #ifndef SERVER_HOME_DIR
                     92:   gethostname (system_name, sizeof (system_name));
                     93:   sprintf (server.sun_path, "/tmp/esrv%d-%s", geteuid (), system_name);
                     94: 
                     95:   if (stat (server.sun_path, &statbfr) == -1)
                     96:     {
                     97:       perror ("stat");
                     98:       exit (1);
                     99:     }
                    100:   if (statbfr.st_uid != geteuid())
                    101:     {
                    102:       fprintf (stderr, "Illegal socket owner\n");
                    103:       exit (1);
                    104:     }
                    105: #else
                    106:   if ((homedir = getenv ("HOME")) == NULL)
                    107:     {
                    108:       fprintf (stderr, "%s: No home directory\n", argv[0]);
                    109:       exit (1);
                    110:     }
                    111:   strcpy (server.sun_path, homedir);
                    112:   strcat (server.sun_path, "/.emacs_server");
                    113: #endif
                    114: 
                    115:   if (connect (s, &server, strlen (server.sun_path) + 2) < 0)
                    116:     {
                    117:       fprintf (stderr, "%s: ", argv[0]);
                    118:       perror ("connect");
                    119:       exit (1);
                    120:     }
                    121:   if ((out = fdopen (s, "r+")) == NULL)
                    122:     {
                    123:       fprintf (stderr, "%s: ", argv[0]);
                    124:       perror ("fdopen");
                    125:       exit (1);
                    126:     }
                    127: 
                    128:   cwd = getwd (string);
                    129:   if (cwd == 0)
                    130:     {
                    131:       /* getwd puts message in STRING if it fails.  */
                    132:       fprintf (stderr, "%s: %s (%s)\n", argv[0], string,
                    133:               (errno < sys_nerr) ? sys_errlist[errno] : "unknown error");
                    134:       exit (1);
                    135:     }
                    136: 
                    137:   for (i = 1; i < argc; i++)
                    138:     {
                    139:       if (*argv[i] == '+')
                    140:        {
                    141:          char *p = argv[i] + 1;
                    142:          while (*p >= '0' && *p <= '9') p++;
                    143:          if (*p != 0)
                    144:            fprintf (out, "%s/", cwd);
                    145:        }
                    146:       else if (*argv[i] != '/')
                    147:        fprintf (out, "%s/", cwd);
                    148:       fprintf (out, "%s ", argv[i]);
                    149:     }
                    150:   fprintf (out, "\n");
                    151:   fflush (out);
                    152: 
                    153:   printf ("Waiting for Emacs...");
                    154:   fflush (stdout);
                    155: 
                    156:   rewind (out); /* re-read the output */
                    157:   str = fgets (string, BUFSIZ, out); 
                    158: 
                    159:   /* Now, wait for an answer and print any messages.  */
                    160:   
                    161:   while (str = fgets (string, BUFSIZ, out))
                    162:     printf ("%s", str);
                    163:   
                    164:   exit (0);
                    165: }
                    166: 
                    167: #else /* This is the SYSV IPC section */
                    168: 
                    169: #include <sys/types.h>
                    170: #include <sys/ipc.h>
                    171: #include <sys/msg.h>
                    172: #include <stdio.h>
                    173: 
                    174: main (argc, argv)
                    175:      int argc;
                    176:      char **argv;
                    177: {
                    178:   int s;
                    179:   key_t key;
                    180:   struct msgbuf * msgp =
                    181:       (struct msgbuf *) malloc (sizeof *msgp + BUFSIZ);
                    182:   struct msqid_ds * msg_st;
                    183:   char *homedir, buf[BUFSIZ];
                    184:   char gwdirb[BUFSIZ];
                    185:   char *cwd;
                    186:   char *temp;
                    187:   char *getwd (), *getcwd (), *getenv ();
                    188: 
                    189:   if (argc < 2)
                    190:     {
                    191:       fprintf (stderr, "Usage: %s filename\n", argv[0]);
                    192:       exit (1);
                    193:     }
                    194: 
                    195:   /*
                    196:    * Create a message queue using ~/.emacs_server as the path for ftok
                    197:    */
                    198:   if ((homedir = getenv ("HOME")) == NULL)
                    199:     {
                    200:       fprintf (stderr, "%s: No home directory\n", argv[0]);
                    201:       exit (1);
                    202:     }
                    203:   strcpy (buf, homedir);
                    204:   strcat (buf, "/.emacs_server");
                    205:   creat (buf, 0600);
                    206:   key = ftok (buf, 1); /* unlikely to be anyone else using it */
                    207:   s = msgget (key, 0600 | IPC_CREAT);
                    208:   if (s == -1)
                    209:     {
                    210:       fprintf (stderr, "%s: ", argv[0]);
                    211:       perror ("msgget");
                    212:       exit (1);
                    213:     }
                    214: 
                    215:   /* Determine working dir, so we can prefix it to all the arguments.  */
                    216: #ifdef BSD
                    217:   temp = getwd (gwdirb);
                    218: #else
                    219:   temp = getcwd (gwdirb, sizeof gwdirb);
                    220: #endif
                    221: 
                    222:   cwd = gwdirb;
                    223:   if (temp != 0)
                    224:     {
                    225:       /* On some systems, cwd can look like `@machine/...';
                    226:         ignore everything before the first slash in such a case.  */
                    227:       while (*cwd && *cwd != '/')
                    228:        cwd++;
                    229:       strcat (cwd, "/");
                    230:     }
                    231:   else
                    232:     {
                    233:       fprintf (stderr, cwd);
                    234:       exit (1);
                    235:     }
                    236: 
                    237:   msgp->mtext[0] = 0;
                    238:   argc--; argv++;
                    239:   while (argc)
                    240:     {
                    241:       if (*argv[0] == '+')
                    242:        {
                    243:          char *p = argv[0] + 1;
                    244:          while (*p >= '0' && *p <= '9') p++;
                    245:          if (*p != 0)
                    246:            strcat (msgp->mtext, cwd);
                    247:        }
                    248:       else if (*argv[0] != '/')
                    249:        strcat (msgp->mtext, cwd);
                    250: 
                    251:       strcat (msgp->mtext, argv[0]);
                    252:       strcat (msgp->mtext, " ");
                    253:       argv++; argc--;
                    254:     }
                    255:   strcat (msgp->mtext, "\n");
                    256:   msgp->mtype = 1;
                    257:   if (msgsnd (s, msgp, strlen (msgp->mtext)+1, 0) < 0)
                    258:     {
                    259:       fprintf (stderr, "%s: ", argv[0]);
                    260:       perror ("msgsnd");
                    261:       exit (1);
                    262:     }
                    263:   /*
                    264:    * Now, wait for an answer
                    265:    */
                    266:   printf ("Waiting for Emacs...");
                    267:   fflush (stdout);
                    268: 
                    269:   msgrcv (s, msgp, BUFSIZ, getpid (), 0);      /* wait for anything back */
                    270:   strcpy (buf, msgp->mtext);
                    271: 
                    272:   printf ("\n%s\n", buf);
                    273:   exit (0);
                    274: }
                    275: 
                    276: #endif /* HAVE_SYSVIPC */
                    277: 
                    278: #endif /* BSD or HAVE_SYSVIPC */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.