]>
Commit | Line | Data |
---|---|---|
800d775e UD |
1 | /* |
2 | * Sun RPC is a product of Sun Microsystems, Inc. and is provided for | |
3 | * unrestricted use provided that this legend is included on all tape | |
4 | * media and as a part of the software program in whole or part. Users | |
5 | * may copy or modify Sun RPC without charge, but are not authorized | |
6 | * to license or distribute it to anyone else except as part of a product or | |
7 | * program developed by the user. | |
8 | * | |
9 | * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE | |
10 | * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR | |
11 | * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. | |
12 | * | |
13 | * Sun RPC is provided with no support and without any obligation on the | |
14 | * part of Sun Microsystems, Inc. to assist in its use, correction, | |
15 | * modification or enhancement. | |
16 | * | |
17 | * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE | |
18 | * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC | |
19 | * OR ANY PART THEREOF. | |
20 | * | |
21 | * In no event will Sun Microsystems, Inc. be liable for any lost revenue | |
22 | * or profits or other special, indirect and consequential damages, even if | |
23 | * Sun has been advised of the possibility of such damages. | |
24 | * | |
25 | * Sun Microsystems, Inc. | |
26 | * 2550 Garcia Avenue | |
27 | * Mountain View, California 94043 | |
28 | */ | |
29 | ||
30 | /* | |
31 | * Copyright (c) 1988 by Sun Microsystems, Inc. | |
32 | */ | |
33 | ||
34 | /* | |
35 | * Open two pipes to a child process, one for reading, one for writing. | |
36 | * The pipes are accessed by FILE pointers. This is NOT a public | |
37 | * interface, but for internal use only! | |
38 | */ | |
39 | #include <stdio.h> | |
40 | #include <stdlib.h> | |
41 | #include <unistd.h> | |
42 | #include <string.h> | |
43 | #include <rpc/rpc.h> | |
44 | #include <rpc/clnt.h> | |
45 | ||
50304ef0 UD |
46 | #ifdef USE_IN_LIBIO |
47 | # include <libio/iolibio.h> | |
48 | # define fflush(s) _IO_fflush (s) | |
49 | #endif | |
50 | ||
800d775e UD |
51 | /* |
52 | * returns pid, or -1 for failure | |
53 | */ | |
54 | int | |
55 | _openchild (char *command, FILE ** fto, FILE ** ffrom) | |
56 | { | |
57 | int i; | |
58 | int pid; | |
59 | int pdto[2]; | |
60 | int pdfrom[2]; | |
800d775e | 61 | |
50304ef0 | 62 | if (__pipe (pdto) < 0) |
800d775e | 63 | goto error1; |
50304ef0 | 64 | if (__pipe (pdfrom) < 0) |
800d775e | 65 | goto error2; |
50304ef0 | 66 | switch (pid = __fork ()) |
800d775e UD |
67 | { |
68 | case -1: | |
69 | goto error3; | |
70 | ||
71 | case 0: | |
72 | /* | |
73 | * child: read from pdto[0], write into pdfrom[1] | |
74 | */ | |
50304ef0 UD |
75 | __close (0); |
76 | __dup (pdto[0]); | |
77 | __close (1); | |
78 | __dup (pdfrom[1]); | |
9a0a462c | 79 | fflush (stderr); |
800d775e | 80 | for (i = _rpc_dtablesize () - 1; i >= 3; i--) |
50304ef0 | 81 | __close (i); |
9a0a462c UD |
82 | fflush (stderr); |
83 | execlp (command, command, 0); | |
84 | perror ("exec"); | |
800d775e UD |
85 | _exit (~0); |
86 | ||
87 | default: | |
88 | /* | |
89 | * parent: write into pdto[1], read from pdfrom[0] | |
90 | */ | |
91 | *fto = fdopen (pdto[1], "w"); | |
50304ef0 | 92 | __close (pdto[0]); |
800d775e | 93 | *ffrom = fdopen (pdfrom[0], "r"); |
50304ef0 | 94 | __close (pdfrom[1]); |
800d775e UD |
95 | break; |
96 | } | |
97 | return pid; | |
98 | ||
99 | /* | |
100 | * error cleanup and return | |
101 | */ | |
102 | error3: | |
50304ef0 UD |
103 | __close (pdfrom[0]); |
104 | __close (pdfrom[1]); | |
800d775e | 105 | error2: |
50304ef0 UD |
106 | __close (pdto[0]); |
107 | __close (pdto[1]); | |
800d775e UD |
108 | error1: |
109 | return -1; | |
110 | } |