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 }
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; }