void telnet_process() { if (sock_telnet.sock_flags & SF_CONNECTED) { /* Just connected */ sock_telnet.sock_flags &= ~SF_CONNECTED; sock_telnet.sock_flags |= SF_PUSH; telnet_send_opt(&sock_telnet.sbuf, TELNET_DO, TELNET_OPT_GOAHEAD); telnet_send_opt(&sock_telnet.sbuf, TELNET_WILL, TELNET_OPT_GOAHEAD); telnet_send_opt(&sock_telnet.sbuf, TELNET_WILL, TELNET_OPT_ECHO); //bprintf(&sock_telnet.sbuf, "Testing...\r\n"); telnet_term.in = &sock_telnet.rbuf; telnet_term.out = &sock_telnet.sbuf; term_create(&telnet_term); } switch (sock_telnet.sock_state) { case TCP_CLOSE_WAIT: term_destroy(&telnet_term); tcp_sock_close(&sock_telnet); break; case TCP_CLOSE: tcp_sock_listen(&sock_telnet); break; } }
int parse_mathematical_input(const char* str, fp_t *val) { errlevel = 0; char *stripped = strip_all_whitespace(str); if (!check_alphanumeric_validity(stripped)) { sa_free(stripped); return 0; } int pb = check_parenthesis_balance(stripped); if (pb != 0) { parse_error(ERR_BAD_PARENTHESIS, "NULL", 0); sa_free(stripped); return 0; } struct term_t t = term_create(stripped, 1); term_get_result(&t, 0); fp_t_assign(val, t.value); sa_free(stripped); return errlevel == 0; }
static void termtree_add(struct termtree_t *t, const char* term_str, mathfuncptr op, int reparse) { if (t->num_terms >= t->capacity) { termtree_resize(t); } t->terms[t->num_terms] = term_create(term_str, reparse); t->ops[t->num_terms] = op; ++t->num_terms; }
static int term_varfuncid_strcmp_pass(struct term_t *term) { int i = 0; for (; i < functions_table_size; ++i) { char *b; if ((b = strstr(term->string, functions[i].key)) == &term->string[0]) { int opening_par_pos = functions[i].key_len; int closing_par_pos = find_matching_parenthesis(term->string, opening_par_pos); int tlen = closing_par_pos - opening_par_pos; if (tlen <= 0) { parse_error(ERR_INTERNAL, NULL, 0); return -1; } else if (closing_par_pos < (strlen(term->string) - 1)) { parse_error(ERR_TRAILING_PARINPUT, term->string, closing_par_pos + 1); return -1; } char *argstr = substring(term->string, opening_par_pos, tlen+1); struct term_t arg_term = term_create(argstr, 1); term_get_result(&arg_term, 0); functions[i].funcptr(&term->value, arg_term.value); sa_free(argstr); return 1; } } for (i = 0; i < constants_table_size; ++i) { if (strcmp(term->string, constants[i].key) == 0) { fp_t_assign(&term->value, constants[i].value); return 1; } } struct udc_node *n = udctree_search(term->string); if (n) { fp_t_assign(&term->value, n->pair.value); return 1; } return 0; }
int main(int argc, char *argv[]) { int cc; struct termios rtt, stt; struct winsize win; int ch, n; struct timeval tv, *tvp; time_t tvec, start; char obuf[BUFSIZ]; char ibuf[BUFSIZ]; fd_set rfd; int flushtime = 30; int readstdin; int nfds=0; while ((ch = getopt(argc, argv, "hnw")) != -1) switch(ch) { case 'n': ambi_width=1; break; case 'w': ambi_width=2; break; case 'h': case '?': default: usage(); } argc -= optind; argv += optind; if(getenv("TERMIM")!=NULL) err(1, "already in termim"); if(pipe(tube)==-1) err(1, "pipe"); sprintf(obuf, "%d", tube[1]); setenv("TERMIM", obuf, 1); if ((ttyflg = isatty(STDIN_FILENO)) != 0) { if (tcgetattr(STDIN_FILENO, &tt) == -1) err(1, "tcgetattr"); if (ioctl(STDIN_FILENO, TIOCGWINSZ, &win) == -1) err(1, "ioctl"); win.ws_row-=2; term=term_create(); term_assoc_output(term, STDOUT_FILENO); term_set_size(term, win.ws_row, win.ws_col); term_set_offset(term, 0, 0); if (openpty(&master, &slave, NULL, &tt, &win) == -1) err(1, "openpty"); term2=term_create(); term_assoc_output(term2, STDOUT_FILENO); term_set_size(term2, 2, win.ws_col); term_set_offset(term2, win.ws_row, 0); win.ws_row=2; if (openpty(&master2, &slave2, NULL, &tt, &win) == -1) err(1, "openpty"); } else { if (openpty(&master, &slave, NULL, NULL, NULL) == -1) err(1, "openpty"); if (openpty(&master2, &slave2, NULL, NULL, NULL) == -1) err(1, "openpty"); } if (!qflg) { tvec = time(NULL); } if (ttyflg) { rtt = tt; cfmakeraw(&rtt); rtt.c_lflag &= ~ECHO; (void)tcsetattr(STDIN_FILENO, TCSAFLUSH, &rtt); } tcgetattr(master2, &rtt); cfmakeraw(&rtt); rtt.c_lflag &= ~ECHO; tcsetattr(master2, TCSAFLUSH, &rtt); signal(SIGCHLD, &sigchild); child = fork(); if (child < 0) { warn("fork"); done(1); } if (child == 0) doshell(argv); close(slave); child2 = fork(); if (child2 < 0) { warn("fork"); done(1); } if (child2 == 0) dodock(); close(tube[1]); fcntl(tube[0], F_SETFL, O_NONBLOCK); fcntl(master, F_SETFL, O_NONBLOCK); signal(SIGINT, &sigforwarder); signal(SIGQUIT, &sigforwarder); signal(SIGPIPE, &sigforwarder); #ifndef __linux signal(SIGINFO, &sigforwarder); #endif signal(SIGUSR1, &sigforwarder); signal(SIGUSR2, &sigforwarder); signal(SIGWINCH, &winchforwarder); #define RESET "\033[m\033[2J\033[H" term_write(term, RESET, sizeof(RESET)); term_write(term2, RESET, sizeof(RESET)); start = tvec = time(0); readstdin = 1; if(master2 > tube[0]) nfds = tube[0]; if(master > nfds) nfds = master; if(master2 > nfds) nfds = master2; if(STDIN_FILENO > nfds) nfds = STDIN_FILENO; nfds+=1; for (;;) { FD_ZERO(&rfd); FD_SET(tube[0], &rfd); FD_SET(master, &rfd); FD_SET(master2, &rfd); if (readstdin) FD_SET(STDIN_FILENO, &rfd); if (!readstdin && ttyflg) { tv.tv_sec = 1; tv.tv_usec = 0; tvp = &tv; readstdin = 1; } else if (flushtime > 0) { tv.tv_sec = flushtime - (tvec - start); tv.tv_usec = 0; tvp = &tv; } else { tvp = NULL; } n = select(nfds, &rfd, 0, 0, tvp); if (n < 0 && errno != EINTR) break; if (n > 0 && FD_ISSET(STDIN_FILENO, &rfd)) { cc = read(STDIN_FILENO, ibuf, sizeof (ibuf)); if (cc < 0) break; if (cc == 0) { if (tcgetattr(master, &stt) == 0 && (stt.c_lflag & ICANON) != 0) { (void)write(master, &stt.c_cc[VEOF], 1); } readstdin = 0; } write(master2, ibuf, cc); } if (n > 0 && FD_ISSET(master, &rfd)) { while(1){ cc = read(master, obuf, sizeof (obuf)); if (cc <= 0) break; term_write(term, obuf, cc); } } if (n > 0 && FD_ISSET(master2, &rfd)) { cc = read(master2, obuf, sizeof (obuf)); if (cc <= 0) break; term_write(term2, obuf, cc); } if (n > 0 && FD_ISSET(tube[0], &rfd)) { cc = read(tube[0], ibuf, sizeof (ibuf)); if(cc < 0 && errno!=EAGAIN) break; write(master, ibuf, cc); } tvec = time(0); if (tvec - start >= flushtime) { start = tvec; } } finish(); done(0); }