ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/process.c
Revision: 2.12
Committed: Mon Jun 3 18:55:51 2024 UTC (11 days, 11 hours ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 2.11: +6 -4 lines
Log Message:
refactor: Changed buffer types in process(), readbuf(), writebuf()

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.12 static const char RCSid[] = "$Id: process.c,v 2.11 2021/01/15 19:01:53 greg Exp $";
3 greg 1.1 #endif
4     /*
5     * Routines to communicate with separate process via dual pipes
6 greg 2.5 *
7 greg 2.11 * External symbols declared in rtprocess.h
8 greg 2.5 */
9    
10 greg 2.6 #include "copyright.h"
11 greg 1.1
12 schorsch 2.7 #include "rtprocess.h"
13 greg 1.1
14 schorsch 2.7 /*
15 greg 1.1
16 schorsch 2.7 The functions open_process() and close_process() exist in
17     (currently) two versions, which are found in the files:
18 greg 1.1
19 schorsch 2.7 win_process.c
20     unix_process.c
21 greg 1.1
22 schorsch 2.7 */
23 greg 2.4
24 greg 1.1 int
25 schorsch 2.7 process( /* process data through pd */
26 greg 2.9 SUBPROC *pd,
27 greg 2.12 void *recvbuf, void *sendbuf,
28 greg 2.9 int nbr, int nbs
29 schorsch 2.7 )
30 greg 1.1 {
31 greg 2.9 if (!(pd->flags & PF_RUNNING))
32 greg 2.8 return(-1);
33 schorsch 2.7 if (writebuf(pd->w, sendbuf, nbs) < nbs)
34 greg 1.1 return(-1);
35 schorsch 2.7 return(readbuf(pd->r, recvbuf, nbr));
36 greg 1.1 }
37    
38    
39    
40 greg 2.11 ssize_t
41 schorsch 2.7 readbuf( /* read all of requested buffer */
42 greg 2.9 int fd,
43 greg 2.12 void *buf,
44 greg 2.11 ssize_t siz
45 schorsch 2.7 )
46 greg 1.1 {
47 greg 2.12 char *bpos = (char *)buf;
48 greg 2.11 ssize_t cc = 0, nrem = siz;
49 greg 2.4 retry:
50 greg 1.1 while (nrem > 0 && (cc = read(fd, bpos, nrem)) > 0) {
51     bpos += cc;
52     nrem -= cc;
53     }
54 greg 2.4 if (cc < 0) {
55     #ifndef BSD
56     if (errno == EINTR) /* we were interrupted! */
57     goto retry;
58     #endif
59 greg 1.1 return(cc);
60 greg 2.4 }
61 greg 1.1 return(siz-nrem);
62     }
63    
64    
65 greg 2.11 ssize_t
66 schorsch 2.7 writebuf( /* write all of requested buffer */
67     int fd,
68 greg 2.12 void *buf,
69 greg 2.11 ssize_t siz
70 schorsch 2.7 )
71 greg 1.1 {
72 greg 2.12 char *bpos = (char *)buf;
73 greg 2.11 ssize_t cc = 0, nrem = siz;
74 greg 2.4 retry:
75 greg 1.1 while (nrem > 0 && (cc = write(fd, bpos, nrem)) > 0) {
76     bpos += cc;
77     nrem -= cc;
78     }
79 greg 2.4 if (cc < 0) {
80     #ifndef BSD
81     if (errno == EINTR) /* we were interrupted! */
82     goto retry;
83     #endif
84 greg 1.1 return(cc);
85 greg 2.4 }
86 greg 1.1 return(siz-nrem);
87     }