]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/5e/5e.c
5e: remove newline from suicide string
[plan9front.git] / sys / src / cmd / 5e / 5e.c
1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include "dat.h"
5 #include "fns.h"
6
7 int nflag, pflag, bflag;
8 Ref nproc;
9
10 void
11 dump(void)
12 {
13         int i;
14         
15         for(i = 0; i < 16; i++) {
16                 print("R%2d %.8ux", i, P->R[i]);
17                 if((i % 4) == 3) print("\n");
18                 else print("\t");
19         }
20 }
21
22 static void
23 adjustns(void)
24 {
25         if(bind("/arm/bin", "/bin", MREPL) < 0)
26                 sysfatal("bind: %r");
27         if(bind("/rc/bin", "/bin", MAFTER) < 0)
28                 sysfatal("bind: %r");
29         putenv("cputype", "arm");
30         putenv("objtype", "arm");
31 }
32
33 void
34 cleanup(void)
35 {
36         if(P == nil)
37                 return;
38
39         remproc(P);
40         decref(&nproc);
41         freesegs();
42         fddecref(P->fd);
43         if(P->path != nil && decref(P->path) == 0)
44                 free(P->path);
45         free(P);
46 }
47
48 static void
49 usage(void)
50 {
51         fprint(2, "usage: 5e [-npbf] text [...]\n");
52         exits(nil);
53 }
54
55 void
56 suicide(char *fmt, ...)
57 {
58         va_list va;
59         char buf[1024];
60         
61         va_start(va, fmt);
62         vsnprint(buf, sizeof(buf), fmt, va);
63         va_end(va);
64         fprint(2, "%s\n", buf);
65         if(!bflag)
66                 exits(buf);
67         abort();
68 }
69
70 int
71 notehandler(void *, char *note)
72 {
73         if(strncmp(note, "sys:", 4) == 0)
74                 return 0;
75         
76         if(strncmp(note, "emu:", 4) == 0)
77                 exits(note);
78
79         addnote(note);
80         return 1;
81 }
82
83 static void
84 dotext(int argc, char **argv)
85 {
86         char *file;
87         
88         if(**argv == '/' || **argv == '.' || **argv == '#') {
89                 if(loadtext(*argv, argc, argv) < 0)
90                         sysfatal("loadtext: %r");
91                 return;
92         }
93         file = smprint("/bin/%s", *argv);
94         if(loadtext(file, argc, argv) < 0)
95                 sysfatal("loadtext: %r");
96         free(file);
97 }
98
99 void
100 main(int argc, char **argv)
101 {
102         ARGBEGIN {
103         case 'n': nflag++; break;
104         case 'p': pflag++; break;
105         case 'b': bflag++; break;
106         case 'f': vfp = 1; break;
107         default: usage();
108         } ARGEND;
109         if(argc < 1)
110                 usage();
111         if(_nprivates < 1)
112                 sysfatal("we don't have privates");
113         if(rfork(RFREND | RFNAMEG | RFENVG) < 0)
114                 sysfatal("rfork: %r");
115         atexit(cleanup);
116         if(!nflag)
117                 adjustns();
118         if(pflag)
119                 initfs("armproc", "/proc");
120         initproc();
121         dotext(argc, argv);
122         atnotify(notehandler, 1);
123         for(;;) {
124                 if(ultraverbose)
125                         dump();
126                 step();
127                 while((P->notein - P->noteout) % NNOTE) {
128                         donote(P->notes[P->noteout % NNOTE], 0);
129                         ainc(&P->noteout);
130                 }
131         }
132 }