Updated from GMP 1.906.7
[kopensolaris-gnu/glibc.git] / sysdeps / posix / pipestream.c
index 425fd57..53595f5 100644 (file)
@@ -42,22 +42,26 @@ struct child
    These all simply call the corresponding
    original function with the original cookie.  */
 
-#define FUNC(type, name, args, argdecl)                                              \
-  static type DEFUN(__CONCAT(child_,name), args, argdecl)                    \
+#define FUNC(type, name, args                                              \
+  static type DEFUN(__CONCAT(child_,name), args, __CONCAT(name,decl))        \
   {                                                                          \
     struct child *c = (struct child *) cookie;                               \
-    __ptr_t cookie = c->cookie;                                                      \
-    return (*c->cookie.funcs.__CONCAT(__,name)) args;                        \
+    {                                                                        \
+      __ptr_t cookie = c->cookie;                                            \
+      return (*c->funcs.__CONCAT(__,name)) args;                             \
+    }                                                                        \
   }
 
-FUNC (int, read, (cookie, buf, n),
-      PTR cookie AND register char *buf AND register size_t n)
-FUNC (int, write, (cookie, buf, n),
-      PTR cookie AND register CONST char *buf AND register size_t n)
-FUNC (int, seek, (cookie, pos, whence),
-      PTR cookie AND fpos_t *pos AND int whence)
-FUNC (int, close, (cookie), PTR cookie)
-FUNC (int, fileno, (cookie), PTR cookie)
+#define readdecl PTR cookie AND register char *buf AND register size_t n
+FUNC (int, read, (cookie, buf, n))
+#define writedecl PTR cookie AND register CONST char *buf AND register size_t n
+FUNC (int, write, (cookie, buf, n))
+#define seekdecl PTR cookie AND fpos_t *pos AND int whence
+FUNC (int, seek, (cookie, pos, whence))
+#define closedecl PTR cookie
+FUNC (int, close, (cookie))
+#define filenodecl PTR cookie
+FUNC (int, fileno, (cookie))
 
 static const __io_functions child_funcs
   = { child_read, child_write, child_seek, child_close, child_fileno };
@@ -123,23 +127,31 @@ DEFUN(popen, (command, mode), CONST char *command AND CONST char *mode)
      won't see it.  */
   if (*mode == 'r')
     {
-      (void) close(pipedes[STDOUT_FILENO]);
+      (void) close (pipedes[STDOUT_FILENO]);
       (void) fcntl (pipedes[STDIN_FILENO], F_SETFD, FD_CLOEXEC);
-      stream = fdopen(pipedes[STDIN_FILENO], mode);
+      stream = fdopen (pipedes[STDIN_FILENO], mode);
     }
   else
     {
-      (void) close(pipedes[STDIN_FILENO]);
+      (void) close (pipedes[STDIN_FILENO]);
       (void) fcntl (pipedes[STDOUT_FILENO], F_SETFD, FD_CLOEXEC);
-      stream = fdopen(pipedes[STDOUT_FILENO], mode);
+      stream = fdopen (pipedes[STDOUT_FILENO], mode);
     }
 
   if (stream == NULL)
     goto error;
 
-  child = (struct child *) malloc(sizeof(struct child));
+  child = (struct child *) malloc (sizeof (struct child));
   if (child == NULL)
     goto error;
+
+  {
+    /* Make sure STREAM has its functions set before
+       we try to squirrel them away in CHILD.  */
+    extern void __stdio_check_funcs __P ((FILE *));
+    __stdio_check_funcs (stream);
+  }
+
   child->pid = pid;
   child->cookie = stream->__cookie;
   child->funcs = stream->__io_funcs;
@@ -148,18 +160,18 @@ DEFUN(popen, (command, mode), CONST char *command AND CONST char *mode)
   stream->__ispipe = 1;
   return stream;
 
- error:;
+ error:
   {
     /* The stream couldn't be opened or the child structure couldn't be
        allocated.  Kill the child and close the other side of the pipe.  */
     int save = errno;
-    (void) kill(pid, SIGKILL);
+    (void) kill (pid, SIGKILL);
     if (stream == NULL)
-      (void) close(pipedes[*mode == 'r' ? STDOUT_FILENO : STDIN_FILENO]);
+      (void) close (pipedes[*mode == 'r' ? STDOUT_FILENO : STDIN_FILENO]);
     else
-      (void) fclose(stream);
+      (void) fclose (stream);
 #ifndef        NO_WAITPID
-    (void) waitpid(pid, (int *) NULL, 0);
+    (void) waitpid (pid, (int *) NULL, 0);
 #else
     {
       pid_t dead;
@@ -192,9 +204,9 @@ DEFUN(pclose, (stream), register FILE *stream)
   pid = c->pid;
   stream->__cookie = c->cookie;
   stream->__io_funcs = c->funcs;
-  free(stream->__cookie);
+  free ((PTR) c);
   stream->__ispipe = 0;
-  if (fclose(stream))
+  if (fclose (stream))
     return -1;
 
 #ifndef        NO_WAITPID