123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <pty.h>
- #include <termios.h>
- #include <fcntl.h>
- #include <sys/select.h>
- #include <sys/wait.h>
- #include <signal.h> // handle Ctrl-C/SIGINT
- #include <time.h> // usleep(), nanonsleep() ?
- #include <strings.h> // strcasecmp
- #include <stdlib.h> // random()
- #define TARGET "./mySTIC"
- #define BSIZE 1024
- #define LOGGING
- const char * it_is_now(void) {
- static char buffer[100];
- time_t timer;
- struct tm* tm_info;
- timer = time(NULL);
- tm_info = localtime(&timer);
- strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", tm_info);
- return buffer;
- }
- void slow_write(int fd, int speed, char * buffer, int len) {
- int x;
- for( x = 0; x < len; x++) {
- usleep(speed);
- write( fd, &buffer[x], 1);
- }
- }
- void harry_event(int fd) {
-
- char clear[] = "\b \b";
- int x;
- char haha[] = "Hahaha hahaha!!!";
- char beep = '\a';
- slow_write(fd, 11500, haha, strlen(haha) );
- write(fd, &beep, 1);
- sleep(3);
- for( x = 0; x < strlen(haha); x++ ) {
- write(fd, clear, strlen(clear) );
- };
- }
- char * username = NULL;
- char * fullname = NULL;
- void pcopy(char * pstring, char * str) {
- int len = (int)*pstring;
- strncpy( str, pstring+1, len );
- str[len] = 0;
- }
- int locate_user(const char *alias) {
- FILE * user;
- char buffer[0x600];
- char temp[100];
- user = fopen("data/users.dat", "rb");
- if (user == NULL)
- return 0;
-
- while (fread(buffer, 0x600, 1, user) == 1) {
- pcopy( buffer + 0x6d, temp );
- if ( strcasecmp( temp, username) == 0) {
- pcopy(buffer + 0x8c, temp );
- fullname = strdup(temp);
- break;
- }
-
- }
- fclose(user);
- return 1;
- }
- void mangle( char * buffer ) {
-
-
-
- }
- int main(int argc, char * argv[])
- {
- int master;
- pid_t pid;
-
- #ifdef LOGGING
- FILE * fp;
- fp = fopen("mystic_pipe.data", "wb");
- if ( fp == NULL ) {
- return 2;
- }
- #endif
- srandom(time(NULL));
-
-
- for (int x = 0; x < argc; x++) {
- if (strncmp("-U", argv[x], 2) == 0) {
- username = argv[x] + 2;
- #ifdef LOGGING
- fprintf(fp, "Username: [%s]\n", username);
- #endif
- break;
- }
- }
- if (username != NULL) {
- locate_user(username);
- #ifdef LOGGING
- fprintf(fp, "Username: [%s] A.K.A. [%s]\n", username, fullname);
- #endif
- }
-
-
- pid = forkpty(&master, NULL, NULL, NULL);
-
- if (pid < 0) {
- return 1;
- }
-
- else if (pid == 0) {
- char *args[20];
- int x;
- args[0] = TARGET;
- for ( x = 1; x < argc; x++ ) {
- args[x] = argv[x];
- };
- args[x] = NULL;
-
-
- execvp( TARGET, args);
- }
-
- else {
-
-
- struct termios tios, orig1;
- struct timeval timeout;
- int last_event;
- tcgetattr(master, &tios);
- tios.c_lflag &= ~(ECHO | ECHONL | ICANON );
- tcsetattr(master, TCSAFLUSH, &tios);
- tcgetattr(1, &orig1);
- tios = orig1;
- tios.c_iflag &= ~(ICRNL | IXON);
- tios.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN );
-
-
- tcsetattr(1, TCSAFLUSH, &tios);
- for (;;) {
-
-
- fd_set read_fd;
- fd_set write_fd;
- fd_set except_fd;
-
- FD_ZERO(&read_fd);
- FD_ZERO(&write_fd);
- FD_ZERO(&except_fd);
-
- FD_SET(master, &read_fd);
-
- FD_SET(STDIN_FILENO, &read_fd);
-
-
-
- timeout.tv_sec = 10;
- timeout.tv_usec = 0;
-
- if ( select(master+1, &read_fd, &write_fd, &except_fd, &timeout) == 0 ) {
-
- harry_event(STDOUT_FILENO);
- #ifdef LOGGING
- fprintf(fp, "%s : TICK\n", it_is_now());
- #endif
- }
- char input[BSIZE + 1];
- char output[BSIZE + 1];
- int total;
-
- if (FD_ISSET(master, &read_fd))
- {
-
- if ((total = read(master, &output, BSIZE)) != -1) {
-
- output[total] = 0;
- if (random() % 20 < 3) {
- mangle( output );
- }
- write(STDOUT_FILENO, &output, total);
-
- #ifdef LOGGING
- fprintf(fp, ">> [%s]\n", output);
- #endif
- } else
- break;
- }
-
- if (FD_ISSET(STDIN_FILENO, &read_fd))
- {
-
- total = read(STDIN_FILENO, &input, BSIZE);
- input[total] = 0;
-
- write(master, &input, total);
-
- #ifdef LOGGING
- fprintf(fp, "<< [%s]\n", input);
- #endif
- }
- }
- tcsetattr(1, TCSAFLUSH, &orig1);
- #ifdef LOGGING
- fclose(fp);
- #endif
- }
- return 0;
- }
|