1 #include "links.h"
2
3 #ifndef HAVE_RAISE
raise(int s)4 int raise(int s)
5 {
6 #ifdef HAVE_GETPID
7 pid_t p;
8 EINTRLOOP(p, getpid());
9 if (p == -1) return -1;
10 return kill(p, s);
11 #else
12 return 0;
13 #endif
14 };
15 #endif
16 #ifndef HAVE_GETTIMEOFDAY
gettimeofday(struct timeval * tv,struct timezone * tz)17 int gettimeofday(struct timeval *tv, struct timezone *tz)
18 {
19 time_t t;
20 errno = 0;
21 EINTRLOOPX(t, time(NULL), (time_t)-1);
22 if (tv) tv->tv_sec = t, tv->tv_usec = 0;
23 if (tz) tz->tz_minuteswest = tz->tz_dsttime = 0;
24 return 0;
25 }
26 #endif
27 #ifndef HAVE_GETCWD
getcwd(char * buf,size_t size)28 char *getcwd(char *buf, size_t size)
29 {
30 #ifndef MAXPATHLEN
31 #define MAXPATHLEN 1024
32 #endif
33 static char cwd[MAXPATHLEN];
34 if (!getwd(cwd))
35 return NULL;
36 if (strlen(cwd) >= size) {
37 errno = ERANGE;
38 return NULL;
39 }
40 strcpy(buf, cwd);
41 return 0;
42 }
43 #endif
44 #ifndef HAVE_TEMPNAM
tempnam(const char * dir,const char * pfx)45 char *tempnam(const char *dir, const char *pfx)
46 {
47 static int counter = 0;
48 unsigned char *d, *s, *a;
49 int l;
50 if (!(d = cast_uchar getenv("TMPDIR"))) {
51 if (dir) d = cast_uchar dir;
52 else if (!(d = cast_uchar getenv("TMP")) && !(d = cast_uchar getenv("TEMP"))) {
53 #ifdef P_tmpdir
54 d = cast_uchar(P_tmpdir);
55 #else
56 d = cast_uchar "/tmp";
57 #endif
58 }
59 }
60 l = 0;
61 s = init_str();
62 add_to_str(&s, &l, d);
63 if (s[0] && s[strlen(cast_const_char s) - 1] != '/') add_chr_to_str(&s, &l, '/');
64 add_to_str(&s, &l, cast_uchar pfx);
65 add_num_to_str(&s, &l, counter++);
66 a = cast_uchar strdup(cast_const_char s);
67 mem_free(s);
68 return cast_char a;
69 }
70 #endif
71 #ifndef HAVE_SIGFILLSET
sigfillset(sigset_t * set)72 int sigfillset(sigset_t *set)
73 {
74 memset(set, -1, sizeof(sigset_t));
75 return 0;
76 }
77 #endif
78 #ifndef HAVE_STRDUP
strdup(const char * s)79 char *strdup(const char *s)
80 {
81 char *a = malloc(strlen(s) + 1);
82 if (!a) return NULL;
83 return strcpy(a, s);
84 }
85 #endif
86 #ifndef HAVE_STRTOL
strtol(const char * nptr,char ** endptr,int base)87 long strtol(const char *nptr, char **endptr, int base)
88 {
89 unsigned long result;
90 char negative = 0;
91 if (*nptr == '-') {
92 negative = 1;
93 nptr++;
94 }
95 result = 0;
96 while (1) {
97 char c = *nptr;
98 char val;
99 unsigned long nr;
100 if (c >= '0' && c <= '9') val = c - '0';
101 else if (c >= 'A' && c <= 'Z') val = c - 'A' + 10;
102 else if (c >= 'a' && c <= 'z') val = c - 'a' + 10;
103 else break;
104 if (val >= base) break;
105 nr = result * base + val;
106 if ((long)nr < val || (nr - val) / base != result) break;
107 result = nr;
108 nptr++;
109 }
110 if (endptr) *endptr = (char *)nptr;
111 if (negative) return -result;
112 return result;
113 }
114 #endif
115 #ifndef HAVE_STRTOUL
strtoul(const char * nptr,char ** endptr,int base)116 unsigned long strtoul(const char *nptr, char **endptr, int base)
117 {
118 if (*nptr == '-') {
119 if (endptr) *endptr = nptr;
120 return 0;
121 }
122 return (unsigned long)strtol(nptr,endptr,base);
123 };
124 #endif
125 #ifndef HAVE_STRLEN
strlen(const char * s)126 size_t strlen(const char *s)
127 {
128 size_t len = 0;
129 while (s[len]) len++;
130 return len;
131 }
132 #endif
133 #ifndef HAVE_STRCPY
strcpy(char * dst,const char * src)134 char *strcpy(char *dst, const char *src)
135 {
136 return memcpy(dst, src, strlen(src) + 1);
137 }
138 #endif
139 #ifndef HAVE_STRCHR
strchr(const char * s,int c)140 char *strchr(const char *s, int c)
141 {
142 do {
143 if (*s == (char)c)
144 return (char *)s;
145 } while (*s++);
146 return NULL;
147 }
148 #endif
149 #ifndef HAVE_STRRCHR
strrchr(const char * s,int c)150 char *strrchr(const char *s, int c)
151 {
152 char *ret = NULL;
153 do {
154 if (*s == (char)c)
155 ret = (char *)s;
156 } while (*s++);
157 return ret;
158 }
159 #endif
160 #ifndef HAVE_STRCMP
strcmp(const char * s1,const char * s2)161 int strcmp(const char *s1, const char *s2)
162 {
163 while (1) {
164 unsigned char c1 = (unsigned char)*s1;
165 unsigned char c2 = (unsigned char)*s2;
166 if (c1 != c2) {
167 return (int)c1 - (int)c2;
168 }
169 if (!c1) break;
170 s1++, s2++;
171 }
172 return 0;
173 }
174 #endif
175 #ifndef HAVE_STRNCMP
strncmp(const char * s1,const char * s2,size_t n)176 int strncmp(const char *s1, const char *s2, size_t n)
177 {
178 while (n--) {
179 unsigned char c1 = (unsigned char)*s1;
180 unsigned char c2 = (unsigned char)*s2;
181 if (c1 != c2) {
182 return (int)c1 - (int)c2;
183 }
184 if (!c1) break;
185 s1++, s2++;
186 }
187 return 0;
188 }
189 #endif
190 #ifndef HAVE_STRCASECMP
strcasecmp(const char * s1,const char * s2)191 int strcasecmp(const char *s1, const char *s2)
192 {
193 while (1) {
194 unsigned char c1 = (unsigned char)*s1;
195 unsigned char c2 = (unsigned char)*s2;
196 c1 = upcase(c1);
197 c2 = upcase(c2);
198 if (c1 != c2) {
199 return (int)c1 - (int)c2;
200 }
201 if (!*s1) break;
202 s1++, s2++;
203 }
204 return 0;
205 }
206 #endif
207 #ifndef HAVE_STRNCASECMP
strncasecmp(const char * s1,const char * s2,size_t n)208 int strncasecmp(const char *s1, const char *s2, size_t n)
209 {
210 while (n--) {
211 unsigned char c1 = (unsigned char)*s1;
212 unsigned char c2 = (unsigned char)*s2;
213 c1 = upcase(c1);
214 c2 = upcase(c2);
215 if (c1 != c2) {
216 return (int)c1 - (int)c2;
217 }
218 if (!*s1) break;
219 s1++, s2++;
220 }
221 return 0;
222 }
223 #endif
224 #ifndef HAVE_STRCSPN
strcspn(const char * s,const char * reject)225 size_t strcspn(const char *s, const char *reject)
226 {
227 size_t r;
228 for (r = 0; *s; r++, s++) {
229 const char *rj;
230 for (rj = reject; *rj; rj++) if (*s == *rj) goto brk;
231 }
232 brk:
233 return r;
234 }
235 #endif
236 #ifndef HAVE_STRSPN
strspn(const char * s,const char * accept)237 size_t strspn(const char *s, const char *accept)
238 {
239 size_t r;
240 for (r = 0; *s; r++, s++) {
241 const char *rj;
242 for (rj = accept; *rj; rj++) if (*s == *rj) goto ac;
243 break;
244 ac:;
245 }
246 return r;
247 }
248 #endif
249 #ifndef HAVE_STRSTR
strstr(const char * haystack,const char * needle)250 char *strstr(const char *haystack, const char *needle)
251 {
252 size_t hs = strlen(haystack);
253 size_t ns = strlen(needle);
254 while (hs >= ns) {
255 if (!memcmp(haystack, needle, ns)) return (char *)haystack;
256 haystack++, hs--;
257 }
258 return NULL;
259 }
260 #endif
261 #ifndef HAVE_MEMCHR
memchr(const void * s,int c,size_t length)262 void *memchr(const void *s, int c, size_t length)
263 {
264 const char *sp = s;
265 while (length--) {
266 if (*sp == (char)c)
267 return (char *)s;
268 sp++;
269 }
270 return NULL;
271 }
272 #endif
273 #ifndef HAVE_MEMCMP
memcmp(const void * src0,const void * src1,size_t length)274 int memcmp(const void *src0, const void *src1, size_t length)
275 {
276 const unsigned char *s0, *s1;
277 #ifdef HAVE_BCMP
278 if (!bcmp(src0, src1, length))
279 return 0;
280 #endif
281 s0 = src0;
282 s1 = src1;
283 while (length--) {
284 int c = *s0 - *s1;
285 if (c) return c;
286 s0++, s1++;
287 }
288 return 0;
289 }
290 #endif
291 #ifndef HAVE_MEMCPY
memcpy(void * dst0,const void * src0,size_t length)292 void *memcpy(void *dst0, const void *src0, size_t length)
293 {
294 return memmove(dst0, src0, length);
295 }
296 #endif
297 #ifndef HAVE_MEMMOVE
memmove(void * dst0,const void * src0,size_t length)298 void *memmove(void *dst0, const void *src0, size_t length)
299 {
300 #ifdef HAVE_BCOPY
301 bcopy(src0, dst0, length);
302 return dst0;
303 #else
304 unsigned char *dst = dst0;
305 const unsigned char *src = src0;
306
307 if ((const unsigned char *)dst == src || !length)
308 return dst0;
309
310 if ((const unsigned char *)dst <= src) {
311 while (length--) *dst++ = *src++;
312 } else {
313 dst += length - 1;
314 src += length - 1;
315 while (length--) *dst-- = *src--;
316 }
317 return dst0;
318 #endif
319 }
320 #endif
321 #ifndef HAVE_MEMSET
memset(void * s,int c,size_t n)322 void *memset(void *s, int c, size_t n)
323 {
324 char *sc = s;
325 #ifdef HAVE_BZERO
326 if (!c) bzero(s, n);
327 else
328 #endif
329 while (n--) *sc++ = c;
330 return s;
331 }
332 #endif
333 #ifndef HAVE_STRERROR
334 extern char *sys_errlist[];
335 extern int sys_nerr;
strerror(int errnum)336 char *strerror(int errnum)
337 {
338 if (errnum < 0 || errnum >= sys_nerr) return "Unknown error";
339 return sys_errlist[errnum];
340 };
341 #endif
342