]> git.pld-linux.org Git - packages/dhcp.git/blame - dhcp-libdhcp4client.patch
- added try-restart and force-reload options
[packages/dhcp.git] / dhcp-libdhcp4client.patch
CommitLineData
c494ae74
PZ
1diff -up dhcp-3.1.0/omapip/dispatch.c.libdhcp4client dhcp-3.1.0/omapip/dispatch.c
2--- dhcp-3.1.0/omapip/dispatch.c.libdhcp4client 2005-03-17 15:15:21.000000000 -0500
3+++ dhcp-3.1.0/omapip/dispatch.c 2007-10-24 14:55:56.000000000 -0400
4@@ -34,7 +34,7 @@
5
6 #include <omapip/omapip_p.h>
7
8-static omapi_io_object_t omapi_io_states;
9+omapi_io_object_t omapi_io_states;
10 TIME cur_time;
11
12 OMAPI_OBJECT_ALLOC (omapi_io,
13diff -up dhcp-3.1.0/omapip/errwarn.c.libdhcp4client dhcp-3.1.0/omapip/errwarn.c
14--- dhcp-3.1.0/omapip/errwarn.c.libdhcp4client 2007-10-24 14:55:56.000000000 -0400
15+++ dhcp-3.1.0/omapip/errwarn.c 2007-10-24 14:57:16.000000000 -0400
16@@ -39,6 +39,11 @@ static char copyright[] =
17 #include <omapip/omapip_p.h>
18 #include <errno.h>
19
20+#ifdef LIBDHCP
21+#include <isc-dhcp/libdhcp_control.h>
22+extern LIBDHCP_Control *libdhcp_control;
23+#endif
24+
25 #ifdef DEBUG
26 int log_perror = -1;
27 #else
28@@ -48,7 +53,9 @@ int log_priority;
29 void (*log_cleanup) (void);
30
31 #define CVT_BUF_MAX 1023
32+#ifndef LIBDHCP
33 static char mbuf [CVT_BUF_MAX + 1];
34+#endif
35 static char fbuf [CVT_BUF_MAX + 1];
36
37 /* Log an error message, then exit... */
38@@ -58,6 +65,16 @@ void log_fatal (const char * fmt, ... )
39 va_list list;
40
41 do_percentm (fbuf, fmt);
42+
43+#ifdef LIBDHCP
44+ if (libdhcp_control && (libdhcp_control->eh)) {
45+ va_start (list, fmt);
46+ libdhcp_control->eh(libdhcp_control, LOG_FATAL, fbuf, list);
47+ va_end(list);
48+ libdhcp_control->finished = 1;
49+ return;
50+ }
51+#else
52
53 /* %Audit% This is log output. %2004.06.17,Safe%
54 * If we truncate we hope the user can get a hint from the log.
55@@ -91,6 +108,7 @@ void log_fatal (const char * fmt, ... )
56 if (log_cleanup)
57 (*log_cleanup) ();
58 exit (1);
59+#endif
60 }
61
62 /* Log an error message... */
63@@ -101,6 +119,13 @@ int log_error (const char * fmt, ...)
64
65 do_percentm (fbuf, fmt);
66
67+#ifdef LIBDHCP
68+ if (libdhcp_control && libdhcp_control->eh) {
69+ va_start (list, fmt);
70+ libdhcp_control->eh(libdhcp_control, LOG_ERR, fbuf, list);
71+ va_end(list);
72+ }
73+#else
74 /* %Audit% This is log output. %2004.06.17,Safe%
75 * If we truncate we hope the user can get a hint from the log.
76 */
77@@ -116,7 +141,7 @@ int log_error (const char * fmt, ...)
78 write (STDERR_FILENO, mbuf, strlen (mbuf));
79 write (STDERR_FILENO, "\n", 1);
80 }
81-
82+#endif
83 return 0;
84 }
85
86@@ -128,6 +153,13 @@ int log_info (const char *fmt, ...)
87
88 do_percentm (fbuf, fmt);
89
90+#ifdef LIBDHCP
91+ if (libdhcp_control && libdhcp_control->eh) {
92+ va_start (list, fmt);
93+ libdhcp_control->eh(libdhcp_control, LOG_INFO, fbuf, list);
94+ va_end(list);
95+ }
96+#else
97 /* %Audit% This is log output. %2004.06.17,Safe%
98 * If we truncate we hope the user can get a hint from the log.
99 */
100@@ -143,7 +175,7 @@ int log_info (const char *fmt, ...)
101 write (STDERR_FILENO, mbuf, strlen (mbuf));
102 write (STDERR_FILENO, "\n", 1);
103 }
104-
105+#endif
106 return 0;
107 }
108
109@@ -154,7 +186,13 @@ int log_debug (const char *fmt, ...)
110 va_list list;
111
112 do_percentm (fbuf, fmt);
113-
114+#ifdef LIBDHCP
115+ if (libdhcp_control && libdhcp_control->eh) {
116+ va_start (list, fmt);
117+ libdhcp_control->eh(libdhcp_control, LOG_DEBUG, fbuf, list);
118+ va_end(list);
119+ }
120+#else
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.
123 */
124@@ -170,7 +208,7 @@ int log_debug (const char *fmt, ...)
125 write (STDERR_FILENO, mbuf, strlen (mbuf));
126 write (STDERR_FILENO, "\n", 1);
127 }
128-
129+#endif
130 return 0;
131 }
132
133diff -up dhcp-3.1.0/omapip/alloc.c.libdhcp4client dhcp-3.1.0/omapip/alloc.c
134--- dhcp-3.1.0/omapip/alloc.c.libdhcp4client 2006-02-24 18:16:30.000000000 -0500
135+++ dhcp-3.1.0/omapip/alloc.c 2007-10-24 14:55:56.000000000 -0400
136@@ -40,6 +40,33 @@ static char copyright[] =
137
138 #include <omapip/omapip_p.h>
139
140+#ifdef LIBDHCP
141+/* OK, we need a quick and dirty way of freeing all memory used by libdhcp.
142+ All pointers will be stored in a glibc tree on alloc, and removed on free.
143+ This is not too expensive for light single-call library use.
144+*/
145+#include <search.h>
146+extern void tdestroy (void *root, void (*free_node)(void *nodep));
147+static void *all_pointers=0L;
148+static int ptr_comparator(const void *p1, const void *p2) {
149+ return ((p1 == p2) ? 0 : ((p1 > p2) ? 1 : -1));
150+}
151+
152+static void record_pointer(void *ptr) {
153+ tsearch(ptr, &(all_pointers), ptr_comparator);
154+}
155+
156+static void forget_pointer(void *ptr) {
157+ tdelete(ptr, &(all_pointers), ptr_comparator);
158+}
159+
160+void omapi_free_all_pointers(void) {
161+ if (all_pointers != NULL)
162+ tdestroy(all_pointers, free);
163+ all_pointers = NULL;
164+}
165+#endif
166+
167 #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \
168 defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
169 struct dmalloc_preamble *dmalloc_list;
170@@ -78,7 +105,9 @@ VOIDPTR dmalloc (size, file, line)
171 return (VOIDPTR)0;
172
173 foo = malloc(len);
174-
175+#ifdef LIBDHCP
176+ record_pointer(foo);
177+#endif
178 if (!foo)
179 return (VOIDPTR)0;
180 bar = (VOIDPTR)(foo + DMDOFFSET);
181@@ -200,6 +229,9 @@ void dfree (ptr, file, line)
182 0, (unsigned char *)ptr + DMDOFFSET, 0, 1, RC_MALLOC);
183 #endif
184 free (ptr);
185+#ifdef LIBDHCP
186+ forget_pointer(ptr);
187+#endif
188 }
189
190 #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \
191diff -up dhcp-3.1.0/configure.libdhcp4client dhcp-3.1.0/configure
192--- dhcp-3.1.0/configure.libdhcp4client 2005-03-17 15:14:55.000000000 -0500
193+++ dhcp-3.1.0/configure 2007-10-24 14:55:56.000000000 -0400
194@@ -246,7 +246,7 @@ if [ ! -d $workname ]; then
195 fi
196
197 if [ x"$dirs" = x ]; then
198- dirs=". client server relay common omapip dhcpctl minires dst"
199+ dirs=". client server relay common omapip dhcpctl minires dst libdhcp4client"
200 fi
201
202 for foo in $dirs; do
203diff -up dhcp-3.1.0/dst/hmac_link.c.libdhcp4client dhcp-3.1.0/dst/hmac_link.c
204--- dhcp-3.1.0/dst/hmac_link.c.libdhcp4client 2001-02-22 02:22:08.000000000 -0500
205+++ dhcp-3.1.0/dst/hmac_link.c 2007-10-24 14:55:56.000000000 -0400
206@@ -38,6 +38,10 @@ static const char rcsid[] = "$Header: /p
207
208 #include "dst_internal.h"
209
210+#ifdef LIBDHCP
211+extern void* dmalloc(size_t,char *,int);
212+#endif
213+
214 #ifdef USE_MD5
215 # include "md5.h"
216 # ifndef _MD5_H_
217@@ -86,7 +90,11 @@ dst_hmac_md5_sign(const int mode, DST_KE
218 MD5_CTX *ctx = NULL;
219
220 if (mode & SIG_MODE_INIT)
221+#ifdef LIBDHCP
222+ ctx = (MD5_CTX *) dmalloc(sizeof(*ctx),__FILE__,__LINE__);
223+#else
224 ctx = (MD5_CTX *) malloc(sizeof(*ctx));
225+#endif
226 else if (context)
227 ctx = (MD5_CTX *) *context;
228 if (ctx == NULL)
229@@ -153,7 +161,11 @@ dst_hmac_md5_verify(const int mode, DST_
230 MD5_CTX *ctx = NULL;
231
232 if (mode & SIG_MODE_INIT)
233+#ifdef LIBDHCP
234+ ctx = (MD5_CTX *) dmalloc(sizeof(*ctx),__FILE__,__LINE__);
235+#else
236 ctx = (MD5_CTX *) malloc(sizeof(*ctx));
237+#endif
238 else if (context)
239 ctx = (MD5_CTX *) *context;
240 if (ctx == NULL)
241@@ -217,8 +229,11 @@ dst_buffer_to_hmac_md5(DST_KEY *dkey, co
242
243 if (dkey == NULL || key == NULL || keylen < 0)
244 return (-1);
245-
246+#ifdef LIBDHCP
247+ if ((hkey = (HMAC_Key *) dmalloc(sizeof(HMAC_Key),__FILE__,__LINE__)) == NULL)
248+#else
249 if ((hkey = (HMAC_Key *) malloc(sizeof(HMAC_Key))) == NULL)
250+#endif
251 return (-2);
252
253 memset(hkey->hk_ipad, 0, sizeof(hkey->hk_ipad));
254@@ -347,7 +362,11 @@ dst_hmac_md5_key_from_file_format(DST_KE
255 if (eol == NULL)
256 return (-4);
257 len = eol - p;
258+#ifdef LIBDHCP
259+ tmp = dmalloc(len + 2,__FILE__,__LINE__);
260+#else
261 tmp = malloc(len + 2);
262+#endif
263 memcpy(tmp, p, len);
264 *(tmp + len) = 0x0;
265 key_len = b64_pton((char *)tmp, key, HMAC_LEN+1); /* see above */
266@@ -439,8 +458,11 @@ dst_hmac_md5_generate_key(DST_KEY *key,
267 return(0);
268
269 len = size > 64 ? 64 : size;
270+#ifdef LIBDHCP
271+ buff = dmalloc(len+8,__FILE__,__LINE__);
272+#else
273 buff = malloc(len+8);
274-
275+#endif
276 n = dst_random(DST_RAND_SEMI, len, buff);
277 n += dst_random(DST_RAND_KEY, len, buff);
278 if (n <= len) { /* failed getting anything */
279@@ -463,7 +485,11 @@ dst_hmac_md5_init()
280 {
281 if (dst_t_func[KEY_HMAC_MD5] != NULL)
282 return (1);
283+#ifdef LIBDHCP
284+ dst_t_func[KEY_HMAC_MD5] = dmalloc(sizeof(struct dst_func),__FILE__,__LINE__);
285+#else
286 dst_t_func[KEY_HMAC_MD5] = malloc(sizeof(struct dst_func));
287+#endif
288 if (dst_t_func[KEY_HMAC_MD5] == NULL)
289 return (0);
290 memset(dst_t_func[KEY_HMAC_MD5], 0, sizeof(struct dst_func));
291diff -up dhcp-3.1.0/common/discover.c.libdhcp4client dhcp-3.1.0/common/discover.c
292--- dhcp-3.1.0/common/discover.c.libdhcp4client 2006-11-07 18:41:39.000000000 -0500
293+++ dhcp-3.1.0/common/discover.c 2007-10-24 14:55:56.000000000 -0400
294@@ -121,6 +121,10 @@ isc_result_t interface_initialize (omapi
295 register that interface with the network I/O software, figure out what
296 subnet it's on, and add it to the list of interfaces. */
297
298+#ifdef LIBDHCP
299+int have_setup_fallback = 0;
300+#endif
301+
302 void discover_interfaces (state)
303 int state;
304 {
305@@ -141,7 +145,9 @@ void discover_interfaces (state)
306 char *s;
307 #endif
308 isc_result_t status;
309+#ifndef LIBDHCP
310 static int setup_fallback = 0;
311+#endif
312 int wifcount = 0;
313
314 /* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. */
315@@ -695,10 +701,17 @@ void discover_interfaces (state)
316 log_fatal ("Not configured to listen on any interfaces!");
317 }
318
319+#ifdef LIBDHCP
320+ if (!have_setup_fallback) {
321+ have_setup_fallback = 1;
322+ maybe_setup_fallback ();
323+ }
324+#else
325 if (!setup_fallback) {
326 setup_fallback = 1;
327 maybe_setup_fallback ();
328 }
329+#endif
330
331 #if defined (HAVE_SETFD)
332 if (fallback_interface) {
333diff -up dhcp-3.1.0/common/tree.c.libdhcp4client dhcp-3.1.0/common/tree.c
334--- dhcp-3.1.0/common/tree.c.libdhcp4client 2007-02-14 17:41:22.000000000 -0500
335+++ dhcp-3.1.0/common/tree.c 2007-10-24 14:55:56.000000000 -0400
336@@ -41,7 +41,7 @@ static char copyright[] =
337 #include <omapip/omapip_p.h>
338 #include <ctype.h>
339
340-struct binding_scope *global_scope;
341+struct binding_scope __attribute__ ((visibility ("default"))) *global_scope;
342
343 static int do_host_lookup PROTO ((struct data_string *,
344 struct dns_host_entry *));
345@@ -2761,6 +2761,7 @@ int evaluate_numeric_expression (result,
346 result of that evaluation. There should never be both an expression
347 and a valid data_string. */
348
349+__attribute__ ((visibility ("default")))
350 int evaluate_option_cache (result, packet, lease, client_state,
351 in_options, cfg_options, scope, oc, file, line)
352 struct data_string *result;
353diff -up dhcp-3.1.0/common/options.c.libdhcp4client dhcp-3.1.0/common/options.c
354--- dhcp-3.1.0/common/options.c.libdhcp4client 2007-05-23 15:26:22.000000000 -0400
355+++ dhcp-3.1.0/common/options.c 2007-10-24 14:55:56.000000000 -0400
356@@ -2501,6 +2501,7 @@ int fqdn_option_space_encapsulate (resul
357 return 1;
358 }
359
360+__attribute__ ((visibility ("default")))
361 void option_space_foreach (struct packet *packet, struct lease *lease,
362 struct client_state *client_state,
363 struct option_state *in_options,
364diff -up dhcp-3.1.0/common/dispatch.c.libdhcp4client dhcp-3.1.0/common/dispatch.c
365--- dhcp-3.1.0/common/dispatch.c.libdhcp4client 2007-10-24 14:55:56.000000000 -0400
366+++ dhcp-3.1.0/common/dispatch.c 2007-10-24 14:55:56.000000000 -0400
367@@ -39,8 +39,24 @@ static char copyright[] =
368
369 #include "dhcpd.h"
370
371-struct timeout *timeouts;
372-static struct timeout *free_timeouts;
373+struct timeout {
374+#ifndef LIBDHCP
375+ struct timeout *next;
376+#endif
377+ TIME when;
378+ void (*func) PROTO ((void *));
379+ void *what;
380+ tvref_t ref;
381+ tvunref_t unref;
382+};
383+
384+#ifdef LIBDHCP
385+static struct timeout *timeouts = NULL;
386+static int ntimeouts = 0;
387+#else
388+static struct timeout *timeouts = NULL;
389+static struct timeout *free_timeouts = NULL;
390+#endif
391
392 void set_time(TIME t)
393 {
394@@ -53,9 +69,41 @@ void set_time(TIME t)
395
396 struct timeval *process_outstanding_timeouts (struct timeval *tvp)
397 {
398+#ifdef LIBDHCP
399+ int i;
400+ struct timeout t = { 0 };
401+#endif
402 /* Call any expired timeouts, and then if there's
403 still a timeout registered, time out the select
404 call then. */
405+#ifdef LIBDHCP
406+ if (!ntimeouts)
407+ return NULL;
408+
409+ for (i = 0; i < ntimeouts && timeouts[i].when <= cur_time;) {
410+ struct timeout *new_timeouts;
411+ size_t n;
412+
413+ memmove(&t, &timeouts[i], sizeof (t));
414+
415+ n = (ntimeouts - i - 1) * sizeof (t);
416+ memmove(&timeouts[i+1], &timeouts[i], n);
417+
418+ n = --ntimeouts * sizeof (t);
419+ new_timeouts = realloc(timeouts, n);
420+ /* XXX broken API, no way to return error here */
421+ if (new_timeouts || !n)
422+ timeouts = new_timeouts;
423+
424+ if (t.func)
425+ t.func(t.what);
426+ if (t.unref)
427+ t.unref(t.what, MDL);
428+ }
429+ if (tvp && ntimeouts) {
430+ tvp->tv_sec = timeouts[0].when;
431+ tvp->tv_usec = 0;
432+#else
433 another:
434 if (timeouts) {
435 struct timeout *t;
436@@ -73,9 +121,15 @@ struct timeval *process_outstanding_time
437 tvp -> tv_sec = timeouts -> when;
438 tvp -> tv_usec = 0;
439 }
440+#endif
441 return tvp;
442+#ifdef LIBDHCP
443+ }
444+ return NULL;
445+#else
446 } else
447 return (struct timeval *)0;
448+#endif
449 }
450
451 /* Wait for packets to come in using select(). When one does, call
452@@ -104,13 +158,28 @@ void add_timeout (when, where, what, ref
453 tvref_t ref;
454 tvunref_t unref;
455 {
456+#ifdef LIBDHCP
457+ struct timeout t = {
458+ .when = when,
459+ .func = where,
460+ .what = what,
461+ .ref = ref,
462+ .unref = unref
463+ };
464+ struct timeout *new_timeouts;
465+ int i, pos = 0;
466+#else
467 struct timeout *t, *q;
468+#endif
469
470 /* See if this timeout supersedes an existing timeout. */
471+#ifdef LIBDHCP
472+ for (i = 0; i < ntimeouts; i++) {
473+ struct timeout *q = &timeouts[i];
474+#else
475 t = (struct timeout *)0;
476 for (q = timeouts; q; q = q -> next) {
477- if ((where == NULL || q -> func == where) &&
478- q -> what == what) {
479+ if ((where == NULL || q -> func == where) && q -> what == what) {
480 if (t)
481 t -> next = q -> next;
482 else
483@@ -119,7 +188,29 @@ void add_timeout (when, where, what, ref
484 }
485 t = q;
486 }
487+#endif
488
489+#ifdef LIBDHCP
490+ /* If this one is already in the list with a different time,
491+ * remove it and re-add */
492+ if ((where == NULL || q->func == where) &&
493+ q->what == what) {
494+ size_t n = (--ntimeouts - i) * sizeof (*q);
495+ memmove(&t, q, sizeof (t));
496+
497+ if (n)
498+ memmove(&timeouts[i], &timeouts[i+1], n);
499+
500+ if (ntimeouts) {
501+ new_timeouts = realloc(timeouts, ntimeouts * sizeof (*q));
502+ /* XXX broken API, no way to return error here */
503+ if (new_timeouts)
504+ timeouts = new_timeouts;
505+ } else {
506+ timeouts = NULL;
507+ }
508+ add_timeout(when, where, what, ref, unref);
509+#else
510 /* If we didn't supersede a timeout, allocate a timeout
511 structure now. */
512 if (!q) {
513@@ -128,7 +219,7 @@ void add_timeout (when, where, what, ref
514 free_timeouts = q -> next;
515 } else {
516 q = ((struct timeout *)
517- dmalloc (sizeof (struct timeout), MDL));
518+ dmalloc (sizeof (struct timeout), MDL));
519 if (!q)
520 log_fatal ("add_timeout: no memory!");
521 }
522@@ -158,22 +249,76 @@ void add_timeout (when, where, what, ref
523 if (t -> next -> when > q -> when) {
524 q -> next = t -> next;
525 t -> next = q;
526+#endif
527 return;
528+#ifdef LIBDHCP
529+ } else if (timeouts[i].when > when) {
530+ pos = i;
531+#endif
532 }
533 }
534
535+#ifdef LIBDHCP
536+ /* If we didn't supersede an existing timeout, then pos is set
537+ * to the timeout which will post after this one. Insert this
538+ * one before it. */
539+
540+ new_timeouts = realloc(timeouts, sizeof (t) * (ntimeouts+1));
541+ /* XXX broken API, no way to return error here */
542+ if (new_timeouts) {
543+ /* ntimeouts = 10
544+ * pos = 3;
545+ * n = 10-3 * sizeof (t) = 7 * sizeof (t)
546+ */
547+ size_t n = (ntimeouts - pos) * sizeof (t);
548+
549+ timeouts = new_timeouts;
550+ memmove(&timeouts[pos+1], &timeouts[pos], n);
551+ memmove(&timeouts[pos], &t, sizeof (t));
552+ ntimeouts++;
553+ }
554+#else
555 /* End of list. */
556 t -> next = q;
557 q -> next = (struct timeout *)0;
558+#endif
559 }
560
561 void cancel_timeout (where, what)
562 void (*where) PROTO ((void *));
563 void *what;
564 {
565+#ifdef LIBDHCP
566+ struct timeout t;
567+ int i = 0;
568+#else
569 struct timeout *t, *q;
570+#endif
571
572 /* Look for this timeout on the list, and unlink it if we find it. */
573+#ifdef LIBDHCP
574+ for (i = 0; i < ntimeouts; i++) {
575+ struct timeout *new_timeouts, *q = &timeouts[i];
576+
577+ if (q->func == where && q->what == what) {
578+ size_t n;
579+
580+ memmove(&t, q, sizeof (t));
581+
582+ n = (ntimeouts - i - 1) * sizeof (t);
583+ memmove(&timeouts[i+1], &timeouts[i], n);
584+
585+ n = --ntimeouts * sizeof (t);
586+ new_timeouts = realloc(timeouts, n);
587+ /* XXX broken API, no way to return error here */
588+ if (new_timeouts || !n)
589+ timeouts = new_timeouts;
590+
591+ if (t.unref)
592+ t.unref(t.what, MDL);
593+ }
594+ }
595+#else
596 t = (struct timeout *)0;
597 for (q = timeouts; q; q = q -> next) {
598 if (q -> func == where && q -> what == what) {
c1618512 599@@ -193,10 +338,15 @@ void cancel_timeout (where, what)
c494ae74
PZ
600 q -> next = free_timeouts;
601 free_timeouts = q;
602 }
603+#endif
604 }
605
c494ae74
PZ
606 void cancel_all_timeouts ()
607 {
608+#ifdef LIBDHCP
609+ cur_time = TIME_MAX;
610+ process_outstanding_timeouts(NULL);
611+#else
612 struct timeout *t, *n;
613 for (t = timeouts; t; t = n) {
614 n = t -> next;
615@@ -205,13 +355,20 @@ void cancel_all_timeouts ()
616 t -> next = free_timeouts;
617 free_timeouts = t;
618 }
619+#endif
620 }
621
622+__attribute__ ((visibility ("default")))
623 void relinquish_timeouts ()
624 {
625+#ifdef LIBDHCP
626+ while (ntimeouts)
627+ cancel_timeout(timeouts[0].func, timeouts[0].what);
628+#else
629 struct timeout *t, *n;
630 for (t = free_timeouts; t; t = n) {
631 n = t -> next;
632 dfree (t, MDL);
633 }
634+#endif
635 }
636diff -up dhcp-3.1.0/common/alloc.c.libdhcp4client dhcp-3.1.0/common/alloc.c
637--- dhcp-3.1.0/common/alloc.c.libdhcp4client 2006-06-01 16:23:17.000000000 -0400
638+++ dhcp-3.1.0/common/alloc.c 2007-10-24 14:55:56.000000000 -0400
639@@ -1013,7 +1013,11 @@ int executable_statement_reference (ptr,
640 return 1;
641 }
642
643+#ifdef LIBDHCP
644+struct packet *free_packets;
645+#else
646 static struct packet *free_packets;
647+#endif
648
649 #if defined (DEBUG_MEMORY_LEAKAGE) || \
650 defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
651diff -up dhcp-3.1.0/includes/dhcpd.h.libdhcp4client dhcp-3.1.0/includes/dhcpd.h
652--- dhcp-3.1.0/includes/dhcpd.h.libdhcp4client 2007-10-24 14:55:56.000000000 -0400
653+++ dhcp-3.1.0/includes/dhcpd.h 2007-10-24 14:55:56.000000000 -0400
654@@ -1000,14 +1000,6 @@ struct hardware_link {
655
656 typedef void (*tvref_t)(void *, void *, const char *, int);
657 typedef void (*tvunref_t)(void *, const char *, int);
658-struct timeout {
659- struct timeout *next;
660- TIME when;
661- void (*func) PROTO ((void *));
662- void *what;
663- tvref_t ref;
664- tvunref_t unref;
665-};
666
667 struct protocol {
668 struct protocol *next;
669@@ -1960,7 +1952,6 @@ extern void (*bootp_packet_handler) PROT
670 struct dhcp_packet *, unsigned,
671 unsigned int,
672 struct iaddr, struct hardware *));
673-extern struct timeout *timeouts;
674 extern omapi_object_type_t *dhcp_type_interface;
675 #if defined (TRACING)
676 trace_type_t *interface_trace;
677diff -up dhcp-3.1.0/client/dhclient.c.libdhcp4client dhcp-3.1.0/client/dhclient.c
678--- dhcp-3.1.0/client/dhclient.c.libdhcp4client 2007-10-24 14:55:56.000000000 -0400
679+++ dhcp-3.1.0/client/dhclient.c 2007-10-24 14:56:20.000000000 -0400
680@@ -82,16 +82,52 @@ int quiet=0;
681 int nowait=0;
682 int bootp_broadcast_always = 0;
683
684+#ifdef LIBDHCP
685+FILE *leaseFile = NULL;
686+#endif
687+
688 extern u_int32_t default_requested_options[];
689 #ifdef EXTENDED_NEW_OPTION_INFO
690 int extended_option_environment = 0;
691 #endif
692 static void usage PROTO ((void));
693
694+#ifdef LIBDHCP
695+#include "isc-dhcp/libdhcp_control.h"
696+LIBDHCP_Control *libdhcp_control;
697+static void libdhcp_dispatch(void)
698+{
699+ struct timeval tv = { 0, 0 }, *tvp;
700+ isc_result_t status;
701+
702+ /* Wait for a packet, or a timeout, or libdhcp being finished */
703+ do {
704+ tvp = process_outstanding_timeouts(&tv);
705+ status = omapi_one_dispatch(0, tvp);
706+
707+ if (libdhcp_control && ((status == ISC_R_TIMEDOUT) || (libdhcp_control->timeout && (time(NULL) >= (libdhcp_control->timeout + libdhcp_control->now))))) {
708+ if (libdhcp_control->callback)
709+ libdhcp_control->callback(libdhcp_control, DHC_TIMEDOUT, NULL);
710+
711+ break;
712+ }
713+ } while ((status != ISC_R_TIMEDOUT) && ((!libdhcp_control) || (!(libdhcp_control->finished))));
714+}
715+
716+extern void omapi_free_all_pointers(void);
717+
718+__attribute__ ((visibility ("default")))
719+int dhcpv4_client (libdhcp_ctl, argc, argv, envp)
720+ LIBDHCP_Control *libdhcp_ctl;
721+#else
722 int main (argc, argv, envp)
723+#endif
724 int argc;
725 char **argv, **envp;
726 {
727+#ifdef LIBDHCP
728+ libdhcp_control = libdhcp_ctl;
729+#endif
730 int fd;
731 int i;
732 struct servent *ent;
733@@ -120,6 +156,7 @@ int main (argc, argv, envp)
734 char *arg_conf = NULL;
735 int arg_conf_len = 0;
736
737+#ifndef LIBDHCP
738 /* Make sure that file descriptors 0 (stdin), 1, (stdout), and
739 2 (stderr) are open. To do this, we assume that when we
740 open a file the lowest available file decriptor is used. */
741@@ -143,6 +180,7 @@ int main (argc, argv, envp)
742 #if !(defined (DEBUG) || defined (SYSLOG_4_2) || defined (__CYGWIN32__))
743 setlogmask (LOG_UPTO (LOG_INFO));
744 #endif
745+#endif
746
747 /* Set up the OMAPI. */
748 status = omapi_init ();
749@@ -439,6 +477,10 @@ int main (argc, argv, envp)
750 }
751 }
752
753+#ifdef LIBDHCP
754+ if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_PID_FILE))
755+#endif
756+#ifndef LIBDHCP
757 if (!quiet) {
758 log_info ("%s %s", message, DHCP_VERSION);
759 log_info (copyright);
760@@ -449,6 +491,7 @@ int main (argc, argv, envp)
761 log_info ("%s", "");
762 } else
763 log_perror = 0;
764+#endif
765
766 /* If we're given a relay agent address to insert, for testing
767 purposes, figure out what it is. */
768@@ -680,11 +723,17 @@ int main (argc, argv, envp)
769 arg_conf_len = 0;
770 }
771
772+#ifdef LIBDHCP
773+ if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_LEASE_DATABASE)) {
774+#endif
775 /* Parse the lease database. */
776 read_client_leases ();
777
778 /* Rewrite the lease database... */
779 rewrite_client_leases ();
780+#ifdef LIBDHCP
781+ }
782+#endif
783
784 /* XXX */
785 /* config_counter(&snd_counter, &rcv_counter); */
786@@ -703,7 +752,7 @@ int main (argc, argv, envp)
787 if (!persist) {
788 /* Nothing more to do. */
789 log_info ("No broadcast interfaces found - exiting.");
790- exit (0);
791+ return (0);
792 }
793 } else if (!release_mode && !exit_mode) {
794 /* Call the script with the list of interfaces. */
795@@ -799,6 +848,7 @@ int main (argc, argv, envp)
796 dmalloc_outstanding = 0;
797 #endif
798
799+#ifndef LIBDHCP
800 /* If we're not supposed to wait before getting the address,
801 don't. */
802 if (nowait)
803@@ -811,6 +861,126 @@ int main (argc, argv, envp)
804
805 /* Start dispatching packets and timeouts... */
806 dispatch ();
807+#else
808+ if (libdhcp_control) {
809+ if (libdhcp_control->timeout)
810+ libdhcp_control->now = time(NULL);
811+ else
812+ libdhcp_control->now = 0;
813+ }
814+
815+ libdhcp_dispatch();
816+
817+ /* libdhcp is finished with us. */
818+
819+ /* close all file descriptors: */
820+ for (ip = interfaces; ip; ip = ip->next) {
821+ shutdown(ip->wfdesc, SHUT_RDWR);
822+ close(ip->wfdesc);
823+
824+ if (ip->rfdesc != ip->wfdesc)
825+ close(ip->rfdesc);
826+ }
827+
828+ if (fallback_interface != 0) {
829+ ip = fallback_interface;
830+ shutdown(ip->wfdesc, SHUT_RDWR);
831+ close(ip->wfdesc);
832+
833+ if (ip->rfdesc != ip->wfdesc)
834+ close(ip->rfdesc);
835+ }
836+
837+ if (leaseFile)
838+ fclose (leaseFile);
839+
840+ closelog();
841+
842+ char *current_pid_file = _PATH_DHCLIENT_PID;
843+
844+ /* Free ALL allocated memory: */
845+ omapi_free_all_pointers();
846+
847+ /* Re-Initialize globals: */
848+ client_env = 0;
849+ client_env_count = 0;
850+ default_lease_time = 43200;
851+
852+ dhcp_max_agent_option_packet_length = 0;
853+ iaddr_any.len = 4;
854+ memset(&(iaddr_any.iabuf[0]), '\0', 4);
855+ iaddr_broadcast.len = 4;
856+ memset(&(iaddr_broadcast.iabuf[0]), 0xff, 4);
857+ interfaces_requested = 0;
858+ leaseFile = 0;
859+
860+ libdhcp_control = 0;
861+
862+ local_port = 0;
863+ no_daemon = 0;
864+ nowait = 0;
865+ onetry = 0;
866+ quiet = 0;
867+ max_lease_time = 86400;
868+ path_dhclient_conf = _PATH_DHCLIENT_CONF;
869+ path_dhclient_db = _PATH_DHCLIENT_DB;
870+ path_dhclient_pid = _PATH_DHCLIENT_PID;
871+ strcpy(&(path_dhclient_script_array[0]), _PATH_DHCLIENT_SCRIPT);
872+ path_dhclient_script = path_dhclient_script_array;
873+ remote_port = 0;
874+ resolver_inited = 0;
875+ log_perror = 1;
876+ global_scope = NULL;
877+ root_group = NULL;
878+ group_name_hash = NULL;
879+ interfaces = NULL;
880+ dummy_interfaces = NULL;
881+ fallback_interface = NULL;
882+ extern int have_setup_fallback;
883+ have_setup_fallback = 0;
884+ quiet_interface_discovery = 1;
885+#ifndef LIBDHCP
886+ timeouts = NULL;
887+#endif
888+ dhcp_type_interface = NULL;
889+ interface_vector = NULL;
890+ interface_count = 0;
891+ interface_max = 0;
892+ name_servers = 0;
893+ domains = 0;
894+ dhcp_type_interface = NULL;
895+ dhcp_type_group = NULL;
896+ dhcp_type_shared_network = NULL;
897+ dhcp_type_control = NULL;
898+ memset(&dhcp_universe, '\0', sizeof(struct universe));
899+ memset(&nwip_universe, '\0', sizeof(struct universe));
900+ memset(&fqdn_universe, '\0', sizeof(struct universe));
901+ universe_hash = 0;
902+ universes = 0;
903+ universe_count = 0;
904+ universe_max = 0;
905+ config_universe = 0;
906+ extern struct hash_bucket *free_hash_buckets;
907+ free_hash_buckets = NULL;
908+ extern struct dhcp_packet *dhcp_free_list;
909+ dhcp_free_list = NULL;
910+ extern struct packet *packet_free_list;
911+ packet_free_list = NULL;
912+ extern struct binding_value *free_binding_values;
913+ free_binding_values = NULL;
914+ extern struct expression *free_expressions;
915+ free_expressions = NULL;
916+ extern struct option_cache *free_option_caches;
917+ free_option_caches = NULL;
918+ extern struct packet *free_packets;
919+ free_packets = NULL;
920+ extern pair free_pairs;
921+ free_pairs = NULL;
922+ extern omapi_io_object_t omapi_io_states;
923+ memset(&omapi_io_states, '\0', sizeof(omapi_io_states));
924+ dhcp_control_object = NULL;
925+ unlink(current_pid_file);
926+#endif
927
928 /*NOTREACHED*/
929 return 0;
930@@ -1203,7 +1373,20 @@ void dhcpack (packet)
931 if (client -> new -> rebind < cur_time)
932 client -> new -> rebind = TIME_MAX;
933
934+#ifdef LIBDHCP
935+ /* We need the server's siaddr for the 'bootServer'
936+ * pump option
937+ */
938+ u_int32_t set_siaddr = 0;
939+ set_siaddr = client->packet.siaddr.s_addr;
940+ client->packet.siaddr.s_addr = packet->raw->siaddr.s_addr;
941+#endif
942+
943 bind_lease (client);
944+
945+#ifdef LIBDHCP
946+ client->packet.siaddr.s_addr = set_siaddr;
947+#endif
948 }
949
950 void bind_lease (client)
951@@ -1241,6 +1424,9 @@ void bind_lease (client)
952 return;
953 }
954
955+#ifdef LIBDHCP
956+ if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_LEASE_DATABASE))
957+#endif
958 /* Write out the new lease. */
959 write_client_lease (client, client -> new, 0, 0);
960
961@@ -1343,11 +1529,13 @@ int commit_leases ()
962 return 0;
963 }
964
965+#ifndef LIBDHCP
966 int write_lease (lease)
967 struct lease *lease;
968 {
969 return 0;
970 }
971+#endif
972
973 int write_host (host)
974 struct host_decl *host;
975@@ -1957,6 +2145,10 @@ void state_panic (cpp)
976 tell the shell script that we failed to allocate an address,
977 and try again later. */
978 if (onetry) {
979+#ifdef LIBDHCP
980+ script_init (client, "FAIL", (struct string_list *)0);
981+ return;
982+#endif
983 if (!quiet)
984 log_info ("Unable to obtain a lease on first try.%s",
985 " Exiting.");
986@@ -2579,7 +2771,9 @@ void destroy_client_lease (lease)
987 free_client_lease (lease, MDL);
988 }
989
990+#ifndef LIBDHCP
991 FILE *leaseFile;
992+#endif
993
994 void rewrite_client_leases ()
995 {
996@@ -2960,6 +3154,54 @@ void script_write_params (client, prefix
997 int script_go (client)
998 struct client_state *client;
999 {
1000+#ifdef LIBDHCP
1001+ struct string_list *sp;
1002+
1003+ if (libdhcp_control && libdhcp_control->callback) {
1004+ int dhcmsg;
1005+ char *reason="";
1006+
1007+ for (sp = client->env; sp; sp = sp->next)
1008+ if (strncmp(sp->string, "reason=", 7) == 0) {
1009+ reason = sp->string + 7;
1010+ break;
1011+ }
1012+
1013+ if (strcmp(reason,"NBI") == 0)
1014+ dhcmsg = DHC4_NBI;
1015+ else if (strcmp(reason,"PREINIT") == 0)
1016+ dhcmsg = DHC4_PREINIT;
1017+ else if (strcmp(reason,"BOUND") == 0)
1018+ dhcmsg = DHC4_BOUND;
1019+ else if (strcmp(reason,"RENEW") == 0)
1020+ dhcmsg = DHC4_RENEW;
1021+ else if (strcmp(reason,"REBOOT") == 0)
1022+ dhcmsg = DHC4_REBOOT;
1023+ else if (strcmp(reason,"REBIND") == 0)
1024+ dhcmsg = DHC4_REBIND;
1025+ else if (strcmp(reason,"STOP") == 0)
1026+ dhcmsg = DHC4_STOP;
1027+ else if (strcmp(reason,"MEDIUM") == 0)
1028+ dhcmsg = DHC4_MEDIUM;
1029+ else if (strcmp(reason,"TIMEOUT") == 0)
1030+ dhcmsg = DHC4_TIMEOUT;
1031+ else if (strcmp(reason,"FAIL") == 0)
1032+ dhcmsg = DHC4_FAIL;
1033+ else if (strcmp(reason,"EXPIRE") == 0)
1034+ dhcmsg = DHC4_EXPIRE;
1035+ else if (strcmp(reason,"RELEASE") == 0)
1036+ dhcmsg = DHC4_RELEASE;
1037+ else
1038+ dhcmsg = DHC4_NBI;
1039+
1040+ (*libdhcp_control->callback) (libdhcp_control, dhcmsg, client);
1041+
1042+ if (libdhcp_control->decline)
1043+ return 1;
1044+ }
1045+
1046+ return 0;
1047+#else
1048 int rval;
1049 char *scriptName;
1050 char *argv [2];
1051@@ -3038,6 +3280,7 @@ int script_go (client)
1052 GET_TIME (&cur_time);
1053 return (WIFEXITED (wstatus) ?
1054 WEXITSTATUS (wstatus) : -WTERMSIG (wstatus));
1055+#endif
1056 }
1057
1058 void client_envadd (struct client_state *client,
1059@@ -3120,6 +3363,9 @@ void go_daemon ()
1060
1061 /* Don't become a daemon if the user requested otherwise. */
1062 if (no_daemon) {
1063+#ifdef LIBDHCP
1064+ if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_PID_FILE ))
1065+#endif
1066 write_client_pid_file ();
1067 return;
1068 }
1069@@ -3129,6 +3375,10 @@ void go_daemon ()
1070 return;
1071 state = 1;
1072
1073+#ifdef LIBDHCP
1074+ return;
1075+#endif
1076+
1077 /* Stop logging to stderr... */
1078 log_perror = 0;
1079
1080diff -up dhcp-3.1.0/Makefile.dist.libdhcp4client dhcp-3.1.0/Makefile.dist
1081--- dhcp-3.1.0/Makefile.dist.libdhcp4client 2005-03-17 15:14:54.000000000 -0500
1082+++ dhcp-3.1.0/Makefile.dist 2007-10-24 14:55:56.000000000 -0400
1083@@ -22,7 +22,7 @@
1084 # http://www.isc.org/
1085
1086
1087-SUBDIRS= common $(MINIRES) dst omapip server client relay dhcpctl
1088+SUBDIRS= common $(MINIRES) dst omapip server client relay dhcpctl libdhcp4client
1089
1090 all:
1091 @for dir in ${SUBDIRS}; do \
7877c5b5
JB
1092--- dhcp-3.1.0/minires/Makefile.dist.orig 2007-12-25 12:41:11.744624000 +0100
1093+++ dhcp-3.1.0/minires/Makefile.dist 2007-12-25 12:54:35.448726491 +0100
1094@@ -32,7 +32,7 @@
1095 ns_date.o ns_parse.o ns_sign.o ns_name.o ns_samedomain.o ns_verify.o
1096
1097 INCLUDES = $(BINDINC) -I$(TOP)/includes
1098-CFLAGS = $(DEBUG) $(PREDEFINES) $(INCLUDES) $(COPTS) -DHMAC_MD5 -DMINIRES_LIB
1099+CFLAGS = $(DEBUG) $(PREDEFINES) $(INCLUDES) $(COPTS) -DHMAC_MD5 -DMINIRES_LIB -fPIC
1100
1101 all: libres.a
1102
This page took 0.189609 seconds and 4 git commands to generate.