Example #1
0
int		main(int argc, char **argv)
{
    int		master_fd;
    int		opt[2];

    if (prepare_options(argc, argv, opt))
      {
	if (prepare_tcattr())
	  {
	    if (open_master(&master_fd))
	      {
		if (fork_pty(master_fd,
			     (opt[0] == -1 ? DEFAULT_SCRIPT_ : argv[opt[0]]),
			     opt[1]))
		  {
		    close(master_fd);
		    return (reset_settings());
		  }
		close(master_fd);
	      }
	    reset_settings();
	  }
      }
    return (EXIT_FAILURE);
}
Example #2
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 #3
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;
}