comparison lib-src/emacsclient.c @ 53734:132739917566

(main): Don't use the hostname in the socket name. Look for relative socket names in the /tmp dir rather than in cwd.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 27 Jan 2004 23:04:52 +0000
parents 04e9ebd16fcd
children ddc4b99f4f8c 1d2f73785d9d
comparison
equal deleted inserted replaced
53733:d5f680b60b41 53734:132739917566
297 int 297 int
298 main (argc, argv) 298 main (argc, argv)
299 int argc; 299 int argc;
300 char **argv; 300 char **argv;
301 { 301 {
302 char *system_name;
303 int system_name_length;
304 int s, i, needlf = 0; 302 int s, i, needlf = 0;
305 FILE *out, *in; 303 FILE *out, *in;
306 struct sockaddr_un server; 304 struct sockaddr_un server;
307 char *cwd, *str; 305 char *cwd, *str;
308 char string[BUFSIZ]; 306 char string[BUFSIZ];
331 } 329 }
332 330
333 server.sun_family = AF_UNIX; 331 server.sun_family = AF_UNIX;
334 332
335 { 333 {
336 char *dot;
337 system_name_length = 32;
338
339 while (1)
340 {
341 system_name = (char *) xmalloc (system_name_length + 1);
342
343 /* system_name must be null-terminated string. */
344 system_name[system_name_length] = '\0';
345
346 if (gethostname (system_name, system_name_length) == 0)
347 break;
348
349 free (system_name);
350 system_name_length *= 2;
351 }
352
353 /* We always use the non-dotted host name, for simplicity. */
354 dot = index (system_name, '.');
355 if (dot)
356 *dot = '\0';
357 }
358
359 {
360 int sock_status = 0; 334 int sock_status = 0;
361 int default_sock = !socket_name; 335 int default_sock = !socket_name;
362 int saved_errno; 336 int saved_errno;
337 char *server_name = "server";
338
339 if (socket_name && !index (socket_name, '/') && !index (socket_name, '\\'))
340 { /* socket_name is a file name component. */
341 server_name = socket_name;
342 socket_name = NULL;
343 default_sock = 1; /* Try both UIDs. */
344 }
363 345
364 if (default_sock) 346 if (default_sock)
365 { 347 {
366 socket_name = alloca (system_name_length + 100); 348 socket_name = alloca (100 + strlen (server_name));
367 sprintf (socket_name, "/tmp/emacs%d-%s/server", 349 sprintf (socket_name, "/tmp/emacs%d/%s",
368 (int) geteuid (), system_name); 350 (int) geteuid (), server_name);
369 } 351 }
370 352
371 if (strlen (socket_name) < sizeof (server.sun_path)) 353 if (strlen (socket_name) < sizeof (server.sun_path))
372 strcpy (server.sun_path, socket_name); 354 strcpy (server.sun_path, socket_name);
373 else 355 else
397 struct passwd *pw = getpwnam (user_name); 379 struct passwd *pw = getpwnam (user_name);
398 380
399 if (pw && (pw->pw_uid != geteuid ())) 381 if (pw && (pw->pw_uid != geteuid ()))
400 { 382 {
401 /* We're running under su, apparently. */ 383 /* We're running under su, apparently. */
402 sprintf (socket_name, "/tmp/emacs%d-%s/server", 384 socket_name = alloca (100 + strlen (server_name));
403 (int) pw->pw_uid, system_name); 385 sprintf (socket_name, "/tmp/emacs%d/%s",
386 (int) pw->pw_uid, server_name);
404 387
405 if (strlen (socket_name) < sizeof (server.sun_path)) 388 if (strlen (socket_name) < sizeof (server.sun_path))
406 strcpy (server.sun_path, socket_name); 389 strcpy (server.sun_path, socket_name);
407 else 390 else
408 { 391 {