ftp.nice.ch/pub/next/unix/communication/pcomm.NIHS.bs.tar.gz#/pcomm/Source/passthru.c

This is passthru.c in view mode; [Download] [Up]

/*
 * A transparent "pass-thru" mode, designed to allow binary transfers
 * between 3 machines (with the middle machine in the pass-thru mode).
 * A non-zero return code means the input routine should be restarted.
 */

#include <stdio.h>
#include <signal.h>
#include <curses.h>
#include "config.h"
#include "misc.h"

#ifdef BSD
#include <setjmp.h>
jmp_buf cp_buf;
#endif /* BSD */

int
pass_thru()
{
	extern int fd;
	WINDOW *pt_win, *newwin();
	int num;
	void error_win();
	static void cpio();

	pt_win = newwin(5, 70, 5, 5);

	mvwaddstr(pt_win, 2, 4, "Enter the expiration time (5-60 sec): ");
	box(pt_win, VERT, HORZ);

	mvwattrstr(pt_win, 0, 3, A_BOLD, " Pass Through Mode ");
	wmove(pt_win, 2, 43);
	wrefresh(pt_win);
					/* get the answer */
	while ((num = get_num(pt_win, 2)) != -1) {
					/* out of bounds */
		if (num < 5 || num > 60) {
			beep();
			clear_line(pt_win, 2, 43, TRUE);
			wmove(pt_win, 2, 43);
			wrefresh(pt_win);
		}
		else {
			werase(pt_win);
			wrefresh(pt_win);
			delwin(pt_win);

			if (fd == -1) {
				error_win(0, "Not currently connected to any host", "");
				return(0);
			}

			touchwin(stdscr);
			refresh();

			cpio((unsigned int) num);
			return(1);
		}
	}
	if (fd == -1) {
		werase(pt_win);
		wrefresh(pt_win);
	}
	delwin(pt_win);
	return(0);
}

/*
 * Copy the stdin to the TTYout and copy the TTYin to the stdout.  Uses
 * multi character reads.  I'm not too concerned about the excess baggage
 * caused by the entire image being forked... this feature won't be used
 * that often.
 */

static int cp_flag;

static void
cpio(num)
unsigned int num;
{
	extern int fd;
	int cpid, n;
	static int cp_force();
	char buf[CLIST_SIZ];
	unsigned int alarm(), sleep();
	void line_set(), xmodem_mode(), input_off();

					/* out of curses mode */
	resetterm();

	input_off();
	xmodem_mode(0);
	xmodem_mode(fd);

					/* copy the TTYin to stdout */
	if (!(cpid = fork())) {
		while (1) {
			n = read(fd, buf, CLIST_SIZ);
			write(1, buf, n);
		}
	}

	cp_flag = 0;
	signal(SIGALRM, (SIG_TYPE(*) ()) cp_force);
					/* copy the stdin to TTYout */
	while (1) {
		alarm(num);
#ifdef BSD
		if (setjmp(cp_buf))
			break;
#endif /* BSD */
		n = read(0, buf, CLIST_SIZ);
		if (cp_flag)
			break;
		write(fd, buf, n);
	}
	kill(cpid, SIGKILL);
					/* back to curses mode */
	sleep(1);
	fixterm();
	beep();
	line_set();
	clearok(curscr, TRUE);
	return;
}

/* ARGSUSED */
static int
cp_force(dummy)
{
#ifdef BSD
	longjmp(cp_buf, 1);
#else /* BSD */
	signal(SIGALRM, (SIG_TYPE(*) ()) cp_force);
	cp_flag = 1;
#endif /* BSD */
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.