diff src/callproc.c @ 25522:c675d8210bda

(call-process) [macintosh]: Call mac_run_command in sysdep.c. The Mac code is modeled after the DOS code.
author Richard M. Stallman <rms@gnu.org>
date Fri, 03 Sep 1999 18:29:30 +0000
parents 8aec1d72cac4
children a14111a2a100
line wrap: on
line diff
--- a/src/callproc.c	Fri Sep 03 18:26:26 1999 +0000
+++ b/src/callproc.c	Fri Sep 03 18:29:30 1999 +0000
@@ -140,17 +140,16 @@
 call_process_cleanup (fdpid)
      Lisp_Object fdpid;
 {
-#ifdef MSDOS
+#if defined (MSDOS) || defined (macintosh)
   /* for MSDOS fdpid is really (fd . tempfile)  */
   register Lisp_Object file;
   file = Fcdr (fdpid);
   close (XFASTINT (Fcar (fdpid)));
   if (strcmp (XSTRING (file)-> data, NULL_DEVICE) != 0)
     unlink (XSTRING (file)->data);
-#else /* not MSDOS */
+#else /* not MSDOS and not macintosh */
   register int pid = XFASTINT (Fcdr (fdpid));
 
-
   if (call_process_exited)
     {
       close (XFASTINT (Fcar (fdpid)));
@@ -217,6 +216,10 @@
   char *outf, *tempfile;
   int outfilefd;
 #endif
+#ifdef macintosh
+  char *tempfile;
+  int outfilefd;
+#endif
 #if 0
   int mask;
 #endif
@@ -438,13 +441,35 @@
   fd[1] = outfilefd;
 #endif /* MSDOS */
 
+#ifdef macintosh
+  /* Since we don't have pipes on the Mac, create a temporary file to
+     hold the output of the subprocess.  */
+  tempfile = (char *) alloca (STRING_BYTES (XSTRING (Vtemp_file_name_pattern)) + 1);
+  bcopy (XSTRING (Vtemp_file_name_pattern)->data, tempfile,
+	 STRING_BYTES (XSTRING (Vtemp_file_name_pattern)) + 1);
+
+  mktemp (tempfile);
+
+  outfilefd = creat (tempfile, S_IREAD | S_IWRITE);
+  if (outfilefd < 0)
+    {
+      close (filefd);
+      report_file_error ("Opening process output file",
+			 Fcons (build_string (tempfile), Qnil));
+    }
+  fd[0] = filefd;
+  fd[1] = outfilefd;
+#endif /* macintosh */
+
   if (INTEGERP (buffer))
     fd[1] = open (NULL_DEVICE, O_WRONLY), fd[0] = -1;
   else
     {
 #ifndef MSDOS
+#ifndef macintosh
       pipe (fd);
 #endif
+#endif
 #if 0
       /* Replaced by close_process_descs */
       set_exclusive_use (fd[0]);
@@ -502,6 +527,49 @@
 
     current_dir = ENCODE_FILE (current_dir);
 
+#ifdef macintosh
+    {
+      /* Call run_mac_command in sysdep.c here directly instead of doing
+         a child_setup as for MSDOS and other platforms.  Note that this
+         code does not handle passing the environment to the synchronous
+         Mac subprocess.  */
+      char *infn, *outfn, *errfn, *currdn;
+      
+      /* close these files so subprocess can write to them */
+      close (outfilefd);
+      if (fd_error != outfilefd)
+        close (fd_error);
+      fd1 = -1; /* No harm in closing that one! */
+
+      infn = XSTRING (infile)->data;
+      outfn = tempfile;
+      if (NILP (error_file))
+        errfn = NULL_DEVICE;
+      else if (EQ (Qt, error_file))
+        errfn = outfn;
+      else
+        errfn = XSTRING (error_file)->data;
+      currdn = XSTRING (current_dir)->data;
+      pid = run_mac_command (new_argv, currdn, infn, outfn, errfn);
+
+      /* Record that the synchronous process exited and note its
+         termination status.  */
+      synch_process_alive = 0;
+      synch_process_retcode = pid;
+      if (synch_process_retcode < 0)  /* means it couldn't be exec'ed */
+        synch_process_death = strerror (errno);
+
+      /* Since CRLF is converted to LF within `decode_coding', we can
+         always open a file with binary mode.  */
+      fd[0] = open (tempfile, O_BINARY);
+      if (fd[0] < 0)
+	{
+	  unlink (tempfile);
+	  close (filefd);
+	  report_file_error ("Cannot re-open temporary file", Qnil);
+	}
+    }
+#else /* not macintosh */
 #ifdef MSDOS /* MW, July 1993 */
     /* Note that on MSDOS `child_setup' actually returns the child process
        exit status, not its PID, so we assign it to `synch_process_retcode'
@@ -557,6 +625,7 @@
     if (fd_error >= 0)
       close (fd_error);
 #endif /* not MSDOS */
+#endif /* not macintosh */
 
     environ = save_environ;
 
@@ -590,14 +659,14 @@
   /* Enable sending signal if user quits below.  */
   call_process_exited = 0;
 
-#ifdef MSDOS
+#if defined(MSDOS) || defined(macintosh)
   /* MSDOS needs different cleanup information.  */
   record_unwind_protect (call_process_cleanup,
 			 Fcons (make_number (fd[0]), build_string (tempfile)));
 #else
   record_unwind_protect (call_process_cleanup,
 			 Fcons (make_number (fd[0]), make_number (pid)));
-#endif /* not MSDOS */
+#endif /* not MSDOS and not macintosh */
 
 
   if (BUFFERP (buffer))