From 6ebd057e3ee33870481defeb2bacabe995e6e354 Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Thu, 25 Mar 2010 17:06:13 +0100 Subject: adding user input support for tsnif - user switch commands for pty channels - user command to quit the program --- src/tsnif.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/src/tsnif.c b/src/tsnif.c index 9330d15..d2bcc41 100644 --- a/src/tsnif.c +++ b/src/tsnif.c @@ -17,15 +17,31 @@ struct tsnif_term term; static int killed = 0; static int type = -1; static int idx = -1; +static int display_slave = 1; +static int display_master = 0; +static int display_pty(int flags) +{ + if ((flags == TSNIF_FLAGS_PTY_SLAVE) && + !display_slave) + return 0; + + if ((flags == TSNIF_FLAGS_PTY_MASTER) && + !display_master) + return 0; + + return 1; +} static int data_cb(struct tsnif_term* term, struct tsnif_data *data) { - if (data->flags == TSNIF_FLAGS_PTY_SLAVE) { - fwrite(data->ptr, data->len, 1, stdout); - fflush(NULL); - } + /* rule out unwanted PTY channel */ + if ((term->type == TSNIF_TYPE_PTY) && + !display_pty(data->flags)) + return 0; + fwrite(data->ptr, data->len, 1, stdout); + fflush(NULL); return 0; } @@ -149,6 +165,31 @@ static int get_args(int argc, char **argv) return 0; } +static int process_input(void) +{ + int c = getchar(); + switch(c) { + case 's': + display_slave = !display_slave; + break; + + case 'm': + display_master = !display_master; + break; + + case 'q': + return -1; + + default: + return 0; + } + + printf("\ntsnif display [%s%s]\n", + display_master ? "M" : "", + display_slave ? "S" : ""); + return 0; +} + int main(int argc, char **argv) { int err, ret; @@ -180,7 +221,6 @@ int main(int argc, char **argv) if (err) longjmp(env, 1); - set_term(0); signal(SIGINT, sig_handler); @@ -188,9 +228,11 @@ int main(int argc, char **argv) fd_set rfds; struct timeval tv = { 1, 0}; int ts_fd = tsnif_fd(&handle), ret; + int in_fd = 0; FD_ZERO(&rfds); FD_SET(ts_fd, &rfds); + FD_SET(in_fd, &rfds); ret = select(ts_fd + 1, &rfds, NULL, NULL, &tv); if (ret == -1) { @@ -199,7 +241,12 @@ int main(int argc, char **argv) } else if (!ret) continue; - if (tsnif_process(&handle)) + if (FD_ISSET(ts_fd, &rfds) && + tsnif_process(&handle)) + longjmp(env, 2); + + if (FD_ISSET(in_fd, &rfds) && + process_input()) longjmp(env, 2); } -- cgit