--- ray/src/common/process.c 2003/02/22 02:07:22 2.5
+++ ray/src/common/process.c 2024/10/29 00:35:06 2.13
@@ -1,166 +1,51 @@
#ifndef lint
-static const char RCSid[] = "$Id: process.c,v 2.5 2003/02/22 02:07:22 greg Exp $";
+static const char RCSid[] = "$Id: process.c,v 2.13 2024/10/29 00:35:06 greg Exp $";
#endif
/*
* Routines to communicate with separate process via dual pipes
*
- * External symbols declared in standard.h
+ * External symbols declared in rtprocess.h
*/
-/* ====================================================================
- * The Radiance Software License, Version 1.0
- *
- * Copyright (c) 1990 - 2002 The Regents of the University of California,
- * through Lawrence Berkeley National Laboratory. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes Radiance software
- * (http://radsite.lbl.gov/)
- * developed by the Lawrence Berkeley National Laboratory
- * (http://www.lbl.gov/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
- * and "The Regents of the University of California" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact radiance@radsite.lbl.gov.
- *
- * 5. Products derived from this software may not be called "Radiance",
- * nor may "Radiance" appear in their name, without prior written
- * permission of Lawrence Berkeley National Laboratory.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of Lawrence Berkeley National Laboratory. For more
- * information on Lawrence Berkeley National Laboratory, please see
- * .
- */
+#include "copyright.h"
- /* find pipe buffer limit */
-#include
+#include "rtprocess.h"
-#ifndef PIPE_BUF
-#ifdef PIPSIZ
-#define PIPE_BUF PIPSIZ
-#else
-#ifdef PIPE_MAX
-#define PIPE_BUF PIPE_MAX
-#else
-#define PIPE_BUF 512 /* hyperconservative */
-#endif
-#endif
-#endif
+/*
-#include "vfork.h"
+The functions open_process() and close_process() exist in
+(currently) two versions, which are found in the files:
-#ifndef BSD
-#include
-#endif
+ win_process.c
+ unix_process.c
+*/
int
-open_process(pd, av) /* open communication to separate process */
-int pd[3];
-char *av[];
+process( /* process data through pd */
+ SUBPROC *pd,
+ void *recvbuf, void *sendbuf,
+ int nbr, int nbs
+)
{
- extern char *getpath(), *getenv();
- char *compath;
- int p0[2], p1[2];
- /* find executable */
- compath = getpath(av[0], getenv("PATH"), 1);
- if (compath == 0)
- return(0);
- if (pipe(p0) < 0 || pipe(p1) < 0)
+ if (!(pd->flags & PF_RUNNING))
return(-1);
- if ((pd[2] = vfork()) == 0) { /* if child */
- close(p0[1]);
- close(p1[0]);
- if (p0[0] != 0) { /* connect p0 to stdin */
- dup2(p0[0], 0);
- close(p0[0]);
- }
- if (p1[1] != 1) { /* connect p1 to stdout */
- dup2(p1[1], 1);
- close(p1[1]);
- }
- execv(compath, av); /* exec command */
- perror(compath);
- _exit(127);
- }
- if (pd[2] == -1)
+ if (writebuf(pd->w, sendbuf, nbs) < nbs)
return(-1);
- close(p0[0]);
- close(p1[1]);
- pd[0] = p1[0];
- pd[1] = p0[1];
- return(PIPE_BUF);
+ return(readbuf(pd->r, recvbuf, nbr));
}
-int
-process(pd, recvbuf, sendbuf, nbr, nbs) /* process data through pd */
-int pd[3];
-char *recvbuf, *sendbuf;
-int nbr, nbs;
-{
- if (nbs > PIPE_BUF)
- return(-1);
- if (writebuf(pd[1], sendbuf, nbs) < nbs)
- return(-1);
- return(readbuf(pd[0], recvbuf, nbr));
-}
-
-int
-close_process(pd) /* close pipes and wait for process */
-int pd[3];
+ssize_t
+readbuf( /* read all of requested buffer */
+ int fd,
+ void *buf,
+ ssize_t siz
+)
{
- int pid, status;
-
- close(pd[1]);
- close(pd[0]);
- while ((pid = wait(&status)) != -1)
- if (pid == pd[2])
- return(status>>8 & 0xff);
- return(-1); /* ? unknown status */
-}
-
-
-int
-readbuf(fd, bpos, siz) /* read all of requested buffer */
-int fd;
-char *bpos;
-int siz;
-{
- register int cc = 0, nrem = siz;
+ char *bpos = (char *)buf;
+ ssize_t cc = 0, nrem = siz;
retry:
while (nrem > 0 && (cc = read(fd, bpos, nrem)) > 0) {
bpos += cc;
@@ -177,13 +62,15 @@ retry:
}
-int
-writebuf(fd, bpos, siz) /* write all of requested buffer */
-int fd;
-char *bpos;
-int siz;
+ssize_t
+writebuf( /* write all of requested buffer */
+int fd,
+const void *buf,
+ssize_t siz
+)
{
- register int cc = 0, nrem = siz;
+ const char *bpos = (const char *)buf;
+ ssize_t cc = 0, nrem = siz;
retry:
while (nrem > 0 && (cc = write(fd, bpos, nrem)) > 0) {
bpos += cc;