ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/devcomm.c
Revision: 2.3
Committed: Mon Apr 5 15:16:47 1993 UTC (31 years ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.2: +32 -26 lines
Log Message:
added slave_init() for slave mode of rview

File Contents

# Content
1 /* Copyright (c) 1988 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * devcomm.c - communication routines for separate drivers.
9 *
10 * 10/5/88
11 */
12
13 #include "standard.h"
14
15 #include "color.h"
16
17 #include "driver.h"
18
19 #include "vfork.h"
20
21 #ifndef DEVPATH
22 #define DEVPATH getenv("PATH") /* device search path */
23 #endif
24
25 static int comm_close(), comm_clear(), comm_paintr(),
26 comm_getcur(), comm_comout(), comm_comin(), comm_flush();
27
28 struct driver comm_driver = {
29 comm_close, comm_clear, comm_paintr, comm_getcur,
30 comm_comout, comm_comin, comm_flush
31 };
32
33 FILE *devin, *devout;
34
35 int devchild;
36
37
38 static struct driver *
39 final_connect() /* verify and initialize connection */
40 {
41 putw(COM_SENDM, devout);
42 fflush(devout);
43 if (getw(devin) != COM_RECVM)
44 return(NULL);
45 /* get driver parameters */
46 getstate();
47 /* set error vectors */
48 cmdvec = comm_comout;
49 if (wrnvec != NULL)
50 wrnvec = comm_comout;
51 return(&comm_driver);
52 }
53
54
55 struct driver *
56 slave_init(dname, id) /* run rview in slave mode */
57 char *dname, *id;
58 {
59 devchild = -1; /* we're the slave here */
60 devout = stdout; /* use standard input */
61 devin = stdin; /* and standard output */
62 return(final_connect()); /* verify initialization */
63 }
64
65
66 struct driver *
67 comm_init(dname, id) /* set up and execute driver */
68 char *dname, *id;
69 {
70 char *devname;
71 int p1[2], p2[2];
72 char pin[16], pout[16];
73 /* find driver program */
74 if ((devname = getpath(dname, DEVPATH, X_OK)) == NULL) {
75 stderr_v(dname);
76 stderr_v(": not found\n");
77 return(NULL);
78 }
79 /* open communication pipes */
80 if (pipe(p1) == -1 || pipe(p2) == -1)
81 goto syserr;
82 if ((devchild = vfork()) == 0) { /* fork driver process */
83 close(p1[1]);
84 close(p2[0]);
85 sprintf(pin, "%d", p1[0]);
86 sprintf(pout, "%d", p2[1]);
87 execl(devname, dname, pin, pout, id, 0);
88 perror(devname);
89 _exit(127);
90 }
91 if (devchild == -1)
92 goto syserr;
93 close(p1[0]);
94 close(p2[1]);
95 if ((devout = fdopen(p1[1], "w")) == NULL)
96 goto syserr;
97 if ((devin = fdopen(p2[0], "r")) == NULL)
98 goto syserr;
99 return(final_connect()); /* verify initialization */
100 syserr:
101 perror(dname);
102 return(NULL);
103 }
104
105
106 static
107 comm_close() /* done with driver */
108 {
109 int pid;
110
111 cmdvec = NULL; /* reset error vectors */
112 if (wrnvec != NULL)
113 wrnvec = stderr_v;
114 fclose(devout);
115 fclose(devin);
116 if (devchild < 0)
117 return;
118 while ((pid = wait(0)) != -1 && pid != devchild)
119 ;
120 }
121
122
123 static
124 comm_clear(xres, yres) /* clear screen */
125 int xres, yres;
126 {
127 putc(COM_CLEAR, devout);
128 putw(xres, devout);
129 putw(yres, devout);
130 fflush(devout);
131 }
132
133
134 static
135 comm_paintr(col, xmin, ymin, xmax, ymax) /* paint a rectangle */
136 COLOR col;
137 int xmin, ymin, xmax, ymax;
138 {
139 putc(COM_PAINTR, devout);
140 fwrite((char *)col, sizeof(COLOR), 1, devout);
141 putw(xmin, devout);
142 putw(ymin, devout);
143 putw(xmax, devout);
144 putw(ymax, devout);
145 }
146
147
148 static
149 comm_flush() /* flush output to driver */
150 {
151 putc(COM_FLUSH, devout);
152 fflush(devout);
153 if (getc(devin) != COM_FLUSH)
154 reply_error("flush");
155 getstate();
156 }
157
158
159 static int
160 comm_getcur(xp, yp) /* get and return cursor position */
161 int *xp, *yp;
162 {
163 int c;
164
165 putc(COM_GETCUR, devout);
166 fflush(devout);
167 if (getc(devin) != COM_GETCUR)
168 reply_error("getcur");
169 c = getc(devin);
170 *xp = getw(devin);
171 *yp = getw(devin);
172 return(c);
173 }
174
175
176 static
177 comm_comout(str) /* print string to command line */
178 char *str;
179 {
180 putc(COM_COMOUT, devout);
181 myputs(str, devout);
182 if (str[strlen(str)-1] == '\n')
183 fflush(devout);
184 }
185
186
187 static
188 comm_comin(buf, prompt) /* read string from command line */
189 char *buf;
190 char *prompt;
191 {
192 putc(COM_COMIN, devout);
193 if (prompt == NULL)
194 putc(0, devout);
195 else {
196 putc(1, devout);
197 myputs(prompt, devout);
198 }
199 fflush(devout);
200 if (getc(devin) != COM_COMIN)
201 reply_error("comin");
202 mygets(buf, devin);
203 getstate();
204 }
205
206
207 static
208 mygets(s, fp) /* get string from file (with nul) */
209 register char *s;
210 register FILE *fp;
211 {
212 register int c;
213
214 while ((c = getc(fp)) != EOF)
215 if ((*s++ = c) == '\0')
216 return;
217 *s = '\0';
218 }
219
220
221 static
222 myputs(s, fp) /* put string to file (with nul) */
223 register char *s;
224 register FILE *fp;
225 {
226 do
227 putc(*s, fp);
228 while (*s++);
229 }
230
231
232 static
233 reply_error(routine) /* what should we do here? */
234 char *routine;
235 {
236 stderr_v(routine);
237 stderr_v(": driver reply error\n");
238 quit(1);
239 }
240
241
242 static
243 getstate() /* get driver state variables */
244 {
245 fread((char *)&comm_driver.pixaspect,
246 sizeof(comm_driver.pixaspect), 1, devin);
247 comm_driver.xsiz = getw(devin);
248 comm_driver.ysiz = getw(devin);
249 comm_driver.inpready = getw(devin);
250 }