BSD 3 development
[unix-history] / usr / src / cmd / sdb / main.c
CommitLineData
780dc7a7
HK
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "head.h"
9#include <signal.h>
10#include <stdio.h>
11#include <sys/stat.h>
12
13INT mkfault;
14INT executing;
15CHAR *lp;
16L_INT maxoff;
17L_INT maxpos;
18ADDR sigint;
19ADDR sigqit;
20INT wtflag;
21L_INT maxfile;
22L_INT maxstor;
23L_INT txtsiz;
24L_INT datsiz;
25L_INT datbas;
26L_INT stksiz;
27STRING errflg;
28INT magic;
29L_INT entrypt;
30
31CHAR lastc;
32
33STRING symfil;
34STRING corfil;
35INT argcount;
36int fpe();
37
38
39
40#ifndef STD
41char *mktemp(), *tfn;
42int tfd;
43#endif
44
45main(argc, argv)
46REG STRING *argv;
47REG INT argc;
48{
49 register char *p;
50 struct stat stbuf;
51
52 maxfile=1L<<24; maxstor=1L<<31;
53
54 setbuf(stdout, NULL);
55 setbuf(stderr, NULL);
56
57 WHILE argc>1
58 DO IF eqstr("-w",argv[1])
59 THEN wtflag=2; argc--; argv++;
60 ELSE break;
61 FI
62 OD
63
64 IF argc>1 THEN symfil = argv[1]; FI
65 IF argc>2 THEN corfil = argv[2]; FI
66 fp = filework;
67 if (argc > 3) {
68 for (p = argv[3]; *p; *fp++ = *p++) ;
69 *fp++ = '/';
70 }
71 argcount=argc;
72
73 if (stat(symfil, &stbuf) == -1) {
74 printf("`%s' does not exist\n", symfil);
75 exit(4);
76 }
77 symtime = stbuf.st_mtime;
78 if (stat(corfil, &stbuf) != -1) {
79 if (symtime > stbuf.st_mtime)
80 printf("Warning: `%s' newer than `%s'\n",
81 symfil, corfil);
82 }
83
84 setsym(); setcor();
85 initfp();
86
87 /* set up variables for user */
88 maxoff=MAXOFF; maxpos=MAXPOS;
89 gtty(2, &sdbttym);
90 IF (sigint= (ADDR) signal(SIGINT,01))!=01
91 THEN sigint= (ADDR) fault; signal(SIGINT,fault);
92 FI
93 sigqit= (ADDR) signal(SIGQUIT,1);
94 signal(SIGILL, fpe);
95#ifdef VAX135
96 tfn = "/usr/hpk/sdblog/XXXXXX";
97#endif
98#ifdef UCBVAX
99 tfn = "/usr/staff/hpk/sdblog/XXXXXX";
100#endif
101#ifndef STD
102 tfn = mktemp(tfn);
103 tfd = open(tfn);
104 if (tfd < 0)
105 tfd = creat(tfn, 0666);
106 lseek(tfd, 0l, 2);
107#endif
108
109 setjmp(env);
110 if (debug) printf("Sdb restarted\n");
111 gtty(2, &userttym);
112 if (sdbttym.sg_flags != userttym.sg_flags)
113 stty(2, &sdbttym);
114 IF executing THEN delbp(); FI
115 executing=FALSE;
116
117 for (;;) {
118 mkfault = 0;
119 printf("*");
120 if (decode(readline(stdin)) == 1) {
121 printf("Error; try again\n");
122 continue;
123 }
124
125 if (debug) {
126 printf("cmd %c:\n", cmd);
127 printf("%s:%s\n", proc, var);
128 printf("args-%s;re-%s;integ-%d\n", args, re, integ);
129 printf("scallf-%d;reflg-%d\n\n", scallf, reflag);
130 }
131
132#ifndef STD
133 write(tfd, &cmd, 1);
134#endif
135
136 docommand();
137 }
138}
139
140
141fault(a)
142{
143 signal(a,fault);
144 mkfault++;
145 printf("\n");
146 longjmp(env, 0);
147}
148
149fpe() {
150 signal(SIGILL, fpe);
151 error("Illegal floating constant");
152 longjmp(env, 0);
153}