]>
Commit | Line | Data |
---|---|---|
e5ebac8b AM |
1 | diff -up dhcp-4.0.0/configure.ac.libdhcp4client dhcp-4.0.0/configure.ac |
2 | --- dhcp-4.0.0/configure.ac.libdhcp4client 2007-12-14 08:24:56.000000000 -1000 | |
3 | +++ dhcp-4.0.0/configure.ac 2008-01-22 17:04:28.000000000 -1000 | |
4 | @@ -1,5 +1,32 @@ | |
5 | AC_INIT([DHCP], [4.0.0], [dhcp-users@isc.org]) | |
6 | ||
7 | +dnl Versioning | |
8 | +dnl (from glib's configure.in ...) | |
9 | +dnl Making releases: | |
10 | +dnl DHCP_MICRO_VERSION += 1; | |
11 | +dnl DHCP_INTERFACE_AGE += 1; | |
12 | +dnl DHCP_BINARY_AGE += 1; | |
13 | +dnl if any functions have been added, set DHCP_INTERFACE_AGE to 0. | |
14 | +dnl if backwards compatibility has been broken (e.g., functions removed, | |
15 | +dnl function signatures changed), | |
16 | +dnl set DHCP_BINARY_AGE and DHCP_INTERFACE_AGE to 0. | |
17 | +DHCP_MAJOR_VERSION=4 | |
18 | +DHCP_MINOR_VERSION=0 | |
19 | +DHCP_MICRO_VERSION=0 | |
20 | +DHCP_INTERFACE_AGE=0 | |
21 | +DHCP_BINARY_AGE=0 | |
22 | +DHCP_VERSION_SUFFIX= | |
23 | +DHCP_VERSION=$DHCP_MAJOR_VERSION.$DHCP_MINOR_VERSION.$DHCP_MICRO_VERSION$DHCP_VERSION_SUFFIX | |
24 | + | |
25 | +LT_RELEASE=$DHCP_MAJOR_VERSION.$DHCP_MINOR_VERSION | |
26 | +LT_CURRENT=`expr $DHCP_MICRO_VERSION - $DHCP_INTERFACE_AGE` | |
27 | +LT_REVISION=$DHCP_INTERFACE_AGE | |
28 | +AC_SUBST(DHCP_VERSION) | |
29 | +AC_SUBST(LT_RELEASE) | |
30 | +AC_SUBST(LT_CURRENT) | |
31 | +AC_SUBST(LT_REVISION) | |
32 | +AC_SUBST(LT_AGE) | |
33 | + | |
34 | # we specify "foreign" to avoid having to have the GNU mandated files, | |
35 | # like AUTHORS, COPYING, and such | |
36 | AM_INIT_AUTOMAKE([foreign]) | |
37 | @@ -20,7 +47,8 @@ if test "$GCC" = "yes"; then | |
38 | fi | |
39 | fi | |
c494ae74 | 40 | |
e5ebac8b AM |
41 | -AC_PROG_RANLIB |
42 | +AC_PROG_LIBTOOL | |
43 | + | |
44 | AC_CONFIG_HEADERS([includes/config.h]) | |
45 | ||
46 | # we sometimes need to know byte order for building packets | |
47 | diff -up dhcp-4.0.0/omapip/Makefile.am.libdhcp4client dhcp-4.0.0/omapip/Makefile.am | |
48 | --- dhcp-4.0.0/omapip/Makefile.am.libdhcp4client 2007-05-29 06:32:11.000000000 -1000 | |
49 | +++ dhcp-4.0.0/omapip/Makefile.am 2008-01-22 17:04:28.000000000 -1000 | |
50 | @@ -1,10 +1,18 @@ | |
51 | lib_LIBRARIES = libomapi.a | |
52 | +noinst_LIBRARIES = libomapiLIBDHCP.a | |
53 | noinst_PROGRAMS = svtest | |
54 | ||
55 | libomapi_a_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \ | |
56 | errwarn.c listener.c dispatch.c generic.c support.c \ | |
57 | handle.c message.c convert.c hash.c auth.c inet_addr.c \ | |
58 | array.c trace.c mrtrace.c toisc.c iscprint.c | |
59 | + | |
60 | +libomapiLIBDHCP_a_CFLAGS = -DLIBDHCP | |
61 | +libomapiLIBDHCP_a_SOURCES = alloc.c array.c auth.c buffer.c connection.c \ | |
62 | + convert.c dispatch.c errwarn.c handle.c hash.c listener.c \ | |
63 | + mrtrace.c result.c support.c toisc.c trace.c generic.c message.c \ | |
64 | + protocol.c | |
65 | + | |
66 | man_MANS = omapi.3 | |
67 | EXTRA_DIST = $(man_MANS) | |
68 | ||
69 | diff -up dhcp-4.0.0/omapip/dispatch.c.libdhcp4client dhcp-4.0.0/omapip/dispatch.c | |
70 | --- dhcp-4.0.0/omapip/dispatch.c.libdhcp4client 2007-11-30 11:51:43.000000000 -1000 | |
71 | +++ dhcp-4.0.0/omapip/dispatch.c 2008-01-22 17:04:28.000000000 -1000 | |
72 | @@ -37,7 +37,7 @@ | |
c494ae74 | 73 | #include <omapip/omapip_p.h> |
e5ebac8b | 74 | #include <sys/time.h> |
c494ae74 PZ |
75 | |
76 | -static omapi_io_object_t omapi_io_states; | |
77 | +omapi_io_object_t omapi_io_states; | |
e5ebac8b | 78 | time_t cur_time; |
c494ae74 PZ |
79 | |
80 | OMAPI_OBJECT_ALLOC (omapi_io, | |
e5ebac8b AM |
81 | diff -up dhcp-4.0.0/omapip/errwarn.c.libdhcp4client dhcp-4.0.0/omapip/errwarn.c |
82 | --- dhcp-4.0.0/omapip/errwarn.c.libdhcp4client 2008-01-22 17:04:28.000000000 -1000 | |
83 | +++ dhcp-4.0.0/omapip/errwarn.c 2008-01-22 17:04:28.000000000 -1000 | |
84 | @@ -37,6 +37,11 @@ | |
c494ae74 | 85 | #include <errno.h> |
e5ebac8b | 86 | #include <syslog.h> |
c494ae74 PZ |
87 | |
88 | +#ifdef LIBDHCP | |
89 | +#include <isc-dhcp/libdhcp_control.h> | |
90 | +extern LIBDHCP_Control *libdhcp_control; | |
91 | +#endif | |
92 | + | |
93 | #ifdef DEBUG | |
94 | int log_perror = -1; | |
95 | #else | |
e5ebac8b | 96 | @@ -46,7 +51,9 @@ int log_priority; |
c494ae74 PZ |
97 | void (*log_cleanup) (void); |
98 | ||
99 | #define CVT_BUF_MAX 1023 | |
100 | +#ifndef LIBDHCP | |
101 | static char mbuf [CVT_BUF_MAX + 1]; | |
102 | +#endif | |
103 | static char fbuf [CVT_BUF_MAX + 1]; | |
104 | ||
105 | /* Log an error message, then exit... */ | |
e5ebac8b | 106 | @@ -56,6 +63,16 @@ void log_fatal (const char * fmt, ... ) |
c494ae74 PZ |
107 | va_list list; |
108 | ||
109 | do_percentm (fbuf, fmt); | |
110 | + | |
111 | +#ifdef LIBDHCP | |
112 | + if (libdhcp_control && (libdhcp_control->eh)) { | |
113 | + va_start (list, fmt); | |
114 | + libdhcp_control->eh(libdhcp_control, LOG_FATAL, fbuf, list); | |
115 | + va_end(list); | |
116 | + libdhcp_control->finished = 1; | |
117 | + return; | |
118 | + } | |
119 | +#else | |
120 | ||
121 | /* %Audit% This is log output. %2004.06.17,Safe% | |
122 | * If we truncate we hope the user can get a hint from the log. | |
e5ebac8b | 123 | @@ -89,6 +106,7 @@ void log_fatal (const char * fmt, ... ) |
c494ae74 PZ |
124 | if (log_cleanup) |
125 | (*log_cleanup) (); | |
126 | exit (1); | |
127 | +#endif | |
128 | } | |
129 | ||
130 | /* Log an error message... */ | |
e5ebac8b | 131 | @@ -99,6 +117,13 @@ int log_error (const char * fmt, ...) |
c494ae74 PZ |
132 | |
133 | do_percentm (fbuf, fmt); | |
134 | ||
135 | +#ifdef LIBDHCP | |
136 | + if (libdhcp_control && libdhcp_control->eh) { | |
137 | + va_start (list, fmt); | |
138 | + libdhcp_control->eh(libdhcp_control, LOG_ERR, fbuf, list); | |
139 | + va_end(list); | |
140 | + } | |
141 | +#else | |
142 | /* %Audit% This is log output. %2004.06.17,Safe% | |
143 | * If we truncate we hope the user can get a hint from the log. | |
144 | */ | |
e5ebac8b | 145 | @@ -114,7 +139,7 @@ int log_error (const char * fmt, ...) |
c494ae74 PZ |
146 | write (STDERR_FILENO, mbuf, strlen (mbuf)); |
147 | write (STDERR_FILENO, "\n", 1); | |
148 | } | |
149 | - | |
150 | +#endif | |
151 | return 0; | |
152 | } | |
153 | ||
e5ebac8b | 154 | @@ -126,6 +151,13 @@ int log_info (const char *fmt, ...) |
c494ae74 PZ |
155 | |
156 | do_percentm (fbuf, fmt); | |
157 | ||
158 | +#ifdef LIBDHCP | |
159 | + if (libdhcp_control && libdhcp_control->eh) { | |
160 | + va_start (list, fmt); | |
161 | + libdhcp_control->eh(libdhcp_control, LOG_INFO, fbuf, list); | |
162 | + va_end(list); | |
163 | + } | |
164 | +#else | |
165 | /* %Audit% This is log output. %2004.06.17,Safe% | |
166 | * If we truncate we hope the user can get a hint from the log. | |
167 | */ | |
e5ebac8b | 168 | @@ -141,7 +173,7 @@ int log_info (const char *fmt, ...) |
c494ae74 PZ |
169 | write (STDERR_FILENO, mbuf, strlen (mbuf)); |
170 | write (STDERR_FILENO, "\n", 1); | |
171 | } | |
172 | - | |
173 | +#endif | |
174 | return 0; | |
175 | } | |
176 | ||
e5ebac8b | 177 | @@ -152,7 +184,13 @@ int log_debug (const char *fmt, ...) |
c494ae74 PZ |
178 | va_list list; |
179 | ||
180 | do_percentm (fbuf, fmt); | |
181 | - | |
182 | +#ifdef LIBDHCP | |
183 | + if (libdhcp_control && libdhcp_control->eh) { | |
184 | + va_start (list, fmt); | |
185 | + libdhcp_control->eh(libdhcp_control, LOG_DEBUG, fbuf, list); | |
186 | + va_end(list); | |
187 | + } | |
188 | +#else | |
189 | /* %Audit% This is log output. %2004.06.17,Safe% | |
190 | * If we truncate we hope the user can get a hint from the log. | |
191 | */ | |
e5ebac8b | 192 | @@ -168,7 +206,7 @@ int log_debug (const char *fmt, ...) |
c494ae74 PZ |
193 | write (STDERR_FILENO, mbuf, strlen (mbuf)); |
194 | write (STDERR_FILENO, "\n", 1); | |
195 | } | |
196 | - | |
197 | +#endif | |
198 | return 0; | |
199 | } | |
200 | ||
e5ebac8b AM |
201 | diff -up dhcp-4.0.0/omapip/alloc.c.libdhcp4client dhcp-4.0.0/omapip/alloc.c |
202 | --- dhcp-4.0.0/omapip/alloc.c.libdhcp4client 2007-07-12 20:43:42.000000000 -1000 | |
203 | +++ dhcp-4.0.0/omapip/alloc.c 2008-01-22 17:04:28.000000000 -1000 | |
204 | @@ -37,6 +37,33 @@ | |
c494ae74 PZ |
205 | |
206 | #include <omapip/omapip_p.h> | |
207 | ||
208 | +#ifdef LIBDHCP | |
209 | +/* OK, we need a quick and dirty way of freeing all memory used by libdhcp. | |
210 | + All pointers will be stored in a glibc tree on alloc, and removed on free. | |
211 | + This is not too expensive for light single-call library use. | |
212 | +*/ | |
213 | +#include <search.h> | |
214 | +extern void tdestroy (void *root, void (*free_node)(void *nodep)); | |
215 | +static void *all_pointers=0L; | |
216 | +static int ptr_comparator(const void *p1, const void *p2) { | |
217 | + return ((p1 == p2) ? 0 : ((p1 > p2) ? 1 : -1)); | |
218 | +} | |
219 | + | |
220 | +static void record_pointer(void *ptr) { | |
221 | + tsearch(ptr, &(all_pointers), ptr_comparator); | |
222 | +} | |
223 | + | |
224 | +static void forget_pointer(void *ptr) { | |
225 | + tdelete(ptr, &(all_pointers), ptr_comparator); | |
226 | +} | |
227 | + | |
228 | +void omapi_free_all_pointers(void) { | |
229 | + if (all_pointers != NULL) | |
230 | + tdestroy(all_pointers, free); | |
231 | + all_pointers = NULL; | |
232 | +} | |
233 | +#endif | |
234 | + | |
235 | #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \ | |
236 | defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) | |
237 | struct dmalloc_preamble *dmalloc_list; | |
e5ebac8b AM |
238 | @@ -72,7 +99,9 @@ dmalloc(unsigned size, const char *file, |
239 | return NULL; | |
c494ae74 PZ |
240 | |
241 | foo = malloc(len); | |
242 | - | |
243 | +#ifdef LIBDHCP | |
244 | + record_pointer(foo); | |
245 | +#endif | |
246 | if (!foo) | |
e5ebac8b AM |
247 | return NULL; |
248 | bar = (void *)(foo + DMDOFFSET); | |
249 | @@ -191,6 +220,9 @@ dfree(void *ptr, const char *file, int l | |
c494ae74 PZ |
250 | 0, (unsigned char *)ptr + DMDOFFSET, 0, 1, RC_MALLOC); |
251 | #endif | |
252 | free (ptr); | |
253 | +#ifdef LIBDHCP | |
254 | + forget_pointer(ptr); | |
255 | +#endif | |
256 | } | |
257 | ||
258 | #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \ | |
e5ebac8b AM |
259 | diff -up dhcp-4.0.0/dst/Makefile.am.libdhcp4client dhcp-4.0.0/dst/Makefile.am |
260 | --- dhcp-4.0.0/dst/Makefile.am.libdhcp4client 2008-01-22 17:04:28.000000000 -1000 | |
261 | +++ dhcp-4.0.0/dst/Makefile.am 2008-01-22 17:04:28.000000000 -1000 | |
262 | @@ -2,7 +2,7 @@ AM_CPPFLAGS = -DMINIRES_LIB -DHMAC_MD5 | |
c494ae74 | 263 | |
e5ebac8b AM |
264 | lib_LIBRARIES = libdst.a |
265 | ||
266 | -noinst_LIBRARIES = libdstnomd5.a | |
267 | +noinst_LIBRARIES = libdstnomd5.a libdstLIBDHCP.a | |
c494ae74 | 268 | |
e5ebac8b AM |
269 | libdst_a_SOURCES = dst_support.c dst_api.c hmac_link.c md5_dgst.c \ |
270 | base64.c prandom.c | |
271 | @@ -10,4 +10,8 @@ libdst_a_SOURCES = dst_support.c dst_api | |
272 | libdstnomd5_a_SOURCES = dst_support.c dst_api.c hmac_link.c \ | |
273 | base64.c prandom.c | |
274 | ||
275 | +libdstLIBDHCP_a_CFLAGS = -DLIBDHCP | |
276 | +libdstLIBDHCP_a_SOURCES = dst_support.c dst_api.c hmac_link.c md5_dgst.c \ | |
277 | + base64.c prandom.c | |
278 | + | |
279 | EXTRA_DIST = dst_internal.h md5.h md5_locl.h | |
280 | diff -up dhcp-4.0.0/dst/hmac_link.c.libdhcp4client dhcp-4.0.0/dst/hmac_link.c | |
281 | --- dhcp-4.0.0/dst/hmac_link.c.libdhcp4client 2007-12-05 14:50:22.000000000 -1000 | |
282 | +++ dhcp-4.0.0/dst/hmac_link.c 2008-01-22 17:04:28.000000000 -1000 | |
283 | @@ -39,6 +39,10 @@ static const char rcsid[] = "$Header: /p | |
c494ae74 PZ |
284 | |
285 | #include "dst_internal.h" | |
286 | ||
287 | +#ifdef LIBDHCP | |
288 | +extern void* dmalloc(size_t,char *,int); | |
289 | +#endif | |
290 | + | |
291 | #ifdef USE_MD5 | |
292 | # include "md5.h" | |
293 | # ifndef _MD5_H_ | |
e5ebac8b | 294 | @@ -87,7 +91,11 @@ dst_hmac_md5_sign(const int mode, DST_KE |
c494ae74 PZ |
295 | MD5_CTX *ctx = NULL; |
296 | ||
297 | if (mode & SIG_MODE_INIT) | |
298 | +#ifdef LIBDHCP | |
299 | + ctx = (MD5_CTX *) dmalloc(sizeof(*ctx),__FILE__,__LINE__); | |
300 | +#else | |
301 | ctx = (MD5_CTX *) malloc(sizeof(*ctx)); | |
302 | +#endif | |
303 | else if (context) | |
304 | ctx = (MD5_CTX *) *context; | |
305 | if (ctx == NULL) | |
e5ebac8b | 306 | @@ -154,7 +162,11 @@ dst_hmac_md5_verify(const int mode, DST_ |
c494ae74 PZ |
307 | MD5_CTX *ctx = NULL; |
308 | ||
309 | if (mode & SIG_MODE_INIT) | |
310 | +#ifdef LIBDHCP | |
311 | + ctx = (MD5_CTX *) dmalloc(sizeof(*ctx),__FILE__,__LINE__); | |
312 | +#else | |
313 | ctx = (MD5_CTX *) malloc(sizeof(*ctx)); | |
314 | +#endif | |
315 | else if (context) | |
316 | ctx = (MD5_CTX *) *context; | |
317 | if (ctx == NULL) | |
e5ebac8b | 318 | @@ -218,8 +230,11 @@ dst_buffer_to_hmac_md5(DST_KEY *dkey, co |
c494ae74 PZ |
319 | |
320 | if (dkey == NULL || key == NULL || keylen < 0) | |
321 | return (-1); | |
322 | - | |
323 | +#ifdef LIBDHCP | |
324 | + if ((hkey = (HMAC_Key *) dmalloc(sizeof(HMAC_Key),__FILE__,__LINE__)) == NULL) | |
325 | +#else | |
326 | if ((hkey = (HMAC_Key *) malloc(sizeof(HMAC_Key))) == NULL) | |
327 | +#endif | |
328 | return (-2); | |
329 | ||
330 | memset(hkey->hk_ipad, 0, sizeof(hkey->hk_ipad)); | |
e5ebac8b | 331 | @@ -348,7 +363,11 @@ dst_hmac_md5_key_from_file_format(DST_KE |
c494ae74 PZ |
332 | if (eol == NULL) |
333 | return (-4); | |
334 | len = eol - p; | |
335 | +#ifdef LIBDHCP | |
336 | + tmp = dmalloc(len + 2,__FILE__,__LINE__); | |
337 | +#else | |
338 | tmp = malloc(len + 2); | |
339 | +#endif | |
340 | memcpy(tmp, p, len); | |
341 | *(tmp + len) = 0x0; | |
342 | key_len = b64_pton((char *)tmp, key, HMAC_LEN+1); /* see above */ | |
e5ebac8b | 343 | @@ -440,8 +459,11 @@ dst_hmac_md5_generate_key(DST_KEY *key, |
c494ae74 PZ |
344 | return(0); |
345 | ||
346 | len = size > 64 ? 64 : size; | |
347 | +#ifdef LIBDHCP | |
348 | + buff = dmalloc(len+8,__FILE__,__LINE__); | |
349 | +#else | |
350 | buff = malloc(len+8); | |
351 | - | |
352 | +#endif | |
353 | n = dst_random(DST_RAND_SEMI, len, buff); | |
354 | n += dst_random(DST_RAND_KEY, len, buff); | |
355 | if (n <= len) { /* failed getting anything */ | |
e5ebac8b | 356 | @@ -464,7 +486,11 @@ dst_hmac_md5_init() |
c494ae74 PZ |
357 | { |
358 | if (dst_t_func[KEY_HMAC_MD5] != NULL) | |
359 | return (1); | |
360 | +#ifdef LIBDHCP | |
361 | + dst_t_func[KEY_HMAC_MD5] = dmalloc(sizeof(struct dst_func),__FILE__,__LINE__); | |
362 | +#else | |
363 | dst_t_func[KEY_HMAC_MD5] = malloc(sizeof(struct dst_func)); | |
364 | +#endif | |
365 | if (dst_t_func[KEY_HMAC_MD5] == NULL) | |
366 | return (0); | |
367 | memset(dst_t_func[KEY_HMAC_MD5], 0, sizeof(struct dst_func)); | |
e5ebac8b AM |
368 | diff -up dhcp-4.0.0/common/Makefile.am.libdhcp4client dhcp-4.0.0/common/Makefile.am |
369 | --- dhcp-4.0.0/common/Makefile.am.libdhcp4client 2007-11-16 01:04:11.000000000 -1000 | |
370 | +++ dhcp-4.0.0/common/Makefile.am 2008-01-22 17:04:28.000000000 -1000 | |
371 | @@ -1,11 +1,17 @@ | |
372 | AM_CPPFLAGS = -I.. -DLOCALSTATEDIR='"@localstatedir@"' | |
373 | ||
374 | -noinst_LIBRARIES = libdhcp.a | |
375 | +noinst_LIBRARIES = libdhcp.a libdhcpLIBDHCP.a | |
376 | libdhcp_a_SOURCES = alloc.c bpf.c comapi.c conflex.c ctrace.c discover.c \ | |
377 | dispatch.c dlpi.c dns.c ethernet.c execute.c fddi.c \ | |
378 | icmp.c inet.c lpf.c memory.c nit.c options.c packet.c \ | |
379 | parse.c print.c raw.c resolv.c socket.c tables.c tr.c \ | |
380 | tree.c upf.c heap.c | |
381 | +libdhcpLIBDHCP_a_CFLAGS = -DLIBDHCP | |
382 | +libdhcpLIBDHCP_a_SOURCES = alloc.c bpf.c comapi.c conflex.c ctrace.c \ | |
383 | + discover.c dispatch.c dlpi.c dns.c ethernet.c \ | |
384 | + execute.c inet.c lpf.c memory.c nit.c options.c \ | |
385 | + packet.c parse.c print.c resolv.c socket.c \ | |
386 | + tables.c tr.c tree.c upf.c | |
387 | man_MANS = dhcp-eval.5 dhcp-options.5 | |
388 | EXTRA_DIST = $(man_MANS) | |
389 | ||
390 | diff -up dhcp-4.0.0/common/discover.c.libdhcp4client dhcp-4.0.0/common/discover.c | |
391 | --- dhcp-4.0.0/common/discover.c.libdhcp4client 2007-10-05 12:29:51.000000000 -1000 | |
392 | +++ dhcp-4.0.0/common/discover.c 2008-01-22 17:04:28.000000000 -1000 | |
393 | @@ -883,6 +883,10 @@ add_ipv6_addr_to_interface(struct interf | |
c494ae74 PZ |
394 | register that interface with the network I/O software, figure out what |
395 | subnet it's on, and add it to the list of interfaces. */ | |
396 | ||
397 | +#ifdef LIBDHCP | |
398 | +int have_setup_fallback = 0; | |
399 | +#endif | |
400 | + | |
e5ebac8b AM |
401 | void |
402 | discover_interfaces(int state) { | |
403 | struct iface_conf_list ifaces; | |
404 | @@ -902,7 +906,9 @@ discover_interfaces(int state) { | |
c494ae74 | 405 | isc_result_t status; |
e5ebac8b AM |
406 | int wifcount = 0; |
407 | ||
c494ae74 PZ |
408 | +#ifndef LIBDHCP |
409 | static int setup_fallback = 0; | |
410 | +#endif | |
c494ae74 | 411 | |
e5ebac8b AM |
412 | if (!begin_iface_scan(&ifaces)) { |
413 | log_fatal("Can't get list of interfaces."); | |
414 | @@ -1242,10 +1248,17 @@ discover_interfaces(int state) { | |
c494ae74 PZ |
415 | log_fatal ("Not configured to listen on any interfaces!"); |
416 | } | |
417 | ||
418 | +#ifdef LIBDHCP | |
e5ebac8b | 419 | + if ((local_family == AF_INET) && !have_setup_fallback) { |
c494ae74 PZ |
420 | + have_setup_fallback = 1; |
421 | + maybe_setup_fallback (); | |
422 | + } | |
423 | +#else | |
e5ebac8b | 424 | if ((local_family == AF_INET) && !setup_fallback) { |
c494ae74 | 425 | setup_fallback = 1; |
e5ebac8b | 426 | maybe_setup_fallback(); |
c494ae74 PZ |
427 | } |
428 | +#endif | |
429 | ||
e5ebac8b | 430 | #if defined (F_SETFD) |
c494ae74 | 431 | if (fallback_interface) { |
e5ebac8b AM |
432 | diff -up dhcp-4.0.0/common/tree.c.libdhcp4client dhcp-4.0.0/common/tree.c |
433 | --- dhcp-4.0.0/common/tree.c.libdhcp4client 2007-08-22 03:41:37.000000000 -1000 | |
434 | +++ dhcp-4.0.0/common/tree.c 2008-01-22 17:04:28.000000000 -1000 | |
435 | @@ -41,7 +41,7 @@ | |
436 | # include <regex.h> | |
437 | #endif | |
c494ae74 PZ |
438 | |
439 | -struct binding_scope *global_scope; | |
440 | +struct binding_scope __attribute__ ((visibility ("default"))) *global_scope; | |
441 | ||
442 | static int do_host_lookup PROTO ((struct data_string *, | |
443 | struct dns_host_entry *)); | |
e5ebac8b | 444 | @@ -2859,6 +2859,7 @@ int evaluate_numeric_expression (result, |
c494ae74 PZ |
445 | result of that evaluation. There should never be both an expression |
446 | and a valid data_string. */ | |
447 | ||
448 | +__attribute__ ((visibility ("default"))) | |
449 | int evaluate_option_cache (result, packet, lease, client_state, | |
450 | in_options, cfg_options, scope, oc, file, line) | |
451 | struct data_string *result; | |
e5ebac8b AM |
452 | diff -up dhcp-4.0.0/common/options.c.libdhcp4client dhcp-4.0.0/common/options.c |
453 | --- dhcp-4.0.0/common/options.c.libdhcp4client 2007-11-30 11:51:43.000000000 -1000 | |
454 | +++ dhcp-4.0.0/common/options.c 2008-01-22 17:04:28.000000000 -1000 | |
455 | @@ -3392,6 +3392,7 @@ fqdn6_universe_decode(struct option_stat | |
456 | return 0; | |
c494ae74 PZ |
457 | } |
458 | ||
459 | +__attribute__ ((visibility ("default"))) | |
460 | void option_space_foreach (struct packet *packet, struct lease *lease, | |
461 | struct client_state *client_state, | |
462 | struct option_state *in_options, | |
e5ebac8b AM |
463 | diff -up dhcp-4.0.0/common/dispatch.c.libdhcp4client dhcp-4.0.0/common/dispatch.c |
464 | --- dhcp-4.0.0/common/dispatch.c.libdhcp4client 2008-01-22 17:04:28.000000000 -1000 | |
465 | +++ dhcp-4.0.0/common/dispatch.c 2008-01-22 17:04:28.000000000 -1000 | |
466 | @@ -34,8 +34,24 @@ | |
c494ae74 PZ |
467 | |
468 | #include "dhcpd.h" | |
469 | ||
470 | -struct timeout *timeouts; | |
471 | -static struct timeout *free_timeouts; | |
472 | +struct timeout { | |
473 | +#ifndef LIBDHCP | |
474 | + struct timeout *next; | |
475 | +#endif | |
476 | + TIME when; | |
477 | + void (*func) PROTO ((void *)); | |
478 | + void *what; | |
479 | + tvref_t ref; | |
480 | + tvunref_t unref; | |
481 | +}; | |
482 | + | |
483 | +#ifdef LIBDHCP | |
484 | +static struct timeout *timeouts = NULL; | |
485 | +static int ntimeouts = 0; | |
486 | +#else | |
487 | +static struct timeout *timeouts = NULL; | |
488 | +static struct timeout *free_timeouts = NULL; | |
489 | +#endif | |
490 | ||
491 | void set_time(TIME t) | |
492 | { | |
e5ebac8b | 493 | @@ -48,9 +64,41 @@ void set_time(TIME t) |
c494ae74 PZ |
494 | |
495 | struct timeval *process_outstanding_timeouts (struct timeval *tvp) | |
496 | { | |
497 | +#ifdef LIBDHCP | |
498 | + int i; | |
499 | + struct timeout t = { 0 }; | |
500 | +#endif | |
501 | /* Call any expired timeouts, and then if there's | |
502 | still a timeout registered, time out the select | |
503 | call then. */ | |
504 | +#ifdef LIBDHCP | |
505 | + if (!ntimeouts) | |
506 | + return NULL; | |
507 | + | |
508 | + for (i = 0; i < ntimeouts && timeouts[i].when <= cur_time;) { | |
509 | + struct timeout *new_timeouts; | |
510 | + size_t n; | |
511 | + | |
512 | + memmove(&t, &timeouts[i], sizeof (t)); | |
513 | + | |
514 | + n = (ntimeouts - i - 1) * sizeof (t); | |
515 | + memmove(&timeouts[i+1], &timeouts[i], n); | |
516 | + | |
517 | + n = --ntimeouts * sizeof (t); | |
518 | + new_timeouts = realloc(timeouts, n); | |
519 | + /* XXX broken API, no way to return error here */ | |
520 | + if (new_timeouts || !n) | |
521 | + timeouts = new_timeouts; | |
522 | + | |
523 | + if (t.func) | |
524 | + t.func(t.what); | |
525 | + if (t.unref) | |
526 | + t.unref(t.what, MDL); | |
527 | + } | |
528 | + if (tvp && ntimeouts) { | |
529 | + tvp->tv_sec = timeouts[0].when; | |
530 | + tvp->tv_usec = 0; | |
531 | +#else | |
532 | another: | |
533 | if (timeouts) { | |
534 | struct timeout *t; | |
e5ebac8b | 535 | @@ -68,9 +116,15 @@ struct timeval *process_outstanding_time |
c494ae74 PZ |
536 | tvp -> tv_sec = timeouts -> when; |
537 | tvp -> tv_usec = 0; | |
538 | } | |
539 | +#endif | |
540 | return tvp; | |
541 | +#ifdef LIBDHCP | |
542 | + } | |
543 | + return NULL; | |
544 | +#else | |
545 | } else | |
546 | return (struct timeval *)0; | |
547 | +#endif | |
548 | } | |
549 | ||
550 | /* Wait for packets to come in using select(). When one does, call | |
e5ebac8b | 551 | @@ -99,13 +153,28 @@ void add_timeout (when, where, what, ref |
c494ae74 PZ |
552 | tvref_t ref; |
553 | tvunref_t unref; | |
554 | { | |
555 | +#ifdef LIBDHCP | |
556 | + struct timeout t = { | |
557 | + .when = when, | |
558 | + .func = where, | |
559 | + .what = what, | |
560 | + .ref = ref, | |
561 | + .unref = unref | |
562 | + }; | |
563 | + struct timeout *new_timeouts; | |
564 | + int i, pos = 0; | |
565 | +#else | |
566 | struct timeout *t, *q; | |
567 | +#endif | |
568 | ||
569 | /* See if this timeout supersedes an existing timeout. */ | |
570 | +#ifdef LIBDHCP | |
571 | + for (i = 0; i < ntimeouts; i++) { | |
572 | + struct timeout *q = &timeouts[i]; | |
573 | +#else | |
574 | t = (struct timeout *)0; | |
575 | for (q = timeouts; q; q = q -> next) { | |
576 | - if ((where == NULL || q -> func == where) && | |
577 | - q -> what == what) { | |
578 | + if ((where == NULL || q -> func == where) && q -> what == what) { | |
579 | if (t) | |
580 | t -> next = q -> next; | |
581 | else | |
e5ebac8b | 582 | @@ -114,7 +183,29 @@ void add_timeout (when, where, what, ref |
c494ae74 PZ |
583 | } |
584 | t = q; | |
585 | } | |
586 | +#endif | |
587 | ||
588 | +#ifdef LIBDHCP | |
589 | + /* If this one is already in the list with a different time, | |
590 | + * remove it and re-add */ | |
591 | + if ((where == NULL || q->func == where) && | |
592 | + q->what == what) { | |
593 | + size_t n = (--ntimeouts - i) * sizeof (*q); | |
594 | + memmove(&t, q, sizeof (t)); | |
595 | + | |
596 | + if (n) | |
597 | + memmove(&timeouts[i], &timeouts[i+1], n); | |
598 | + | |
599 | + if (ntimeouts) { | |
600 | + new_timeouts = realloc(timeouts, ntimeouts * sizeof (*q)); | |
601 | + /* XXX broken API, no way to return error here */ | |
602 | + if (new_timeouts) | |
603 | + timeouts = new_timeouts; | |
604 | + } else { | |
605 | + timeouts = NULL; | |
606 | + } | |
607 | + add_timeout(when, where, what, ref, unref); | |
608 | +#else | |
609 | /* If we didn't supersede a timeout, allocate a timeout | |
610 | structure now. */ | |
611 | if (!q) { | |
e5ebac8b | 612 | @@ -123,7 +214,7 @@ void add_timeout (when, where, what, ref |
c494ae74 PZ |
613 | free_timeouts = q -> next; |
614 | } else { | |
615 | q = ((struct timeout *) | |
616 | - dmalloc (sizeof (struct timeout), MDL)); | |
617 | + dmalloc (sizeof (struct timeout), MDL)); | |
618 | if (!q) | |
619 | log_fatal ("add_timeout: no memory!"); | |
620 | } | |
e5ebac8b | 621 | @@ -153,22 +244,76 @@ void add_timeout (when, where, what, ref |
c494ae74 PZ |
622 | if (t -> next -> when > q -> when) { |
623 | q -> next = t -> next; | |
624 | t -> next = q; | |
625 | +#endif | |
626 | return; | |
627 | +#ifdef LIBDHCP | |
628 | + } else if (timeouts[i].when > when) { | |
629 | + pos = i; | |
630 | +#endif | |
631 | } | |
632 | } | |
633 | ||
634 | +#ifdef LIBDHCP | |
635 | + /* If we didn't supersede an existing timeout, then pos is set | |
636 | + * to the timeout which will post after this one. Insert this | |
637 | + * one before it. */ | |
638 | + | |
639 | + new_timeouts = realloc(timeouts, sizeof (t) * (ntimeouts+1)); | |
640 | + /* XXX broken API, no way to return error here */ | |
641 | + if (new_timeouts) { | |
642 | + /* ntimeouts = 10 | |
643 | + * pos = 3; | |
644 | + * n = 10-3 * sizeof (t) = 7 * sizeof (t) | |
645 | + */ | |
646 | + size_t n = (ntimeouts - pos) * sizeof (t); | |
647 | + | |
648 | + timeouts = new_timeouts; | |
649 | + memmove(&timeouts[pos+1], &timeouts[pos], n); | |
650 | + memmove(&timeouts[pos], &t, sizeof (t)); | |
651 | + ntimeouts++; | |
652 | + } | |
653 | +#else | |
654 | /* End of list. */ | |
655 | t -> next = q; | |
656 | q -> next = (struct timeout *)0; | |
657 | +#endif | |
658 | } | |
659 | ||
660 | void cancel_timeout (where, what) | |
661 | void (*where) PROTO ((void *)); | |
662 | void *what; | |
663 | { | |
664 | +#ifdef LIBDHCP | |
665 | + struct timeout t; | |
666 | + int i = 0; | |
667 | +#else | |
668 | struct timeout *t, *q; | |
669 | +#endif | |
670 | ||
671 | /* Look for this timeout on the list, and unlink it if we find it. */ | |
672 | +#ifdef LIBDHCP | |
673 | + for (i = 0; i < ntimeouts; i++) { | |
674 | + struct timeout *new_timeouts, *q = &timeouts[i]; | |
675 | + | |
676 | + if (q->func == where && q->what == what) { | |
677 | + size_t n; | |
678 | + | |
679 | + memmove(&t, q, sizeof (t)); | |
680 | + | |
681 | + n = (ntimeouts - i - 1) * sizeof (t); | |
682 | + memmove(&timeouts[i+1], &timeouts[i], n); | |
683 | + | |
684 | + n = --ntimeouts * sizeof (t); | |
685 | + new_timeouts = realloc(timeouts, n); | |
686 | + /* XXX broken API, no way to return error here */ | |
687 | + if (new_timeouts || !n) | |
688 | + timeouts = new_timeouts; | |
689 | + | |
690 | + if (t.unref) | |
691 | + t.unref(t.what, MDL); | |
692 | + } | |
693 | + } | |
694 | +#else | |
695 | t = (struct timeout *)0; | |
696 | for (q = timeouts; q; q = q -> next) { | |
697 | if (q -> func == where && q -> what == what) { | |
e5ebac8b | 698 | @@ -188,10 +333,15 @@ void cancel_timeout (where, what) |
c494ae74 PZ |
699 | q -> next = free_timeouts; |
700 | free_timeouts = q; | |
701 | } | |
702 | +#endif | |
703 | } | |
704 | ||
c494ae74 PZ |
705 | void cancel_all_timeouts () |
706 | { | |
707 | +#ifdef LIBDHCP | |
708 | + cur_time = TIME_MAX; | |
709 | + process_outstanding_timeouts(NULL); | |
710 | +#else | |
711 | struct timeout *t, *n; | |
712 | for (t = timeouts; t; t = n) { | |
713 | n = t -> next; | |
e5ebac8b | 714 | @@ -200,13 +350,20 @@ void cancel_all_timeouts () |
c494ae74 PZ |
715 | t -> next = free_timeouts; |
716 | free_timeouts = t; | |
717 | } | |
718 | +#endif | |
719 | } | |
720 | ||
721 | +__attribute__ ((visibility ("default"))) | |
722 | void relinquish_timeouts () | |
723 | { | |
724 | +#ifdef LIBDHCP | |
725 | + while (ntimeouts) | |
726 | + cancel_timeout(timeouts[0].func, timeouts[0].what); | |
727 | +#else | |
728 | struct timeout *t, *n; | |
729 | for (t = free_timeouts; t; t = n) { | |
730 | n = t -> next; | |
731 | dfree (t, MDL); | |
732 | } | |
733 | +#endif | |
734 | } | |
e5ebac8b AM |
735 | diff -up dhcp-4.0.0/common/alloc.c.libdhcp4client dhcp-4.0.0/common/alloc.c |
736 | --- dhcp-4.0.0/common/alloc.c.libdhcp4client 2007-10-23 14:54:11.000000000 -1000 | |
737 | +++ dhcp-4.0.0/common/alloc.c 2008-01-22 17:04:28.000000000 -1000 | |
738 | @@ -1004,7 +1004,11 @@ int executable_statement_reference (ptr, | |
c494ae74 PZ |
739 | return 1; |
740 | } | |
741 | ||
742 | +#ifdef LIBDHCP | |
743 | +struct packet *free_packets; | |
744 | +#else | |
745 | static struct packet *free_packets; | |
746 | +#endif | |
747 | ||
748 | #if defined (DEBUG_MEMORY_LEAKAGE) || \ | |
749 | defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) | |
e5ebac8b AM |
750 | diff -up dhcp-4.0.0/includes/dhcpd.h.libdhcp4client dhcp-4.0.0/includes/dhcpd.h |
751 | --- dhcp-4.0.0/includes/dhcpd.h.libdhcp4client 2008-01-22 17:04:28.000000000 -1000 | |
752 | +++ dhcp-4.0.0/includes/dhcpd.h 2008-01-22 17:05:02.000000000 -1000 | |
753 | @@ -1199,14 +1199,6 @@ struct hardware_link { | |
c494ae74 PZ |
754 | |
755 | typedef void (*tvref_t)(void *, void *, const char *, int); | |
756 | typedef void (*tvunref_t)(void *, const char *, int); | |
757 | -struct timeout { | |
758 | - struct timeout *next; | |
759 | - TIME when; | |
760 | - void (*func) PROTO ((void *)); | |
761 | - void *what; | |
762 | - tvref_t ref; | |
763 | - tvunref_t unref; | |
764 | -}; | |
765 | ||
766 | struct protocol { | |
767 | struct protocol *next; | |
e5ebac8b AM |
768 | @@ -1664,7 +1656,6 @@ extern const char *path_dhcpd_pid; |
769 | ||
770 | extern int dhcp_max_agent_option_packet_length; | |
771 | ||
772 | -int main(int, char **); | |
773 | void postconf_initialization(int); | |
774 | void postdb_startup(void); | |
775 | void cleanup PROTO ((void)); | |
776 | @@ -2337,7 +2328,6 @@ extern void (*bootp_packet_handler) PROT | |
777 | extern void (*dhcpv6_packet_handler)(struct interface_info *, | |
778 | const char *, int, | |
779 | int, const struct iaddr *, isc_boolean_t); | |
c494ae74 PZ |
780 | -extern struct timeout *timeouts; |
781 | extern omapi_object_type_t *dhcp_type_interface; | |
782 | #if defined (TRACING) | |
e5ebac8b AM |
783 | extern trace_type_t *interface_trace; |
784 | @@ -2392,6 +2382,10 @@ extern struct universe dhcpv6_universe; | |
785 | extern struct universe nwip_universe; | |
786 | extern struct universe fqdn_universe; | |
787 | extern struct universe vsio_universe; | |
788 | +extern struct universe vendor_class_universe; | |
789 | +extern struct universe vendor_universe; | |
790 | +extern struct universe isc_universe; | |
791 | +extern struct universe isc6_universe; | |
792 | extern int dhcp_option_default_priority_list []; | |
793 | extern int dhcp_option_default_priority_list_count; | |
794 | extern const char *hardware_types [256]; | |
795 | diff -up dhcp-4.0.0/client/Makefile.am.libdhcp4client dhcp-4.0.0/client/Makefile.am | |
796 | --- dhcp-4.0.0/client/Makefile.am.libdhcp4client 2007-12-12 09:23:42.000000000 -1000 | |
797 | +++ dhcp-4.0.0/client/Makefile.am 2008-01-22 17:04:28.000000000 -1000 | |
798 | @@ -1,10 +1,18 @@ | |
799 | dist_sysconf_DATA = dhclient.conf | |
800 | sbin_PROGRAMS = dhclient | |
801 | +lib_LTLIBRARIES = libdhcp4client.la | |
802 | dhclient_SOURCES = clparse.c dhclient.c dhc6.c \ | |
803 | scripts/bsdos scripts/freebsd scripts/linux scripts/netbsd \ | |
804 | scripts/nextstep scripts/openbsd scripts/solaris | |
805 | dhclient_LDADD = ../common/libdhcp.a ../minires/libres.a \ | |
806 | ../omapip/libomapi.a ../dst/libdst.a | |
807 | +libdhcp4client_la_CFLAGS = -DLIBDHCP -DLOCALSTATEDIR='"@localstatedir@"' | |
808 | +libdhcp4client_la_LDFLAGS = -version-info \ | |
809 | + $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ | |
810 | + -release $(LT_RELEASE) | |
811 | +libdhcp4client_la_SOURCES = clparse.c dhclient.c dhc6.c | |
812 | +libdhcp4client_la_LIBADD = ../common/libdhcpLIBDHCP.a ../minires/libres.a \ | |
813 | + ../omapip/libomapiLIBDHCP.a ../dst/libdstLIBDHCP.a | |
814 | man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5 | |
815 | EXTRA_DIST = $(man_MANS) | |
816 | ||
817 | diff -up dhcp-4.0.0/client/dhclient.c.libdhcp4client dhcp-4.0.0/client/dhclient.c | |
818 | --- dhcp-4.0.0/client/dhclient.c.libdhcp4client 2008-01-22 17:04:28.000000000 -1000 | |
819 | +++ dhcp-4.0.0/client/dhclient.c 2008-01-22 17:05:47.000000000 -1000 | |
820 | @@ -83,14 +83,50 @@ int nowait=0; | |
821 | char *mockup_relay = NULL; | |
c494ae74 PZ |
822 | int bootp_broadcast_always = 0; |
823 | ||
824 | +#ifdef LIBDHCP | |
825 | +FILE *leaseFile = NULL; | |
826 | +#endif | |
827 | + | |
828 | extern u_int32_t default_requested_options[]; | |
e5ebac8b | 829 | |
c494ae74 PZ |
830 | static void usage PROTO ((void)); |
831 | ||
e5ebac8b AM |
832 | static isc_result_t write_duid(struct data_string *duid); |
833 | ||
834 | -int | |
835 | -main(int argc, char **argv) { | |
c494ae74 PZ |
836 | +#ifdef LIBDHCP |
837 | +#include "isc-dhcp/libdhcp_control.h" | |
838 | +LIBDHCP_Control *libdhcp_control; | |
839 | +static void libdhcp_dispatch(void) | |
840 | +{ | |
841 | + struct timeval tv = { 0, 0 }, *tvp; | |
842 | + isc_result_t status; | |
843 | + | |
844 | + /* Wait for a packet, or a timeout, or libdhcp being finished */ | |
845 | + do { | |
846 | + tvp = process_outstanding_timeouts(&tv); | |
847 | + status = omapi_one_dispatch(0, tvp); | |
848 | + | |
849 | + if (libdhcp_control && ((status == ISC_R_TIMEDOUT) || (libdhcp_control->timeout && (time(NULL) >= (libdhcp_control->timeout + libdhcp_control->now))))) { | |
850 | + if (libdhcp_control->callback) | |
851 | + libdhcp_control->callback(libdhcp_control, DHC_TIMEDOUT, NULL); | |
852 | + | |
853 | + break; | |
854 | + } | |
855 | + } while ((status != ISC_R_TIMEDOUT) && ((!libdhcp_control) || (!(libdhcp_control->finished)))); | |
856 | +} | |
857 | + | |
858 | +extern void omapi_free_all_pointers(void); | |
859 | + | |
860 | +__attribute__ ((visibility ("default"))) | |
e5ebac8b AM |
861 | +int dhcpv4_client (LIBDHCP_Control *libdhcp_ctl, int argc, char **argv, |
862 | + char **envp) | |
c494ae74 | 863 | +#else |
e5ebac8b | 864 | +int main(int argc, char **argv, char **envp) |
c494ae74 | 865 | +#endif |
e5ebac8b | 866 | +{ |
c494ae74 PZ |
867 | +#ifdef LIBDHCP |
868 | + libdhcp_control = libdhcp_ctl; | |
869 | +#endif | |
870 | int fd; | |
871 | int i; | |
e5ebac8b AM |
872 | struct interface_info *ip; |
873 | @@ -122,6 +158,7 @@ main(int argc, char **argv) { | |
874 | /* Initialize client globals. */ | |
875 | memset(&default_duid, 0, sizeof(default_duid)); | |
c494ae74 PZ |
876 | |
877 | +#ifndef LIBDHCP | |
878 | /* Make sure that file descriptors 0 (stdin), 1, (stdout), and | |
879 | 2 (stderr) are open. To do this, we assume that when we | |
e5ebac8b AM |
880 | open a file the lowest available file descriptor is used. */ |
881 | @@ -140,6 +177,7 @@ main(int argc, char **argv) { | |
882 | #if !(defined (DEBUG) || defined (__CYGWIN32__)) | |
c494ae74 PZ |
883 | setlogmask (LOG_UPTO (LOG_INFO)); |
884 | #endif | |
885 | +#endif | |
886 | ||
887 | /* Set up the OMAPI. */ | |
888 | status = omapi_init (); | |
e5ebac8b | 889 | @@ -485,8 +523,12 @@ main(int argc, char **argv) { |
c494ae74 PZ |
890 | } |
891 | } | |
892 | ||
893 | +#ifdef LIBDHCP | |
894 | + if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_PID_FILE)) | |
895 | +#endif | |
e5ebac8b AM |
896 | write_client_pid_file(); |
897 | ||
c494ae74 PZ |
898 | +#ifndef LIBDHCP |
899 | if (!quiet) { | |
e5ebac8b | 900 | log_info ("%s %s", message, PACKAGE_VERSION); |
c494ae74 | 901 | log_info (copyright); |
e5ebac8b | 902 | @@ -497,6 +539,7 @@ main(int argc, char **argv) { |
c494ae74 | 903 | log_perror = 0; |
e5ebac8b AM |
904 | quiet_interface_discovery = 1; |
905 | } | |
c494ae74 PZ |
906 | +#endif |
907 | ||
908 | /* If we're given a relay agent address to insert, for testing | |
909 | purposes, figure out what it is. */ | |
e5ebac8b | 910 | @@ -702,11 +745,17 @@ main(int argc, char **argv) { |
c494ae74 PZ |
911 | arg_conf_len = 0; |
912 | } | |
913 | ||
914 | +#ifdef LIBDHCP | |
915 | + if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_LEASE_DATABASE)) { | |
916 | +#endif | |
917 | /* Parse the lease database. */ | |
918 | read_client_leases (); | |
919 | ||
920 | /* Rewrite the lease database... */ | |
921 | rewrite_client_leases (); | |
922 | +#ifdef LIBDHCP | |
923 | + } | |
924 | +#endif | |
925 | ||
926 | /* XXX */ | |
927 | /* config_counter(&snd_counter, &rcv_counter); */ | |
e5ebac8b | 928 | @@ -725,7 +774,7 @@ main(int argc, char **argv) { |
c494ae74 PZ |
929 | if (!persist) { |
930 | /* Nothing more to do. */ | |
931 | log_info ("No broadcast interfaces found - exiting."); | |
932 | - exit (0); | |
933 | + return (0); | |
934 | } | |
935 | } else if (!release_mode && !exit_mode) { | |
936 | /* Call the script with the list of interfaces. */ | |
e5ebac8b | 937 | @@ -863,6 +912,7 @@ main(int argc, char **argv) { |
c494ae74 PZ |
938 | dmalloc_outstanding = 0; |
939 | #endif | |
940 | ||
941 | +#ifndef LIBDHCP | |
942 | /* If we're not supposed to wait before getting the address, | |
943 | don't. */ | |
944 | if (nowait) | |
e5ebac8b | 945 | @@ -875,6 +925,132 @@ main(int argc, char **argv) { |
c494ae74 PZ |
946 | |
947 | /* Start dispatching packets and timeouts... */ | |
948 | dispatch (); | |
949 | +#else | |
950 | + if (libdhcp_control) { | |
951 | + if (libdhcp_control->timeout) | |
952 | + libdhcp_control->now = time(NULL); | |
953 | + else | |
954 | + libdhcp_control->now = 0; | |
955 | + } | |
956 | + | |
957 | + libdhcp_dispatch(); | |
958 | + | |
959 | + /* libdhcp is finished with us. */ | |
960 | + | |
961 | + /* close all file descriptors: */ | |
962 | + for (ip = interfaces; ip; ip = ip->next) { | |
963 | + shutdown(ip->wfdesc, SHUT_RDWR); | |
964 | + close(ip->wfdesc); | |
965 | + | |
966 | + if (ip->rfdesc != ip->wfdesc) | |
967 | + close(ip->rfdesc); | |
968 | + } | |
969 | + | |
970 | + if (fallback_interface != 0) { | |
971 | + ip = fallback_interface; | |
972 | + shutdown(ip->wfdesc, SHUT_RDWR); | |
973 | + close(ip->wfdesc); | |
974 | + | |
975 | + if (ip->rfdesc != ip->wfdesc) | |
976 | + close(ip->rfdesc); | |
977 | + } | |
978 | + | |
979 | + if (leaseFile) | |
980 | + fclose (leaseFile); | |
981 | + | |
982 | + closelog(); | |
983 | + | |
984 | + char *current_pid_file = _PATH_DHCLIENT_PID; | |
985 | + | |
986 | + /* Free ALL allocated memory: */ | |
987 | + omapi_free_all_pointers(); | |
988 | + | |
989 | + /* Re-Initialize globals: */ | |
990 | + client_env = 0; | |
991 | + client_env_count = 0; | |
992 | + default_lease_time = 43200; | |
993 | + | |
994 | + dhcp_max_agent_option_packet_length = 0; | |
995 | + iaddr_any.len = 4; | |
996 | + memset(&(iaddr_any.iabuf[0]), '\0', 4); | |
997 | + iaddr_broadcast.len = 4; | |
998 | + memset(&(iaddr_broadcast.iabuf[0]), 0xff, 4); | |
999 | + interfaces_requested = 0; | |
1000 | + leaseFile = 0; | |
1001 | + | |
1002 | + libdhcp_control = 0; | |
1003 | + | |
1004 | + local_port = 0; | |
1005 | + no_daemon = 0; | |
1006 | + nowait = 0; | |
1007 | + onetry = 0; | |
1008 | + quiet = 0; | |
1009 | + max_lease_time = 86400; | |
1010 | + path_dhclient_conf = _PATH_DHCLIENT_CONF; | |
1011 | + path_dhclient_db = _PATH_DHCLIENT_DB; | |
1012 | + path_dhclient_pid = _PATH_DHCLIENT_PID; | |
1013 | + strcpy(&(path_dhclient_script_array[0]), _PATH_DHCLIENT_SCRIPT); | |
1014 | + path_dhclient_script = path_dhclient_script_array; | |
1015 | + remote_port = 0; | |
1016 | + resolver_inited = 0; | |
1017 | + log_perror = 1; | |
1018 | + global_scope = NULL; | |
1019 | + root_group = NULL; | |
1020 | + group_name_hash = NULL; | |
1021 | + interfaces = NULL; | |
1022 | + dummy_interfaces = NULL; | |
1023 | + fallback_interface = NULL; | |
1024 | + extern int have_setup_fallback; | |
1025 | + have_setup_fallback = 0; | |
1026 | + quiet_interface_discovery = 1; | |
1027 | +#ifndef LIBDHCP | |
1028 | + timeouts = NULL; | |
1029 | +#endif | |
1030 | + dhcp_type_interface = NULL; | |
1031 | + interface_vector = NULL; | |
1032 | + interface_count = 0; | |
1033 | + interface_max = 0; | |
1034 | + name_servers = 0; | |
1035 | + domains = 0; | |
1036 | + dhcp_type_interface = NULL; | |
1037 | + dhcp_type_group = NULL; | |
1038 | + dhcp_type_shared_network = NULL; | |
1039 | + dhcp_type_control = NULL; | |
1040 | + memset(&dhcp_universe, '\0', sizeof(struct universe)); | |
e5ebac8b | 1041 | + memset(&dhcpv6_universe, '\0', sizeof(struct universe)); |
c494ae74 PZ |
1042 | + memset(&nwip_universe, '\0', sizeof(struct universe)); |
1043 | + memset(&fqdn_universe, '\0', sizeof(struct universe)); | |
e5ebac8b AM |
1044 | + memset(&vendor_class_universe, '\0', sizeof(struct universe)); |
1045 | + memset(&vendor_universe, '\0', sizeof(struct universe)); | |
1046 | + memset(&vsio_universe, '\0', sizeof(struct universe)); | |
1047 | + memset(&isc_universe, '\0', sizeof(struct universe)); | |
1048 | + memset(&isc6_universe, '\0', sizeof(struct universe)); | |
c494ae74 PZ |
1049 | + universe_hash = 0; |
1050 | + universes = 0; | |
1051 | + universe_count = 0; | |
1052 | + universe_max = 0; | |
e5ebac8b | 1053 | + config_universe = 0; |
c494ae74 PZ |
1054 | + extern struct hash_bucket *free_hash_buckets; |
1055 | + free_hash_buckets = NULL; | |
1056 | + extern struct dhcp_packet *dhcp_free_list; | |
1057 | + dhcp_free_list = NULL; | |
1058 | + extern struct packet *packet_free_list; | |
1059 | + packet_free_list = NULL; | |
1060 | + extern struct binding_value *free_binding_values; | |
1061 | + free_binding_values = NULL; | |
1062 | + extern struct expression *free_expressions; | |
1063 | + free_expressions = NULL; | |
1064 | + extern struct option_cache *free_option_caches; | |
1065 | + free_option_caches = NULL; | |
1066 | + extern struct packet *free_packets; | |
1067 | + free_packets = NULL; | |
1068 | + extern pair free_pairs; | |
1069 | + free_pairs = NULL; | |
1070 | + extern omapi_io_object_t omapi_io_states; | |
1071 | + memset(&omapi_io_states, '\0', sizeof(omapi_io_states)); | |
1072 | + dhcp_control_object = NULL; | |
1073 | + unlink(current_pid_file); | |
1074 | +#endif | |
1075 | ||
1076 | /*NOTREACHED*/ | |
1077 | return 0; | |
e5ebac8b | 1078 | @@ -1270,7 +1446,20 @@ void dhcpack (packet) |
c494ae74 PZ |
1079 | if (client -> new -> rebind < cur_time) |
1080 | client -> new -> rebind = TIME_MAX; | |
1081 | ||
1082 | +#ifdef LIBDHCP | |
1083 | + /* We need the server's siaddr for the 'bootServer' | |
1084 | + * pump option | |
1085 | + */ | |
1086 | + u_int32_t set_siaddr = 0; | |
1087 | + set_siaddr = client->packet.siaddr.s_addr; | |
1088 | + client->packet.siaddr.s_addr = packet->raw->siaddr.s_addr; | |
1089 | +#endif | |
1090 | + | |
1091 | bind_lease (client); | |
1092 | + | |
1093 | +#ifdef LIBDHCP | |
1094 | + client->packet.siaddr.s_addr = set_siaddr; | |
1095 | +#endif | |
1096 | } | |
1097 | ||
1098 | void bind_lease (client) | |
e5ebac8b | 1099 | @@ -1306,6 +1495,9 @@ void bind_lease (client) |
c494ae74 PZ |
1100 | return; |
1101 | } | |
1102 | ||
1103 | +#ifdef LIBDHCP | |
1104 | + if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_LEASE_DATABASE)) | |
1105 | +#endif | |
1106 | /* Write out the new lease. */ | |
1107 | write_client_lease (client, client -> new, 0, 0); | |
1108 | ||
e5ebac8b AM |
1109 | @@ -1398,10 +1590,12 @@ void state_stop (cpp) |
1110 | } | |
1111 | } | |
c494ae74 PZ |
1112 | |
1113 | +#ifndef LIBDHCP | |
e5ebac8b | 1114 | int commit_leases () |
c494ae74 PZ |
1115 | { |
1116 | return 0; | |
1117 | } | |
1118 | +#endif | |
1119 | ||
e5ebac8b AM |
1120 | int write_lease (lease) |
1121 | struct lease *lease; | |
1122 | @@ -2074,6 +2268,10 @@ void state_panic (cpp) | |
c494ae74 PZ |
1123 | tell the shell script that we failed to allocate an address, |
1124 | and try again later. */ | |
1125 | if (onetry) { | |
1126 | +#ifdef LIBDHCP | |
1127 | + script_init (client, "FAIL", (struct string_list *)0); | |
1128 | + return; | |
1129 | +#endif | |
1130 | if (!quiet) | |
1131 | log_info ("Unable to obtain a lease on first try.%s", | |
1132 | " Exiting."); | |
e5ebac8b | 1133 | @@ -2691,7 +2889,9 @@ void destroy_client_lease (lease) |
c494ae74 PZ |
1134 | free_client_lease (lease, MDL); |
1135 | } | |
1136 | ||
1137 | +#ifndef LIBDHCP | |
e5ebac8b | 1138 | FILE *leaseFile = NULL; |
c494ae74 | 1139 | +#endif |
e5ebac8b | 1140 | int leases_written = 0; |
c494ae74 PZ |
1141 | |
1142 | void rewrite_client_leases () | |
e5ebac8b | 1143 | @@ -3218,6 +3418,54 @@ void script_write_params (client, prefix |
c494ae74 PZ |
1144 | int script_go (client) |
1145 | struct client_state *client; | |
1146 | { | |
1147 | +#ifdef LIBDHCP | |
1148 | + struct string_list *sp; | |
1149 | + | |
1150 | + if (libdhcp_control && libdhcp_control->callback) { | |
1151 | + int dhcmsg; | |
1152 | + char *reason=""; | |
1153 | + | |
1154 | + for (sp = client->env; sp; sp = sp->next) | |
1155 | + if (strncmp(sp->string, "reason=", 7) == 0) { | |
1156 | + reason = sp->string + 7; | |
1157 | + break; | |
1158 | + } | |
1159 | + | |
1160 | + if (strcmp(reason,"NBI") == 0) | |
1161 | + dhcmsg = DHC4_NBI; | |
1162 | + else if (strcmp(reason,"PREINIT") == 0) | |
1163 | + dhcmsg = DHC4_PREINIT; | |
1164 | + else if (strcmp(reason,"BOUND") == 0) | |
1165 | + dhcmsg = DHC4_BOUND; | |
1166 | + else if (strcmp(reason,"RENEW") == 0) | |
1167 | + dhcmsg = DHC4_RENEW; | |
1168 | + else if (strcmp(reason,"REBOOT") == 0) | |
1169 | + dhcmsg = DHC4_REBOOT; | |
1170 | + else if (strcmp(reason,"REBIND") == 0) | |
1171 | + dhcmsg = DHC4_REBIND; | |
1172 | + else if (strcmp(reason,"STOP") == 0) | |
1173 | + dhcmsg = DHC4_STOP; | |
1174 | + else if (strcmp(reason,"MEDIUM") == 0) | |
1175 | + dhcmsg = DHC4_MEDIUM; | |
1176 | + else if (strcmp(reason,"TIMEOUT") == 0) | |
1177 | + dhcmsg = DHC4_TIMEOUT; | |
1178 | + else if (strcmp(reason,"FAIL") == 0) | |
1179 | + dhcmsg = DHC4_FAIL; | |
1180 | + else if (strcmp(reason,"EXPIRE") == 0) | |
1181 | + dhcmsg = DHC4_EXPIRE; | |
1182 | + else if (strcmp(reason,"RELEASE") == 0) | |
1183 | + dhcmsg = DHC4_RELEASE; | |
1184 | + else | |
1185 | + dhcmsg = DHC4_NBI; | |
1186 | + | |
1187 | + (*libdhcp_control->callback) (libdhcp_control, dhcmsg, client); | |
1188 | + | |
1189 | + if (libdhcp_control->decline) | |
1190 | + return 1; | |
1191 | + } | |
1192 | + | |
1193 | + return 0; | |
1194 | +#else | |
c494ae74 PZ |
1195 | char *scriptName; |
1196 | char *argv [2]; | |
e5ebac8b AM |
1197 | char **envp; |
1198 | @@ -3294,6 +3542,7 @@ int script_go (client) | |
1199 | time(&cur_time); | |
c494ae74 PZ |
1200 | return (WIFEXITED (wstatus) ? |
1201 | WEXITSTATUS (wstatus) : -WTERMSIG (wstatus)); | |
1202 | +#endif | |
1203 | } | |
1204 | ||
1205 | void client_envadd (struct client_state *client, | |
e5ebac8b | 1206 | @@ -3376,6 +3625,9 @@ void go_daemon () |
c494ae74 PZ |
1207 | |
1208 | /* Don't become a daemon if the user requested otherwise. */ | |
1209 | if (no_daemon) { | |
1210 | +#ifdef LIBDHCP | |
e5ebac8b | 1211 | + if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_PID_FILE)) |
c494ae74 PZ |
1212 | +#endif |
1213 | write_client_pid_file (); | |
1214 | return; | |
1215 | } | |
e5ebac8b | 1216 | @@ -3385,6 +3637,10 @@ void go_daemon () |
c494ae74 PZ |
1217 | return; |
1218 | state = 1; | |
1219 | ||
1220 | +#ifdef LIBDHCP | |
1221 | + return; | |
1222 | +#endif | |
1223 | + | |
1224 | /* Stop logging to stderr... */ | |
1225 | log_perror = 0; | |
1226 |