diff src/callproc.c @ 7722:e422f06592d3

(child_setup): If PWD is set, set it in the child so that it points at the child's working directory.
author Richard M. Stallman <rms@gnu.org>
date Sat, 28 May 1994 08:29:36 +0000
parents b7d23c08750c
children 5fc8a3a9539a
line wrap: on
line diff
--- a/src/callproc.c	Sat May 28 08:15:16 1994 +0000
+++ b/src/callproc.c	Sat May 28 08:29:36 1994 +0000
@@ -571,6 +571,7 @@
      instead.  */
 #else /* not MSDOS */
   char **env;
+  char *pwd_var;
 
   int pid = getpid ();
 
@@ -595,11 +596,13 @@
      the superior's static variables as if the superior had done alloca
      and will be cleaned up in the usual way.  */
   {
-    register unsigned char *temp;
+    register char *temp;
     register int i;
 
     i = XSTRING (current_dir)->size;
-    temp = (unsigned char *) alloca (i + 2);
+    pwd_var = (char *) alloca (i + 6);
+    temp = pwd_var + 4;
+    bcopy ("PWD=", pwd_var, 4);
     bcopy (XSTRING (current_dir)->data, temp, i);
     if (temp[i - 1] != '/') temp[i++] = '/';
     temp[i] = 0;
@@ -611,6 +614,10 @@
        at least check.  */
     if (chdir (temp) < 0)
       exit (errno);
+
+    /* Strip trailing slashes for PWD, but leave "/" and "//" alone.  */
+    while (i > 2 && temp[i - 1] == '/')
+      temp[--i] = 0;
   }
 
   /* Set `env' to a vector of the strings in Vprocess_environment.  */
@@ -626,8 +633,13 @@
 	 tem = XCONS (tem)->cdr)
       new_length++;
 
-    /* new_length + 1 to include terminating 0.  */
-    env = new_env = (char **) alloca ((new_length + 1) * sizeof (char *));
+    /* new_length + 2 to include PWD and terminating 0.  */
+    env = new_env = (char **) alloca ((new_length + 2) * sizeof (char *));
+
+    /* If we have a PWD envvar, pass one down,
+       but with corrected value.  */
+    if (getenv ("PWD"))
+      *new_env++ = pwd_var;
 
     /* Copy the Vprocess_environment strings into new_env.  */
     for (tem = Vprocess_environment;