BSD 3 development
[unix-history] / usr / src / cmd / sdb / main.c
index 85f4a73..d5d2699 100644 (file)
@@ -6,6 +6,9 @@
  */
 
 #include       "head.h"
  */
 
 #include       "head.h"
+#include       <signal.h>
+#include       <stdio.h>
+#include       <sys/stat.h>
 
 INT            mkfault;
 INT            executing;
 
 INT            mkfault;
 INT            executing;
@@ -30,14 +33,22 @@ CHAR                lastc;
 STRING         symfil;
 STRING         corfil;
 INT            argcount;
 STRING         symfil;
 STRING         corfil;
 INT            argcount;
+int    fpe();
 
 
 
 
 
 
+#ifndef STD
+char *mktemp(), *tfn;
+int tfd;
+#endif
+
 main(argc, argv)
 REG STRING     *argv;
 REG INT                argc;
 {
        register char *p;
 main(argc, argv)
 REG STRING     *argv;
 REG INT                argc;
 {
        register char *p;
+       struct stat stbuf;
+
        maxfile=1L<<24; maxstor=1L<<31;
 
        setbuf(stdout, NULL);
        maxfile=1L<<24; maxstor=1L<<31;
 
        setbuf(stdout, NULL);
@@ -57,27 +68,56 @@ REG INT             argc;
                for (p = argv[3]; *p; *fp++ = *p++) ;
                *fp++ = '/';
        }
                for (p = argv[3]; *p; *fp++ = *p++) ;
                *fp++ = '/';
        }
-
        argcount=argc;
        argcount=argc;
+
+       if (stat(symfil, &stbuf) == -1) {
+               printf("`%s' does not exist\n", symfil);
+               exit(4);
+       }
+       symtime = stbuf.st_mtime;
+       if (stat(corfil, &stbuf) != -1) {
+               if (symtime > stbuf.st_mtime)
+                       printf("Warning: `%s' newer than `%s'\n",
+                               symfil, corfil);
+       }
+
        setsym(); setcor();
        initfp();
 
        /* set up variables for user */
        maxoff=MAXOFF; maxpos=MAXPOS;
        setsym(); setcor();
        initfp();
 
        /* set up variables for user */
        maxoff=MAXOFF; maxpos=MAXPOS;
-
-       IF (sigint=signal(SIGINT,01))!=01
+       gtty(2, &sdbttym);
+       IF (sigint= (ADDR) signal(SIGINT,01))!=01
        THEN    sigint= (ADDR) fault; signal(SIGINT,fault);
        FI
        THEN    sigint= (ADDR) fault; signal(SIGINT,fault);
        FI
-       sigqit=signal(SIGQUIT,1);
-       setexit();
+       sigqit= (ADDR) signal(SIGQUIT,1);
+       signal(SIGILL, fpe);
+#ifdef VAX135
+       tfn = "/usr/hpk/sdblog/XXXXXX";
+#endif
+#ifdef UCBVAX
+       tfn = "/usr/staff/hpk/sdblog/XXXXXX";
+#endif
+#ifndef STD
+       tfn = mktemp(tfn);
+       tfd = open(tfn);
+       if (tfd < 0)
+               tfd = creat(tfn, 0666);
+       lseek(tfd, 0l, 2);
+#endif
+
+       setjmp(env);
        if (debug) printf("Sdb restarted\n");
        if (debug) printf("Sdb restarted\n");
+       gtty(2, &userttym);
+       if (sdbttym.sg_flags != userttym.sg_flags)
+               stty(2, &sdbttym);
        IF executing THEN delbp(); FI
        executing=FALSE;
 
        for (;;) {
                mkfault = 0;
                printf("*");
        IF executing THEN delbp(); FI
        executing=FALSE;
 
        for (;;) {
                mkfault = 0;
                printf("*");
-               if (decode() == 1) {
+               if (decode(readline(stdin)) == 1) {
                        printf("Error; try again\n");
                        continue;
                }
                        printf("Error; try again\n");
                        continue;
                }
@@ -89,6 +129,10 @@ REG INT             argc;
                printf("scallf-%d;reflg-%d\n\n", scallf, reflag);
        }
 
                printf("scallf-%d;reflg-%d\n\n", scallf, reflag);
        }
 
+#ifndef STD
+               write(tfd, &cmd, 1);
+#endif
+
                docommand();
        }
 }
                docommand();
        }
 }
@@ -99,5 +143,11 @@ fault(a)
        signal(a,fault);
        mkfault++;
        printf("\n");
        signal(a,fault);
        mkfault++;
        printf("\n");
-       reset();
+       longjmp(env, 0);
+}
+
+fpe() {
+       signal(SIGILL, fpe);
+       error("Illegal floating constant");
+       longjmp(env, 0);
 }
 }