Line data Source code
1 : /* -*- C -*- */
2 : /*
3 : * Copyright (c) 1995-2017 Kungliga Tekniska Högskolan
4 : * (Royal Institute of Technology, Stockholm, Sweden).
5 : * All rights reserved.
6 : *
7 : * Redistribution and use in source and binary forms, with or without
8 : * modification, are permitted provided that the following conditions
9 : * are met:
10 : *
11 : * 1. Redistributions of source code must retain the above copyright
12 : * notice, this list of conditions and the following disclaimer.
13 : *
14 : * 2. Redistributions in binary form must reproduce the above copyright
15 : * notice, this list of conditions and the following disclaimer in the
16 : * documentation and/or other materials provided with the distribution.
17 : *
18 : * 3. Neither the name of the Institute nor the names of its contributors
19 : * may be used to endorse or promote products derived from this software
20 : * without specific prior written permission.
21 : *
22 : * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
23 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 : * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
26 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 : * SUCH DAMAGE.
33 : */
34 :
35 : # if defined(_WIN32) && _MSC_VER >= 1400
36 : /* _CRT_RAND_S must be defined before including stdlib.h */
37 : # define _CRT_RAND_S
38 : # define HAVE_WIN32_RAND_S 1
39 : # endif
40 :
41 : #include <stdio.h>
42 : #include <stdlib.h>
43 : #include <stdarg.h>
44 : #ifdef HAVE_STDINT_H
45 : #include <stdint.h>
46 : #endif
47 : #include <string.h>
48 : #include <limits.h>
49 : #include <signal.h>
50 :
51 : #ifdef HAVE_UTIL_H
52 : #include <util.h>
53 : #endif
54 :
55 : # ifndef ROKEN_LIB_FUNCTION
56 : # ifdef _WIN32
57 : # ifdef ROKEN_LIB_DYNAMIC
58 : # define ROKEN_LIB_FUNCTION __declspec(dllimport)
59 : # else
60 : # define ROKEN_LIB_FUNCTION
61 : # endif
62 : # else
63 : # define ROKEN_LIB_FUNCTION
64 : # endif
65 : # endif
66 :
67 : # ifndef ROKEN_LIB_NORETURN_FUNCTION
68 : # ifdef _WIN32
69 : # ifdef ROKEN_LIB_DYNAMIC
70 : # define ROKEN_LIB_NORETURN_FUNCTION __declspec(dllimport noreturn)
71 : # else
72 : # define ROKEN_LIB_NORETURN_FUNCTION __declspec(noreturn)
73 : # endif
74 : # else
75 : # define ROKEN_LIB_NORETURN_FUNCTION
76 : # endif
77 : # endif
78 :
79 : # ifndef ROKEN_LIB_CALL
80 : # ifdef _WIN32
81 : # define ROKEN_LIB_CALL __cdecl
82 : # else
83 : # define ROKEN_LIB_CALL
84 : # endif
85 : # endif
86 :
87 : # ifndef ROKEN_LIB_VARIABLE
88 : # ifdef _WIN32
89 : # ifdef ROKEN_LIB_DYNAMIC
90 : # define ROKEN_LIB_VARIABLE __declspec(dllimport)
91 : # else
92 : # define ROKEN_LIB_VARIABLE
93 : # endif
94 : # else
95 : # define ROKEN_LIB_VARIABLE
96 : # endif
97 : # endif
98 :
99 : #if !defined(__has_extension)
100 : #define __has_extension(x) 0
101 : #endif
102 :
103 : #ifndef ROKEN_REQUIRE_GNUC
104 : #define ROKEN_REQUIRE_GNUC(m,n,p) \
105 : (((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) + __GNUC_PATCHLEVEL__) >= \
106 : (((m) * 10000) + ((n) * 100) + (p)))
107 : #endif
108 :
109 : #ifndef ROKEN_DEPRECATED
110 : #if __has_extension(deprecated) || ROKEN_REQUIRE_GNUC(3,1,0)
111 : #define ROKEN_DEPRECATED __attribute__ ((__deprecated__))
112 : #elif defined(_MSC_VER) && (_MSC_VER>1200)
113 : #define ROKEN_DEPRECATED __declspec(deprecated)
114 : #else
115 : #define ROKEN_DEPRECATED
116 : #endif
117 : #endif
118 :
119 : #ifndef ROKEN_PRINTF_ATTRIBUTE
120 : #if __has_extension(format) || ROKEN_REQUIRE_GNUC(3,1,0)
121 : #define ROKEN_PRINTF_ATTRIBUTE(x) __attribute__ ((__format__ x))
122 : #else
123 : #define ROKEN_PRINTF_ATTRIBUTE(x)
124 : #endif
125 : #endif
126 :
127 : #ifndef ROKEN_NORETURN_ATTRIBUTE
128 : #if __has_extension(noreturn) || ROKEN_REQUIRE_GNUC(3,1,0)
129 : #define ROKEN_NORETURN_ATTRIBUTE __attribute__ ((__noreturn__))
130 : #else
131 : #define ROKEN_NORETURN_ATTRIBUTE
132 : #endif
133 : #endif
134 :
135 : #ifndef ROKEN_UNUSED_ATTRIBUTE
136 : #if __has_extension(unused) || ROKEN_REQUIRE_GNUC(3,1,0)
137 : #define ROKEN_UNUSED_ATTRIBUTE __attribute__ ((__unused__))
138 : #else
139 : #define ROKEN_UNUSED_ATTRIBUTE
140 : #endif
141 : #endif
142 :
143 : #ifndef ROKEN_WARN_UNUSED_RESULT_ATTRIBUTE
144 : #if __has_extension(warn_unused_result) || ROKEN_REQUIRE_GNUC(3,3,0)
145 : #define ROKEN_WARN_UNUSED_RESULT_ATTRIBUTE __attribute__ ((__warn_unused_result__))
146 : #else
147 : #define ROKEN_WARN_UNUSED_RESULT_ATTRIBUTE
148 : #endif
149 : #endif
150 :
151 : #ifdef HAVE_WINSOCK
152 : /* Declarations for Microsoft Windows */
153 :
154 : #include <winsock2.h>
155 : #include <ws2tcpip.h>
156 :
157 : /*
158 : * error codes for inet_ntop/inet_pton
159 : */
160 : typedef SOCKET rk_socket_t;
161 :
162 : #define rk_closesocket(x) closesocket(x)
163 : #define rk_INVALID_SOCKET INVALID_SOCKET
164 : #define rk_IS_BAD_SOCKET(s) ((s) == INVALID_SOCKET)
165 : #define rk_IS_SOCKET_ERROR(rv) ((rv) == SOCKET_ERROR)
166 : #define rk_SOCK_ERRNO WSAGetLastError()
167 :
168 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_SOCK_IOCTL(SOCKET s, long cmd, int * argp);
169 :
170 : #define rk_SOCK_INIT() rk_WSAStartup()
171 : #define rk_SOCK_EXIT() rk_WSACleanup()
172 :
173 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_WSAStartup(void);
174 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_WSACleanup(void);
175 :
176 : #else /* not WinSock */
177 :
178 : typedef int rk_socket_t;
179 :
180 : #define rk_closesocket(x) close(x)
181 : #define rk_SOCK_IOCTL(s,c,a) ioctl((s),(c),(a))
182 : #define rk_IS_BAD_SOCKET(s) ((s) < 0)
183 : #define rk_IS_SOCKET_ERROR(rv) ((rv) < 0)
184 : #define rk_SOCK_ERRNO errno
185 : #define rk_INVALID_SOCKET (-1)
186 :
187 772494 : static inline ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_SOCK_INIT(void) {
188 772494 : return 0;
189 : }
190 :
191 : #define rk_SOCK_EXIT() do { } while(0)
192 :
193 : #endif /* WinSock */
194 :
195 : #ifndef IN_LOOPBACKNET
196 : #define IN_LOOPBACKNET 127
197 : #endif
198 :
199 : #ifdef _MSC_VER
200 : #ifndef HAVE_STDINT_H
201 : #include <intsafe.h>
202 : #endif
203 :
204 : /* Declarations for Microsoft Visual C runtime on Windows */
205 :
206 : #include<process.h>
207 :
208 : #include<io.h>
209 :
210 : #ifndef __BIT_TYPES_DEFINED__
211 : #define __BIT_TYPES_DEFINED__
212 :
213 : typedef __int8 int8_t;
214 : typedef __int16 int16_t;
215 : typedef __int32 int32_t;
216 : typedef __int64 int64_t;
217 : typedef unsigned __int8 uint8_t;
218 : typedef unsigned __int16 uint16_t;
219 : typedef unsigned __int32 uint32_t;
220 : typedef unsigned __int64 uint64_t;
221 : typedef uint8_t u_int8_t;
222 : typedef uint16_t u_int16_t;
223 : typedef uint32_t u_int32_t;
224 : typedef uint64_t u_int64_t;
225 :
226 : #endif /* __BIT_TYPES_DEFINED__ */
227 :
228 : #define UNREACHABLE(x) x
229 : #define UNUSED_ARGUMENT(x) ((void) x)
230 :
231 : #define RETSIGTYPE void
232 :
233 : #define VOID_RETSIGTYPE 1
234 :
235 : #ifdef VOID_RETSIGTYPE
236 : #define SIGRETURN(x) return
237 : #else
238 : #define SIGRETURN(x) return (RETSIGTYPE)(x)
239 : #endif
240 :
241 : #ifndef CPP_ONLY
242 :
243 : typedef int pid_t;
244 :
245 : typedef unsigned int gid_t;
246 :
247 : typedef unsigned int uid_t;
248 :
249 : typedef unsigned short mode_t;
250 :
251 : #endif
252 :
253 : #ifndef __cplusplus
254 : #define inline __inline
255 : #endif
256 :
257 : #else
258 :
259 : #define UNREACHABLE(x)
260 : #define UNUSED_ARGUMENT(x)
261 :
262 : #endif
263 :
264 : #ifdef _AIX
265 : struct ether_addr;
266 : struct sockaddr_dl;
267 : #endif
268 : #ifdef HAVE_SYS_PARAM_H
269 : #include <sys/param.h>
270 : #endif
271 : #ifdef HAVE_INTTYPES_H
272 : #include <inttypes.h>
273 : #endif
274 : #ifdef HAVE_SYS_TYPES_H
275 : #include <sys/types.h>
276 : #endif
277 : #ifdef HAVE_SYS_ERRNO_H
278 : #include <sys/errno.h>
279 : #endif
280 : #ifdef HAVE_SYS_BITYPES_H
281 : #include <sys/bitypes.h>
282 : #endif
283 : #ifdef HAVE_BIND_BITYPES_H
284 : #include <bind/bitypes.h>
285 : #endif
286 : #ifdef HAVE_NETINET_IN6_MACHTYPES_H
287 : #include <netinet/in6_machtypes.h>
288 : #endif
289 : #ifdef HAVE_UNISTD_H
290 : #include <unistd.h>
291 : #endif
292 : #ifdef HAVE_SYS_SOCKET_H
293 : #include <sys/socket.h>
294 : #endif
295 : #ifdef HAVE_SYS_UIO_H
296 : #include <sys/uio.h>
297 : #endif
298 : #ifdef HAVE_GRP_H
299 : #include <grp.h>
300 : #endif
301 : #ifdef HAVE_SYS_STAT_H
302 : #include <sys/stat.h>
303 : #endif
304 : #ifdef HAVE_NETINET_IN_H
305 : #include <netinet/in.h>
306 : #endif
307 : #ifdef HAVE_NETINET_IN6_H
308 : #include <netinet/in6.h>
309 : #endif
310 : #ifdef HAVE_NETINET6_IN6_H
311 : #include <netinet6/in6.h>
312 : #endif
313 : #ifdef HAVE_ARPA_INET_H
314 : #include <arpa/inet.h>
315 : #endif
316 : #ifdef HAVE_NETDB_H
317 : #include <netdb.h>
318 : #endif
319 : #ifdef HAVE_ARPA_NAMESER_H
320 : #include <arpa/nameser.h>
321 : #endif
322 : #ifdef HAVE_RESOLV_H
323 : #include <resolv.h>
324 : #endif
325 : #ifdef HAVE_SYSLOG_H
326 : #include <syslog.h>
327 : #endif
328 : #ifdef HAVE_FCNTL_H
329 : #include <fcntl.h>
330 : #endif
331 : #ifdef HAVE_ERRNO_H
332 : #include <errno.h>
333 : #endif
334 : #include <err.h>
335 : #ifdef HAVE_TERMIOS_H
336 : #include <termios.h>
337 : #endif
338 : #ifdef HAVE_SYS_IOCTL_H
339 : #include <sys/ioctl.h>
340 : #endif
341 : #ifdef TIME_WITH_SYS_TIME
342 : #include <sys/time.h>
343 : #include <time.h>
344 : #elif defined(HAVE_SYS_TIME_H)
345 : #include <sys/time.h>
346 : #else
347 : #include <time.h>
348 : #endif
349 :
350 : #ifdef HAVE_PATHS_H
351 : #include <paths.h>
352 : #endif
353 :
354 : #ifdef HAVE_DLFCN_H
355 : #include <dlfcn.h>
356 : #endif
357 :
358 : #ifdef HAVE_DIRENT_H
359 : #include <dirent.h>
360 : #endif
361 :
362 : #ifdef WIN32
363 : #include <direct.h>
364 : #endif
365 :
366 : #ifdef BACKSLASH_PATH_DELIM
367 : #define rk_PATH_DELIM '\\'
368 : #endif
369 :
370 : #ifndef HAVE_SSIZE_T
371 : #ifndef SSIZE_T_DEFINED
372 : #ifdef ssize_t
373 : #undef ssize_t
374 : #endif
375 : #ifdef _WIN64
376 : typedef __int64 ssize_t;
377 : #else
378 : typedef int ssize_t;
379 : #endif
380 : #define SSIZE_T_DEFINED
381 : #endif /* SSIZE_T_DEFINED */
382 : #endif /* HAVE_SSIZE_T */
383 :
384 : #include <roken-common.h>
385 :
386 : ROKEN_CPP_START
387 :
388 : #ifdef HAVE_UINTPTR_T
389 : #define rk_UNCONST(x) ((void *)(uintptr_t)(const void *)(x))
390 : #else
391 : #define rk_UNCONST(x) ((void *)(unsigned long)(const void *)(x))
392 : #endif
393 :
394 : #if !defined(HAVE_SETSID) && defined(HAVE__SETSID)
395 : #define setsid _setsid
396 : #endif
397 :
398 : #ifdef _MSC_VER
399 : /* Additional macros for Visual C/C++ runtime */
400 :
401 : #define close _close
402 :
403 : #define getpid _getpid
404 :
405 : #define open _open
406 :
407 : #define chdir _chdir
408 :
409 : #define fsync _commit
410 :
411 : #define _PIPE_BUFFER_SZ 8192
412 : #define pipe(fds) _pipe((fds), _PIPE_BUFFER_SZ, O_BINARY);
413 :
414 : #define ftruncate(fd, sz) _chsize((fd), (sz))
415 :
416 : #if !defined(HAVE_UCRT)
417 : #define snprintf rk_snprintf
418 : #define vsnprintf rk_vsnprintf
419 : #define vasnprintf rk_vasnprintf
420 : #define vasprintf rk_vasprintf
421 : #define asnprintf rk_asnprintf
422 : #define asprintf rk_asprintf
423 :
424 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
425 : rk_snprintf (char *str, size_t sz, const char *format, ...);
426 :
427 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
428 : rk_asprintf (char **ret, const char *format, ...);
429 :
430 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
431 : rk_asnprintf (char **ret, size_t max_sz, const char *format, ...);
432 :
433 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
434 : rk_vasprintf (char **ret, const char *format, va_list args);
435 :
436 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
437 : rk_vasnprintf (char **ret, size_t max_sz, const char *format, va_list args);
438 :
439 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
440 : rk_vsnprintf (char *str, size_t sz, const char *format, va_list args);
441 : #endif /* !defined(HAVE_UCRT) */
442 :
443 : /* missing stat.h predicates */
444 :
445 : #define S_ISREG(m) (((m) & _S_IFREG) == _S_IFREG)
446 :
447 : #define S_ISDIR(m) (((m) & _S_IFDIR) == _S_IFDIR)
448 :
449 : #define S_ISCHR(m) (((m) & _S_IFCHR) == _S_IFCHR)
450 :
451 : #define S_ISFIFO(m) (((m) & _S_IFIFO) == _S_IFIFO)
452 :
453 : /* The following are not implemented:
454 :
455 : S_ISLNK(m)
456 : S_ISSOCK(m)
457 : S_ISBLK(m)
458 : */
459 :
460 : /* The following symbolic constants are provided for rk_mkdir mode */
461 :
462 : #define S_IRWXU 00700 /* user (file owner) has read, write and execute permission */
463 : #define S_IRUSR 00400 /* user has read permission */
464 : #define S_IWUSR 00200 /* user has write permission */
465 : #define S_IXUSR 00100 /* user has execute permission */
466 : #define S_IRWXG 00070 /* group has read, write and execute permission */
467 : #define S_IRGRP 00040 /* group has read permission */
468 : #define S_IWGRP 00020 /* group has write permission */
469 : #define S_IXGRP 00010 /* group has execute permission */
470 : #define S_IRWXO 00007 /* others have read, write and execute permission */
471 : #define S_IROTH 00004 /* others have read permission */
472 : #define S_IWOTH 00002 /* others have write permission */
473 : #define S_IXOTH 00001 /* others have execute permission */
474 :
475 : #if !defined(ROKEN_NO_DEFINE_ALLOCATORS)
476 : /* Ensure that a common memory allocator is used by all */
477 : #define calloc rk_calloc
478 : #define free rk_free
479 : #define malloc rk_malloc
480 : #define realloc rk_realloc
481 : #define strdup rk_strdup
482 : #define wcsdup rk_wcsdup
483 : #endif
484 :
485 : ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
486 : rk_calloc(size_t, size_t);
487 :
488 : ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
489 : rk_free(void *);
490 :
491 : ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
492 : rk_malloc(size_t);
493 :
494 : ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
495 : rk_realloc(void *, size_t);
496 :
497 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
498 : rk_strdup(const char *);
499 :
500 : ROKEN_LIB_FUNCTION unsigned short * ROKEN_LIB_CALL
501 : rk_wcsdup(const unsigned short *);
502 :
503 : #endif /* _MSC_VER */
504 :
505 : #ifndef HAVE_MEMMEM
506 : #define memmem rk_smemmem
507 : ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL memmem(const void *, size_t, const void *, size_t);
508 : #endif
509 :
510 : #ifdef HAVE_WINSOCK
511 :
512 : /* While we are at it, define WinSock specific scatter gather socket
513 : I/O. */
514 :
515 : #define iovec _WSABUF
516 : #define iov_base buf
517 : #define iov_len len
518 :
519 : struct msghdr {
520 : void *msg_name;
521 : socklen_t msg_namelen;
522 : struct iovec *msg_iov;
523 : size_t msg_iovlen;
524 : void *msg_control;
525 : socklen_t msg_controllen;
526 : int msg_flags;
527 : };
528 :
529 : #define sendmsg sendmsg_w32
530 :
531 : ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
532 : sendmsg_w32(rk_socket_t s, const struct msghdr * msg, int flags);
533 :
534 : #endif /* HAVE_WINSOCK */
535 :
536 : #ifndef HAVE_PUTENV
537 : #define putenv rk_putenv
538 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL putenv(const char *);
539 : #endif
540 :
541 : #if !defined(HAVE_SETENV) || defined(NEED_SETENV_PROTO)
542 : #ifndef HAVE_SETENV
543 : #define setenv rk_setenv
544 : #endif
545 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL setenv(const char *, const char *, int);
546 : #endif
547 :
548 : #if !defined(HAVE_UNSETENV) || defined(NEED_UNSETENV_PROTO)
549 : #ifndef HAVE_UNSETENV
550 : #define unsetenv rk_unsetenv
551 : #endif
552 : ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL unsetenv(const char *);
553 : #endif
554 :
555 : #if !defined(HAVE_GETUSERSHELL) || defined(NEED_GETUSERSHELL_PROTO)
556 : #ifndef HAVE_GETUSERSHELL
557 : #define getusershell rk_getusershell
558 : #define endusershell rk_endusershell
559 : #endif
560 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL getusershell(void);
561 : ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL endusershell(void);
562 : #endif
563 :
564 : #if !defined(HAVE_SNPRINTF) || defined(NEED_SNPRINTF_PROTO)
565 : #ifndef HAVE_SNPRINTF
566 : #define snprintf rk_snprintf
567 : #endif
568 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
569 : rk_snprintf (char *, size_t, const char *, ...)
570 : ROKEN_PRINTF_ATTRIBUTE((__printf__, 3, 4));
571 : #endif
572 :
573 : #if !defined(HAVE_VSNPRINTF) || defined(NEED_VSNPRINTF_PROTO)
574 : #ifndef HAVE_VSNPRINTF
575 : #define vsnprintf rk_vsnprintf
576 : #endif
577 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
578 : rk_vsnprintf (char *, size_t, const char *, va_list)
579 : ROKEN_PRINTF_ATTRIBUTE((__printf__, 3, 0));
580 : #endif
581 :
582 : #if !defined(HAVE_ASPRINTF) || defined(NEED_ASPRINTF_PROTO)
583 : #ifndef HAVE_ASPRINTF
584 : #define asprintf rk_asprintf
585 : #endif
586 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
587 : rk_asprintf (char **, const char *, ...)
588 : ROKEN_PRINTF_ATTRIBUTE((__printf__, 2, 3));
589 : #endif
590 :
591 : #if !defined(HAVE_VASPRINTF) || defined(NEED_VASPRINTF_PROTO)
592 : #ifndef HAVE_VASPRINTF
593 : #define vasprintf rk_vasprintf
594 : #endif
595 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
596 : rk_vasprintf (char **, const char *, va_list)
597 : ROKEN_PRINTF_ATTRIBUTE((__printf__, 2, 0));
598 : #endif
599 :
600 : #if !defined(HAVE_ASNPRINTF) || defined(NEED_ASNPRINTF_PROTO)
601 : #ifndef HAVE_ASNPRINTF
602 : #define asnprintf rk_asnprintf
603 : #endif
604 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
605 : rk_asnprintf (char **, size_t, const char *, ...)
606 : ROKEN_PRINTF_ATTRIBUTE((__printf__, 3, 4));
607 : #endif
608 :
609 : #if !defined(HAVE_VASNPRINTF) || defined(NEED_VASNPRINTF_PROTO)
610 : #ifndef HAVE_VASNPRINTF
611 : #define vasnprintf rk_vasnprintf
612 : #endif
613 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
614 : vasnprintf (char **, size_t, const char *, va_list)
615 : ROKEN_PRINTF_ATTRIBUTE((__printf__, 3, 0));
616 : #endif
617 :
618 : #if !defined(HAVE_EVASPRINTF) || defined(NEED_EVASPRINTF_PROTO)
619 : #define evasprintf rk_evasprintf
620 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
621 : rk_evasprintf(const char *format, va_list args);
622 : #endif
623 :
624 : #if !defined(HAVE_EASPRINTF) || defined(NEED_EASPRINTF_PROTO)
625 : #define easprintf rk_easprintf
626 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
627 : rk_easprintf(const char *format, ...);
628 : #endif
629 :
630 : #ifndef HAVE_STRDUP
631 : #define strdup rk_strdup
632 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL strdup(const char *);
633 : #endif
634 :
635 : #if !defined(HAVE_STRNDUP) || defined(NEED_STRNDUP_PROTO)
636 : #ifndef HAVE_STRNDUP
637 : #define strndup rk_strndup
638 : #endif
639 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL strndup(const char *, size_t);
640 : #endif
641 :
642 : #ifndef HAVE_STRLWR
643 : #define strlwr rk_strlwr
644 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL strlwr(char *);
645 : #endif
646 :
647 : #ifndef HAVE_STRNLEN
648 : #define strnlen rk_strnlen
649 : ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL strnlen(const char*, size_t);
650 : #endif
651 :
652 : #if !defined(HAVE_STRSEP) || defined(NEED_STRSEP_PROTO)
653 : #ifndef HAVE_STRSEP
654 : #define strsep rk_strsep
655 : #endif
656 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL strsep(char**, const char*);
657 : #endif
658 :
659 : #if !defined(HAVE_STRSEP_COPY) || defined(NEED_STRSEP_COPY_PROTO)
660 : #ifndef HAVE_STRSEP_COPY
661 : #define strsep_copy rk_strsep_copy
662 : #endif
663 : ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL strsep_copy(const char**, const char*, char*, size_t);
664 : #endif
665 :
666 : #ifndef HAVE_STRCASECMP
667 : #define strcasecmp rk_strcasecmp
668 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL strcasecmp(const char *, const char *);
669 : #endif
670 :
671 : #ifdef NEED_FCLOSE_PROTO
672 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL fclose(FILE *);
673 : #endif
674 :
675 : #ifdef NEED_STRTOK_R_PROTO
676 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL strtok_r(char *, const char *, char **);
677 : #endif
678 :
679 : #ifndef HAVE_STRUPR
680 : #define strupr rk_strupr
681 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL strupr(char *);
682 : #endif
683 :
684 : #ifndef HAVE_STRLCPY
685 : #define strlcpy rk_strlcpy
686 : ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL strlcpy (char *, const char *, size_t);
687 : #endif
688 :
689 : #ifndef HAVE_STRLCAT
690 : #define strlcat rk_strlcat
691 : ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL strlcat (char *, const char *, size_t);
692 : #endif
693 :
694 : #ifndef HAVE_GETDTABLESIZE
695 : #define getdtablesize rk_getdtablesize
696 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL getdtablesize(void);
697 : #endif
698 :
699 : #if !defined(HAVE_STRERROR) && !defined(strerror)
700 : #define strerror rk_strerror
701 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL strerror(int);
702 : #endif
703 :
704 : #if (!defined(HAVE_STRERROR_R) && !defined(strerror_r)) || (!defined(STRERROR_R_PROTO_COMPATIBLE) && defined(HAVE_STRERROR_R))
705 : int ROKEN_LIB_FUNCTION rk_strerror_r(int, char *, size_t);
706 : #else
707 : #define rk_strerror_r strerror_r
708 : #endif
709 :
710 : #if !defined(HAVE_HSTRERROR) || defined(NEED_HSTRERROR_PROTO)
711 : #ifndef HAVE_HSTRERROR
712 : #define hstrerror rk_hstrerror
713 : #endif
714 : /* This causes a fatal error under Psoriasis */
715 : #ifndef SunOS
716 : ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL hstrerror(int);
717 : #endif
718 : #endif
719 :
720 : #if !HAVE_DECL_H_ERRNO
721 : extern int h_errno;
722 : #endif
723 :
724 : #if !defined(HAVE_INET_ATON) || defined(NEED_INET_ATON_PROTO)
725 : #ifndef HAVE_INET_ATON
726 : #define inet_aton rk_inet_aton
727 : #endif
728 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL inet_aton(const char *, struct in_addr *);
729 : #endif
730 :
731 : #ifndef HAVE_INET_NTOP
732 : #define inet_ntop rk_inet_ntop
733 : ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL
734 : inet_ntop(int af, const void *src, char *dst, size_t size);
735 : #endif
736 :
737 : #ifndef HAVE_INET_PTON
738 : #define inet_pton rk_inet_pton
739 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
740 : inet_pton(int, const char *, void *);
741 : #endif
742 :
743 : #ifndef HAVE_GETCWD
744 : #define getcwd rk_getcwd
745 : ROKEN_LIB_FUNCTION char* ROKEN_LIB_CALL getcwd(char *, size_t);
746 : #endif
747 :
748 : #ifdef HAVE_PWD_H
749 : #include <pwd.h>
750 : #endif
751 :
752 : #ifndef HAVE_SETEUID
753 : #define seteuid rk_seteuid
754 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL seteuid(uid_t);
755 : #endif
756 :
757 : #ifndef HAVE_SETEGID
758 : #define setegid rk_setegid
759 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL setegid(gid_t);
760 : #endif
761 :
762 : #ifndef HAVE_LSTAT
763 : #define lstat rk_lstat
764 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL lstat(const char *, struct stat *);
765 : #endif
766 :
767 : #if !defined(HAVE_MKSTEMP) || defined(NEED_MKSTEMP_PROTO)
768 : #ifndef HAVE_MKSTEMP
769 : #define mkstemp rk_mkstemp
770 : #endif
771 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL mkstemp(char *);
772 : #endif
773 :
774 : #ifndef HAVE_MKOSTEMP
775 : #define mkostemp rk_mkostemp
776 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL mkostemp(char *, int);
777 : #endif
778 :
779 : #ifndef HAVE_MKDTEMP
780 : #define mkdtemp rk_mkdtemp
781 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL mkdtemp(char *);
782 : #endif
783 :
784 : #ifndef HAVE_INITGROUPS
785 : #define initgroups rk_initgroups
786 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL initgroups(const char *, gid_t);
787 : #endif
788 :
789 : #ifndef HAVE_FCHOWN
790 : #define fchown rk_fchown
791 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL fchown(int, uid_t, gid_t);
792 : #endif
793 :
794 : #ifdef RENAME_DOES_NOT_UNLINK
795 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_rename(const char *, const char *);
796 : #else
797 : #define rk_rename(__rk_rn_from,__rk_rn_to) rename(__rk_rn_from,__rk_rn_to)
798 : #endif
799 :
800 : #ifdef WIN32
801 : #define mkdir rk_mkdir
802 : #else
803 : #define rk_mkdir(__rk_rn_name, __rk_rn_mode) mkdir(__rk_rn_name,__rk_rn_mode)
804 : #endif
805 :
806 :
807 : #if !defined(HAVE_DAEMON) || defined(NEED_DAEMON_PROTO)
808 : #ifndef HAVE_DAEMON
809 : #define daemon rk_daemon
810 : #endif
811 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL daemon(int, int);
812 : #endif
813 :
814 : #ifndef HAVE_CHOWN
815 : #define chown rk_chown
816 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL chown(const char *, uid_t, gid_t);
817 : #endif
818 :
819 : #ifndef HAVE_RCMD
820 : #define rcmd rk_rcmd
821 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
822 : rcmd(char **, unsigned short, const char *,
823 : const char *, const char *, int *);
824 : #endif
825 :
826 : #if !defined(HAVE_INNETGR) || defined(NEED_INNETGR_PROTO)
827 : #ifndef HAVE_INNETGR
828 : #define innetgr rk_innetgr
829 : #endif
830 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL innetgr(const char*, const char*,
831 : const char*, const char*);
832 : #endif
833 :
834 : #if !defined(HAVE_GETHOSTNAME) || defined(NEED_GETHOSTNAME_PROTO)
835 : #ifndef HAVE_GETHOSTNAME
836 : #define gethostname rk_gethostname
837 : #endif
838 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL gethostname(char *, int);
839 : #endif
840 :
841 : #ifndef HAVE_WRITEV
842 : #define writev rk_writev
843 : ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
844 : writev(int, const struct iovec *, int);
845 : #endif
846 :
847 : #ifndef HAVE_READV
848 : #define readv rk_readv
849 : ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
850 : readv(int, const struct iovec *, int);
851 : #endif
852 :
853 : #ifdef NO_PIDFILES
854 : #define rk_pidfile(x) ((void) 0)
855 : #else
856 : ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL rk_pidfile (const char*);
857 : #endif
858 :
859 : #ifndef HAVE_BSWAP64
860 : #define bswap64 rk_bswap64
861 : ROKEN_LIB_FUNCTION uint64_t ROKEN_LIB_CALL bswap64(uint64_t);
862 : #endif
863 :
864 : #ifndef HAVE_BSWAP32
865 : #define bswap32 rk_bswap32
866 : ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL bswap32(unsigned int);
867 : #endif
868 :
869 : #ifndef HAVE_BSWAP16
870 : #define bswap16 rk_bswap16
871 : ROKEN_LIB_FUNCTION unsigned short ROKEN_LIB_CALL bswap16(unsigned short);
872 : #endif
873 :
874 : #ifndef HAVE_FLOCK
875 : #ifndef LOCK_SH
876 : #define LOCK_SH 1 /* Shared lock */
877 : #endif
878 : #ifndef LOCK_EX
879 : #define LOCK_EX 2 /* Exclusive lock */
880 : #endif
881 : #ifndef LOCK_NB
882 : #define LOCK_NB 4 /* Don't block when locking */
883 : #endif
884 : #ifndef LOCK_UN
885 : #define LOCK_UN 8 /* Unlock */
886 : #endif
887 :
888 : #define flock(_x,_y) rk_flock(_x,_y)
889 : int rk_flock(int fd, int operation);
890 : #endif /* HAVE_FLOCK */
891 :
892 : #ifndef HAVE_DIRFD
893 : #ifdef HAVE_DIR_DD_FD
894 : #define dirfd(x) ((x)->dd_fd)
895 : #elif defined(HAVE_DIR_D_FD)
896 : #define dirfd(x) ((x)->d_fd)
897 : #else
898 : #ifndef _WIN32 /* Windows code never calls dirfd */
899 : #error Missing dirfd() and ->dd_fd and ->d_fd
900 : #endif
901 : #endif
902 : #endif
903 :
904 : ROKEN_LIB_FUNCTION time_t ROKEN_LIB_CALL tm2time (struct tm, int);
905 :
906 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL roken_concat (char *, size_t, ...);
907 :
908 : ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL roken_mconcat (char **, size_t, ...);
909 :
910 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL roken_vconcat (char *, size_t, va_list);
911 :
912 : ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL
913 : roken_vmconcat (char **, size_t, va_list);
914 :
915 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL roken_detach_prep(int, char **, char *);
916 : ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL roken_detach_finish(const char *, int);
917 :
918 : ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
919 : net_write (rk_socket_t, const void *, size_t);
920 :
921 : ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
922 : net_read (rk_socket_t, void *, size_t);
923 :
924 : ROKEN_LIB_FUNCTION unsigned long ROKEN_LIB_CALL
925 : rk_getauxval(unsigned long);
926 :
927 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
928 : issuid(void);
929 :
930 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
931 : rk_secure_getenv(const char *);
932 :
933 : #ifndef HAVE_SECURE_GETENV
934 : #undef secure_getenv
935 : #define secure_getenv(e) rk_secure_getenv(e)
936 : #endif
937 :
938 : #ifndef HAVE_STRUCT_WINSIZE
939 : struct winsize {
940 : unsigned short ws_row, ws_col;
941 : unsigned short ws_xpixel, ws_ypixel;
942 : };
943 : #endif
944 :
945 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL get_window_size(int fd, int *, int *);
946 :
947 : #ifndef HAVE_VSYSLOG
948 : #define vsyslog rk_vsyslog
949 : ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL vsyslog(int, const char *, va_list);
950 : #endif
951 :
952 : #ifndef HAVE_GETOPT
953 : #define getopt rk_getopt
954 : #define optarg rk_optarg
955 : #define optind rk_optind
956 : #define opterr rk_opterr
957 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
958 : getopt(int nargc, char * const *nargv, const char *ostr);
959 : #endif
960 :
961 : #if !HAVE_DECL_OPTARG
962 : ROKEN_LIB_VARIABLE extern char *optarg;
963 : #endif
964 : #if !HAVE_DECL_OPTIND
965 : ROKEN_LIB_VARIABLE extern int optind;
966 : #endif
967 : #if !HAVE_DECL_OPTERR
968 : ROKEN_LIB_VARIABLE extern int opterr;
969 : #endif
970 :
971 : #ifndef HAVE_GETIPNODEBYNAME
972 : #define getipnodebyname rk_getipnodebyname
973 : #endif
974 : ROKEN_LIB_FUNCTION struct hostent * ROKEN_LIB_CALL
975 : rk_getipnodebyname(const char *, int, int, int *);
976 :
977 : #ifndef HAVE_GETIPNODEBYADDR
978 : #define getipnodebyaddr rk_getipnodebyaddr
979 : #endif
980 : ROKEN_LIB_FUNCTION struct hostent * ROKEN_LIB_CALL
981 : rk_getipnodebyaddr(const void *, size_t, int, int *);
982 :
983 : #ifndef HAVE_FREEHOSTENT
984 : #define freehostent rk_freehostent
985 : #endif
986 : ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
987 : rk_freehostent(struct hostent *);
988 :
989 : #ifndef HAVE_COPYHOSTENT
990 : #define copyhostent rk_copyhostent
991 : #endif
992 : ROKEN_LIB_FUNCTION struct hostent * ROKEN_LIB_CALL
993 : rk_copyhostent(const struct hostent *);
994 :
995 : #ifndef HAVE_SOCKLEN_T
996 : typedef int socklen_t;
997 : #endif
998 :
999 : #ifndef HAVE_STRUCT_SOCKADDR_STORAGE
1000 :
1001 : #ifndef HAVE_SA_FAMILY_T
1002 : typedef unsigned short sa_family_t;
1003 : #endif
1004 :
1005 : #ifdef HAVE_IPV6
1006 : #define _SS_MAXSIZE sizeof(struct sockaddr_in6)
1007 : #else
1008 : #define _SS_MAXSIZE sizeof(struct sockaddr_in)
1009 : #endif
1010 :
1011 : #define _SS_ALIGNSIZE sizeof(unsigned long)
1012 :
1013 : #if HAVE_STRUCT_SOCKADDR_SA_LEN
1014 :
1015 : typedef unsigned char roken_sa_family_t;
1016 :
1017 : #define _SS_PAD1SIZE ((2 * _SS_ALIGNSIZE - sizeof (roken_sa_family_t) - sizeof(unsigned char)) % _SS_ALIGNSIZE)
1018 : #define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (roken_sa_family_t) + sizeof(unsigned char) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
1019 :
1020 : struct sockaddr_storage {
1021 : unsigned char ss_len;
1022 : roken_sa_family_t ss_family;
1023 : char __ss_pad1[_SS_PAD1SIZE];
1024 : unsigned long __ss_align[_SS_PAD2SIZE / sizeof(unsigned long) + 1];
1025 : };
1026 :
1027 : #else /* !HAVE_STRUCT_SOCKADDR_SA_LEN */
1028 :
1029 : typedef unsigned short roken_sa_family_t;
1030 :
1031 : #define _SS_PAD1SIZE ((2 * _SS_ALIGNSIZE - sizeof (roken_sa_family_t)) % _SS_ALIGNSIZE)
1032 : #define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (roken_sa_family_t) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
1033 :
1034 : struct sockaddr_storage {
1035 : roken_sa_family_t ss_family;
1036 : char __ss_pad1[_SS_PAD1SIZE];
1037 : unsigned long __ss_align[_SS_PAD2SIZE / sizeof(unsigned long) + 1];
1038 : };
1039 :
1040 : #endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
1041 :
1042 : #endif /* HAVE_STRUCT_SOCKADDR_STORAGE */
1043 :
1044 : #ifndef HAVE_STRUCT_ADDRINFO
1045 : struct addrinfo {
1046 : int ai_flags;
1047 : int ai_family;
1048 : int ai_socktype;
1049 : int ai_protocol;
1050 : size_t ai_addrlen;
1051 : char *ai_canonname;
1052 : struct sockaddr *ai_addr;
1053 : struct addrinfo *ai_next;
1054 : };
1055 : #endif
1056 :
1057 : #ifndef HAVE_GETADDRINFO
1058 : #define getaddrinfo rk_getaddrinfo
1059 : #endif
1060 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1061 : rk_getaddrinfo(const char *,
1062 : const char *,
1063 : const struct addrinfo *,
1064 : struct addrinfo **);
1065 :
1066 : #ifndef HAVE_GETNAMEINFO
1067 : #define getnameinfo rk_getnameinfo
1068 : #endif
1069 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1070 : rk_getnameinfo(const struct sockaddr *, socklen_t,
1071 : char *, size_t,
1072 : char *, size_t,
1073 : int);
1074 :
1075 : #ifndef HAVE_FREEADDRINFO
1076 : #define freeaddrinfo rk_freeaddrinfo
1077 : #endif
1078 : ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
1079 : rk_freeaddrinfo(struct addrinfo *);
1080 :
1081 : #ifndef HAVE_GAI_STRERROR
1082 : #define gai_strerror rk_gai_strerror
1083 : ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL
1084 : gai_strerror(int);
1085 : #endif
1086 :
1087 : #ifdef NO_SLEEP
1088 :
1089 : ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL
1090 : sleep(unsigned int seconds);
1091 :
1092 : ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL
1093 : usleep(unsigned int useconds);
1094 :
1095 : #endif
1096 :
1097 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1098 : getnameinfo_verified(const struct sockaddr *, socklen_t,
1099 : char *, size_t,
1100 : char *, size_t,
1101 : int);
1102 :
1103 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1104 : roken_getaddrinfo_hostspec(const char *, int, struct addrinfo **);
1105 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1106 : roken_getaddrinfo_hostspec2(const char *, int, int, struct addrinfo **);
1107 :
1108 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
1109 : roken_get_homedir(char *, size_t);
1110 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
1111 : roken_get_appdatadir(char *, size_t);
1112 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
1113 : roken_get_username(char *, size_t);
1114 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
1115 : roken_get_loginname(char *, size_t);
1116 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
1117 : roken_get_shell(char *, size_t);
1118 :
1119 : #ifndef HAVE_STRFTIME
1120 : #define strftime rk_strftime
1121 : ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL
1122 : strftime (char *, size_t, const char *, const struct tm *);
1123 : #endif
1124 :
1125 : #ifndef HAVE_STRPTIME
1126 : #define strptime rk_strptime
1127 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
1128 : strptime (const char *, const char *, struct tm *);
1129 : #endif
1130 :
1131 : #ifndef HAVE_GETTIMEOFDAY
1132 : #define gettimeofday rk_gettimeofday
1133 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1134 : gettimeofday (struct timeval *, void *);
1135 : #endif
1136 :
1137 : #ifndef HAVE_EMALLOC
1138 : #define emalloc rk_emalloc
1139 : ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL emalloc (size_t);
1140 : #endif
1141 : #ifndef HAVE_ECALLOC
1142 : #define ecalloc rk_ecalloc
1143 : ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL ecalloc(size_t, size_t);
1144 : #endif
1145 : #ifndef HAVE_EREALLOC
1146 : #define erealloc rk_erealloc
1147 : ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL erealloc (void *, size_t);
1148 : #endif
1149 : #ifndef HAVE_ESTRDUP
1150 : #define estrdup rk_estrdup
1151 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL estrdup (const char *);
1152 : #endif
1153 :
1154 : /*
1155 : * kludges and such
1156 : */
1157 :
1158 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1159 : roken_gethostby_setup(const char*, const char*);
1160 : ROKEN_LIB_FUNCTION struct hostent* ROKEN_LIB_CALL
1161 : roken_gethostbyname(const char*);
1162 : ROKEN_LIB_FUNCTION struct hostent* ROKEN_LIB_CALL
1163 : roken_gethostbyaddr(const void*, size_t, int);
1164 :
1165 : #ifdef GETSERVBYNAME_PROTO_COMPATIBLE
1166 : #define roken_getservbyname(x,y) getservbyname(x,y)
1167 : #else
1168 : #define roken_getservbyname(x,y) getservbyname((char *)x, (char *)y)
1169 : #endif
1170 :
1171 : #ifdef OPENLOG_PROTO_COMPATIBLE
1172 : #define roken_openlog(a,b,c) openlog(a,b,c)
1173 : #else
1174 : #define roken_openlog(a,b,c) openlog((char *)a,b,c)
1175 : #endif
1176 :
1177 : #ifdef GETSOCKNAME_PROTO_COMPATIBLE
1178 : #define roken_getsockname(a,b,c) getsockname(a,b,c)
1179 : #else
1180 : #define roken_getsockname(a,b,c) getsockname(a, b, (void*)c)
1181 : #endif
1182 :
1183 : #ifndef HAVE_SETPROGNAME
1184 : #define setprogname rk_setprogname
1185 : ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL setprogname(const char *);
1186 : #endif
1187 :
1188 : #ifndef HAVE_GETPROGNAME
1189 : #define getprogname rk_getprogname
1190 : ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL getprogname(void);
1191 : #endif
1192 :
1193 : #if !defined(HAVE_SETPROGNAME) && !defined(HAVE_GETPROGNAME) && !HAVE_DECL___PROGNAME
1194 : extern const char *__progname;
1195 : #endif
1196 :
1197 : ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
1198 : mini_inetd_addrinfo (struct addrinfo*, rk_socket_t *);
1199 :
1200 : ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
1201 : mini_inetd (int, rk_socket_t *);
1202 :
1203 : #ifndef HAVE_LOCALTIME_R
1204 : #define localtime_r rk_localtime_r
1205 : ROKEN_LIB_FUNCTION struct tm * ROKEN_LIB_CALL
1206 : localtime_r(const time_t *, struct tm *);
1207 : #endif
1208 :
1209 : #if !defined(HAVE_STRTOLL) || defined(NEED_STRTOLL_PROTO)
1210 : #ifndef HAVE_STRTOLL
1211 : #define strtoll rk_strtoll
1212 : #endif
1213 : ROKEN_LIB_FUNCTION long long ROKEN_LIB_CALL
1214 : strtoll(const char * nptr, char ** endptr, int base);
1215 : #endif
1216 :
1217 : #if !defined(HAVE_STRTOULL) || defined(NEED_STRTOULL_PROTO)
1218 : #ifndef HAVE_STRTOULL
1219 : #define strtoull rk_strtoull
1220 : #endif
1221 : ROKEN_LIB_FUNCTION unsigned long long ROKEN_LIB_CALL
1222 : strtoull(const char * nptr, char ** endptr, int base);
1223 : #endif
1224 :
1225 : #if !defined(HAVE_STRSVIS) || defined(NEED_STRSVIS_PROTO)
1226 : #ifndef HAVE_STRSVIS
1227 : #define strsvis rk_strsvis
1228 : #endif
1229 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1230 : strsvis(char *, const char *, int, const char *);
1231 : #endif
1232 :
1233 : #if !defined(HAVE_STRSVISX) || defined(NEED_STRSVISX_PROTO)
1234 : #ifndef HAVE_STRSVISX
1235 : #define strsvisx rk_strsvisx
1236 : #endif
1237 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1238 : strsvisx(char *, const char *, size_t, int, const char *);
1239 : #endif
1240 :
1241 : #if !defined(HAVE_STRUNVIS) || defined(NEED_STRUNVIS_PROTO)
1242 : #ifndef HAVE_STRUNVIS
1243 : #define strunvis rk_strunvis
1244 : #endif
1245 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1246 : strunvis(char *, const char *);
1247 : #endif
1248 :
1249 : #if !defined(HAVE_STRVIS) || defined(NEED_STRVIS_PROTO)
1250 : #ifndef HAVE_STRVIS
1251 : #define strvis rk_strvis
1252 : #endif
1253 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1254 : strvis(char *, const char *, int);
1255 : #endif
1256 :
1257 : #if !defined(HAVE_STRVISX) || defined(NEED_STRVISX_PROTO)
1258 : #ifndef HAVE_STRVISX
1259 : #define strvisx rk_strvisx
1260 : #endif
1261 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1262 : strvisx(char *, const char *, size_t, int);
1263 : #endif
1264 :
1265 : #if !defined(HAVE_SVIS) || defined(NEED_SVIS_PROTO)
1266 : #ifndef HAVE_SVIS
1267 : #define svis rk_svis
1268 : #endif
1269 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
1270 : svis(char *, int, int, int, const char *);
1271 : #endif
1272 :
1273 : #if !defined(HAVE_UNVIS) || defined(NEED_UNVIS_PROTO)
1274 : #ifndef HAVE_UNVIS
1275 : #define unvis rk_unvis
1276 : #endif
1277 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1278 : unvis(char *, int, int *, int);
1279 : #endif
1280 :
1281 : #if !defined(HAVE_VIS) || defined(NEED_VIS_PROTO)
1282 : #ifndef HAVE_VIS
1283 : #define vis rk_vis
1284 : #endif
1285 : ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
1286 : vis(char *, int, int, int);
1287 : #endif
1288 :
1289 : #if !defined(HAVE_CLOSEFROM)
1290 : #define closefrom rk_closefrom
1291 : #endif
1292 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1293 : rk_closefrom(int);
1294 :
1295 : #if !defined(HAVE_TIMEGM)
1296 : #define timegm rk_timegm
1297 : ROKEN_LIB_FUNCTION time_t ROKEN_LIB_CALL
1298 : rk_timegm(struct tm *tm);
1299 : #endif
1300 :
1301 : #ifdef NEED_QSORT
1302 : #define qsort rk_qsort
1303 : void
1304 : rk_qsort(void *, size_t, size_t, int (*)(const void *, const void *));
1305 : #endif
1306 :
1307 : #if !defined(HAVE_MERGESORT)
1308 : #define mergesort rk_mergesort
1309 : int
1310 : mergesort(void *base, size_t nel, size_t width,
1311 : int (*compar)(const void *, const void *));
1312 : #endif
1313 :
1314 : #if !defined(HAVE_MERGESORT_R)
1315 : #define mergesort_r rk_mergesort_r
1316 : int
1317 : mergesort_r(void *base, size_t nel, size_t width,
1318 : int (*compar)(const void *, const void *, void *), void *thunk);
1319 : #endif
1320 :
1321 : #ifndef HAVE_MEMSET_S
1322 : #define memset_s rk_memset_s
1323 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL memset_s(void *s, size_t smax,
1324 : int c, size_t n);
1325 : #endif
1326 :
1327 : #if defined(HAVE_ARC4RANDOM)
1328 : # define rk_random() arc4random()
1329 : #elif defined(HAVE_RANDOM)
1330 : # define rk_random() random()
1331 : #else
1332 : # ifdef HAVE_WIN32_RAND_S
1333 : ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL
1334 : rk_random(void);
1335 : # else
1336 : # define rk_random() rand()
1337 : # endif
1338 : #endif
1339 :
1340 : #ifndef HAVE_TDELETE
1341 : #define tdelete(a,b,c) rk_tdelete(a,b,c)
1342 : #endif
1343 : #ifndef HAVE_TFIND
1344 : #define tfind(a,b,c) rk_tfind(a,b,c)
1345 : #endif
1346 : #ifndef HAVE_TSEARCH
1347 : #define tsearch(a,b,c) rk_tsearch(a,b,c)
1348 : #endif
1349 : #ifndef HAVE_TWALK
1350 : #define twalk(a,b) rk_twalk(a,b)
1351 : #endif
1352 :
1353 : #if defined(__linux__) && defined(SOCK_CLOEXEC) && !defined(SOCKET_WRAPPER_REPLACE) && !defined(__SOCKET_WRAPPER_H__)
1354 : #undef socket
1355 : #define socket(_fam,_type,_prot) rk_socket(_fam,_type,_prot)
1356 : int ROKEN_LIB_FUNCTION rk_socket(int, int, int);
1357 : #endif
1358 :
1359 : /* Microsoft VC 2010 POSIX definitions */
1360 : #ifndef EAFNOSUPPORT
1361 : #define EAFNOSUPPORT 102
1362 : #endif
1363 : #ifndef EINPROGRESS
1364 : #define EINPROGRESS 112
1365 : #endif
1366 : #ifndef ELOOP
1367 : #define ELOOP 114
1368 : #endif
1369 : #ifndef ENOTSOCK
1370 : #define ENOTSOCK 128
1371 : #endif
1372 : #ifndef ENOTSUP
1373 : #define ENOTSUP 129
1374 : #endif
1375 : #ifndef EOVERFLOW
1376 : #define EOVERFLOW 132
1377 : #endif
1378 : #ifndef ETIMEDOUT
1379 : #define ETIMEDOUT 138
1380 : #endif
1381 : #ifndef EWOULDBLOCK
1382 : #define EWOULDBLOCK 140
1383 : #endif
1384 :
1385 : #ifdef WIN32
1386 : ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
1387 : win32_getLibraryVersion(const char *libname, char **outname, char **outversion);
1388 : #endif
1389 :
1390 : #ifdef SOCKET_WRAPPER_REPLACE
1391 : #include <socket_wrapper.h>
1392 : #endif
1393 :
1394 : ROKEN_CPP_END
|