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