示例#1
0
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;
	}
}
示例#2
0
文件: termtree.c 项目: elipp/calc
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;

}
示例#3
0
文件: termtree.c 项目: elipp/calc
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;
}
示例#4
0
文件: termtree.c 项目: elipp/calc
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;
}
示例#5
0
文件: termim.c 项目: buganini/termim
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);
}