Annotation of GNUtools/emacs/etc/emacsclient.c, revision 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.