|
|
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.