Esempio n. 1
0
void
reattach_tty(char *tty, char *password)
{
	int s = -1;
	char *name;
	struct sockaddr_in addr;
	struct hostent *hp;
	int len = 0;
	fd_set rd_fd;
	struct timeval tm = {0};
	char chr_c[] = "\003";

/*
 * this buffer has to be big enough to handle a full screen of
 * information from the detached process.
 */
	unsigned char buffer[6 * BIG_BUFFER_SIZE + 1];
	char *p;
	int port = 0;

#if defined (TIOCGWINSZ)
	struct winsize window;

#endif
	memset(&parm, 0, sizeof(struct param));

	if (!(name = find_detach_socket(socket_path, tty))) {
		fprintf(stderr, "No detached process to attach to.\r\n");
		_exit(1);
	}
	strcpy(parm.cookie, get_cookie(name));
	if (!*parm.cookie)
		_exit(1);
	if ((p = strrchr(name, '/')))
		p++;
	sscanf(p, "%d.%*s.%*s", &port);
	displays = 1;
	if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		displays = 0;
		_exit(1);
	}
	chmod(name, SOCKMODE);
	set_socket_options(s);
	memset(&addr, 0, sizeof(struct sockaddr_in));
	addr.sin_port = htons(port);
	addr.sin_family = AF_INET;
	if ((hp = gethostbyname("localhost")))
		memcpy(&addr.sin_addr, hp->h_addr, hp->h_length);
	else
		inet_aton("127.0.0.1", (struct in_addr *)&addr.sin_addr);
	if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
		fprintf(stderr, "connection refused for %s\r\n", name);
		_exit(1);
	}
	parm.pid = getpid();
	parm.pgrp = getpgrp();
	parm.uid = getuid();
	strcpy(parm.tty, ttyname(0));
	strncpy(parm.termid, getenv("TERM"), 80);
	if (password)
		strncpy(parm.password, password, 60);
	fprintf(stderr, "attempting to wakeup %s\r\n", find_tty_name(name));
#if defined (TIOCGWINSZ)
	if (ioctl(0, TIOCGWINSZ, &window) > -1) {
		parm.cols = window.ws_col;
		parm.rows = window.ws_row;
	} else
#endif
	{
		parm.cols = 79;
		parm.rows = 25;
	}
	write(s, &parm, sizeof(struct param));
	sleep(2);
	alarm(15);
	len = read(s, &parm, sizeof(struct param));
	alarm(0);
	if (len <= 0) {
		fprintf(stderr, "error reconnecting to %s\r\n", find_tty_name(name));
		displays = 0;
		chmod(name, SOCKMODE);
		exit(1);
	}
	unlink(name);

	term_init(parm.termid);
	set_term_eight_bit(1);
	charset_ibmpc();
	term_clear_screen();
	term_resize();
	term_move_cursor(0, 0);

	my_signal(SIGPIPE, handle_pipe, 0);
	my_signal(SIGINT, handle_ctrlc, 0);
	my_signal(SIGHUP, handle_hup, 0);

	/*
	 * according to MHacker we need to set errno to 0 under BSD.
	 * for some reason we get a address in use from a socket
	 *
	 */
	errno = 0;
	while (1) {
		FD_ZERO(&rd_fd);
		FD_SET(0, &rd_fd);
		FD_SET(s, &rd_fd);
		tm.tv_sec = 2;

		switch (select(s + 1, &rd_fd, NULL, NULL, &tm)) {
		case -1:
			if (ctrl_c) {
				write(s, chr_c, 1);
				ctrl_c = 0;
			} else if (errno != EINTR) {
				close(s);
				_exit(1);
			}
			break;
		case 0:
			break;
		default:
		{
			if (FD_ISSET(0, &rd_fd)) {
				len = read(0, buffer, sizeof(buffer) - 1);
				write(s, buffer, len);
			}
			if (FD_ISSET(s, &rd_fd)) {
				len = read(s, buffer, sizeof(buffer) - 1);
				write(1, buffer, len);
			}
		}
		}
	}
	close(s);
	fprintf(stderr, "Never should have got here");
	_exit(1);

	return;                         /* error return */
}
Esempio n. 2
0
File: vars.c Progetto: jnbek/TekNap
static	void eight_bit_characters(Window *win, char *unused, int value)
{
	if (value == ON && !term_eight_bit())
		say("Warning!  Your terminal says it does not support eight bit characters");
	set_term_eight_bit(value);
}