minix/commands/yap/main.c
2009-11-09 10:26:00 +00:00

222 lines
3.5 KiB
C

/* 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;
char *empty_envp[] = { (char *) 0 };
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, &empty_envp);
}
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();
}