#include #include #include #include #include #include #include #include #include void sprog_process(const struct sprog_family *fam, void *arg, int nstdin, int nstdout); void sprog_error(const char *text, ...) { va_list l; va_start(l, text); vfprintf(stderr, text, l); va_end(l); } void sprog_sleep(int msec) { usleep(msec * 1000); } void sprog_communicate(const struct sprog_family *fam, const char *port, int baud) { int pstdin[2]; int pstdout[2]; int pid; void *arg; struct serial_device dev; serial_open(&dev, port, baud); arg = fam->setup(&dev); pipe(pstdin); pipe(pstdout); pid = fork(); if(pid<0) sprog_error("Unable to fork: %s\n", strerror(errno)); else { if(pid!=0) { close(pstdin[0]); close(pstdout[1]); /* serial_communicate(&dev, pstdout[0], pstdin[1]); */ waitpid(pid, NULL, 0); fam->close(arg); } else { close(pstdin[1]); close(pstdout[0]); /* sprog_process(fam, arg, pstdin[0], pstdout[1]); */ sprog_process(fam, arg, dev.fd, dev.fd); } } } int sprog_waitdata(int timeout) { fd_set read_set; struct timeval tval; FD_ZERO(&read_set); FD_SET(1, &read_set); tval.tv_sec = timeout/1000; tval.tv_usec = (timeout%1000)*1000; if(select(1+1, &read_set, NULL, NULL, &tval)!=1) return 0; return 1; } void sprog_process(const struct sprog_family *fam, void *arg, int nstdin, int nstdout) { dup2(nstdin, 0); dup2(nstdout, 1); fam->init(arg); exit(0); }