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