Date: Mon, 9 Jun 1997 14:01:58 +0300 (IDT) From: Eli Zaretskii To: djgpp-workers AT delorie DOT com Subject: Making `popen' more POSIX Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Precedence: bulk While at that (see my other mail), I corrected the problem whereby `pclose' won't report the exit status of the spawned program if you call `popen' with "r" (to read from the pipe). Here's the patch: *** src/libc/posix/stdio/popen.c~1 Mon Jun 9 09:45:04 1997 --- src/libc/posix/stdio/popen.c Mon Jun 9 10:07:16 1997 *************** *** 60,69 **** #include #include ! /* hold file pointer, descriptor, command, mode, temporary file name */ struct pipe_list { FILE *fp; int fd; char *command, mode[10], temp_name[L_tmpnam]; struct pipe_list *next; }; --- 60,71 ---- #include #include ! /* hold file pointer, descriptor, command, mode, temporary file name, ! and the status of the command */ struct pipe_list { FILE *fp; int fd; + int exit_status; char *command, mode[10], temp_name[L_tmpnam]; struct pipe_list *next; }; *************** popen (const char *cm, const char *md) / *** 103,108 **** --- 105,111 ---- } /* stick in elements we know already */ + l1->exit_status = -1; strcpy (l1->mode, md); if (tmpnam (l1->temp_name) == NULL) return NULL; *************** popen (const char *cm, const char *md) / *** 121,127 **** l1->fp = NULL; else /* exec cmd */ ! if (system (cm) == EOF) l1->fp = NULL; /* reopen real stdout */ if (dup2 (l1->fd, fileno (stdout)) == EOF) --- 124,130 ---- l1->fp = NULL; else /* exec cmd */ ! if ((l1->exit_status = system (cm)) == EOF) l1->fp = NULL; /* reopen real stdout */ if (dup2 (l1->fd, fileno (stdout)) == EOF) *************** pclose (FILE *pp) *** 189,197 **** retval = -1; else /* exec cmd */ ! if (system (l1->command) == EOF) ! retval = -1; ! else { /* reopen stdin */ if (dup2 (l1->fd, fileno (stdin)) == EOF) --- 192,198 ---- retval = -1; else /* exec cmd */ ! if ((retval = system (l1->command)) != EOF) { /* reopen stdin */ if (dup2 (l1->fd, fileno (stdin)) == EOF) *************** pclose (FILE *pp) *** 200,208 **** close(l1->fd); } else ! /* if pipe was opened to read */ if (l1->mode[0] == 'r') ! retval = 0; else /* invalid mode */ retval = -1; --- 201,209 ---- close(l1->fd); } else ! /* if pipe was opened to read, return the exit status we saved */ if (l1->mode[0] == 'r') ! retval = l1->exit_status; else /* invalid mode */ retval = -1;