Blame


1 be22ae2d 2004-03-26 devnull #include <u.h>
2 76193d7c 2003-09-30 devnull #include <sys/types.h>
3 76193d7c 2003-09-30 devnull #include <sys/stat.h>
4 76193d7c 2003-09-30 devnull #include <sys/wait.h>
5 76193d7c 2003-09-30 devnull #include <pwd.h>
6 76193d7c 2003-09-30 devnull #include <signal.h>
7 76193d7c 2003-09-30 devnull #include <fcntl.h>
8 76193d7c 2003-09-30 devnull #include <errno.h>
9 76193d7c 2003-09-30 devnull
10 76193d7c 2003-09-30 devnull #include "sam.h"
11 76193d7c 2003-09-30 devnull
12 76193d7c 2003-09-30 devnull Rune samname[] = { '~', '~', 's', 'a', 'm', '~', '~', 0 };
13 fa325e9b 2020-01-10 cross
14 76193d7c 2003-09-30 devnull static Rune l1[] = { '{', '[', '(', '<', 0253, 0};
15 76193d7c 2003-09-30 devnull static Rune l2[] = { '\n', 0};
16 76193d7c 2003-09-30 devnull static Rune l3[] = { '\'', '"', '`', 0};
17 76193d7c 2003-09-30 devnull Rune *left[]= { l1, l2, l3, 0};
18 76193d7c 2003-09-30 devnull
19 76193d7c 2003-09-30 devnull static Rune r1[] = {'}', ']', ')', '>', 0273, 0};
20 76193d7c 2003-09-30 devnull static Rune r2[] = {'\n', 0};
21 76193d7c 2003-09-30 devnull static Rune r3[] = {'\'', '"', '`', 0};
22 76193d7c 2003-09-30 devnull Rune *right[]= { r1, r2, r3, 0};
23 76193d7c 2003-09-30 devnull
24 76193d7c 2003-09-30 devnull #ifndef SAMTERMNAME
25 5b6dcaf4 2003-11-23 devnull #define SAMTERMNAME "samterm"
26 76193d7c 2003-09-30 devnull #endif
27 76193d7c 2003-09-30 devnull #ifndef TMPDIRNAME
28 76193d7c 2003-09-30 devnull #define TMPDIRNAME "/tmp"
29 76193d7c 2003-09-30 devnull #endif
30 76193d7c 2003-09-30 devnull #ifndef SHNAME
31 ffcafb8c 2003-10-11 devnull #define SHNAME "sh"
32 76193d7c 2003-09-30 devnull #endif
33 76193d7c 2003-09-30 devnull #ifndef SHPATHNAME
34 ffcafb8c 2003-10-11 devnull #define SHPATHNAME "/bin/sh"
35 76193d7c 2003-09-30 devnull #endif
36 76193d7c 2003-09-30 devnull #ifndef RXNAME
37 76193d7c 2003-09-30 devnull #define RXNAME "ssh"
38 76193d7c 2003-09-30 devnull #endif
39 76193d7c 2003-09-30 devnull #ifndef RXPATHNAME
40 5b6dcaf4 2003-11-23 devnull #define RXPATHNAME "ssh"
41 76193d7c 2003-09-30 devnull #endif
42 76193d7c 2003-09-30 devnull
43 76193d7c 2003-09-30 devnull char RSAM[] = "sam";
44 76193d7c 2003-09-30 devnull char SAMTERM[] = SAMTERMNAME;
45 76193d7c 2003-09-30 devnull char HOME[] = "HOME";
46 76193d7c 2003-09-30 devnull char TMPDIR[] = TMPDIRNAME;
47 76193d7c 2003-09-30 devnull char SH[] = SHNAME;
48 76193d7c 2003-09-30 devnull char SHPATH[] = SHPATHNAME;
49 76193d7c 2003-09-30 devnull char RX[] = RXNAME;
50 76193d7c 2003-09-30 devnull char RXPATH[] = RXPATHNAME;
51 76193d7c 2003-09-30 devnull
52 76193d7c 2003-09-30 devnull
53 76193d7c 2003-09-30 devnull void
54 76193d7c 2003-09-30 devnull dprint(char *z, ...)
55 76193d7c 2003-09-30 devnull {
56 76193d7c 2003-09-30 devnull char buf[BLOCKSIZE];
57 76193d7c 2003-09-30 devnull va_list arg;
58 76193d7c 2003-09-30 devnull
59 76193d7c 2003-09-30 devnull va_start(arg, z);
60 76193d7c 2003-09-30 devnull vseprint(buf, &buf[BLOCKSIZE], z, arg);
61 76193d7c 2003-09-30 devnull va_end(arg);
62 76193d7c 2003-09-30 devnull termwrite(buf);
63 76193d7c 2003-09-30 devnull }
64 76193d7c 2003-09-30 devnull
65 76193d7c 2003-09-30 devnull void
66 76193d7c 2003-09-30 devnull print_ss(char *s, String *a, String *b)
67 76193d7c 2003-09-30 devnull {
68 76193d7c 2003-09-30 devnull dprint("?warning: %s: `%.*S' and `%.*S'\n", s, a->n, a->s, b->n, b->s);
69 76193d7c 2003-09-30 devnull }
70 76193d7c 2003-09-30 devnull
71 76193d7c 2003-09-30 devnull void
72 76193d7c 2003-09-30 devnull print_s(char *s, String *a)
73 76193d7c 2003-09-30 devnull {
74 76193d7c 2003-09-30 devnull dprint("?warning: %s `%.*S'\n", s, a->n, a->s);
75 76193d7c 2003-09-30 devnull }
76 76193d7c 2003-09-30 devnull
77 76193d7c 2003-09-30 devnull char*
78 76193d7c 2003-09-30 devnull getuser(void)
79 76193d7c 2003-09-30 devnull {
80 76193d7c 2003-09-30 devnull static char user[64];
81 76193d7c 2003-09-30 devnull if(user[0] == 0){
82 76193d7c 2003-09-30 devnull struct passwd *pw = getpwuid(getuid());
83 76193d7c 2003-09-30 devnull strcpy(user, pw ? pw->pw_name : "nobody");
84 76193d7c 2003-09-30 devnull }
85 76193d7c 2003-09-30 devnull return user;
86 76193d7c 2003-09-30 devnull }
87 76193d7c 2003-09-30 devnull
88 fa325e9b 2020-01-10 cross int
89 fa325e9b 2020-01-10 cross statfile(char *name, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
90 76193d7c 2003-09-30 devnull {
91 76193d7c 2003-09-30 devnull struct stat dirb;
92 76193d7c 2003-09-30 devnull
93 76193d7c 2003-09-30 devnull if (stat(name, &dirb) == -1)
94 76193d7c 2003-09-30 devnull return -1;
95 76193d7c 2003-09-30 devnull if (dev)
96 fa325e9b 2020-01-10 cross *dev = dirb.st_dev;
97 76193d7c 2003-09-30 devnull if (id)
98 76193d7c 2003-09-30 devnull *id = dirb.st_ino;
99 76193d7c 2003-09-30 devnull if (time)
100 76193d7c 2003-09-30 devnull *time = dirb.st_mtime;
101 76193d7c 2003-09-30 devnull if (length)
102 76193d7c 2003-09-30 devnull *length = dirb.st_size;
103 76193d7c 2003-09-30 devnull if(appendonly)
104 76193d7c 2003-09-30 devnull *appendonly = 0;
105 76193d7c 2003-09-30 devnull return 1;
106 76193d7c 2003-09-30 devnull }
107 76193d7c 2003-09-30 devnull
108 76193d7c 2003-09-30 devnull int
109 76193d7c 2003-09-30 devnull statfd(int fd, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
110 76193d7c 2003-09-30 devnull {
111 76193d7c 2003-09-30 devnull struct stat dirb;
112 76193d7c 2003-09-30 devnull
113 fa325e9b 2020-01-10 cross if (fstat(fd, &dirb) == -1)
114 76193d7c 2003-09-30 devnull return -1;
115 76193d7c 2003-09-30 devnull if (dev)
116 76193d7c 2003-09-30 devnull *dev = dirb.st_dev;
117 fa325e9b 2020-01-10 cross if (id)
118 76193d7c 2003-09-30 devnull *id = dirb.st_ino;
119 76193d7c 2003-09-30 devnull if (time)
120 76193d7c 2003-09-30 devnull *time = dirb.st_mtime;
121 76193d7c 2003-09-30 devnull if (length)
122 76193d7c 2003-09-30 devnull *length = dirb.st_size;
123 76193d7c 2003-09-30 devnull if(appendonly)
124 76193d7c 2003-09-30 devnull *appendonly = 0;
125 76193d7c 2003-09-30 devnull return 1;
126 76193d7c 2003-09-30 devnull }
127 76193d7c 2003-09-30 devnull
128 76193d7c 2003-09-30 devnull void
129 76193d7c 2003-09-30 devnull hup(int sig)
130 76193d7c 2003-09-30 devnull {
131 cbeb0b26 2006-04-01 devnull panicking = 1; /* ??? */
132 76193d7c 2003-09-30 devnull rescue();
133 76193d7c 2003-09-30 devnull exit(1);
134 76193d7c 2003-09-30 devnull }
135 76193d7c 2003-09-30 devnull
136 76193d7c 2003-09-30 devnull int
137 ffcafb8c 2003-10-11 devnull notify(void(*f)(void *, char *))
138 76193d7c 2003-09-30 devnull {
139 76193d7c 2003-09-30 devnull signal(SIGINT, SIG_IGN);
140 cbeb0b26 2006-04-01 devnull signal(SIGPIPE, SIG_IGN); /* XXX - bpipeok? */
141 76193d7c 2003-09-30 devnull signal(SIGHUP, hup);
142 76193d7c 2003-09-30 devnull return 1;
143 76193d7c 2003-09-30 devnull }
144 76193d7c 2003-09-30 devnull
145 76193d7c 2003-09-30 devnull void
146 76193d7c 2003-09-30 devnull notifyf(void *a, char *b) /* never called; hup is instead */
147 76193d7c 2003-09-30 devnull {
148 76193d7c 2003-09-30 devnull }
149 76193d7c 2003-09-30 devnull
150 76193d7c 2003-09-30 devnull static int
151 76193d7c 2003-09-30 devnull temp_file(char *buf, int bufsize)
152 76193d7c 2003-09-30 devnull {
153 76193d7c 2003-09-30 devnull char *tmp;
154 76193d7c 2003-09-30 devnull int n, fd;
155 76193d7c 2003-09-30 devnull
156 76193d7c 2003-09-30 devnull tmp = getenv("TMPDIR");
157 76193d7c 2003-09-30 devnull if (!tmp)
158 76193d7c 2003-09-30 devnull tmp = TMPDIR;
159 76193d7c 2003-09-30 devnull
160 76193d7c 2003-09-30 devnull n = snprint(buf, bufsize, "%s/sam.%d.XXXXXXX", tmp, getuid());
161 76193d7c 2003-09-30 devnull if (bufsize <= n)
162 76193d7c 2003-09-30 devnull return -1;
163 76193d7c 2003-09-30 devnull if ((fd = mkstemp(buf)) < 0) /* SES - linux sometimes uses mode 0666 */
164 76193d7c 2003-09-30 devnull return -1;
165 76193d7c 2003-09-30 devnull if (fcntl(fd, F_SETFD, fcntl(fd,F_GETFD,0) | FD_CLOEXEC) < 0)
166 76193d7c 2003-09-30 devnull return -1;
167 76193d7c 2003-09-30 devnull return fd;
168 76193d7c 2003-09-30 devnull }
169 76193d7c 2003-09-30 devnull
170 76193d7c 2003-09-30 devnull int
171 76193d7c 2003-09-30 devnull tempdisk(void)
172 76193d7c 2003-09-30 devnull {
173 76193d7c 2003-09-30 devnull char buf[4096];
174 76193d7c 2003-09-30 devnull int fd = temp_file(buf, sizeof buf);
175 76193d7c 2003-09-30 devnull if (fd >= 0)
176 76193d7c 2003-09-30 devnull remove(buf);
177 fa325e9b 2020-01-10 cross return fd;
178 76193d7c 2003-09-30 devnull }
179 76193d7c 2003-09-30 devnull
180 22c7ebff 2004-12-28 devnull #undef waitfor
181 fa325e9b 2020-01-10 cross int
182 22c7ebff 2004-12-28 devnull samwaitfor(int pid)
183 76193d7c 2003-09-30 devnull {
184 22c7ebff 2004-12-28 devnull int r;
185 22c7ebff 2004-12-28 devnull Waitmsg *w;
186 76193d7c 2003-09-30 devnull
187 22c7ebff 2004-12-28 devnull w = p9waitfor(pid);
188 22c7ebff 2004-12-28 devnull if(w == nil)
189 22c7ebff 2004-12-28 devnull return -1;
190 22c7ebff 2004-12-28 devnull r = atoi(w->msg);
191 22c7ebff 2004-12-28 devnull free(w);
192 22c7ebff 2004-12-28 devnull return r;
193 22c7ebff 2004-12-28 devnull }
194 22c7ebff 2004-12-28 devnull
195 76193d7c 2003-09-30 devnull void
196 76193d7c 2003-09-30 devnull samerr(char *buf)
197 76193d7c 2003-09-30 devnull {
198 76193d7c 2003-09-30 devnull sprint(buf, "%s/sam.%s.err", TMPDIR, getuser());
199 76193d7c 2003-09-30 devnull }
200 76193d7c 2003-09-30 devnull
201 76193d7c 2003-09-30 devnull void*
202 76193d7c 2003-09-30 devnull emalloc(ulong n)
203 76193d7c 2003-09-30 devnull {
204 76193d7c 2003-09-30 devnull void *p;
205 76193d7c 2003-09-30 devnull
206 76193d7c 2003-09-30 devnull p = malloc(n);
207 76193d7c 2003-09-30 devnull if(p == 0)
208 76193d7c 2003-09-30 devnull panic("malloc fails");
209 76193d7c 2003-09-30 devnull memset(p, 0, n);
210 76193d7c 2003-09-30 devnull return p;
211 76193d7c 2003-09-30 devnull }
212 76193d7c 2003-09-30 devnull
213 76193d7c 2003-09-30 devnull void*
214 76193d7c 2003-09-30 devnull erealloc(void *p, ulong n)
215 76193d7c 2003-09-30 devnull {
216 76193d7c 2003-09-30 devnull p = realloc(p, n);
217 76193d7c 2003-09-30 devnull if(p == 0)
218 76193d7c 2003-09-30 devnull panic("realloc fails");
219 76193d7c 2003-09-30 devnull return p;
220 a995e477 2003-10-01 devnull }