diff -Naur vde2-2.1.6/unixterm/unixterm.c vde2-2.1.6-unixterm/unixterm/unixterm.c --- vde2-2.1.6/unixterm/unixterm.c 2006-07-07 16:54:39.000000000 +0200 +++ vde2-2.1.6/unixterm/unixterm.c 2007-04-03 12:49:14.000000000 +0200 @@ -4,6 +4,8 @@ * Minimal terminal emulator on a UNIX stream socket */ +/* render: addedd support for stdin commands */ + #include #include #include @@ -11,10 +13,12 @@ #include #include #include - +#include #include #define BUFSIZE 1024 +#define LINESIZE 1025 +#define THRESHOLD 4 char buf[BUFSIZE]; int main(int argc,char *argv[]) @@ -23,25 +27,168 @@ int fd; int rv; static struct pollfd pfd[]={ - {STDIN_FILENO,POLLIN | POLLHUP,0}, - {STDIN_FILENO,POLLIN | POLLHUP,0}}; + {STDIN_FILENO,POLLIN | POLLHUP, 0}, + {STDIN_FILENO,POLLIN | POLLHUP, 0}}; static int fileout[]={STDOUT_FILENO,STDOUT_FILENO}; + int optret; + char *sockpath, *sockname; + char sentinel = 0; + unsigned char injecting = 0; + unsigned char optcount = 0; + unsigned char failures = 0; + unsigned char loggedout = 0; + unsigned char ok_to_write = 0; + + /* options management loop */ + while (1) { + static struct option options[] = { + {"inject", 0, 0, 0}, /* get command list from stdin */ + {"socket", 1, 0, 0}, /* management socket */ + {0, 0, 0, 0} /* default case */ + }; + int option_index = 0; + + if ((optret = getopt_long (argc, argv, "is:", options, &option_index)) == -1) + break; + + optcount++; + + switch (optret) { + case 0: + switch (option_index) { + case 0: + injecting = 1; + break; + case 1: + if ((sockpath = strdup(optarg)) == NULL) + fprintf(stderr, "strdup error\n"); + sockname = (char *)basename(sockpath); + break; + default: + fprintf(stderr, "unknown long option\n"); + break; + } + + break; + + case 'i': + injecting = 1; + break; + + case 's': + if ((sockpath = strdup(optarg)) == NULL) + fprintf(stderr, "strdup error\n"); + sockname = (char *)basename(sockpath); + break; + + case '?': + fprintf(stderr, "unknown short option\n"); + break; + + default: + fprintf(stderr, "default case!\n"); + break; + } + } + sun.sun_family=PF_UNIX; - snprintf(sun.sun_path,sizeof(sun.sun_path),"%s",argv[1]); + snprintf(sun.sun_path,sizeof(sun.sun_path),"%s", optcount ? sockpath : argv[1]); + fd=socket(PF_UNIX,SOCK_STREAM,0); - rv=connect(fd,(struct sockaddr *)(&sun),sizeof(sun)); + + if (connect(fd, (struct sockaddr *)(&sun), sizeof(sun)) < 0) { + perror("connect"); + exit(-1); + } + pfd[1].fd=fileout[0]=fd; + while(1) { - int m,i,n=poll(pfd,2,-1); - for(i=0;n>0;i++) { - if(pfd[i].revents & POLLHUP) - exit(0); + int ccount,m,i,n = poll(pfd,2,-1); + for(i = 0; n > 0; i++) { if(pfd[i].revents & POLLIN) { - n--; - if((m=read(pfd[i].fd,buf,BUFSIZE)) == 0) + --n; + if (injecting) { + switch (i) { + case 0: + if (!feof(stdin)) { + ccount = 0; + + if (sentinel > 0) { + buf[ccount] = sentinel; + ccount++; + } + + while ((buf[ccount] = fgetc(stdin)) != '\n' && !feof(stdin)) + ccount++; + /* avoid write of empty lines */ + if ((ccount > 0) && (buf[0] != '\n')) { + write(fileout[i],buf,ccount); + } + sentinel = fgetc(stdin); + } + /* end of stdin: logout from management console */ + if (feof(stdin) && !loggedout) { + write(fileout[i],"logout\n",strlen("logout\n")); + loggedout = 1; + } + + break; + case 1: { + int cursor = 0; + int base = 0; + char line[LINESIZE]; + unsigned char start = 1; + + if ((m = read(pfd[i].fd,buf,BUFSIZE)) == 0) + exit(0); + + while (cursor < m) { + while ((buf[cursor] != '\n') && (cursor <= m)) + cursor++; + + memcpy(line, &buf[base], cursor - base + 1); + + if (!ok_to_write && (start = (strstr(line, "0000 DATA") == NULL))) { + base += (cursor - base) + 1; + cursor += 1; + } else { + if (ok_to_write && (strstr(line, ".\n") != NULL)) { + ok_to_write = 0; + } + + if (ok_to_write) { + write(fileout[i],sockname, strlen(sockname)); + write(fileout[i],": ", 2); + write(fileout[i],line,cursor - base + 1); + } + else { + if (!start) { + ok_to_write = 1; + start = 1; + } + } + base += (cursor - base) + 1; + cursor += 1; + } + } + + break; + } + } + } else { + if((m=read(pfd[i].fd,buf,BUFSIZE)) == 0) + exit(0); + + write(fileout[i],buf,m); + } + } + + if(pfd[i].revents & POLLHUP) { + --n; + if (sentinel > 0) exit(0); - write(fileout[i],buf,m); } - } - } + } /* for */ + } /* infinite while */ }