Ejemplo n.º 1
0
int main(void)
{
  char c;
  char *sen[10];
  int should_run=1;
  int usless;
  
  setup_handler(maxints);
//this one handles "^C" for 3 times
 jump:
  while(should_run){
    fflush(stdout);
    printf("Jingning > ");
  for(int i=0;i<10;i++)
    sen[i]=malloc(100*sizeof(char));
  int i=0;
  int j=0;
  
  //get token starts here:
  c=getchar();
  while(c!='\n')
    {
      if(c=='\n'){
	break;
      }
      else if(c==' '){
      	j=0;
	i++;
      }
      else if(c=='|'||c=='&'||c=='<'||c=='>'){
	i++;j=0;sen[i][j]=c;
	i++;
      }
      else{
	sen[i][j]=c;
	j++;
      }
      c=getchar();
      if(should_run==2){
	should_run=1;
	goto jump;
      }
    }//put the tokens into an array sen[]
  // all token are ready
  usless = pipexec();
  //  redirect1();  
  
  /* for(int k=0;k<=i;k++)
    {
      printf("here is token \n %s\n",sen[k]);
    }*/
  }//Everything in this bracket
  
}
Ejemplo n.º 2
0
int main (int argc, char ** argv)
{
    if (argc != 2) return 1;
    strcpy(peer, argv[1]);
    int i, kfd, mfd, ufd, cfd, sfd, fd_max;
    fd_set rfds, wfds;
    struct input_event ev;
    struct uinput_user_dev uidev;
    pthread_t serv_thread, cli_thread;
    char kbd_devname[MAX], mouse_devname[MAX], virt_devname[MAX];

    /*  TODO necessary ? */
    kfd = mfd = ufd = cfd = sfd = -1;

    pipexec("./get_devices.sh keyboard", kbd_devname);
    puts(kbd_devname);

    pipexec("./get_devices.sh mouse", mouse_devname);
    puts(mouse_devname);

    if (-1 == (kfd = open (kbd_devname, O_RDONLY)))
        error (EXIT_FAILURE, errno, "Can't open keyboard");
    if (-1 == (mfd = open (mouse_devname, O_RDONLY)))
        error (EXIT_FAILURE, errno, "Can't open mouse");
    if (-1 == (ufd = open ("/dev/uinput", O_WRONLY)))
        error (EXIT_FAILURE, errno, "Can't open virtual device");

    /* begin dirty socket work */
    pthread_create (&cli_thread, NULL, init_client, &cfd);
    pthread_create (&serv_thread, NULL, init_server, &sfd);

    /* enable keyboard events */
    ioctl (ufd, UI_SET_EVBIT, EV_KEY);
    /* all keycodes */
    for (i = 0; i < KEY_MAX; i++)
        ioctl (ufd, UI_SET_KEYBIT, i);

    /* enable mouse events */
    ioctl (ufd, UI_SET_EVBIT, EV_KEY);
    ioctl (ufd, UI_SET_EVBIT, EV_REL);
    /* all keycodes */
    ioctl (ufd, UI_SET_KEYBIT, BTN_LEFT);
    ioctl (ufd, UI_SET_KEYBIT, BTN_MIDDLE);
    ioctl (ufd, UI_SET_KEYBIT, BTN_RIGHT);
    for (i = 0; i < REL_MAX; i++)
        ioctl (ufd, UI_SET_RELBIT, i);

    /* init uinput device */
    memset (&uidev, 0, sizeof (struct uinput_user_dev));
    /* TODO get this name from elsewhere */
    strncpy (uidev.name, "virt", UINPUT_MAX_NAME_SIZE);
    uidev.id.bustype = BUS_USB;
    /* trolling */
    uidev.id.vendor = 0x1234;
    uidev.id.product = 0x1234;
    uidev.id.version = 1;
    write (ufd, &uidev, sizeof (uidev));

    /* create device */
    ioctl (ufd, UI_DEV_CREATE);

    /* TODO should I wait this late ? */
    pthread_join (cli_thread, NULL);
    pthread_join (serv_thread, NULL);

    /* since udev runs async */
    /* TODO udevadm trigger */
    sleep (5);
    puts("All init done");

    pipexec("./get_devices.sh virt", virt_devname);
    puts(virt_devname);

    /* start qws here */
    if (!fork())
        launch_qws(virt_devname);

    while (1)
        {
            /* monitor read on kfd, mfd and cfd */
            FD_ZERO (&rfds);
            FD_SET (kfd, &rfds);
            FD_SET (mfd, &rfds);
            FD_SET (cfd, &rfds);

            /* monitor write on sfd and ufd */
            FD_ZERO (&wfds);
            FD_SET (sfd, &wfds);
            FD_SET (ufd, &wfds);

            /* calculate maximum socket value */
            fd_max = kfd;
            if (fd_max < mfd) fd_max = mfd;
            if (fd_max < ufd) fd_max = ufd;
            if (fd_max < cfd) fd_max = cfd;
            if (fd_max < sfd) fd_max = sfd;

            select (fd_max + 1, &rfds, &wfds, NULL, NULL);

            if (FD_ISSET (kfd, &rfds))
                {
                    read (kfd, &ev, sizeof (struct input_event));
                    puts("Input from local keyboard");
                    //while (! (FD_ISSET (ufd, &wfds)));
                    write (ufd, &ev, sizeof (struct input_event));
                    puts("Output to virtual device");
                    FD_SET (ufd, &wfds);
                    /* TODO could this block ? */
                    //while (! (FD_ISSET (sfd, &wfds)));
                    write (sfd, &ev, sizeof (struct input_event));
                    puts("Output to server");
                    FD_SET (sfd, &wfds);
                }

            else if (FD_ISSET (mfd, &rfds))
                {
                    read (mfd, &ev, sizeof (struct input_event));
                    puts("Input from local mouse");
                    //while (! (FD_ISSET (ufd, &wfds)));
                    write (ufd, &ev, sizeof (struct input_event));
                    puts("Output to virtual device");
                    FD_SET (ufd, &wfds);
                    /* TODO could this block ? */
                    //while (! (FD_ISSET (sfd, &wfds)));
                    write (sfd, &ev, sizeof (struct input_event));
                    puts("Output to server");
                    FD_SET (sfd, &wfds);
                }

            else if (FD_ISSET (cfd, &rfds))
                {
                    read (cfd, &ev, sizeof (struct input_event));
                    puts("Incoming event from remote server");
                    //while (! (FD_ISSET (ufd, &wfds)));
                    write (ufd, &ev, sizeof (struct input_event));
                    puts("Output to virtual device");
                    FD_SET (ufd, &wfds);
                }
        }

    /* kill the bad guys */
    ioctl (ufd, UI_DEV_DESTROY);
    close (ufd);
    close (kfd);
    close (mfd);
    close (cfd);
    close (sfd);
    return EXIT_SUCCESS;
}