changeset 6213:7eefa1bd1478

(main) [HAVE_SYSVIPC]: Make msgp->mtext longer if necessary. On HPUX, error if it's more than 512 chars.
author Richard M. Stallman <rms@gnu.org>
date Sat, 05 Mar 1994 21:42:57 +0000
parents 7a86fbeb5c88
children 512963eb02fe
files lib-src/emacsclient.c
diffstat 1 files changed, 32 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/lib-src/emacsclient.c	Sat Mar 05 21:38:34 1994 +0000
+++ b/lib-src/emacsclient.c	Sat Mar 05 21:42:57 1994 +0000
@@ -177,20 +177,25 @@
 #include <sys/msg.h>
 #include <stdio.h>
 
+char *getwd (), *getcwd (), *getenv ();
+
 main (argc, argv)
      int argc;
      char **argv;
 {
   int s;
   key_t key;
-  struct msgbuf * msgp =
-      (struct msgbuf *) malloc (sizeof *msgp + BUFSIZ);
+  /* Size of text allocated in MSGP.  */
+  int size_allocated = BUFSIZ;
+  /* Amount of text used in MSGP.  */
+  int used;
+  struct msgbuf *msgp
+    = (struct msgbuf *) malloc (sizeof (struct msgbuf) + size_allocated);
   struct msqid_ds * msg_st;
   char *homedir, buf[BUFSIZ];
   char gwdirb[BUFSIZ];
   char *cwd;
   char *temp;
-  char *getwd (), *getcwd (), *getenv ();
 
   if (argc < 2)
     {
@@ -241,17 +246,33 @@
     }
 
   msgp->mtext[0] = 0;
+  used = 0;
   argc--; argv++;
   while (argc)
     {
+      int need_cwd = 0;
       if (*argv[0] == '+')
 	{
 	  char *p = argv[0] + 1;
 	  while (*p >= '0' && *p <= '9') p++;
 	  if (*p != 0)
-	    strcat (msgp->mtext, cwd);
+	    need_cwd = 1;
 	}
       else if (*argv[0] != '/')
+	need_cwd = 1;
+
+      if (need_cwd)
+	used += strlen (cwd);
+      used += strlen (argv[0]) + 1;
+      while (used + 2 > size_allocated)
+	{
+	  size_allocated *= 2;
+	  msgp = (struct msgbuf *) realloc (msgp,
+					    (sizeof (struct msgbuf)
+					     + size_allocated));
+	}
+
+      if (need_cwd)
 	strcat (msgp->mtext, cwd);
 
       strcat (msgp->mtext, argv[0]);
@@ -259,6 +280,13 @@
       argv++; argc--;
     }
   strcat (msgp->mtext, "\n");
+#ifdef HPUX /* HPUX has a bug.  */
+  if (strlen (msgp->mtext) >= 512)
+    {
+      fprintf (stderr, "emacsclient: args too long for msgsnd\n");
+      exit (1);
+    }
+#endif
   msgp->mtype = 1;
   if (msgsnd (s, msgp, strlen (msgp->mtext)+1, 0) < 0)
     {