Blame


1 76193d7c 2003-09-30 devnull #include <sys/types.h>
2 76193d7c 2003-09-30 devnull #include <sys/stat.h>
3 76193d7c 2003-09-30 devnull #include <sys/wait.h>
4 76193d7c 2003-09-30 devnull #include <pwd.h>
5 76193d7c 2003-09-30 devnull #include <signal.h>
6 76193d7c 2003-09-30 devnull #include <fcntl.h>
7 76193d7c 2003-09-30 devnull #include <errno.h>
8 76193d7c 2003-09-30 devnull
9 76193d7c 2003-09-30 devnull #include "sam.h"
10 76193d7c 2003-09-30 devnull
11 76193d7c 2003-09-30 devnull Rune samname[] = { '~', '~', 's', 'a', 'm', '~', '~', 0 };
12 76193d7c 2003-09-30 devnull
13 76193d7c 2003-09-30 devnull static Rune l1[] = { '{', '[', '(', '<', 0253, 0};
14 76193d7c 2003-09-30 devnull static Rune l2[] = { '\n', 0};
15 76193d7c 2003-09-30 devnull static Rune l3[] = { '\'', '"', '`', 0};
16 76193d7c 2003-09-30 devnull Rune *left[]= { l1, l2, l3, 0};
17 76193d7c 2003-09-30 devnull
18 76193d7c 2003-09-30 devnull static Rune r1[] = {'}', ']', ')', '>', 0273, 0};
19 76193d7c 2003-09-30 devnull static Rune r2[] = {'\n', 0};
20 76193d7c 2003-09-30 devnull static Rune r3[] = {'\'', '"', '`', 0};
21 76193d7c 2003-09-30 devnull Rune *right[]= { r1, r2, r3, 0};
22 76193d7c 2003-09-30 devnull
23 76193d7c 2003-09-30 devnull #ifndef SAMTERMNAME
24 5b6dcaf4 2003-11-23 devnull #define SAMTERMNAME "samterm"
25 76193d7c 2003-09-30 devnull #endif
26 76193d7c 2003-09-30 devnull #ifndef TMPDIRNAME
27 76193d7c 2003-09-30 devnull #define TMPDIRNAME "/tmp"
28 76193d7c 2003-09-30 devnull #endif
29 76193d7c 2003-09-30 devnull #ifndef SHNAME
30 ffcafb8c 2003-10-11 devnull #define SHNAME "sh"
31 76193d7c 2003-09-30 devnull #endif
32 76193d7c 2003-09-30 devnull #ifndef SHPATHNAME
33 ffcafb8c 2003-10-11 devnull #define SHPATHNAME "/bin/sh"
34 76193d7c 2003-09-30 devnull #endif
35 76193d7c 2003-09-30 devnull #ifndef RXNAME
36 76193d7c 2003-09-30 devnull #define RXNAME "ssh"
37 76193d7c 2003-09-30 devnull #endif
38 76193d7c 2003-09-30 devnull #ifndef RXPATHNAME
39 5b6dcaf4 2003-11-23 devnull #define RXPATHNAME "ssh"
40 76193d7c 2003-09-30 devnull #endif
41 76193d7c 2003-09-30 devnull
42 76193d7c 2003-09-30 devnull char RSAM[] = "sam";
43 76193d7c 2003-09-30 devnull char SAMTERM[] = SAMTERMNAME;
44 76193d7c 2003-09-30 devnull char HOME[] = "HOME";
45 76193d7c 2003-09-30 devnull char TMPDIR[] = TMPDIRNAME;
46 76193d7c 2003-09-30 devnull char SH[] = SHNAME;
47 76193d7c 2003-09-30 devnull char SHPATH[] = SHPATHNAME;
48 76193d7c 2003-09-30 devnull char RX[] = RXNAME;
49 76193d7c 2003-09-30 devnull char RXPATH[] = RXPATHNAME;
50 76193d7c 2003-09-30 devnull
51 76193d7c 2003-09-30 devnull
52 76193d7c 2003-09-30 devnull void
53 76193d7c 2003-09-30 devnull dprint(char *z, ...)
54 76193d7c 2003-09-30 devnull {
55 76193d7c 2003-09-30 devnull char buf[BLOCKSIZE];
56 76193d7c 2003-09-30 devnull va_list arg;
57 76193d7c 2003-09-30 devnull
58 76193d7c 2003-09-30 devnull va_start(arg, z);
59 76193d7c 2003-09-30 devnull vseprint(buf, &buf[BLOCKSIZE], z, arg);
60 76193d7c 2003-09-30 devnull va_end(arg);
61 76193d7c 2003-09-30 devnull termwrite(buf);
62 76193d7c 2003-09-30 devnull }
63 76193d7c 2003-09-30 devnull
64 76193d7c 2003-09-30 devnull void
65 76193d7c 2003-09-30 devnull print_ss(char *s, String *a, String *b)
66 76193d7c 2003-09-30 devnull {
67 76193d7c 2003-09-30 devnull dprint("?warning: %s: `%.*S' and `%.*S'\n", s, a->n, a->s, b->n, b->s);
68 76193d7c 2003-09-30 devnull }
69 76193d7c 2003-09-30 devnull
70 76193d7c 2003-09-30 devnull void
71 76193d7c 2003-09-30 devnull print_s(char *s, String *a)
72 76193d7c 2003-09-30 devnull {
73 76193d7c 2003-09-30 devnull dprint("?warning: %s `%.*S'\n", s, a->n, a->s);
74 76193d7c 2003-09-30 devnull }
75 76193d7c 2003-09-30 devnull
76 76193d7c 2003-09-30 devnull char*
77 76193d7c 2003-09-30 devnull getuser(void)
78 76193d7c 2003-09-30 devnull {
79 76193d7c 2003-09-30 devnull static char user[64];
80 76193d7c 2003-09-30 devnull if(user[0] == 0){
81 76193d7c 2003-09-30 devnull struct passwd *pw = getpwuid(getuid());
82 76193d7c 2003-09-30 devnull strcpy(user, pw ? pw->pw_name : "nobody");
83 76193d7c 2003-09-30 devnull }
84 76193d7c 2003-09-30 devnull return user;
85 76193d7c 2003-09-30 devnull }
86 76193d7c 2003-09-30 devnull
87 76193d7c 2003-09-30 devnull int
88 76193d7c 2003-09-30 devnull statfile(char *name, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
89 76193d7c 2003-09-30 devnull {
90 76193d7c 2003-09-30 devnull struct stat dirb;
91 76193d7c 2003-09-30 devnull
92 76193d7c 2003-09-30 devnull if (stat(name, &dirb) == -1)
93 76193d7c 2003-09-30 devnull return -1;
94 76193d7c 2003-09-30 devnull if (dev)
95 76193d7c 2003-09-30 devnull *dev = dirb.st_dev;
96 76193d7c 2003-09-30 devnull if (id)
97 76193d7c 2003-09-30 devnull *id = dirb.st_ino;
98 76193d7c 2003-09-30 devnull if (time)
99 76193d7c 2003-09-30 devnull *time = dirb.st_mtime;
100 76193d7c 2003-09-30 devnull if (length)
101 76193d7c 2003-09-30 devnull *length = dirb.st_size;
102 76193d7c 2003-09-30 devnull if(appendonly)
103 76193d7c 2003-09-30 devnull *appendonly = 0;
104 76193d7c 2003-09-30 devnull return 1;
105 76193d7c 2003-09-30 devnull }
106 76193d7c 2003-09-30 devnull
107 76193d7c 2003-09-30 devnull int
108 76193d7c 2003-09-30 devnull statfd(int fd, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
109 76193d7c 2003-09-30 devnull {
110 76193d7c 2003-09-30 devnull struct stat dirb;
111 76193d7c 2003-09-30 devnull
112 76193d7c 2003-09-30 devnull if (fstat(fd, &dirb) == -1)
113 76193d7c 2003-09-30 devnull return -1;
114 76193d7c 2003-09-30 devnull if (dev)
115 76193d7c 2003-09-30 devnull *dev = dirb.st_dev;
116 76193d7c 2003-09-30 devnull if (id)
117 76193d7c 2003-09-30 devnull *id = dirb.st_ino;
118 76193d7c 2003-09-30 devnull if (time)
119 76193d7c 2003-09-30 devnull *time = dirb.st_mtime;
120 76193d7c 2003-09-30 devnull if (length)
121 76193d7c 2003-09-30 devnull *length = dirb.st_size;
122 76193d7c 2003-09-30 devnull if(appendonly)
123 76193d7c 2003-09-30 devnull *appendonly = 0;
124 76193d7c 2003-09-30 devnull return 1;
125 76193d7c 2003-09-30 devnull }
126 76193d7c 2003-09-30 devnull
127 76193d7c 2003-09-30 devnull void
128 76193d7c 2003-09-30 devnull hup(int sig)
129 76193d7c 2003-09-30 devnull {
130 76193d7c 2003-09-30 devnull panicking = 1; // ???
131 76193d7c 2003-09-30 devnull rescue();
132 76193d7c 2003-09-30 devnull exit(1);
133 76193d7c 2003-09-30 devnull }
134 76193d7c 2003-09-30 devnull
135 76193d7c 2003-09-30 devnull int
136 ffcafb8c 2003-10-11 devnull notify(void(*f)(void *, char *))
137 76193d7c 2003-09-30 devnull {
138 76193d7c 2003-09-30 devnull signal(SIGINT, SIG_IGN);
139 76193d7c 2003-09-30 devnull signal(SIGPIPE, SIG_IGN); // XXX - bpipeok?
140 76193d7c 2003-09-30 devnull signal(SIGHUP, hup);
141 76193d7c 2003-09-30 devnull return 1;
142 76193d7c 2003-09-30 devnull }
143 76193d7c 2003-09-30 devnull
144 76193d7c 2003-09-30 devnull void
145 76193d7c 2003-09-30 devnull notifyf(void *a, char *b) /* never called; hup is instead */
146 76193d7c 2003-09-30 devnull {
147 76193d7c 2003-09-30 devnull }
148 76193d7c 2003-09-30 devnull
149 76193d7c 2003-09-30 devnull static int
150 76193d7c 2003-09-30 devnull temp_file(char *buf, int bufsize)
151 76193d7c 2003-09-30 devnull {
152 76193d7c 2003-09-30 devnull char *tmp;
153 76193d7c 2003-09-30 devnull int n, fd;
154 76193d7c 2003-09-30 devnull
155 76193d7c 2003-09-30 devnull tmp = getenv("TMPDIR");
156 76193d7c 2003-09-30 devnull if (!tmp)
157 76193d7c 2003-09-30 devnull tmp = TMPDIR;
158 76193d7c 2003-09-30 devnull
159 76193d7c 2003-09-30 devnull n = snprint(buf, bufsize, "%s/sam.%d.XXXXXXX", tmp, getuid());
160 76193d7c 2003-09-30 devnull if (bufsize <= n)
161 76193d7c 2003-09-30 devnull return -1;
162 76193d7c 2003-09-30 devnull if ((fd = mkstemp(buf)) < 0) /* SES - linux sometimes uses mode 0666 */
163 76193d7c 2003-09-30 devnull return -1;
164 76193d7c 2003-09-30 devnull if (fcntl(fd, F_SETFD, fcntl(fd,F_GETFD,0) | FD_CLOEXEC) < 0)
165 76193d7c 2003-09-30 devnull return -1;
166 76193d7c 2003-09-30 devnull return fd;
167 76193d7c 2003-09-30 devnull }
168 76193d7c 2003-09-30 devnull
169 76193d7c 2003-09-30 devnull int
170 76193d7c 2003-09-30 devnull tempdisk(void)
171 76193d7c 2003-09-30 devnull {
172 76193d7c 2003-09-30 devnull char buf[4096];
173 76193d7c 2003-09-30 devnull int fd = temp_file(buf, sizeof buf);
174 76193d7c 2003-09-30 devnull if (fd >= 0)
175 76193d7c 2003-09-30 devnull remove(buf);
176 76193d7c 2003-09-30 devnull return fd;
177 76193d7c 2003-09-30 devnull }
178 76193d7c 2003-09-30 devnull
179 76193d7c 2003-09-30 devnull #undef wait
180 76193d7c 2003-09-30 devnull int
181 76193d7c 2003-09-30 devnull waitfor(int pid)
182 76193d7c 2003-09-30 devnull {
183 76193d7c 2003-09-30 devnull int wm;
184 76193d7c 2003-09-30 devnull int rpid;
185 76193d7c 2003-09-30 devnull
186 76193d7c 2003-09-30 devnull do; while((rpid = wait(&wm)) != pid && rpid != -1);
187 76193d7c 2003-09-30 devnull return (WEXITSTATUS(wm));
188 76193d7c 2003-09-30 devnull }
189 76193d7c 2003-09-30 devnull
190 76193d7c 2003-09-30 devnull void
191 76193d7c 2003-09-30 devnull samerr(char *buf)
192 76193d7c 2003-09-30 devnull {
193 76193d7c 2003-09-30 devnull sprint(buf, "%s/sam.%s.err", TMPDIR, getuser());
194 76193d7c 2003-09-30 devnull }
195 76193d7c 2003-09-30 devnull
196 76193d7c 2003-09-30 devnull void*
197 76193d7c 2003-09-30 devnull emalloc(ulong n)
198 76193d7c 2003-09-30 devnull {
199 76193d7c 2003-09-30 devnull void *p;
200 76193d7c 2003-09-30 devnull
201 76193d7c 2003-09-30 devnull p = malloc(n);
202 76193d7c 2003-09-30 devnull if(p == 0)
203 76193d7c 2003-09-30 devnull panic("malloc fails");
204 76193d7c 2003-09-30 devnull memset(p, 0, n);
205 76193d7c 2003-09-30 devnull return p;
206 76193d7c 2003-09-30 devnull }
207 76193d7c 2003-09-30 devnull
208 76193d7c 2003-09-30 devnull void*
209 76193d7c 2003-09-30 devnull erealloc(void *p, ulong n)
210 76193d7c 2003-09-30 devnull {
211 76193d7c 2003-09-30 devnull p = realloc(p, n);
212 76193d7c 2003-09-30 devnull if(p == 0)
213 76193d7c 2003-09-30 devnull panic("realloc fails");
214 76193d7c 2003-09-30 devnull return p;
215 76193d7c 2003-09-30 devnull }
216 76193d7c 2003-09-30 devnull
217 76193d7c 2003-09-30 devnull #if 0
218 76193d7c 2003-09-30 devnull char *
219 76193d7c 2003-09-30 devnull strdup(const char *s)
220 76193d7c 2003-09-30 devnull {
221 76193d7c 2003-09-30 devnull return strcpy(emalloc(strlen(s)), s);
222 76193d7c 2003-09-30 devnull }
223 76193d7c 2003-09-30 devnull #endif
224 76193d7c 2003-09-30 devnull
225 76193d7c 2003-09-30 devnull /*
226 76193d7c 2003-09-30 devnull void exits(const char *s)
227 76193d7c 2003-09-30 devnull {
228 76193d7c 2003-09-30 devnull if (s) fprint(2, "exit: %s\n", s);
229 76193d7c 2003-09-30 devnull exit(s != 0);
230 76193d7c 2003-09-30 devnull }
231 76193d7c 2003-09-30 devnull
232 76193d7c 2003-09-30 devnull void
233 76193d7c 2003-09-30 devnull _exits(const char *s)
234 76193d7c 2003-09-30 devnull {
235 76193d7c 2003-09-30 devnull if (s) fprint(2, "exit: %s\n", s);
236 76193d7c 2003-09-30 devnull _exit(s != 0);
237 76193d7c 2003-09-30 devnull }
238 76193d7c 2003-09-30 devnull
239 76193d7c 2003-09-30 devnull int errstr(char *buf, int size)
240 76193d7c 2003-09-30 devnull {
241 76193d7c 2003-09-30 devnull extern int errno;
242 76193d7c 2003-09-30 devnull
243 76193d7c 2003-09-30 devnull snprint(buf, size, "%s", strerror(errno));
244 76193d7c 2003-09-30 devnull return 1;
245 76193d7c 2003-09-30 devnull }
246 76193d7c 2003-09-30 devnull */
247 76193d7c 2003-09-30 devnull
248 ffcafb8c 2003-10-11 devnull int
249 ffcafb8c 2003-10-11 devnull create(char *name, int omode, ulong perm)
250 76193d7c 2003-09-30 devnull {
251 76193d7c 2003-09-30 devnull int mode;
252 76193d7c 2003-09-30 devnull int fd;
253 76193d7c 2003-09-30 devnull
254 76193d7c 2003-09-30 devnull if (omode & OWRITE) mode = O_WRONLY;
255 76193d7c 2003-09-30 devnull else if (omode & OREAD) mode = O_RDONLY;
256 76193d7c 2003-09-30 devnull else mode = O_RDWR;
257 76193d7c 2003-09-30 devnull
258 76193d7c 2003-09-30 devnull if ((fd = open(name, mode|O_CREAT|O_TRUNC, perm)) < 0)
259 76193d7c 2003-09-30 devnull return fd;
260 76193d7c 2003-09-30 devnull
261 76193d7c 2003-09-30 devnull if (omode & OCEXEC)
262 76193d7c 2003-09-30 devnull fcntl(fd, F_SETFD, fcntl(fd,F_GETFD,0) | FD_CLOEXEC);
263 76193d7c 2003-09-30 devnull
264 76193d7c 2003-09-30 devnull /* SES - not exactly right, but hopefully good enough. */
265 76193d7c 2003-09-30 devnull if (omode & ORCLOSE)
266 76193d7c 2003-09-30 devnull remove(name);
267 76193d7c 2003-09-30 devnull
268 76193d7c 2003-09-30 devnull return fd;
269 a995e477 2003-10-01 devnull }
270 a995e477 2003-10-01 devnull
271 a995e477 2003-10-01 devnull /* SHOULD BE ELSEWHERE */
272 ffcafb8c 2003-10-11 devnull #if 0 /* needed on old __APPLE__ */
273 a995e477 2003-10-01 devnull #include <lib9.h>
274 a995e477 2003-10-01 devnull
275 a995e477 2003-10-01 devnull Lock plk;
276 a995e477 2003-10-01 devnull
277 a995e477 2003-10-01 devnull ulong
278 a995e477 2003-10-01 devnull pread(int fd, void *buf, ulong n, ulong off)
279 a995e477 2003-10-01 devnull {
280 a995e477 2003-10-01 devnull ulong rv;
281 a995e477 2003-10-01 devnull
282 a995e477 2003-10-01 devnull lock(&plk);
283 a995e477 2003-10-01 devnull if (lseek(fd, off, 0) != off)
284 a995e477 2003-10-01 devnull return -1;
285 a995e477 2003-10-01 devnull rv = read(fd, buf, n);
286 a995e477 2003-10-01 devnull unlock(&plk);
287 a995e477 2003-10-01 devnull
288 a995e477 2003-10-01 devnull return rv;
289 76193d7c 2003-09-30 devnull }
290 a995e477 2003-10-01 devnull
291 a995e477 2003-10-01 devnull ulong
292 a995e477 2003-10-01 devnull pwrite(int fd, void *buf, ulong n, ulong off)
293 a995e477 2003-10-01 devnull {
294 a995e477 2003-10-01 devnull ulong rv;
295 a995e477 2003-10-01 devnull
296 a995e477 2003-10-01 devnull lock(&plk);
297 a995e477 2003-10-01 devnull if (lseek(fd, off, 0) != off)
298 a995e477 2003-10-01 devnull return -1;
299 a995e477 2003-10-01 devnull rv = write(fd, buf, n);
300 a995e477 2003-10-01 devnull unlock(&plk);
301 a995e477 2003-10-01 devnull
302 a995e477 2003-10-01 devnull return rv;
303 a995e477 2003-10-01 devnull }
304 a995e477 2003-10-01 devnull #endif
305 a995e477 2003-10-01 devnull