[gnu.emacs.bug] emacsclient.c

jik@PIT-MANAGER.MIT.EDU (Jonathan I. Kamens) (01/24/90)

  The error messages printed by the emacsclient program are rather
lacking in useful information.  For example, if the socket to connect
to the emacs server does not exist, the error that is printed is
"stat: no such file or directory" -- not even a program name is
printed to give some idea of what program is having a problem.

  The patch below fixes this problem.

Jonathan Kamens			              USnail:
MIT Project Athena				11 Ashford Terrace
jik@Athena.MIT.EDU				Allston, MA  02134
Office: 617-253-8495			      Home: 617-782-0710

		      *************************

*** /usr/athena/lib/gnuemacs/etc/emacsclient.c	Fri Jun  2 13:01:58 1989
--- /tmp/emacsclient.c	Wed Jan 24 04:29:36 1990
***************
*** 31,40 ****
  #if !defined(BSD) && !defined(HAVE_SYSVIPC)
  #include <stdio.h>
  
! main ()
  {
!   fprintf (stderr, "Sorry, the Emacs server is supported only on Berkeley Unix\n");
!   fprintf (stderr, "or System V systems with IPC\n");
    exit (1);
  }
  
--- 31,44 ----
  #if !defined(BSD) && !defined(HAVE_SYSVIPC)
  #include <stdio.h>
  
! /* ARGSUSED */
! main (argc, argv)
! int argc;
! char *argv[];
  {
!   fprintf (stderr, "%s: Sorry, the Emacs server is supported only\n",
! 	   argv[0]);
!   fprintf (stderr, "on Berkeley Unix or System V systems with IPC\n");
    exit (1);
  }
  
***************
*** 60,71 ****
    char string[BUFSIZ];
    struct stat statbfr;
    extern gid_t geteuid();
  
    char *getenv (), *getwd ();
  
    if (argc < 2)
      {
!       printf ("Usage: %s [filename]\n", argv[0]);
        exit (1);
      }
  
--- 64,76 ----
    char string[BUFSIZ];
    struct stat statbfr;
    extern gid_t geteuid();
+   char error_buf[BUFSIZ];
  
    char *getenv (), *getwd ();
  
    if (argc < 2)
      {
!       fprintf (stderr, "Usage: %s [filename]\n", argv[0]);
        exit (1);
      }
  
***************
*** 75,81 ****
  
    if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
      {
!       perror ("socket");
        exit (1);
      }
    server.sun_family = AF_UNIX;
--- 80,87 ----
  
    if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
      {
!       (void) sprintf(error_buf, "%s: socket", argv[0]);
!       perror (error_buf);
        exit (1);
      }
    server.sun_family = AF_UNIX;
***************
*** 82,104 ****
    (void) sprintf (server.sun_path, "/tmp/esrv%d", geteuid());
    if (stat (server.sun_path, &statbfr) == -1)
      {
!       perror ("stat");
        exit (1);
      }
    if (statbfr.st_uid != geteuid())
      {
!       fprintf (stderr, "Illegal socket owner\n");
        exit (1);
      }
    if (connect (s, (struct sockaddr *)&server,
               strlen (server.sun_path) + 2) < 0)
      {
!       perror ("connect");
        exit (1);
      }
    if ((out = fdopen (s, "r+")) == NULL)
      {
!       perror ("fdopen");
        exit (1);
      }
  
--- 88,113 ----
    (void) sprintf (server.sun_path, "/tmp/esrv%d", geteuid());
    if (stat (server.sun_path, &statbfr) == -1)
      {
!       (void) sprintf(error_buf, "%s: %s", argv[0], server.sun_path);
!       perror (error_buf);
        exit (1);
      }
    if (statbfr.st_uid != geteuid())
      {
!       fprintf (stderr, "%s: Illegal socket owner\n", argv[0]);
        exit (1);
      }
    if (connect (s, (struct sockaddr *)&server,
               strlen (server.sun_path) + 2) < 0)
      {
!       (void) sprintf(error_buf, "%s: connect", argv[0]);
!       perror (error_buf);
        exit (1);
      }
    if ((out = fdopen (s, "r+")) == NULL)
      {
!       (void) sprintf(error_buf, "%s: fdopen", argv[0]);
!       perror (error_buf);
        exit (1);
      }
  
***************
*** 154,162 ****
    struct msqid_ds * msg_st;
    char *homedir, *getenv (), buf[BUFSIZ];
    char *getwd (), *getcwd (), gwdirb[BUFSIZ], *cwd;
    if (argc < 2)
      {
!       printf ("Usage: %s [filename]\n", argv[0]);
        exit (1);
      }
  
--- 163,173 ----
    struct msqid_ds * msg_st;
    char *homedir, *getenv (), buf[BUFSIZ];
    char *getwd (), *getcwd (), gwdirb[BUFSIZ], *cwd;
+   char error_buf[BUFSIZ];
+   
    if (argc < 2)
      {
!       fprintf (stderr, "Usage: %s [filename]\n", argv[0]);
        exit (1);
      }
  
***************
*** 165,171 ****
     */
    if ((homedir = getenv ("HOME")) == NULL)
      {
!       fprintf (stderr,"No home directory\n");
        exit (1);
      }
    strcpy (buf, homedir);
--- 176,182 ----
     */
    if ((homedir = getenv ("HOME")) == NULL)
      {
!       fprintf (stderr,"%s: No home directory\n", argv[0]);
        exit (1);
      }
    strcpy (buf, homedir);
***************
*** 175,181 ****
    s = msgget (key, 0600);
    if (s == -1)
      {
!       perror ("msgget");
        exit (1);
      }
  
--- 186,193 ----
    s = msgget (key, 0600);
    if (s == -1)
      {
!       (void) sprintf(error_buf, "%s: msgget", argv[0]);
!       perror (error_buf);
        exit (1);
      }
  
***************
*** 212,218 ****
    msgp->mtype = 1;
    if (msgsnd (s, msgp, strlen (msgp->mtext)+1, 1, 0) < 0)
      {
!       perror ("msgsnd");
        exit (1);
      }
    /*
--- 224,231 ----
    msgp->mtype = 1;
    if (msgsnd (s, msgp, strlen (msgp->mtext)+1, 1, 0) < 0)
      {
!       (void) sprintf(error_buf, "%s: msgsnd", argv[0]);
!       perror (error_buf);
        exit (1);
      }
    /*

jik@PIT-MANAGER.MIT.EDU (Jonathan I. Kamens) (01/25/90)

   Date: Wed, 24 Jan 90 15:12:49 PST
   From: Mark D. Baushke <mdb@kosciusko.ESD.3Com.COM>

   The patch you posted is NOT against the 18.55 version of emacsclient.c .
   Your patch failed with two hunks rejected. I suggest you obtain a
   'virgin' copy of dist-18.55/etc/emacsclient.c and create the patch
   again.

  You're right.  Sorry about that, I assumed that the sources we were
using At Project Athena were the most up-to-date.  Silly assumption.

  Below is a patch to the version of emacsclient.c in the 18.55
distribution.

Jonathan Kamens			              USnail:
MIT Project Athena				11 Ashford Terrace
jik@Athena.MIT.EDU				Allston, MA  02134
Office: 617-253-8495			      Home: 617-782-0710

		      *************************

*** /tmp/,RCSt1007578	Wed Jan 24 21:00:12 1990
--- emacsclient.c	Wed Jan 24 20:54:24 1990
***************
*** 31,40 ****
  #if !defined(BSD) && !defined(HAVE_SYSVIPC)
  #include <stdio.h>
  
! main ()
  {
!   fprintf (stderr, "Sorry, the Emacs server is supported only on Berkeley Unix\n");
!   fprintf (stderr, "or System V systems with IPC\n");
    exit (1);
  }
  
--- 31,44 ----
  #if !defined(BSD) && !defined(HAVE_SYSVIPC)
  #include <stdio.h>
  
! /* ARGSUSED */
! main (argc, argv)
! int argc;
! char *argv[];
  {
!   fprintf (stderr, "%s: Sorry, the Emacs server is supported only\n",
! 	   argv[0]);
!   fprintf (stderr, "on Berkeley Unix or System V systems with IPC\n");
    exit (1);
  }
  
***************
*** 57,68 ****
    struct sockaddr_un server;
    char *homedir, *cwd, *str;
    char string[BUFSIZ];
  
    char *getenv (), *getwd ();
  
    if (argc < 2)
      {
!       printf ("Usage: %s [filename]\n", argv[0]);
        exit (1);
      }
  
--- 61,73 ----
    struct sockaddr_un server;
    char *homedir, *cwd, *str;
    char string[BUFSIZ];
+   char error_buf[BUFSIZ];
  
    char *getenv (), *getwd ();
  
    if (argc < 2)
      {
!       fprintf (stderr, "Usage: %s [filename]\n", argv[0]);
        exit (1);
      }
  
***************
*** 72,96 ****
  
    if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
      {
!       perror ("socket");
        exit (1);
      }
    server.sun_family = AF_UNIX;
    if ((homedir = getenv ("HOME")) == NULL)
      {
!       fprintf (stderr, "No home directory\n");
!       exit (1);
      }
    strcpy (server.sun_path, homedir);
    strcat (server.sun_path, "/.emacs_server");
    if (connect (s, &server, strlen (server.sun_path) + 2) < 0)
      {
!       perror ("connect");
        exit (1);
      }
    if ((out = fdopen (s, "r+")) == NULL)
      {
!       perror ("fdopen");
        exit (1);
      }
  
--- 77,104 ----
  
    if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
      {
!       (void) sprintf(error_buf, "%s: socket", argv[0]);
!       perror (error_buf);
        exit (1);
      }
    server.sun_family = AF_UNIX;
    if ((homedir = getenv ("HOME")) == NULL)
      {
!       fprintf(stderr, "%s: No home directory\n", argv[0]);
!       exit(1);
      }
    strcpy (server.sun_path, homedir);
    strcat (server.sun_path, "/.emacs_server");
    if (connect (s, &server, strlen (server.sun_path) + 2) < 0)
      {
!       (void) sprintf(error_buf, "%s: connect", argv[0]);
!       perror (error_buf);
        exit (1);
      }
    if ((out = fdopen (s, "r+")) == NULL)
      {
!       (void) sprintf(error_buf, "%s: fdopen", argv[0]);
!       perror (error_buf);
        exit (1);
      }
  
***************
*** 146,154 ****
    struct msqid_ds * msg_st;
    char *homedir, *getenv (), buf[BUFSIZ];
    char *getwd (), *getcwd (), gwdirb[BUFSIZ], *cwd;
    if (argc < 2)
      {
!       printf ("Usage: %s [filename]\n", argv[0]);
        exit (1);
      }
  
--- 154,164 ----
    struct msqid_ds * msg_st;
    char *homedir, *getenv (), buf[BUFSIZ];
    char *getwd (), *getcwd (), gwdirb[BUFSIZ], *cwd;
+   char error_buf[BUFSIZ];
+   
    if (argc < 2)
      {
!       fprintf (stderr, "Usage: %s [filename]\n", argv[0]);
        exit (1);
      }
  
***************
*** 157,163 ****
     */
    if ((homedir = getenv ("HOME")) == NULL)
      {
!       fprintf (stderr,"No home directory\n");
        exit (1);
      }
    strcpy (buf, homedir);
--- 167,173 ----
     */
    if ((homedir = getenv ("HOME")) == NULL)
      {
!       fprintf (stderr,"%s: No home directory\n", argv[0]);
        exit (1);
      }
    strcpy (buf, homedir);
***************
*** 167,173 ****
    s = msgget (key, 0600);
    if (s == -1)
      {
!       perror ("msgget");
        exit (1);
      }
  
--- 177,184 ----
    s = msgget (key, 0600);
    if (s == -1)
      {
!       (void) sprintf(error_buf, "%s: msgget", argv[0]);
!       perror (error_buf);
        exit (1);
      }
  
***************
*** 204,210 ****
    msgp->mtype = 1;
    if (msgsnd (s, msgp, strlen (msgp->mtext)+1, 1, 0) < 0)
      {
!       perror ("msgsnd");
        exit (1);
      }
    /*
--- 215,222 ----
    msgp->mtype = 1;
    if (msgsnd (s, msgp, strlen (msgp->mtext)+1, 1, 0) < 0)
      {
!       (void) sprintf(error_buf, "%s: msgsnd", argv[0]);
!       perror (error_buf);
        exit (1);
      }
    /*