master xplshn/aruu / cmd / extra / yap / main.c
  1/* copyright (c) 1985 ceriel J.H. jacobs */
  2
  3#include "main.h"
  4#include "commands.h"
  5#include "display.h"
  6#include "in_all.h"
  7#include "options.h"
  8#include "output.h"
  9#include "process.h"
 10#include "prompt.h"
 11#include "term.h"
 12
 13int   nopipe;
 14char *progname;
 15int   interrupt;
 16int   no_tty;
 17
 18static int  initialize(int x);
 19static void sigquit(int signo);
 20#ifdef SIGTSTP
 21static void suspsig(int signo);
 22#endif
 23
 24int
 25main(int argc, char **argv)
 26{
 27  char **av;
 28
 29  (void)setlocale(LC_CTYPE, "");
 30  if (!isatty(1)) {
 31    no_tty = 1;
 32  }
 33  argv[argc] = 0;
 34  progname   = argv[0];
 35  if ((av = readoptions(argv)) == (char **)0 || initialize(*av ? 1 : 0)) {
 36    if (no_tty) {
 37      close(1);
 38      (void)dup(2);
 39    }
 40    putline("Usage: ");
 41    putline(argv[0]);
 42    putline(" [-c] [-u] [-n] [-q] [-number] [+command] [file ... ]\n");
 43    flush();
 44    exit(1);
 45  }
 46  if (no_tty) {
 47    *--av = "cat";
 48    execve("/bin/cat", av, (char *const[]){NULL});
 49  } else
 50    processfiles(argc - (av - argv), av);
 51  (void)quit();
 52  /* NOTREACHED */
 53}
 54
 55/*
 56 * open temporary file for reading and writing
 57 * panic if it fails
 58 */
 59
 60/*
 61 * collect initializing stuff here
 62 */
 63
 64static int
 65initialize(int x)
 66{
 67  if (!(nopipe = x)) {
 68    /*
 69 * reading from pipe
 70 */
 71    if (isatty(0)) {
 72      return 1;
 73    }
 74    stdf = dup(0); /* duplicate file descriptor of input */
 75    if (no_tty)
 76      return 0;
 77    /*
 78 * make sure standard input is from the terminal
 79 */
 80    (void)close(0);
 81    if (open("/dev/tty", O_RDONLY, 0) != 0) {
 82      putline("Couldn't open terminal\n");
 83      flush();
 84      exit(1);
 85    }
 86  }
 87  if (no_tty)
 88    return 0;
 89  /*
 90 * handle signals
 91 * catch QUIT, DELETE and ^z
 92 */
 93  (void)signal(SIGQUIT, SIG_IGN);
 94  (void)signal(SIGINT, catchdel);
 95  ini_terminal();
 96#ifdef SIGTSTP
 97  if (signal(SIGTSTP, SIG_IGN) == SIG_DFL) {
 98    (void)signal(SIGTSTP, suspsig);
 99  }
100#endif
101  (void)signal(SIGQUIT, sigquit);
102  return 0;
103}
104
105void
106catchdel(int signo)
107{
108  (void)signo;
109  (void)signal(SIGINT, catchdel);
110  interrupt = 1;
111}
112
113static void
114sigquit(int signo)
115{
116  (void)signo;
117  quit();
118}
119
120#ifdef SIGTSTP
121
122/*
123 * we had a SIGTSTP signal
124 * suspend, by a call to this routine
125 */
126
127void
128suspend()
129{
130  nflush();
131  resettty();
132  (void)signal(SIGTSTP, SIG_DFL);
133  (void)kill(0, SIGTSTP);
134  /*
135 * we are not here anymore ...
136 *
137 *
138 *
139 * but we arive here ...
140 */
141  inittty();
142  putline(TI);
143  flush();
144  (void)signal(SIGTSTP, suspsig);
145}
146
147/*
148 * SIGTSTP signal handler
149 * just indicate that we had one, ignore further ones and return
150 */
151
152static void
153suspsig(int signo)
154{
155  (void)signo;
156
157  suspend();
158  if (DoneSetJmp)
159    longjmp(SetJmpBuf, 1);
160}
161#endif
162
163/*
164 * quit : called on exit
165 * i bet you guessed that much
166 */
167
168int
169quit()
170{
171  clrbline();
172  resettty();
173  flush();
174  exit(0);
175}
176
177/*
178 * exit, but nonvoluntarily
179 * at least tell the user why
180 */
181
182void
183panic(char *s)
184{
185  putline("\a\a\a\r\n");
186  putline(s);
187  putline("\r\n");
188  quit();
189}