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