V10/cmd/2500/remote.c
#include <fio.h>
#include "hdr.h"
#define RELAY "/v/bin/2500relay"
static int frameno;
static int ifd, ofd;
static spawn(char *sys, char *relay, char *prog, int *i, int *o);
remsetup(char *system, char *prog, char *relay)
{
if(relay == 0)
relay = RELAY;
if(spawn(system, relay, prog, &ifd, &ofd))
exit(1);
Finit(ofd, (char *)0);
}
remsframe(char *str)
{
char *s;
fprint(ifd, "%s\n", str);
if(s = Frdline(ofd)){
if(*s)
fprint(2, "[remote] %s\n", s);
} else {
perror("remote died");
exit(1);
}
}
remiframe(int fr)
{
char buf[64];
if(fr >= 0)
frameno = fr;
sprint(buf, "%d", frameno);
frameno++;
remsframe(buf);
}
shoot(int start, int nframes, int snapc)
{
int n = nframes;
frameno = start;
print("shooting frames %d..%d\n", start, start+nframes-1);
while(nframes-- > 0){
remiframe(-1);
snap(snapc);
}
print("shot %d frames\n", n);
}
static
spawn(char *sys, char *relay, char *prog, int *i, int *o)
{
int toremote[2], fromremote[2];
int n;
if((pipe(toremote) < 0) || (pipe(fromremote) < 0)){
perror("pipe");
return(1);
}
if((n = fork()) < 0){
perror("fork");
return(1);
}
if(n){ /* parent */
*i = toremote[1];
close(toremote[0]);
*o = fromremote[0];
close(fromremote[1]);
remsframe(prog);
} else {
char buf[256];
close(logfd);
dup2(toremote[0], 0);
dup2(fromremote[1], 1);
close(toremote[0]);
close(toremote[1]);
close(fromremote[0]);
close(fromremote[1]);
sprint(buf, "rsh %s '%s'", sys, relay);
system(buf);
sleep(5);
exit(1);
}
return(0);
}