diff options
Diffstat (limited to 'runit/runit_lib.c')
-rw-r--r-- | runit/runit_lib.c | 275 |
1 files changed, 0 insertions, 275 deletions
diff --git a/runit/runit_lib.c b/runit/runit_lib.c deleted file mode 100644 index 8182a909a..000000000 --- a/runit/runit_lib.c +++ /dev/null | |||
@@ -1,275 +0,0 @@ | |||
1 | /* | ||
2 | Copyright (c) 2001-2006, Gerrit Pape | ||
3 | All rights reserved. | ||
4 | |||
5 | Redistribution and use in source and binary forms, with or without | ||
6 | modification, are permitted provided that the following conditions are met: | ||
7 | |||
8 | 1. Redistributions of source code must retain the above copyright notice, | ||
9 | this list of conditions and the following disclaimer. | ||
10 | 2. Redistributions in binary form must reproduce the above copyright | ||
11 | notice, this list of conditions and the following disclaimer in the | ||
12 | documentation and/or other materials provided with the distribution. | ||
13 | 3. The name of the author may not be used to endorse or promote products | ||
14 | derived from this software without specific prior written permission. | ||
15 | |||
16 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
17 | WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
18 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | ||
19 | EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
20 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | ||
21 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | ||
22 | OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
23 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | ||
24 | OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | ||
25 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | /* Busyboxed by Denys Vlasenko <vda.linux@googlemail.com> */ | ||
29 | /* Collected into one file from runit's many tiny files */ | ||
30 | /* TODO: review, eliminate unneeded stuff, move good stuff to libbb */ | ||
31 | |||
32 | #include <sys/poll.h> | ||
33 | #include <sys/file.h> | ||
34 | #include "libbb.h" | ||
35 | #include "runit_lib.h" | ||
36 | |||
37 | #ifdef UNUSED | ||
38 | unsigned byte_chr(char *s,unsigned n,int c) | ||
39 | { | ||
40 | char ch; | ||
41 | char *t; | ||
42 | |||
43 | ch = c; | ||
44 | t = s; | ||
45 | for (;;) { | ||
46 | if (!n) break; | ||
47 | if (*t == ch) break; | ||
48 | ++t; | ||
49 | --n; | ||
50 | } | ||
51 | return t - s; | ||
52 | } | ||
53 | |||
54 | static /* as it isn't used anywhere else */ | ||
55 | void tai_pack(char *s, const struct tai *t) | ||
56 | { | ||
57 | uint64_t x; | ||
58 | |||
59 | x = t->x; | ||
60 | s[7] = x & 255; x >>= 8; | ||
61 | s[6] = x & 255; x >>= 8; | ||
62 | s[5] = x & 255; x >>= 8; | ||
63 | s[4] = x & 255; x >>= 8; | ||
64 | s[3] = x & 255; x >>= 8; | ||
65 | s[2] = x & 255; x >>= 8; | ||
66 | s[1] = x & 255; x >>= 8; | ||
67 | s[0] = x; | ||
68 | } | ||
69 | |||
70 | void tai_unpack(const char *s,struct tai *t) | ||
71 | { | ||
72 | uint64_t x; | ||
73 | |||
74 | x = (unsigned char) s[0]; | ||
75 | x <<= 8; x += (unsigned char) s[1]; | ||
76 | x <<= 8; x += (unsigned char) s[2]; | ||
77 | x <<= 8; x += (unsigned char) s[3]; | ||
78 | x <<= 8; x += (unsigned char) s[4]; | ||
79 | x <<= 8; x += (unsigned char) s[5]; | ||
80 | x <<= 8; x += (unsigned char) s[6]; | ||
81 | x <<= 8; x += (unsigned char) s[7]; | ||
82 | t->x = x; | ||
83 | } | ||
84 | |||
85 | |||
86 | void taia_add(struct taia *t,const struct taia *u,const struct taia *v) | ||
87 | { | ||
88 | t->sec.x = u->sec.x + v->sec.x; | ||
89 | t->nano = u->nano + v->nano; | ||
90 | t->atto = u->atto + v->atto; | ||
91 | if (t->atto > 999999999UL) { | ||
92 | t->atto -= 1000000000UL; | ||
93 | ++t->nano; | ||
94 | } | ||
95 | if (t->nano > 999999999UL) { | ||
96 | t->nano -= 1000000000UL; | ||
97 | ++t->sec.x; | ||
98 | } | ||
99 | } | ||
100 | |||
101 | int taia_less(const struct taia *t, const struct taia *u) | ||
102 | { | ||
103 | if (t->sec.x < u->sec.x) return 1; | ||
104 | if (t->sec.x > u->sec.x) return 0; | ||
105 | if (t->nano < u->nano) return 1; | ||
106 | if (t->nano > u->nano) return 0; | ||
107 | return t->atto < u->atto; | ||
108 | } | ||
109 | |||
110 | void taia_now(struct taia *t) | ||
111 | { | ||
112 | struct timeval now; | ||
113 | gettimeofday(&now, NULL); | ||
114 | tai_unix(&t->sec, now.tv_sec); | ||
115 | t->nano = 1000 * now.tv_usec + 500; | ||
116 | t->atto = 0; | ||
117 | } | ||
118 | |||
119 | /* UNUSED | ||
120 | void taia_pack(char *s, const struct taia *t) | ||
121 | { | ||
122 | unsigned long x; | ||
123 | |||
124 | tai_pack(s, &t->sec); | ||
125 | s += 8; | ||
126 | |||
127 | x = t->atto; | ||
128 | s[7] = x & 255; x >>= 8; | ||
129 | s[6] = x & 255; x >>= 8; | ||
130 | s[5] = x & 255; x >>= 8; | ||
131 | s[4] = x; | ||
132 | x = t->nano; | ||
133 | s[3] = x & 255; x >>= 8; | ||
134 | s[2] = x & 255; x >>= 8; | ||
135 | s[1] = x & 255; x >>= 8; | ||
136 | s[0] = x; | ||
137 | } | ||
138 | */ | ||
139 | |||
140 | void taia_sub(struct taia *t, const struct taia *u, const struct taia *v) | ||
141 | { | ||
142 | unsigned long unano = u->nano; | ||
143 | unsigned long uatto = u->atto; | ||
144 | |||
145 | t->sec.x = u->sec.x - v->sec.x; | ||
146 | t->nano = unano - v->nano; | ||
147 | t->atto = uatto - v->atto; | ||
148 | if (t->atto > uatto) { | ||
149 | t->atto += 1000000000UL; | ||
150 | --t->nano; | ||
151 | } | ||
152 | if (t->nano > unano) { | ||
153 | t->nano += 1000000000UL; | ||
154 | --t->sec.x; | ||
155 | } | ||
156 | } | ||
157 | |||
158 | /* XXX: breaks tai encapsulation */ | ||
159 | void taia_uint(struct taia *t, unsigned s) | ||
160 | { | ||
161 | t->sec.x = s; | ||
162 | t->nano = 0; | ||
163 | t->atto = 0; | ||
164 | } | ||
165 | |||
166 | static | ||
167 | uint64_t taia2millisec(const struct taia *t) | ||
168 | { | ||
169 | return (t->sec.x * 1000) + (t->nano / 1000000); | ||
170 | } | ||
171 | |||
172 | void iopause(iopause_fd *x, unsigned len, struct taia *deadline, struct taia *stamp) | ||
173 | { | ||
174 | int millisecs; | ||
175 | int i; | ||
176 | |||
177 | if (taia_less(deadline, stamp)) | ||
178 | millisecs = 0; | ||
179 | else { | ||
180 | uint64_t m; | ||
181 | struct taia t; | ||
182 | t = *stamp; | ||
183 | taia_sub(&t, deadline, &t); | ||
184 | millisecs = m = taia2millisec(&t); | ||
185 | if (m > 1000) millisecs = 1000; | ||
186 | millisecs += 20; | ||
187 | } | ||
188 | |||
189 | for (i = 0; i < len; ++i) | ||
190 | x[i].revents = 0; | ||
191 | |||
192 | poll(x, len, millisecs); | ||
193 | /* XXX: some kernels apparently need x[0] even if len is 0 */ | ||
194 | /* XXX: how to handle EAGAIN? are kernels really this dumb? */ | ||
195 | /* XXX: how to handle EINVAL? when exactly can this happen? */ | ||
196 | } | ||
197 | #endif | ||
198 | |||
199 | int lock_ex(int fd) | ||
200 | { | ||
201 | return flock(fd, LOCK_EX); | ||
202 | } | ||
203 | |||
204 | int lock_exnb(int fd) | ||
205 | { | ||
206 | return flock(fd, LOCK_EX | LOCK_NB); | ||
207 | } | ||
208 | |||
209 | #ifdef UNUSED | ||
210 | int open_append(const char *fn) | ||
211 | { | ||
212 | return open(fn, O_WRONLY | O_NDELAY | O_APPEND | O_CREAT, 0600); | ||
213 | } | ||
214 | |||
215 | int open_trunc(const char *fn) | ||
216 | { | ||
217 | return open(fn, O_WRONLY | O_NDELAY | O_TRUNC | O_CREAT, 0644); | ||
218 | } | ||
219 | #endif | ||
220 | |||
221 | int open_read(const char *fn) | ||
222 | { | ||
223 | return open(fn, O_RDONLY|O_NDELAY); | ||
224 | } | ||
225 | |||
226 | int open_write(const char *fn) | ||
227 | { | ||
228 | return open(fn, O_WRONLY|O_NDELAY); | ||
229 | } | ||
230 | |||
231 | unsigned FAST_FUNC pmatch(const char *p, const char *s, unsigned len) | ||
232 | { | ||
233 | for (;;) { | ||
234 | char c = *p++; | ||
235 | if (!c) return !len; | ||
236 | switch (c) { | ||
237 | case '*': | ||
238 | c = *p; | ||
239 | if (!c) return 1; | ||
240 | for (;;) { | ||
241 | if (!len) return 0; | ||
242 | if (*s == c) break; | ||
243 | ++s; | ||
244 | --len; | ||
245 | } | ||
246 | continue; | ||
247 | case '+': | ||
248 | c = *p++; | ||
249 | if (c != *s) return 0; | ||
250 | for (;;) { | ||
251 | if (!len) return 1; | ||
252 | if (*s != c) break; | ||
253 | ++s; | ||
254 | --len; | ||
255 | } | ||
256 | continue; | ||
257 | /* | ||
258 | case '?': | ||
259 | if (*p == '?') { | ||
260 | if (*s != '?') return 0; | ||
261 | ++p; | ||
262 | } | ||
263 | ++s; --len; | ||
264 | continue; | ||
265 | */ | ||
266 | default: | ||
267 | if (!len) return 0; | ||
268 | if (*s != c) return 0; | ||
269 | ++s; | ||
270 | --len; | ||
271 | continue; | ||
272 | } | ||
273 | } | ||
274 | return 0; | ||
275 | } | ||