Example #1
0
File: tee.c Project: coffeez/FFmpeg
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;
}
Example #2
0
File: tee.c Project: 26mansi/FFmpeg
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;
}
Example #3
0
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;
}
Example #4
0
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;
}