|
|
1.1 root 1: #include <fio.h>
2: #include "hdr.h"
3:
4: #define RELAY "/v/bin/2500relay"
5:
6: static int frameno;
7: static int ifd, ofd;
8: static spawn(char *sys, char *relay, char *prog, int *i, int *o);
9:
10: remsetup(char *system, char *prog, char *relay)
11: {
12: if(relay == 0)
13: relay = RELAY;
14: if(spawn(system, relay, prog, &ifd, &ofd))
15: exit(1);
16: Finit(ofd, (char *)0);
17: }
18:
19: remsframe(char *str)
20: {
21: char *s;
22:
23: fprint(ifd, "%s\n", str);
24: if(s = Frdline(ofd)){
25: if(*s)
26: fprint(2, "[remote] %s\n", s);
27: } else {
28: perror("remote died");
29: exit(1);
30: }
31: }
32:
33: remiframe(int fr)
34: {
35: char buf[64];
36:
37: if(fr >= 0)
38: frameno = fr;
39: sprint(buf, "%d", frameno);
40: frameno++;
41: remsframe(buf);
42: }
43:
44: shoot(int start, int nframes, int snapc)
45: {
46: int n = nframes;
47: frameno = start;
48: print("shooting frames %d..%d\n", start, start+nframes-1);
49: while(nframes-- > 0){
50: remiframe(-1);
51: snap(snapc);
52: }
53: print("shot %d frames\n", n);
54: }
55:
56: static
57: spawn(char *sys, char *relay, char *prog, int *i, int *o)
58: {
59: int toremote[2], fromremote[2];
60: int n;
61:
62: if((pipe(toremote) < 0) || (pipe(fromremote) < 0)){
63: perror("pipe");
64: return(1);
65: }
66: if((n = fork()) < 0){
67: perror("fork");
68: return(1);
69: }
70: if(n){ /* parent */
71: *i = toremote[1];
72: close(toremote[0]);
73: *o = fromremote[0];
74: close(fromremote[1]);
75: remsframe(prog);
76: } else {
77: char buf[256];
78:
79: close(logfd);
80: dup2(toremote[0], 0);
81: dup2(fromremote[1], 1);
82: close(toremote[0]);
83: close(toremote[1]);
84: close(fromremote[0]);
85: close(fromremote[1]);
86: sprint(buf, "rsh %s '%s'", sys, relay);
87: system(buf);
88: sleep(5);
89: exit(1);
90: }
91: return(0);
92: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.