main.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /*
  2. * db - main command loop and error/interrupt handling
  3. */
  4. #include "defs.h"
  5. #include "fns.h"
  6. int wtflag = OREAD;
  7. BOOL kflag;
  8. BOOL mkfault;
  9. ADDR maxoff;
  10. int xargc; /* bullshit */
  11. extern BOOL executing;
  12. extern int infile;
  13. int exitflg;
  14. extern int eof;
  15. int alldigs(char*);
  16. void fault(void*, char*);
  17. extern char *Ipath;
  18. jmp_buf env;
  19. static char *errmsg;
  20. void
  21. main(int argc, char **argv)
  22. {
  23. char b1[100];
  24. char b2[100];
  25. char *s;
  26. char *name;
  27. name = 0;
  28. outputinit();
  29. maxoff = MAXOFF;
  30. ARGBEGIN{
  31. case 'k':
  32. kflag = 1;
  33. break;
  34. case 'w':
  35. wtflag = ORDWR; /* suitable for open() */
  36. break;
  37. case 'I':
  38. s = ARGF();
  39. if(s == 0)
  40. dprint("missing -I argument\n");
  41. else
  42. Ipath = s;
  43. break;
  44. case 'm':
  45. name = ARGF();
  46. if(name == 0)
  47. dprint("missing -m argument\n");
  48. break;
  49. }ARGEND
  50. symfil = 0;
  51. corfil = 0;
  52. if (argc > 0 && !alldigs(argv[0])) {
  53. symfil = argv[0];
  54. argv++;
  55. argc--;
  56. }
  57. if(argc==1 && alldigs(argv[0])){
  58. char *cpu, *p, *q;
  59. pid = atoi(argv[0]);
  60. pcsactive = 0;
  61. if (!symfil) {
  62. if(kflag){
  63. cpu = getenv("cputype");
  64. if(cpu == 0){
  65. cpu = "386";
  66. dprint("$cputype not set; assuming %s\n", cpu);
  67. }
  68. p = getenv("terminal");
  69. if(p==0 || (p=strchr(p, ' '))==0 || p[1]==' ' || p[1]==0){
  70. strcpy(b1, "/386/9pc");
  71. dprint("missing or bad $terminal; assuming %s\n", b1);
  72. }else{
  73. p++;
  74. q = strchr(p, ' ');
  75. if(q)
  76. *q = 0;
  77. sprint(b1, "/%s/9%s", cpu, p);
  78. }
  79. }else
  80. sprint(b1, "/proc/%s/text", argv[0]);
  81. symfil = b1;
  82. }
  83. sprint(b2, "/proc/%s/mem", argv[0]);
  84. corfil = b2;
  85. } else if (argc > 0) {
  86. fprint(2, "Usage: db [-kw] [-m machine] [-I dir] [symfile] [pid]\n");
  87. exits("usage");
  88. }
  89. if (!symfil)
  90. symfil = "8.out";
  91. xargc = argc;
  92. notify(fault);
  93. setsym();
  94. dotmap = dumbmap(-1);
  95. if (name && machbyname(name) == 0)
  96. dprint ("unknown machine %s", name);
  97. dprint("%s binary\n", mach->name);
  98. if(setjmp(env) == 0){
  99. if (corfil) {
  100. setcor(); /* could get error */
  101. dprint("%s\n", machdata->excep(cormap, rget));
  102. printpc();
  103. }
  104. }
  105. setjmp(env);
  106. if (executing)
  107. delbp();
  108. executing = FALSE;
  109. for (;;) {
  110. flushbuf();
  111. if (errmsg) {
  112. dprint(errmsg);
  113. printc('\n');
  114. errmsg = 0;
  115. exitflg = 0;
  116. }
  117. if (mkfault) {
  118. mkfault=0;
  119. printc('\n');
  120. prints(DBNAME);
  121. }
  122. clrinp();
  123. rdc();
  124. reread();
  125. if (eof) {
  126. if (infile == STDIN)
  127. done();
  128. iclose(-1, 0);
  129. eof = 0;
  130. longjmp(env, 1);
  131. }
  132. exitflg = 0;
  133. command(0, 0);
  134. reread();
  135. if (rdc() != '\n')
  136. error("newline expected");
  137. }
  138. }
  139. int
  140. alldigs(char *s)
  141. {
  142. while(*s){
  143. if(*s<'0' || '9'<*s)
  144. return 0;
  145. s++;
  146. }
  147. return 1;
  148. }
  149. void
  150. done(void)
  151. {
  152. if (pid)
  153. endpcs();
  154. exits(exitflg? "error": 0);
  155. }
  156. /*
  157. * An error occurred; save the message for later printing,
  158. * close open files, and reset to main command loop.
  159. */
  160. void
  161. error(char *n)
  162. {
  163. errmsg = n;
  164. iclose(0, 1);
  165. oclose();
  166. flush();
  167. delbp();
  168. ending = 0;
  169. longjmp(env, 1);
  170. }
  171. void
  172. errors(char *m, char *n)
  173. {
  174. static char buf[128];
  175. sprint(buf, "%s: %s", m, n);
  176. error(buf);
  177. }
  178. /*
  179. * An interrupt occurred;
  180. * seek to the end of the current file
  181. * and remember that there was a fault.
  182. */
  183. void
  184. fault(void *a, char *s)
  185. {
  186. USED(a);
  187. if(strncmp(s, "interrupt", 9) == 0){
  188. seek(infile, 0L, 2);
  189. mkfault++;
  190. noted(NCONT);
  191. }
  192. noted(NDFLT);
  193. }