1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
srcdir = '.'
blddir = 'build'
import Options, os
def set_options(opt):
opt.tool_options('compiler_cc')
opt.add_option('--disable-rpath',
help=("Disable use of rpath"),
action="store_true", dest='disable_rpath', default=False)
def configure(conf):
conf.env.hlist = []
# load our local waf extensions
conf.check_tool('autoconf', tooldir='. ../replace')
conf.check_rpath()
conf.check_tool('compiler_cc')
conf.DEFUN('_GNU_SOURCE', 1)
conf.DEFUN('_XOPEN_SOURCE_EXTENDED', 1)
conf.DEFUN('LIBREPLACE_NETWORK_CHECKS', 1)
conf.CHECK_HEADERS('unistd.h sys/types.h stdlib.h stdio.h')
conf.CHECK_HEADERS('sys/wait.h sys/stat.h malloc.h grp.h')
conf.CHECK_HEADERS('crypt.h dlfcn.h dl.h standards.h stdbool.h stdint.h')
conf.CHECK_HEADERS('sys/select.h setjmp.h utime.h sys/syslog.h syslog.h')
conf.CHECK_HEADERS('sys/time.h time.h stdarg.h vararg.h sys/mount.h mntent.h')
conf.CHECK_HEADERS('stropts.h unix.h string.h strings.h sys/param.h limits.h')
conf.CHECK_HEADERS('sys/socket.h netinet/in.h netdb.h arpa/inet.h netinet/in_systm.h')
conf.CHECK_HEADERS('netinet/ip.h netinet/tcp.h netinet/in_ip.h sys/sockio.h sys/un.h')
conf.CHECK_HEADERS('sys/uio.h ifaddrs.h direct.h dirent.h')
conf.CHECK_HEADERS('windows.h winsock2.h ws2tcpip.h')
conf.check(type_name='long long')
conf.CHECK_TYPES('intptr_t uintptr_t ptrdiff_t')
conf.CHECK_TYPES('comparison_fn_t socklen_t bool')
conf.CHECK_TYPE('int8_t', 'char')
conf.CHECK_TYPE('int16_t', 'short')
conf.CHECK_TYPE('uint16_t', 'unsigned short')
conf.CHECK_TYPE('int32_t', 'int')
conf.CHECK_TYPE('uint32_t', 'unsigned')
conf.CHECK_TYPE('int64_t', 'long long')
conf.CHECK_TYPE('uint64_t', 'unsigned long long')
conf.CHECK_TYPE('size_t', 'unsigned int')
conf.CHECK_TYPE('ssize_t', 'int')
conf.CHECK_TYPE('ino_t', 'unsigned')
conf.CHECK_TYPE('loff_t', 'off_t')
conf.CHECK_TYPE('bool', 'off_t')
conf.CHECK_TYPE_IN('struct ifaddrs', 'ifaddrs.h')
conf.CHECK_TYPE_IN('struct addrinfo', 'netdb.h')
conf.CHECK_TYPE_IN('struct sockaddr', 'sys/socket.h')
conf.CHECK_FUNCS('shl_load shl_unload shl_findsym')
conf.CHECK_FUNCS('pipe strftime srandom random srand rand usleep setbuffer')
conf.CHECK_FUNCS('lstat getpgrp utime utimes seteuid setresuid setegid')
conf.CHECK_FUNCS('setresgid chroot bzero strerror vsyslog setlinebuf mktime')
conf.CHECK_FUNCS('ftruncate chsize rename waitpid wait4 strlcpy strlcat')
conf.CHECK_FUNCS('initgroups memmove strdup pread pwrite strndup strcasestr')
conf.CHECK_FUNCS('strtok_r mkdtemp dup2 dprintf vdprintf isatty chown lchown')
conf.CHECK_FUNCS('link readlink symlink realpath fdatasync snprintf vsnprintf')
conf.CHECK_FUNCS('asprintf vasprintf setenv unsetenv strnlen strtoull __strtoull')
conf.CHECK_FUNCS('strtouq strtoll __strtoll strtoq memmem printf memset memcpy')
conf.CHECK_FUNCS('connect gethostbyname if_nametoindex socketpair')
conf.CHECK_FUNCS('inet_ntoa inet_ntop dirfd getdirentries getdents syslog')
conf.CHECK_FUNCS('timegm getifaddrs freeifaddrs')
conf.CHECK_FUNCS_IN('dlopen dlsym dlerror dlclose', 'dl')
# we could also put code fragments like this in separate files,
# for example in test/snprintf.c
conf.check_cc(fragment='''
#include <sys/types.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
void foo(const char *format, ...) {
va_list ap;
int len;
char buf[20];
long long l = 1234567890;
l *= 100;
va_start(ap, format);
len = vsnprintf(buf, 0, format, ap);
va_end(ap);
if (len != 5) exit(1);
va_start(ap, format);
len = vsnprintf(0, 0, format, ap);
va_end(ap);
if (len != 5) exit(2);
if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(3);
if (snprintf(buf, 20, "%lld", l) != 12 || strcmp(buf, "123456789000") != 0) exit(4);
if (snprintf(buf, 20, "%zu", 123456789) != 9 || strcmp(buf, "123456789") != 0) exit(5);
if (snprintf(buf, 20, "%2\$d %1\$d", 3, 4) != 3 || strcmp(buf, "4 3") != 0) exit(6);
if (snprintf(buf, 20, "%s", 0) < 3) exit(7);
printf("1");
exit(0);
}
main() { foo("hello"); }
''',
define_name="HAVE_C99_VSNPRINTF",
execute=1,
define_ret=1,
quote=0,
msg="Checking for C99 vsnprintf")
conf.write_config_header('config.h')
def build(bld):
# the libreplace shared library
bld(
features = 'cc cshlib',
source = 'replace.c',
target='replace',
includes = '. default /usr/include')
# test program
bld(
features = 'cc cprogram',
source = '''test/testsuite.c test/main.c test/strptime.c
test/os2_delete.c test/getifaddrs.c''',
target = 'replace_testsuite',
uselib_local = 'replace',
includes = '. default /usr/include')
|