|
|
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 distributed in the hope that it will be useful, ! 7: but without any warranty. No author or distributor ! 8: accepts responsibility to anyone for the consequences of using it ! 9: or for whether it serves any particular purpose or works at all, ! 10: unless he says so in writing. ! 11: ! 12: Everyone is granted permission to copy, modify and redistribute ! 13: GNU Emacs, but only under the conditions described in the ! 14: document "GNU Emacs copying permission notice". An exact copy ! 15: of the document is supposed to have been given to you along with ! 16: GNU Emacs so that you can know how you may redistribute it all. ! 17: It should be in a file named COPYING. Among other things, the ! 18: copyright notice and this notice must be preserved on all copies. */ ! 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 () ! 35: { ! 36: fprintf (stderr, "Sorry, the Emacs server is supported only on Berkeley Unix\n"); ! 37: fprintf (stderr, "or System V systems with IPC\n"); ! 38: exit (1); ! 39: } ! 40: ! 41: #else /* BSD or HAVE_SYSVIPC */ ! 42: ! 43: #if defined(BSD) && ! defined (HAVE_SYSVIPC) ! 44: /* BSD code is very different from SYSV IPC code */ ! 45: ! 46: #include <sys/types.h> ! 47: #include <sys/socket.h> ! 48: #include <sys/un.h> ! 49: #include <stdio.h> ! 50: ! 51: main (argc, argv) ! 52: int argc; ! 53: char **argv; ! 54: { ! 55: int s, n, i; ! 56: FILE *out; ! 57: struct sockaddr_un server; ! 58: char *homedir, *cwd, *str; ! 59: char string[BUFSIZ]; ! 60: ! 61: char *getenv (), *getwd (); ! 62: ! 63: if (argc < 2) ! 64: { ! 65: printf ("Usage: %s [filename]\n", argv[0]); ! 66: exit (1); ! 67: } ! 68: ! 69: /* ! 70: * Open up an AF_UNIX socket in this person's home directory ! 71: */ ! 72: ! 73: if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) ! 74: { ! 75: perror ("socket"); ! 76: exit (1); ! 77: } ! 78: server.sun_family = AF_UNIX; ! 79: if ((homedir = getenv ("HOME")) == NULL) ! 80: { ! 81: fprintf (stderr, "No home directory\n"); ! 82: exit (1); ! 83: } ! 84: strcpy (server.sun_path, homedir); ! 85: strcat (server.sun_path, "/.emacs_server"); ! 86: if (connect (s, &server, strlen (server.sun_path) + 2) < 0) ! 87: { ! 88: perror ("connect"); ! 89: exit (1); ! 90: } ! 91: if ((out = fdopen (s, "r+")) == NULL) ! 92: { ! 93: perror ("fdopen"); ! 94: exit (1); ! 95: } ! 96: ! 97: cwd = getwd (string); ! 98: if (cwd == 0) ! 99: abort (); ! 100: ! 101: for (i = 1; i < argc; i++) ! 102: { ! 103: if (*argv[i] == '+') ! 104: { ! 105: char *p = argv[i] + 1; ! 106: while (*p >= '0' && *p <= '9') p++; ! 107: if (*p != 0) ! 108: fprintf (out, "%s/", cwd); ! 109: } ! 110: else if (*argv[i] != '/') ! 111: fprintf (out, "%s/", cwd); ! 112: fprintf (out, "%s ", argv[i]); ! 113: } ! 114: fprintf (out, "\n"); ! 115: fflush (out); ! 116: ! 117: printf ("Waiting for Emacs..."); ! 118: fflush (stdout); ! 119: ! 120: rewind (out); /* re-read the output */ ! 121: str = fgets (string, BUFSIZ, out); ! 122: ! 123: /* Now, wait for an answer and print any messages. */ ! 124: ! 125: while (str = fgets (string, BUFSIZ, out)) ! 126: printf ("%s", str); ! 127: ! 128: exit (0); ! 129: } ! 130: ! 131: #else /* This is the SYSV IPC section */ ! 132: ! 133: #include <sys/types.h> ! 134: #include <sys/ipc.h> ! 135: #include <sys/msg.h> ! 136: #include <stdio.h> ! 137: ! 138: main (argc, argv) ! 139: int argc; ! 140: char **argv; ! 141: { ! 142: int s; ! 143: key_t key; ! 144: struct msgbuf * msgp = ! 145: (struct msgbuf *) malloc (sizeof *msgp + BUFSIZ); ! 146: struct msqid_ds * msg_st; ! 147: char *homedir, *getenv (), buf[BUFSIZ]; ! 148: char *getwd (), *getcwd (), gwdirb[BUFSIZ], *cwd; ! 149: if (argc < 2) ! 150: { ! 151: printf ("Usage: %s [filename]\n", argv[0]); ! 152: exit (1); ! 153: } ! 154: ! 155: /* ! 156: * Create a message queue using ~/.emacs_server as the path for ftok ! 157: */ ! 158: if ((homedir = getenv ("HOME")) == NULL) ! 159: { ! 160: fprintf (stderr,"No home directory\n"); ! 161: exit (1); ! 162: } ! 163: strcpy (buf, homedir); ! 164: strcat (buf, "/.emacs_server"); ! 165: creat (buf, 0600); ! 166: key = ftok (buf, 1); /* unlikely to be anyone else using it */ ! 167: s = msgget (key, 0600); ! 168: if (s == -1) ! 169: { ! 170: perror ("msgget"); ! 171: exit (1); ! 172: } ! 173: ! 174: msgp->mtext[0] = 0; ! 175: argc--; argv++; ! 176: while (argc) ! 177: { ! 178: if (*argv[0] != '/') ! 179: { ! 180: char *val; ! 181: cwd = gwdirb; *cwd = '\0'; ! 182: #ifdef BSD ! 183: val = getwd (gwdirb); ! 184: #else ! 185: val = getcwd (gwdirb, sizeof gwdirb); ! 186: #endif ! 187: if (val != 0) ! 188: { ! 189: strcat (cwd, "/"); ! 190: } ! 191: else ! 192: { ! 193: fprintf (stderr, cwd); ! 194: *cwd = '\0'; ! 195: } ! 196: strcat (msgp->mtext, cwd); ! 197: } ! 198: ! 199: strcat (msgp->mtext, argv[0]); ! 200: strcat (msgp->mtext, " "); ! 201: argv++; argc--; ! 202: } ! 203: strcat (msgp->mtext, "\n"); ! 204: msgp->mtype = 1; ! 205: if (msgsnd (s, msgp, strlen (msgp->mtext)+1, 1, 0) < 0) ! 206: { ! 207: perror ("msgsnd"); ! 208: exit (1); ! 209: } ! 210: /* ! 211: * Now, wait for an answer ! 212: */ ! 213: printf ("Waiting\n"); ! 214: ! 215: msgrcv (s, msgp, BUFSIZ, getpid (), 0); /* wait for anything back */ ! 216: strcpy (buf, msgp->mtext); ! 217: ! 218: printf ("Got back: %s\n", buf); ! 219: exit (0); ! 220: } ! 221: ! 222: #endif /* IPC */ ! 223: ! 224: #endif /* BSD && IPC */ ! 225:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.