Fix configure script and "make check" for TCP Wrappers
[ngircd-alex.git] / src / portab / portabtest.c
1 /*
2  * ngIRCd -- The Next Generation IRC Daemon
3  * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  * Please read the file COPYING, README and AUTHORS for more information.
10  */
11
12 #include "portab.h"
13
14 /**
15  * @file
16  * Test program for portab.h and friends ;-)
17  */
18
19 #include "imp.h"
20 #include <stdarg.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24
25 #include "exp.h"
26
27 int allow_severity = 0, deny_severity = 0;
28
29 static void
30 Panic(char *Reason)
31 {
32         /* Oops, something failed!? */
33         fprintf(stderr, "Oops, test for %s failed!?\n", Reason);
34         exit(1);
35 } /* Panic */
36
37 static void
38 Check_snprintf(void)
39 {
40         char str[5];
41
42         snprintf(str, sizeof(str), "%s", "1234567890");
43         if (str[4] != '\0')
44                 Panic("snprintf NULL byte");
45         if (strlen(str) != 4)
46                 Panic("snprintf string length");
47 }
48
49 static void
50 Check_strdup(void)
51 {
52         char *ptr;
53
54         ptr = strdup("1234567890");
55         if (!ptr)
56                 Panic("strdup");
57         if (ptr[10] != '\0')
58                 Panic("strdup NULL byte");
59         if (strlen(ptr) != 10)
60                 Panic("strdup string length");
61         free(ptr);
62 }
63
64 static void
65 Check_strndup(void)
66 {
67         char *ptr;
68
69         ptr = strndup("1234567890", 5);
70         if (!ptr)
71                 Panic("strndup");
72         if (ptr[5] != '\0')
73                 Panic("strndup NULL byte");
74         if (strlen(ptr) != 5)
75                 Panic("strndup string length");
76         free(ptr);
77 }
78
79 static void
80 Check_strlcpy(void)
81 {
82         char str[5];
83
84         if (strlcpy(str, "1234567890", sizeof(str)) != 10)
85                 Panic("strlcpy return code");
86         if (str[4] != '\0')
87                 Panic("strlcpy NULL byte");
88         if (strlen(str) != 4)
89                 Panic("strlcpy string length");
90 }
91
92 static void
93 Check_strlcat(void)
94 {
95         char str[5];
96
97         if (strlcpy(str, "12", sizeof(str)) != 2)
98                 Panic("strlcpy for strlcat");
99         if (strlcat(str, "1234567890", sizeof(str)) != 12)
100                 Panic("strlcat return code");
101         if (str[4] != '\0')
102                 Panic("strlcat NULL byte");
103         if (strlen(str) != 4)
104                 Panic("strlcat string length");
105 }
106
107 static void
108 Check_strtok_r(void)
109 {
110         char *ptr, *last;
111
112         ptr = strdup("12,abc");
113
114         ptr = strtok_r(ptr, ",", &last);
115         if (!ptr)
116                 Panic("strtok_r result #1");
117         if (strcmp(ptr, "12") != 0)
118                 Panic("strtok_r token #1");
119
120         ptr = strtok_r(NULL, ",", &last);
121         if (!ptr)
122                 Panic("strtok_r result #2");
123         if (strcmp(ptr, "abc") != 0)
124                 Panic("strtok_r token #2");
125
126         ptr = strtok_r(NULL, ",", &last);
127         if (ptr)
128                 Panic("strtok_r result #3");
129 }
130
131 #ifdef PROTOTYPES
132 static void
133 Check_vsnprintf(const int Len, const char *Format, ...)
134 #else
135 static void
136 Check_vsnprintf(Len, Format, va_alist)
137 const int Len;
138 const char *Format;
139 va_dcl
140 #endif
141 {
142         char str[5];
143         va_list ap;
144         int r;
145
146 #ifdef PROTOTYPES
147         va_start(ap, Format);
148 #else
149         va_start(ap);
150 #endif
151         r = vsnprintf(str, sizeof(str), Format, ap);
152         va_end(ap);
153         if (r != Len) {
154                 /* C99 states that vsnprintf() "returns the number of
155                  * characters that would have been printed if the n were
156                  * unlimited", but according to the Linux manual page "glibc
157                  * until 2.0.6 would return -1 when the output was truncated",
158                  * and other implementations (libUTIL on A/UX) even return the
159                  * number of characters processed ... so we only test our own
160                  * implementation and warn on errors otherwise :-/ */
161 #ifdef HAVE_VSNPRINTF
162                 fprintf(stderr,
163                         "\n ** WARNING: The vsnprintf() function of this system isn't standard\n");
164                 fprintf(stderr,
165                         " ** conformant and returns a WRONG result: %d (should be %d)! The test\n",
166                         r, Len);
167                 fprintf(stderr,
168                         " ** result has been ignored but may lead to errors during execution!\n\n");
169 #else
170                 Panic("vsnprintf return code");
171 #endif
172         }
173         if (str[4] != '\0')
174                 Panic("vsnprintf NULL byte");
175         if (strlen(str) != 4)
176                 Panic("vsnprintf string length");
177 }
178
179 GLOBAL int
180 main(void)
181 {
182         /* validate datatypes */
183         if (false != 0)
184                 Panic("false");
185         if (true != 1)
186                 Panic("true");
187         if (sizeof(UINT8) != 1)
188                 Panic("UINT8");
189         if (sizeof(UINT16) != 2)
190                 Panic("UINT16");
191         if (sizeof(UINT32) != 4)
192                 Panic("UINT32");
193
194         /* check functions */
195         Check_snprintf();
196         Check_strdup();
197         Check_strndup();
198         Check_strlcpy();
199         Check_strlcat();
200         Check_strtok_r();
201         Check_vsnprintf(2+10, "%s%s", "ab", "1234567890");
202         
203         return 0;
204 }
205
206 /* -eof- */