Blame


1 76193d7c 2003-09-30 devnull #include "sam.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull Rune samname[] = L"~~sam~~";
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull Rune *left[]= {
6 76193d7c 2003-09-30 devnull L"{[(<«",
7 76193d7c 2003-09-30 devnull L"\n",
8 76193d7c 2003-09-30 devnull L"'\"`",
9 76193d7c 2003-09-30 devnull 0
10 76193d7c 2003-09-30 devnull };
11 76193d7c 2003-09-30 devnull Rune *right[]= {
12 76193d7c 2003-09-30 devnull L"}])>»",
13 76193d7c 2003-09-30 devnull L"\n",
14 76193d7c 2003-09-30 devnull L"'\"`",
15 76193d7c 2003-09-30 devnull 0
16 76193d7c 2003-09-30 devnull };
17 76193d7c 2003-09-30 devnull
18 76193d7c 2003-09-30 devnull char RSAM[] = "sam";
19 76193d7c 2003-09-30 devnull char SAMTERM[] = "/bin/aux/samterm";
20 c8b6342d 2005-01-13 devnull char HOME[] = "HOME";
21 76193d7c 2003-09-30 devnull char TMPDIR[] = "/tmp";
22 76193d7c 2003-09-30 devnull char SH[] = "rc";
23 76193d7c 2003-09-30 devnull char SHPATH[] = "/bin/rc";
24 76193d7c 2003-09-30 devnull char RX[] = "rx";
25 76193d7c 2003-09-30 devnull char RXPATH[] = "/bin/rx";
26 76193d7c 2003-09-30 devnull char SAMSAVECMD[] = "/bin/rc\n/sys/lib/samsave";
27 76193d7c 2003-09-30 devnull
28 76193d7c 2003-09-30 devnull void
29 76193d7c 2003-09-30 devnull dprint(char *z, ...)
30 76193d7c 2003-09-30 devnull {
31 76193d7c 2003-09-30 devnull char buf[BLOCKSIZE];
32 76193d7c 2003-09-30 devnull va_list arg;
33 76193d7c 2003-09-30 devnull
34 76193d7c 2003-09-30 devnull va_start(arg, z);
35 76193d7c 2003-09-30 devnull vseprint(buf, &buf[BLOCKSIZE], z, arg);
36 76193d7c 2003-09-30 devnull va_end(arg);
37 76193d7c 2003-09-30 devnull termwrite(buf);
38 76193d7c 2003-09-30 devnull }
39 76193d7c 2003-09-30 devnull
40 76193d7c 2003-09-30 devnull void
41 76193d7c 2003-09-30 devnull print_ss(char *s, String *a, String *b)
42 76193d7c 2003-09-30 devnull {
43 76193d7c 2003-09-30 devnull dprint("?warning: %s: `%.*S' and `%.*S'\n", s, a->n, a->s, b->n, b->s);
44 76193d7c 2003-09-30 devnull }
45 76193d7c 2003-09-30 devnull
46 76193d7c 2003-09-30 devnull void
47 76193d7c 2003-09-30 devnull print_s(char *s, String *a)
48 76193d7c 2003-09-30 devnull {
49 76193d7c 2003-09-30 devnull dprint("?warning: %s `%.*S'\n", s, a->n, a->s);
50 76193d7c 2003-09-30 devnull }
51 76193d7c 2003-09-30 devnull
52 76193d7c 2003-09-30 devnull char*
53 76193d7c 2003-09-30 devnull getuser(void)
54 76193d7c 2003-09-30 devnull {
55 76193d7c 2003-09-30 devnull static char user[64];
56 76193d7c 2003-09-30 devnull int fd;
57 76193d7c 2003-09-30 devnull
58 76193d7c 2003-09-30 devnull if(user[0] == 0){
59 76193d7c 2003-09-30 devnull fd = open("/dev/user", 0);
60 76193d7c 2003-09-30 devnull if(fd<0 || read(fd, user, sizeof user-1)<=0)
61 76193d7c 2003-09-30 devnull strcpy(user, "none");
62 76193d7c 2003-09-30 devnull close(fd);
63 76193d7c 2003-09-30 devnull }
64 76193d7c 2003-09-30 devnull return user;
65 76193d7c 2003-09-30 devnull }
66 76193d7c 2003-09-30 devnull
67 76193d7c 2003-09-30 devnull int
68 76193d7c 2003-09-30 devnull statfile(char *name, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
69 76193d7c 2003-09-30 devnull {
70 76193d7c 2003-09-30 devnull Dir *dirb;
71 76193d7c 2003-09-30 devnull
72 76193d7c 2003-09-30 devnull dirb = dirstat(name);
73 76193d7c 2003-09-30 devnull if(dirb == nil)
74 76193d7c 2003-09-30 devnull return -1;
75 76193d7c 2003-09-30 devnull if(dev)
76 76193d7c 2003-09-30 devnull *dev = dirb->type|(dirb->dev<<16);
77 76193d7c 2003-09-30 devnull if(id)
78 76193d7c 2003-09-30 devnull *id = dirb->qid.path;
79 76193d7c 2003-09-30 devnull if(time)
80 76193d7c 2003-09-30 devnull *time = dirb->mtime;
81 76193d7c 2003-09-30 devnull if(length)
82 76193d7c 2003-09-30 devnull *length = dirb->length;
83 76193d7c 2003-09-30 devnull if(appendonly)
84 76193d7c 2003-09-30 devnull *appendonly = dirb->mode & DMAPPEND;
85 76193d7c 2003-09-30 devnull free(dirb);
86 76193d7c 2003-09-30 devnull return 1;
87 76193d7c 2003-09-30 devnull }
88 76193d7c 2003-09-30 devnull
89 76193d7c 2003-09-30 devnull int
90 76193d7c 2003-09-30 devnull statfd(int fd, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
91 76193d7c 2003-09-30 devnull {
92 76193d7c 2003-09-30 devnull Dir *dirb;
93 76193d7c 2003-09-30 devnull
94 76193d7c 2003-09-30 devnull dirb = dirfstat(fd);
95 76193d7c 2003-09-30 devnull if(dirb == nil)
96 76193d7c 2003-09-30 devnull return -1;
97 76193d7c 2003-09-30 devnull if(dev)
98 76193d7c 2003-09-30 devnull *dev = dirb->type|(dirb->dev<<16);
99 76193d7c 2003-09-30 devnull if(id)
100 76193d7c 2003-09-30 devnull *id = dirb->qid.path;
101 76193d7c 2003-09-30 devnull if(time)
102 76193d7c 2003-09-30 devnull *time = dirb->mtime;
103 76193d7c 2003-09-30 devnull if(length)
104 76193d7c 2003-09-30 devnull *length = dirb->length;
105 76193d7c 2003-09-30 devnull if(appendonly)
106 76193d7c 2003-09-30 devnull *appendonly = dirb->mode & DMAPPEND;
107 76193d7c 2003-09-30 devnull free(dirb);
108 76193d7c 2003-09-30 devnull return 1;
109 76193d7c 2003-09-30 devnull }
110 76193d7c 2003-09-30 devnull
111 76193d7c 2003-09-30 devnull void
112 76193d7c 2003-09-30 devnull notifyf(void *a, char *s)
113 76193d7c 2003-09-30 devnull {
114 76193d7c 2003-09-30 devnull USED(a);
115 76193d7c 2003-09-30 devnull if(bpipeok && strcmp(s, "sys: write on closed pipe") == 0)
116 76193d7c 2003-09-30 devnull noted(NCONT);
117 76193d7c 2003-09-30 devnull if(strcmp(s, "interrupt") == 0)
118 76193d7c 2003-09-30 devnull noted(NCONT);
119 76193d7c 2003-09-30 devnull panicking = 1;
120 76193d7c 2003-09-30 devnull rescue();
121 76193d7c 2003-09-30 devnull noted(NDFLT);
122 76193d7c 2003-09-30 devnull }
123 76193d7c 2003-09-30 devnull
124 76193d7c 2003-09-30 devnull int
125 76193d7c 2003-09-30 devnull newtmp(int num)
126 76193d7c 2003-09-30 devnull {
127 76193d7c 2003-09-30 devnull int i, fd;
128 76193d7c 2003-09-30 devnull static char tempnam[30];
129 76193d7c 2003-09-30 devnull
130 76193d7c 2003-09-30 devnull i = getpid();
131 76193d7c 2003-09-30 devnull do
132 76193d7c 2003-09-30 devnull snprint(tempnam, sizeof tempnam, "%s/%d%.4s%dsam", TMPDIR, num, getuser(), i++);
133 76193d7c 2003-09-30 devnull while(access(tempnam, 0) == 0);
134 76193d7c 2003-09-30 devnull fd = create(tempnam, ORDWR|OCEXEC|ORCLOSE, 0000);
135 76193d7c 2003-09-30 devnull if(fd < 0){
136 76193d7c 2003-09-30 devnull remove(tempnam);
137 76193d7c 2003-09-30 devnull fd = create(tempnam, ORDWR|OCEXEC|ORCLOSE, 0000);
138 76193d7c 2003-09-30 devnull }
139 76193d7c 2003-09-30 devnull return fd;
140 76193d7c 2003-09-30 devnull }
141 76193d7c 2003-09-30 devnull
142 76193d7c 2003-09-30 devnull int
143 76193d7c 2003-09-30 devnull waitfor(int pid)
144 76193d7c 2003-09-30 devnull {
145 76193d7c 2003-09-30 devnull int msg;
146 76193d7c 2003-09-30 devnull Waitmsg *w;
147 76193d7c 2003-09-30 devnull
148 76193d7c 2003-09-30 devnull while((w = wait()) != nil){
149 76193d7c 2003-09-30 devnull if(w->pid != pid){
150 76193d7c 2003-09-30 devnull free(w);
151 76193d7c 2003-09-30 devnull continue;
152 76193d7c 2003-09-30 devnull }
153 76193d7c 2003-09-30 devnull msg = (w->msg[0] != '\0');
154 76193d7c 2003-09-30 devnull free(w);
155 76193d7c 2003-09-30 devnull return msg;
156 76193d7c 2003-09-30 devnull }
157 76193d7c 2003-09-30 devnull return -1;
158 76193d7c 2003-09-30 devnull }
159 76193d7c 2003-09-30 devnull
160 76193d7c 2003-09-30 devnull void
161 76193d7c 2003-09-30 devnull samerr(char *buf)
162 76193d7c 2003-09-30 devnull {
163 76193d7c 2003-09-30 devnull sprint(buf, "%s/sam.err", TMPDIR);
164 76193d7c 2003-09-30 devnull }
165 76193d7c 2003-09-30 devnull
166 76193d7c 2003-09-30 devnull void*
167 76193d7c 2003-09-30 devnull emalloc(ulong n)
168 76193d7c 2003-09-30 devnull {
169 76193d7c 2003-09-30 devnull void *p;
170 76193d7c 2003-09-30 devnull
171 76193d7c 2003-09-30 devnull p = malloc(n);
172 76193d7c 2003-09-30 devnull if(p == 0)
173 76193d7c 2003-09-30 devnull panic("malloc fails");
174 76193d7c 2003-09-30 devnull memset(p, 0, n);
175 76193d7c 2003-09-30 devnull return p;
176 76193d7c 2003-09-30 devnull }
177 76193d7c 2003-09-30 devnull
178 76193d7c 2003-09-30 devnull void*
179 76193d7c 2003-09-30 devnull erealloc(void *p, ulong n)
180 76193d7c 2003-09-30 devnull {
181 76193d7c 2003-09-30 devnull p = realloc(p, n);
182 76193d7c 2003-09-30 devnull if(p == 0)
183 76193d7c 2003-09-30 devnull panic("realloc fails");
184 76193d7c 2003-09-30 devnull return p;
185 76193d7c 2003-09-30 devnull }