ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/process.c
(Generate patch)

Comparing ray/src/common/process.c (file contents):
Revision 2.5 by greg, Sat Feb 22 02:07:22 2003 UTC vs.
Revision 2.10 by greg, Fri Apr 3 17:06:16 2020 UTC

# Line 7 | Line 7 | static const char      RCSid[] = "$Id$";
7   * External symbols declared in standard.h
8   */
9  
10 < /* ====================================================================
11 < * The Radiance Software License, Version 1.0
12 < *
13 < * Copyright (c) 1990 - 2002 The Regents of the University of California,
14 < * through Lawrence Berkeley National Laboratory.   All rights reserved.
15 < *
16 < * Redistribution and use in source and binary forms, with or without
17 < * modification, are permitted provided that the following conditions
18 < * are met:
19 < *
20 < * 1. Redistributions of source code must retain the above copyright
21 < *         notice, this list of conditions and the following disclaimer.
22 < *
23 < * 2. Redistributions in binary form must reproduce the above copyright
24 < *       notice, this list of conditions and the following disclaimer in
25 < *       the documentation and/or other materials provided with the
26 < *       distribution.
27 < *
28 < * 3. The end-user documentation included with the redistribution,
29 < *           if any, must include the following acknowledgment:
30 < *             "This product includes Radiance software
31 < *                 (http://radsite.lbl.gov/)
32 < *                 developed by the Lawrence Berkeley National Laboratory
33 < *               (http://www.lbl.gov/)."
34 < *       Alternately, this acknowledgment may appear in the software itself,
35 < *       if and wherever such third-party acknowledgments normally appear.
36 < *
37 < * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
38 < *       and "The Regents of the University of California" must
39 < *       not be used to endorse or promote products derived from this
40 < *       software without prior written permission. For written
41 < *       permission, please contact [email protected].
42 < *
43 < * 5. Products derived from this software may not be called "Radiance",
44 < *       nor may "Radiance" appear in their name, without prior written
45 < *       permission of Lawrence Berkeley National Laboratory.
46 < *
47 < * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
48 < * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
49 < * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
50 < * DISCLAIMED.   IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
51 < * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
52 < * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
53 < * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
54 < * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
55 < * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
56 < * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
57 < * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 < * SUCH DAMAGE.
59 < * ====================================================================
60 < *
61 < * This software consists of voluntary contributions made by many
62 < * individuals on behalf of Lawrence Berkeley National Laboratory.   For more
63 < * information on Lawrence Berkeley National Laboratory, please see
64 < * <http://www.lbl.gov/>.
65 < */
10 > #include "copyright.h"
11  
12 <                                /* find pipe buffer limit */
68 < #include  <sys/param.h>
12 > #include "rtprocess.h"
13  
14 < #ifndef PIPE_BUF
71 < #ifdef PIPSIZ
72 < #define PIPE_BUF        PIPSIZ
73 < #else
74 < #ifdef PIPE_MAX
75 < #define PIPE_BUF        PIPE_MAX
76 < #else
77 < #define PIPE_BUF        512             /* hyperconservative */
78 < #endif
79 < #endif
80 < #endif
14 > /*
15  
16 < #include  "vfork.h"
16 > The functions open_process() and close_process() exist in
17 > (currently) two versions, which are found in the files:
18  
19 < #ifndef BSD
20 < #include  <errno.h>
86 < #endif
19 >        win_process.c
20 >        unix_process.c
21  
22 + */
23  
24   int
25 < open_process(pd, av)            /* open communication to separate process */
26 < int     pd[3];
27 < char    *av[];
25 > process(                /* process data through pd */
26 >        SUBPROC *pd,
27 >        char    *recvbuf, char *sendbuf,
28 >        int     nbr, int nbs
29 > )
30   {
31 <        extern char     *getpath(), *getenv();
95 <        char    *compath;
96 <        int     p0[2], p1[2];
97 <                                        /* find executable */
98 <        compath = getpath(av[0], getenv("PATH"), 1);
99 <        if (compath == 0)
100 <                return(0);
101 <        if (pipe(p0) < 0 || pipe(p1) < 0)
31 >        if (!(pd->flags & PF_RUNNING))
32                  return(-1);
33 <        if ((pd[2] = vfork()) == 0) {           /* if child */
104 <                close(p0[1]);
105 <                close(p1[0]);
106 <                if (p0[0] != 0) {       /* connect p0 to stdin */
107 <                        dup2(p0[0], 0);
108 <                        close(p0[0]);
109 <                }
110 <                if (p1[1] != 1) {       /* connect p1 to stdout */
111 <                        dup2(p1[1], 1);
112 <                        close(p1[1]);
113 <                }
114 <                execv(compath, av);     /* exec command */
115 <                perror(compath);
116 <                _exit(127);
117 <        }
118 <        if (pd[2] == -1)
33 >        if (writebuf(pd->w, sendbuf, nbs) < nbs)
34                  return(-1);
35 <        close(p0[0]);
121 <        close(p1[1]);
122 <        pd[0] = p1[0];
123 <        pd[1] = p0[1];
124 <        return(PIPE_BUF);
35 >        return(readbuf(pd->r, recvbuf, nbr));
36   }
37  
38  
128 int
129 process(pd, recvbuf, sendbuf, nbr, nbs)         /* process data through pd */
130 int     pd[3];
131 char    *recvbuf, *sendbuf;
132 int     nbr, nbs;
133 {
134        if (nbs > PIPE_BUF)
135                return(-1);
136        if (writebuf(pd[1], sendbuf, nbs) < nbs)
137                return(-1);
138        return(readbuf(pd[0], recvbuf, nbr));
139 }
39  
141
40   int
41 < close_process(pd)               /* close pipes and wait for process */
42 < int     pd[3];
41 > readbuf(                /* read all of requested buffer */
42 >        int     fd,
43 >        char    *bpos,
44 >        int     siz
45 > )
46   {
47 <        int     pid, status;
147 <
148 <        close(pd[1]);
149 <        close(pd[0]);
150 <        while ((pid = wait(&status)) != -1)
151 <                if (pid == pd[2])
152 <                        return(status>>8 & 0xff);
153 <        return(-1);             /* ? unknown status */
154 < }
155 <
156 <
157 < int
158 < readbuf(fd, bpos, siz)          /* read all of requested buffer */
159 < int     fd;
160 < char    *bpos;
161 < int     siz;
162 < {
163 <        register int    cc = 0, nrem = siz;
47 >        int     cc = 0, nrem = siz;
48   retry:
49          while (nrem > 0 && (cc = read(fd, bpos, nrem)) > 0) {
50                  bpos += cc;
# Line 178 | Line 62 | retry:
62  
63  
64   int
65 < writebuf(fd, bpos, siz)         /* write all of requested buffer */
66 < int     fd;
67 < char    *bpos;
68 < int     siz;
65 > writebuf(               /* write all of requested buffer */
66 > int     fd,
67 > char    *bpos,
68 > int     siz
69 > )
70   {
71 <        register int    cc = 0, nrem = siz;
71 >        int     cc = 0, nrem = siz;
72   retry:
73          while (nrem > 0 && (cc = write(fd, bpos, nrem)) > 0) {
74                  bpos += cc;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines