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.8 by greg, Fri Sep 17 21:43:49 2004 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   {
94        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)
102                return(-1);
103        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)
119                return(-1);
120        close(p0[0]);
121        close(p1[1]);
122        pd[0] = p1[0];
123        pd[1] = p0[1];
124        return(PIPE_BUF);
125 }
126
127
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 {
31          if (nbs > PIPE_BUF)
32                  return(-1);
33 <        if (writebuf(pd[1], sendbuf, nbs) < nbs)
33 >        if (!pd->running)
34                  return(-1);
35 <        return(readbuf(pd[0], recvbuf, nbr));
35 >        if (writebuf(pd->w, sendbuf, nbs) < nbs)
36 >                return(-1);
37 >        return(readbuf(pd->r, recvbuf, nbr));
38   }
39  
40  
142 int
143 close_process(pd)               /* close pipes and wait for process */
144 int     pd[3];
145 {
146        int     pid, status;
41  
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
42   int
43 < readbuf(fd, bpos, siz)          /* read all of requested buffer */
44 < int     fd;
45 < char    *bpos;
46 < int     siz;
43 > readbuf(                /* read all of requested buffer */
44 > int     fd,
45 > char    *bpos,
46 > int     siz
47 > )
48   {
49          register int    cc = 0, nrem = siz;
50   retry:
# Line 178 | Line 64 | retry:
64  
65  
66   int
67 < writebuf(fd, bpos, siz)         /* write all of requested buffer */
68 < int     fd;
69 < char    *bpos;
70 < int     siz;
67 > writebuf(               /* write all of requested buffer */
68 > int     fd,
69 > char    *bpos,
70 > int     siz
71 > )
72   {
73          register int    cc = 0, nrem = siz;
74   retry:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines