Mercurial > emacs
annotate lib-src/emacsclient.c @ 14610:6c73b6046d21
(main, both definitions): Print a newline for normal termination.
| author | Karl Heuer <kwzh@gnu.org> |
|---|---|
| date | Wed, 21 Feb 1996 20:53:01 +0000 |
| parents | ee40177f6c68 |
| children | 7e712d42d371 |
| rev | line source |
|---|---|
| 493 | 1 /* Client process that communicates with GNU Emacs acting as server. |
|
5522
64a936b21f74
Don't declare sys_errlist; declare strerror instead.
Roland McGrath <roland@gnu.org>
parents:
4696
diff
changeset
|
2 Copyright (C) 1986, 1987, 1994 Free Software Foundation, Inc. |
| 412 | 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 | |
|
5522
64a936b21f74
Don't declare sys_errlist; declare strerror instead.
Roland McGrath <roland@gnu.org>
parents:
4696
diff
changeset
|
8 the Free Software Foundation; either version 2, or (at your option) |
| 412 | 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 | |
|
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
11486
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
|
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
11486
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
| 412 | 20 |
| 21 | |
| 22 #define NO_SHORTNAMES | |
|
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
3595
diff
changeset
|
23 #include <../src/config.h> |
| 412 | 24 #undef read |
| 25 #undef write | |
| 26 #undef open | |
| 27 #undef close | |
|
3595
e10f7473d2e3
* emacsserver.c (main): When we're passing a `struct sockaddr_un'
Jim Blandy <jimb@redhat.com>
parents:
1031
diff
changeset
|
28 #undef signal |
| 412 | 29 |
| 30 | |
|
10124
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
31 #if !defined (HAVE_SOCKETS) && !defined (HAVE_SYSVIPC) |
| 412 | 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 /* HAVE_SOCKETS or HAVE_SYSVIPC */ | |
| 45 | |
|
11368
91abe61bb495
Test NO_SOCKETS_IN_FILE_SYSTEM.
Richard M. Stallman <rms@gnu.org>
parents:
11232
diff
changeset
|
46 #if defined (HAVE_SOCKETS) && ! defined (NO_SOCKETS_IN_FILE_SYSTEM) |
| 412 | 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> | |
| 493 | 52 #include <sys/stat.h> |
| 412 | 53 #include <stdio.h> |
| 54 #include <errno.h> | |
| 55 | |
|
5522
64a936b21f74
Don't declare sys_errlist; declare strerror instead.
Roland McGrath <roland@gnu.org>
parents:
4696
diff
changeset
|
56 extern char *strerror (); |
| 412 | 57 extern int errno; |
| 58 | |
|
9491
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
8360
diff
changeset
|
59 int |
| 412 | 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 | |
| 71 char *getenv (), *getwd (); | |
|
11232
c203fc1363d4
[Berkeley sockets version] (main): Declare getcwd.
Richard M. Stallman <rms@gnu.org>
parents:
11030
diff
changeset
|
72 char *getcwd (); |
| 412 | 73 int geteuid (); |
| 74 | |
| 75 if (argc < 2) | |
| 76 { | |
| 77 fprintf (stderr, "Usage: %s [+linenumber] filename\n", argv[0]); | |
| 78 exit (1); | |
| 79 } | |
| 80 | |
| 81 /* | |
| 82 * Open up an AF_UNIX socket in this person's home directory | |
| 83 */ | |
| 84 | |
| 85 if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) | |
| 86 { | |
| 87 fprintf (stderr, "%s: ", argv[0]); | |
| 88 perror ("socket"); | |
| 89 exit (1); | |
| 90 } | |
| 91 server.sun_family = AF_UNIX; | |
| 92 #ifndef SERVER_HOME_DIR | |
| 493 | 93 { |
| 94 struct stat statbfr; | |
| 95 | |
| 96 gethostname (system_name, sizeof (system_name)); | |
| 97 sprintf (server.sun_path, "/tmp/esrv%d-%s", geteuid (), system_name); | |
| 412 | 98 |
| 493 | 99 if (stat (server.sun_path, &statbfr) == -1) |
| 100 { | |
| 816 | 101 if (errno == ENOENT) |
| 102 fprintf (stderr, | |
|
11434
5f5dda37c82c
(main): Improve error handling.
Karl Heuer <kwzh@gnu.org>
parents:
11368
diff
changeset
|
103 "%s: can't find socket; have you started the server?\n", |
|
5f5dda37c82c
(main): Improve error handling.
Karl Heuer <kwzh@gnu.org>
parents:
11368
diff
changeset
|
104 argv[0]); |
| 816 | 105 else |
|
11434
5f5dda37c82c
(main): Improve error handling.
Karl Heuer <kwzh@gnu.org>
parents:
11368
diff
changeset
|
106 fprintf (stderr, "%s: can't stat %s: %s\n", |
|
5f5dda37c82c
(main): Improve error handling.
Karl Heuer <kwzh@gnu.org>
parents:
11368
diff
changeset
|
107 argv[0], server.sun_path, strerror (errno)); |
| 493 | 108 exit (1); |
| 109 } | |
|
10124
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
110 if (statbfr.st_uid != geteuid ()) |
| 493 | 111 { |
|
11434
5f5dda37c82c
(main): Improve error handling.
Karl Heuer <kwzh@gnu.org>
parents:
11368
diff
changeset
|
112 fprintf (stderr, "%s: Invalid socket owner\n", argv[0]); |
| 493 | 113 exit (1); |
| 114 } | |
| 115 } | |
| 412 | 116 #else |
| 117 if ((homedir = getenv ("HOME")) == NULL) | |
| 118 { | |
| 119 fprintf (stderr, "%s: No home directory\n", argv[0]); | |
| 120 exit (1); | |
| 121 } | |
| 122 strcpy (server.sun_path, homedir); | |
|
10124
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
123 strcat (server.sun_path, "/.emacs-server-"); |
|
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
124 gethostname (system_name, sizeof (system_name)); |
|
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
125 strcat (server.sun_path, system_name); |
| 412 | 126 #endif |
| 127 | |
|
3595
e10f7473d2e3
* emacsserver.c (main): When we're passing a `struct sockaddr_un'
Jim Blandy <jimb@redhat.com>
parents:
1031
diff
changeset
|
128 if (connect (s, (struct sockaddr *) &server, strlen (server.sun_path) + 2) |
|
e10f7473d2e3
* emacsserver.c (main): When we're passing a `struct sockaddr_un'
Jim Blandy <jimb@redhat.com>
parents:
1031
diff
changeset
|
129 < 0) |
| 412 | 130 { |
| 131 fprintf (stderr, "%s: ", argv[0]); | |
| 132 perror ("connect"); | |
| 133 exit (1); | |
| 134 } | |
| 135 if ((out = fdopen (s, "r+")) == NULL) | |
| 136 { | |
| 137 fprintf (stderr, "%s: ", argv[0]); | |
| 138 perror ("fdopen"); | |
| 139 exit (1); | |
| 140 } | |
| 141 | |
|
11030
3345f6426f49
Use BSD sockets whenever available, even if HAVE_SYSVIPC.
Richard M. Stallman <rms@gnu.org>
parents:
10124
diff
changeset
|
142 #ifdef BSD |
| 412 | 143 cwd = getwd (string); |
|
11030
3345f6426f49
Use BSD sockets whenever available, even if HAVE_SYSVIPC.
Richard M. Stallman <rms@gnu.org>
parents:
10124
diff
changeset
|
144 #else |
|
3345f6426f49
Use BSD sockets whenever available, even if HAVE_SYSVIPC.
Richard M. Stallman <rms@gnu.org>
parents:
10124
diff
changeset
|
145 cwd = getcwd (string, sizeof string); |
|
3345f6426f49
Use BSD sockets whenever available, even if HAVE_SYSVIPC.
Richard M. Stallman <rms@gnu.org>
parents:
10124
diff
changeset
|
146 #endif |
| 412 | 147 if (cwd == 0) |
| 148 { | |
| 149 /* getwd puts message in STRING if it fails. */ | |
|
5522
64a936b21f74
Don't declare sys_errlist; declare strerror instead.
Roland McGrath <roland@gnu.org>
parents:
4696
diff
changeset
|
150 fprintf (stderr, "%s: %s (%s)\n", argv[0], string, strerror (errno)); |
| 412 | 151 exit (1); |
| 152 } | |
| 153 | |
| 154 for (i = 1; i < argc; i++) | |
| 155 { | |
| 156 if (*argv[i] == '+') | |
| 157 { | |
| 158 char *p = argv[i] + 1; | |
| 159 while (*p >= '0' && *p <= '9') p++; | |
| 160 if (*p != 0) | |
| 161 fprintf (out, "%s/", cwd); | |
| 162 } | |
| 163 else if (*argv[i] != '/') | |
| 164 fprintf (out, "%s/", cwd); | |
| 165 fprintf (out, "%s ", argv[i]); | |
| 166 } | |
| 167 fprintf (out, "\n"); | |
| 168 fflush (out); | |
| 169 | |
| 170 printf ("Waiting for Emacs..."); | |
| 171 fflush (stdout); | |
| 172 | |
| 173 rewind (out); /* re-read the output */ | |
| 174 str = fgets (string, BUFSIZ, out); | |
|
14610
6c73b6046d21
(main, both definitions): Print a newline for normal termination.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
175 printf ("\n"); |
| 412 | 176 |
| 177 /* Now, wait for an answer and print any messages. */ | |
| 178 | |
| 179 while (str = fgets (string, BUFSIZ, out)) | |
| 180 printf ("%s", str); | |
| 181 | |
|
9491
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
8360
diff
changeset
|
182 return 0; |
| 412 | 183 } |
| 184 | |
| 185 #else /* This is the SYSV IPC section */ | |
| 186 | |
| 187 #include <sys/types.h> | |
| 188 #include <sys/ipc.h> | |
| 189 #include <sys/msg.h> | |
|
10124
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
190 #include <sys/utsname.h> |
| 412 | 191 #include <stdio.h> |
| 192 | |
|
6213
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
193 char *getwd (), *getcwd (), *getenv (); |
|
10124
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
194 struct utsname system_name; |
|
6213
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
195 |
| 412 | 196 main (argc, argv) |
| 197 int argc; | |
| 198 char **argv; | |
| 199 { | |
| 200 int s; | |
| 201 key_t key; | |
|
6213
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
202 /* Size of text allocated in MSGP. */ |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
203 int size_allocated = BUFSIZ; |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
204 /* Amount of text used in MSGP. */ |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
205 int used; |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
206 struct msgbuf *msgp |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
207 = (struct msgbuf *) malloc (sizeof (struct msgbuf) + size_allocated); |
| 412 | 208 struct msqid_ds * msg_st; |
| 209 char *homedir, buf[BUFSIZ]; | |
| 210 char gwdirb[BUFSIZ]; | |
| 211 char *cwd; | |
| 212 char *temp; | |
|
8360
e1518247fd63
(main): New local var progname saves argv[0].
Richard M. Stallman <rms@gnu.org>
parents:
8346
diff
changeset
|
213 char *progname = argv[0]; |
| 412 | 214 |
| 215 if (argc < 2) | |
| 216 { | |
| 217 fprintf (stderr, "Usage: %s [+linenumber] filename\n", argv[0]); | |
| 218 exit (1); | |
| 219 } | |
| 220 | |
| 221 /* | |
|
10124
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
222 * Create a message queue using ~/.emacs-server as the path for ftok |
| 412 | 223 */ |
| 224 if ((homedir = getenv ("HOME")) == NULL) | |
| 225 { | |
| 226 fprintf (stderr, "%s: No home directory\n", argv[0]); | |
| 227 exit (1); | |
| 228 } | |
| 229 strcpy (buf, homedir); | |
|
10124
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
230 #ifndef HAVE_LONG_FILE_NAMES |
|
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
231 /* If file names are short, we can't fit the host name. */ |
|
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
232 strcat (buf, "/.emacs-server"); |
|
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
233 #else |
|
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
234 strcat (buf, "/.emacs-server-"); |
|
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
235 uname (&system_name); |
|
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
236 strcat (buf, system_name.nodename); |
|
baab57e76991
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9491
diff
changeset
|
237 #endif |
| 412 | 238 creat (buf, 0600); |
| 239 key = ftok (buf, 1); /* unlikely to be anyone else using it */ | |
| 1031 | 240 s = msgget (key, 0600 | IPC_CREAT); |
| 412 | 241 if (s == -1) |
| 242 { | |
| 243 fprintf (stderr, "%s: ", argv[0]); | |
| 244 perror ("msgget"); | |
| 245 exit (1); | |
| 246 } | |
| 247 | |
| 248 /* Determine working dir, so we can prefix it to all the arguments. */ | |
| 249 #ifdef BSD | |
| 250 temp = getwd (gwdirb); | |
| 251 #else | |
| 252 temp = getcwd (gwdirb, sizeof gwdirb); | |
| 253 #endif | |
| 254 | |
| 255 cwd = gwdirb; | |
| 256 if (temp != 0) | |
| 257 { | |
| 258 /* On some systems, cwd can look like `@machine/...'; | |
| 259 ignore everything before the first slash in such a case. */ | |
| 260 while (*cwd && *cwd != '/') | |
| 261 cwd++; | |
| 262 strcat (cwd, "/"); | |
| 263 } | |
| 264 else | |
| 265 { | |
|
11486
fb7c3071c8f0
(main): Add argv[0] to an error message.
Richard M. Stallman <rms@gnu.org>
parents:
11434
diff
changeset
|
266 fprintf (stderr, "%s: %s\n", argv[0], cwd); |
| 412 | 267 exit (1); |
| 268 } | |
| 269 | |
| 270 msgp->mtext[0] = 0; | |
|
6213
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
271 used = 0; |
| 412 | 272 argc--; argv++; |
| 273 while (argc) | |
| 274 { | |
|
6213
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
275 int need_cwd = 0; |
|
8346
3f82ba603fa3
(main): Don't actually modify argv[0]. Modify a copy instead.
Richard M. Stallman <rms@gnu.org>
parents:
6213
diff
changeset
|
276 char *modified_arg = argv[0]; |
|
3f82ba603fa3
(main): Don't actually modify argv[0]. Modify a copy instead.
Richard M. Stallman <rms@gnu.org>
parents:
6213
diff
changeset
|
277 if (*modified_arg == '+') |
| 412 | 278 { |
|
8346
3f82ba603fa3
(main): Don't actually modify argv[0]. Modify a copy instead.
Richard M. Stallman <rms@gnu.org>
parents:
6213
diff
changeset
|
279 char *p = modified_arg + 1; |
| 412 | 280 while (*p >= '0' && *p <= '9') p++; |
| 281 if (*p != 0) | |
|
6213
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
282 need_cwd = 1; |
| 412 | 283 } |
|
8346
3f82ba603fa3
(main): Don't actually modify argv[0]. Modify a copy instead.
Richard M. Stallman <rms@gnu.org>
parents:
6213
diff
changeset
|
284 else if (*modified_arg != '/') |
|
6213
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
285 need_cwd = 1; |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
286 |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
287 if (need_cwd) |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
288 used += strlen (cwd); |
|
8346
3f82ba603fa3
(main): Don't actually modify argv[0]. Modify a copy instead.
Richard M. Stallman <rms@gnu.org>
parents:
6213
diff
changeset
|
289 used += strlen (modified_arg) + 1; |
|
6213
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
290 while (used + 2 > size_allocated) |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
291 { |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
292 size_allocated *= 2; |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
293 msgp = (struct msgbuf *) realloc (msgp, |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
294 (sizeof (struct msgbuf) |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
295 + size_allocated)); |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
296 } |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
297 |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
298 if (need_cwd) |
| 412 | 299 strcat (msgp->mtext, cwd); |
| 300 | |
|
8346
3f82ba603fa3
(main): Don't actually modify argv[0]. Modify a copy instead.
Richard M. Stallman <rms@gnu.org>
parents:
6213
diff
changeset
|
301 strcat (msgp->mtext, modified_arg); |
| 412 | 302 strcat (msgp->mtext, " "); |
| 303 argv++; argc--; | |
| 304 } | |
| 305 strcat (msgp->mtext, "\n"); | |
|
6213
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
306 #ifdef HPUX /* HPUX has a bug. */ |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
307 if (strlen (msgp->mtext) >= 512) |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
308 { |
|
11434
5f5dda37c82c
(main): Improve error handling.
Karl Heuer <kwzh@gnu.org>
parents:
11368
diff
changeset
|
309 fprintf (stderr, "%s: args too long for msgsnd\n", progname); |
|
6213
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
310 exit (1); |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
311 } |
|
7eefa1bd1478
(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary.
Richard M. Stallman <rms@gnu.org>
parents:
5527
diff
changeset
|
312 #endif |
| 412 | 313 msgp->mtype = 1; |
| 314 if (msgsnd (s, msgp, strlen (msgp->mtext)+1, 0) < 0) | |
| 315 { | |
|
8360
e1518247fd63
(main): New local var progname saves argv[0].
Richard M. Stallman <rms@gnu.org>
parents:
8346
diff
changeset
|
316 fprintf (stderr, "%s: ", progname); |
| 412 | 317 perror ("msgsnd"); |
| 318 exit (1); | |
| 319 } | |
| 320 /* | |
| 321 * Now, wait for an answer | |
| 322 */ | |
| 323 printf ("Waiting for Emacs..."); | |
| 324 fflush (stdout); | |
| 325 | |
| 326 msgrcv (s, msgp, BUFSIZ, getpid (), 0); /* wait for anything back */ | |
| 327 strcpy (buf, msgp->mtext); | |
| 328 | |
|
14610
6c73b6046d21
(main, both definitions): Print a newline for normal termination.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
329 printf ("\n"); |
|
6c73b6046d21
(main, both definitions): Print a newline for normal termination.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
330 if (*buf) |
|
6c73b6046d21
(main, both definitions): Print a newline for normal termination.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
331 printf ("%s\n", buf); |
| 412 | 332 exit (0); |
| 333 } | |
| 334 | |
| 335 #endif /* HAVE_SYSVIPC */ | |
| 336 | |
| 337 #endif /* HAVE_SOCKETS or HAVE_SYSVIPC */ | |
|
5527
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
338 |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
339 #ifndef HAVE_STRERROR |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
340 char * |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
341 strerror (errnum) |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
342 int errnum; |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
343 { |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
344 extern char *sys_errlist[]; |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
345 extern int sys_nerr; |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
346 |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
347 if (errnum >= 0 && errnum < sys_nerr) |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
348 return sys_errlist[errnum]; |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
349 return (char *) "Unknown error"; |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
350 } |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
351 |
|
51451a050975
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5522
diff
changeset
|
352 #endif /* ! HAVE_STRERROR */ |
