221 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* Copyright (c) 1985 Ceriel J.H. Jacobs */
 | 
						|
 | 
						|
# ifndef lint
 | 
						|
static char rcsid[] = "$Header$";
 | 
						|
# endif
 | 
						|
 | 
						|
# define _MAIN_
 | 
						|
 | 
						|
# include "in_all.h"
 | 
						|
# if USG_OPEN
 | 
						|
# include <fcntl.h>
 | 
						|
# endif
 | 
						|
# if BSD4_2_OPEN
 | 
						|
# include <sys/file.h>
 | 
						|
# endif
 | 
						|
# if POSIX_OPEN
 | 
						|
# include <sys/types.h>
 | 
						|
# include <fcntl.h>
 | 
						|
# endif
 | 
						|
# include "main.h"
 | 
						|
# include "term.h"
 | 
						|
# include "options.h"
 | 
						|
# include "output.h"
 | 
						|
# include "process.h"
 | 
						|
# include "commands.h"
 | 
						|
# include "display.h"
 | 
						|
# include "prompt.h"
 | 
						|
 | 
						|
char	*strcpy();
 | 
						|
 | 
						|
STATIC int initialize();
 | 
						|
# ifdef SIGTSTP
 | 
						|
STATIC int suspsig();
 | 
						|
# endif
 | 
						|
 | 
						|
int
 | 
						|
main(argc,argv) register char ** argv; {
 | 
						|
 | 
						|
	register char ** av;
 | 
						|
 | 
						|
	if (! isatty(1)) {
 | 
						|
		no_tty = 1;
 | 
						|
	}
 | 
						|
	argv[argc] = 0;
 | 
						|
	progname = argv[0];
 | 
						|
	if ((av = readoptions(argv)) == (char **) 0 ||
 | 
						|
		initialize(*av ? 1 : 0)) {
 | 
						|
		if (no_tty) {
 | 
						|
			close(1);
 | 
						|
			(VOID) dup(2);
 | 
						|
		}
 | 
						|
		putline("Usage: ");
 | 
						|
		putline(argv[0]);
 | 
						|
		putline(
 | 
						|
" [-c] [-u] [-n] [-q] [-number] [+command] [file ... ]\n");
 | 
						|
		flush();
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
	if (no_tty) {
 | 
						|
		*--av = "cat";
 | 
						|
		execve("/bin/cat", av, (char *) 0);
 | 
						|
	}
 | 
						|
	else	processfiles(argc-(av-argv), av);
 | 
						|
	(VOID) quit();
 | 
						|
	/* NOTREACHED */
 | 
						|
}
 | 
						|
 | 
						|
char *mktemp();
 | 
						|
 | 
						|
/*
 | 
						|
 * Open temporary file for reading and writing.
 | 
						|
 * Panic if it fails
 | 
						|
 */
 | 
						|
 | 
						|
static char indexfile[30], tempfile[30];
 | 
						|
 | 
						|
int
 | 
						|
opentemp(i) {
 | 
						|
 | 
						|
	register fildes;
 | 
						|
	register char *f;
 | 
						|
 | 
						|
	f = i ? mktemp(indexfile) : mktemp(tempfile);
 | 
						|
# if BSD4_2_OPEN || USG_OPEN || POSIX_OPEN
 | 
						|
	if ((fildes = open(f,O_RDWR|O_TRUNC|O_CREAT,0600)) < 0) {
 | 
						|
# else
 | 
						|
	if ((fildes = creat(f,0600)) <= 0 || close(fildes) < 0 ||
 | 
						|
	    (fildes = open(f,2)) < 0) {
 | 
						|
# endif
 | 
						|
		panic("Couldn't open temporary file");
 | 
						|
	}
 | 
						|
	(VOID) unlink(f);
 | 
						|
	return fildes;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Collect initializing stuff here.
 | 
						|
 */
 | 
						|
 | 
						|
STATIC int
 | 
						|
initialize(x) {
 | 
						|
 | 
						|
	if (!(nopipe = x)) {
 | 
						|
		/*
 | 
						|
		 * Reading from pipe
 | 
						|
		 */
 | 
						|
		if (isatty(0)) {
 | 
						|
			return 1;
 | 
						|
		}
 | 
						|
		stdf = dup(0);	/* Duplicate file descriptor of input */
 | 
						|
		if (no_tty) return 0;
 | 
						|
		/*
 | 
						|
		 * Make sure standard input is from the terminal.
 | 
						|
		 */
 | 
						|
		(VOID) close(0);
 | 
						|
# if BSD4_2_OPEN || USG_OPEN || POSIX_OPEN
 | 
						|
		if (open("/dev/tty",O_RDONLY,0) != 0) {
 | 
						|
# else
 | 
						|
		if (open("/dev/tty",0) != 0) {
 | 
						|
# endif
 | 
						|
			putline("Couldn't open terminal\n");
 | 
						|
			flush();
 | 
						|
			exit(1);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if (no_tty) return 0;
 | 
						|
	(VOID) strcpy(tempfile,"/usr/tmp/yap_XXXXXX");
 | 
						|
	(VOID) strcpy(indexfile,"/usr/tmp/yap-XXXXXX");
 | 
						|
	/*
 | 
						|
	 * Handle signals.
 | 
						|
	 * Catch QUIT, DELETE and ^Z
 | 
						|
	 */
 | 
						|
	(VOID) signal(SIGQUIT,SIG_IGN);
 | 
						|
	(VOID) signal(SIGINT, catchdel);
 | 
						|
	ini_terminal();
 | 
						|
# ifdef SIGTSTP
 | 
						|
	if (signal(SIGTSTP,SIG_IGN) == SIG_DFL) {
 | 
						|
		(VOID) signal(SIGTSTP,suspsig);
 | 
						|
	}
 | 
						|
# endif
 | 
						|
	(VOID) signal(SIGQUIT,quit);
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
catchdel() {
 | 
						|
	(VOID) signal(SIGINT, catchdel);
 | 
						|
	interrupt = 1;
 | 
						|
}
 | 
						|
 | 
						|
# ifdef SIGTSTP
 | 
						|
 | 
						|
/*
 | 
						|
 * We had a SIGTSTP signal.
 | 
						|
 * Suspend, by a call to this routine.
 | 
						|
 */
 | 
						|
 | 
						|
VOID
 | 
						|
suspend() {
 | 
						|
 | 
						|
	nflush();
 | 
						|
	resettty();
 | 
						|
	(VOID) signal(SIGTSTP,SIG_DFL);
 | 
						|
#if BSD4_2_OPEN
 | 
						|
	sigsetmask(sigblock(0)&~(1 << (SIGTSTP - 1)));
 | 
						|
#endif
 | 
						|
	(VOID) kill(0, SIGTSTP);
 | 
						|
	/*
 | 
						|
	 * We are not here anymore ...
 | 
						|
	 *
 | 
						|
 | 
						|
	 *
 | 
						|
	 * But we arive here ...
 | 
						|
	 */
 | 
						|
	inittty();
 | 
						|
	putline(TI);
 | 
						|
	flush();
 | 
						|
	(VOID) signal(SIGTSTP,suspsig);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * SIGTSTP signal handler.
 | 
						|
 * Just indicate that we had one, ignore further ones and return.
 | 
						|
 */
 | 
						|
 | 
						|
STATIC int
 | 
						|
suspsig() {
 | 
						|
 | 
						|
	suspend();
 | 
						|
	if (DoneSetJmp) longjmp(SetJmpBuf, 1);
 | 
						|
}
 | 
						|
# endif
 | 
						|
 | 
						|
/*
 | 
						|
 * quit : called on exit.
 | 
						|
 * I bet you guessed that much.
 | 
						|
 */
 | 
						|
 | 
						|
int
 | 
						|
quit() {
 | 
						|
 | 
						|
	clrbline();
 | 
						|
	resettty();
 | 
						|
	flush();
 | 
						|
	exit(0);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Exit, but nonvoluntarily.
 | 
						|
 * At least tell the user why.
 | 
						|
 */
 | 
						|
 | 
						|
VOID
 | 
						|
panic(s) char *s; {
 | 
						|
 | 
						|
	putline("\007\007\007\r\n");
 | 
						|
	putline(s);
 | 
						|
	putline("\r\n");
 | 
						|
	quit();
 | 
						|
}
 |