static int tee_write_header(AVFormatContext *avf) { TeeContext *tee = avf->priv_data; unsigned nb_slaves = 0, i; const char *filename = avf->filename; char **slaves = NULL; int ret; while (*filename) { char *slave = av_get_token(&filename, slave_delim); if (!slave) { ret = AVERROR(ENOMEM); goto fail; } ret = av_dynarray_add_nofree(&slaves, &nb_slaves, slave); if (ret < 0) { av_free(slave); goto fail; } if (strspn(filename, slave_delim)) filename++; } if (!(tee->slaves = av_mallocz_array(nb_slaves, sizeof(*tee->slaves)))) { ret = AVERROR(ENOMEM); goto fail; } tee->nb_slaves = tee->nb_alive = nb_slaves; for (i = 0; i < nb_slaves; i++) { if ((ret = open_slave(avf, slaves[i], &tee->slaves[i])) < 0) { ret = tee_process_slave_failure(avf, i, ret); if (ret < 0) goto fail; } else { log_slave(&tee->slaves[i], avf, AV_LOG_VERBOSE); } av_freep(&slaves[i]); } for (i = 0; i < avf->nb_streams; i++) { int j, mapped = 0; for (j = 0; j < tee->nb_slaves; j++) if (tee->slaves[j].avf) mapped += tee->slaves[j].stream_map[i] >= 0; if (!mapped) av_log(avf, AV_LOG_WARNING, "Input stream #%d is not mapped " "to any slave.\n", i); } av_free(slaves); return 0; fail: for (i = 0; i < nb_slaves; i++) av_freep(&slaves[i]); close_slaves(avf); av_free(slaves); return ret; }
static int tee_write_header(AVFormatContext *avf) { TeeContext *tee = avf->priv_data; unsigned nb_slaves = 0, i; const char *filename = avf->filename; char *slaves[MAX_SLAVES]; int ret; while (*filename) { if (nb_slaves == MAX_SLAVES) { av_log(avf, AV_LOG_ERROR, "Maximum %d slave muxers reached.\n", MAX_SLAVES); ret = AVERROR_PATCHWELCOME; goto fail; } if (!(slaves[nb_slaves++] = av_get_token(&filename, slave_delim))) { ret = AVERROR(ENOMEM); goto fail; } if (strspn(filename, slave_delim)) filename++; } for (i = 0; i < nb_slaves; i++) { if ((ret = open_slave(avf, slaves[i], &tee->slaves[i])) < 0) goto fail; log_slave(&tee->slaves[i], avf, AV_LOG_VERBOSE); av_freep(&slaves[i]); } tee->nb_slaves = nb_slaves; for (i = 0; i < avf->nb_streams; i++) { int j, mapped = 0; for (j = 0; j < tee->nb_slaves; j++) mapped += tee->slaves[j].stream_map[i] >= 0; if (!mapped) av_log(avf, AV_LOG_WARNING, "Input stream #%d is not mapped " "to any slave.\n", i); } return 0; fail: for (i = 0; i < nb_slaves; i++) av_freep(&slaves[i]); close_slaves(avf); return ret; }
pid_t forkpty(int *masterp, char *name, struct termios * termp, struct winsize * winp) { int master, slave; char ptname[PATH_MAX]; pid_t pid; master = open_master(ptname, sizeof (ptname)); if (master < 0) { return -1; } slave = open_slave(ptname); if (slave < 0) { close(master); return -1; } if (name) strcpy(name, ptname); if (termp) tcsetattr(slave, TCSAFLUSH, termp); if (winp) ioctl(slave, TIOCSWINSZ, winp); pid = fork(); if (pid < 0) { close(slave); close(master); return -1; } else if (pid == 0) { /* child/slave */ close(master); login_tty(slave); return 0; } /* parent/master */ *masterp = master; close(slave); return pid; }
int main (int argc, char **argv) { int confd,ptyfd,ttyfd; int status,len; char *ptyname; argc--; argv++; if (! *argv) { printf("usage: kbdsh program arguments\n"); exit(-1); } if ((confd = open("/dev/console",O_RDWR,0644)) < 0) { printf("could not open /dev/console\n"); exit (-1); } if ((ptyfd = open_master(&ptyname)) == -1) { printf("could not open master pty\n"); return -1; } if ((ttyfd = open_slave(ptyname)) == -1) { printf("could not open slave of %s\n",ptyname); close(ptyfd); return -1; } if (!fork()) { /* child */ close(ptyfd); close(confd); dup2(ttyfd,0); dup2(ttyfd,1); dup2(ttyfd,2); kprintf("starting: %s\n",*argv); status = execvp(*argv, argv); printf("execvp %s failed %d\n",*argv, status); exit(-1); } else { /* parent */ struct timeval t = { 1 , 0}; close(ttyfd); kprintf("parent\n"); for(;;) { fd_set fdset; FD_ZERO(&fdset); FD_SET(ptyfd,&fdset); if ((len = read(confd,buffer,BSIZE))) { int i; /* remap \n to \r */ for (i = 0; i < len ; i++) { if (buffer[i] == 13) { buffer[i] = 10; } } write(confd,buffer,len); write(ptyfd,buffer,len); } if (select(32,&fdset,0,0,&t)) { len = read(ptyfd,buffer,BSIZE); buffer[len] = 0; write(confd,buffer,len); } if (wait4(0,&status,WNOHANG,0)) { kprintf("child returned: %d\n",status); exit(0); kprintf("BAD\n"); } yield(-1); } } return 0; }