Lines Matching +full:- +full:- +full:daemon
1 /* dnsmasq is Copyright (c) 2000-2009 Simon Kelley
33 daemon->dhcp_buff = safe_malloc(256); in lease_init()
34 daemon->dhcp_buff2 = safe_malloc(256); in lease_init()
36 leases_left = daemon->dhcp_max; in lease_init()
38 if (daemon->options & OPT_LEASE_RO) { in lease_init()
40 initial state of the database. If leasefile-ro is in lease_init()
44 if (daemon->lease_change_command) { in lease_init()
45 strcpy(daemon->dhcp_buff, daemon->lease_change_command); in lease_init()
46 strcat(daemon->dhcp_buff, " init"); in lease_init()
47 leasestream = popen(daemon->dhcp_buff, "r"); in lease_init()
57 leasestream = daemon->lease_stream = fopen(daemon->lease_file, "a+"); in lease_init()
60 die(_("cannot open or create lease file %s: %s"), daemon->lease_file, EC_FILE); in lease_init()
66 /* client-id max length is 255 which is 255*2 digits + 254 colons in lease_init()
69 while (fscanf(leasestream, "%lu %255s %16s %255s %764s", &ei, daemon->dhcp_buff2, in lease_init()
70 daemon->namebuff, daemon->dhcp_buff, daemon->packet) == 5) { in lease_init()
71 hw_len = parse_hex(daemon->dhcp_buff2, (unsigned char*) daemon->dhcp_buff2, in lease_init()
76 addr.s_addr = inet_addr(daemon->namebuff); in lease_init()
80 if (strcmp(daemon->packet, "*") != 0) in lease_init()
82 parse_hex(daemon->packet, (unsigned char*) daemon->packet, 255, NULL, NULL); in lease_init()
88 lease->expires = (time_t) ei + now; in lease_init()
90 lease->expires = (time_t) 0; in lease_init()
91 lease->length = ei; in lease_init()
95 lease->expires = (time_t) ei; in lease_init()
98 lease_set_hwaddr(lease, (unsigned char*) daemon->dhcp_buff2, in lease_init()
99 (unsigned char*) daemon->packet, hw_len, hw_type, clid_len); in lease_init()
101 if (strcmp(daemon->dhcp_buff, "*") != 0) in lease_init()
102 lease_set_hostname(lease, daemon->dhcp_buff, 0); in lease_init()
106 lease->new = lease->changed = 0; in lease_init()
110 if (!daemon->lease_stream) { in lease_init()
114 if (!leasestream || (rc = pclose(leasestream)) == -1 || WEXITSTATUS(rc) == 127 || in lease_init()
120 die(_("cannot run lease-init script %s: %s"), daemon->lease_change_command, EC_FILE); in lease_init()
124 sprintf(daemon->dhcp_buff, "%d", WEXITSTATUS(rc)); in lease_init()
125 die(_("lease-init script returned exit code %s"), daemon->dhcp_buff, in lease_init()
144 for (lease = leases; lease; lease = lease->next) in lease_update_from_configs()
145 if ((config = find_config(daemon->dhcp_conf, NULL, lease->clid, lease->clid_len, in lease_update_from_configs()
146 lease->hwaddr, lease->hwaddr_len, lease->hwaddr_type, NULL)) && in lease_update_from_configs()
147 (config->flags & CONFIG_NAME) && in lease_update_from_configs()
148 (!(config->flags & CONFIG_ADDR) || config->addr.s_addr == lease->addr.s_addr)) in lease_update_from_configs()
149 lease_set_hostname(lease, config->hostname, 1); in lease_update_from_configs()
150 else if ((name = host_from_dns(lease->addr))) in lease_update_from_configs()
158 if (!(*errp) && vfprintf(daemon->lease_stream, format, ap) < 0) *errp = errno; in ourprintf()
167 if (file_dirty != 0 && daemon->lease_stream) { in lease_update_file()
169 rewind(daemon->lease_stream); in lease_update_file()
170 if (errno != 0 || ftruncate(fileno(daemon->lease_stream), 0) != 0) err = errno; in lease_update_file()
172 for (lease = leases; lease; lease = lease->next) { in lease_update_file()
174 ourprintf(&err, "%u ", lease->length); in lease_update_file()
176 ourprintf(&err, "%lu ", (unsigned long) lease->expires); in lease_update_file()
178 if (lease->hwaddr_type != ARPHRD_ETHER || lease->hwaddr_len == 0) in lease_update_file()
179 ourprintf(&err, "%.2x-", lease->hwaddr_type); in lease_update_file()
180 for (i = 0; i < lease->hwaddr_len; i++) { in lease_update_file()
181 ourprintf(&err, "%.2x", lease->hwaddr[i]); in lease_update_file()
182 if (i != lease->hwaddr_len - 1) ourprintf(&err, ":"); in lease_update_file()
185 ourprintf(&err, " %s ", inet_ntoa(lease->addr)); in lease_update_file()
186 ourprintf(&err, "%s ", lease->hostname ? lease->hostname : "*"); in lease_update_file()
188 if (lease->clid && lease->clid_len != 0) { in lease_update_file()
189 for (i = 0; i < lease->clid_len - 1; i++) ourprintf(&err, "%.2x:", lease->clid[i]); in lease_update_file()
190 ourprintf(&err, "%.2x\n", lease->clid[i]); in lease_update_file()
195 if (fflush(daemon->lease_stream) != 0 || fsync(fileno(daemon->lease_stream)) < 0) in lease_update_file()
202 for (next_event = 0, lease = leases; lease; lease = lease->next) in lease_update_file()
203 if (lease->expires != 0 && in lease_update_file()
204 (next_event == 0 || difftime(next_event, lease->expires + 10) > 0.0)) in lease_update_file()
205 next_event = lease->expires + 10; in lease_update_file()
211 my_syslog(MS_DHCP | LOG_ERR, _("failed to write %s: %s (retry in %us)"), daemon->lease_file, in lease_update_file()
221 if (daemon->port != 0 && dns_dirty) { in lease_update_dns()
224 for (lease = leases; lease; lease = lease->next) { in lease_update_dns()
225 if (lease->fqdn) cache_add_dhcp_entry(lease->fqdn, &lease->addr, lease->expires); in lease_update_dns()
227 if (!(daemon->options & OPT_DHCP_FQDN) && lease->hostname) in lease_update_dns()
228 cache_add_dhcp_entry(lease->hostname, &lease->addr, lease->expires); in lease_update_dns()
239 tmp = lease->next; in lease_prune()
240 if ((lease->expires != 0 && difftime(now, lease->expires) > 0) || lease == target) { in lease_prune()
242 if (lease->hostname) dns_dirty = 1; in lease_prune()
244 *up = lease->next; /* unlink */ in lease_prune()
248 lease->next = old_leases; in lease_prune()
253 up = &lease->next; in lease_prune()
262 for (lease = leases; lease; lease = lease->next) in lease_find_by_client()
263 if (lease->clid && clid_len == lease->clid_len && in lease_find_by_client()
264 memcmp(clid, lease->clid, clid_len) == 0) in lease_find_by_client()
267 for (lease = leases; lease; lease = lease->next) in lease_find_by_client()
268 if ((!lease->clid || !clid) && hw_len != 0 && lease->hwaddr_len == hw_len && in lease_find_by_client()
269 lease->hwaddr_type == hw_type && memcmp(hwaddr, lease->hwaddr, hw_len) == 0) in lease_find_by_client()
278 for (lease = leases; lease; lease = lease->next) in lease_find_by_addr()
279 if (lease->addr.s_addr == addr.s_addr) return lease; in lease_find_by_addr()
289 lease->new = 1; in lease_allocate()
290 lease->addr = addr; in lease_allocate()
291 lease->hwaddr_len = 256; /* illegal value */ in lease_allocate()
292 lease->expires = 1; in lease_allocate()
294 lease->length = 0xffffffff; /* illegal value */ in lease_allocate()
296 lease->next = leases; in lease_allocate()
300 leases_left--; in lease_allocate()
313 if (exp != lease->expires) { in lease_set_expires()
315 lease->expires = exp; in lease_set_expires()
317 lease->aux_changed = file_dirty = 1; in lease_set_expires()
322 if (len != lease->length) { in lease_set_expires()
323 lease->length = len; in lease_set_expires()
324 lease->aux_changed = file_dirty = 1; in lease_set_expires()
331 if (hw_len != lease->hwaddr_len || hw_type != lease->hwaddr_type || in lease_set_hwaddr()
332 (hw_len != 0 && memcmp(lease->hwaddr, hwaddr, hw_len) != 0)) { in lease_set_hwaddr()
333 memcpy(lease->hwaddr, hwaddr, hw_len); in lease_set_hwaddr()
334 lease->hwaddr_len = hw_len; in lease_set_hwaddr()
335 lease->hwaddr_type = hw_type; in lease_set_hwaddr()
336 lease->changed = file_dirty = 1; /* run script on change */ in lease_set_hwaddr()
343 if (!lease->clid) lease->clid_len = 0; in lease_set_hwaddr()
345 if (lease->clid_len != clid_len) { in lease_set_hwaddr()
346 lease->aux_changed = file_dirty = 1; in lease_set_hwaddr()
347 free(lease->clid); in lease_set_hwaddr()
348 if (!(lease->clid = whine_malloc(clid_len))) return; in lease_set_hwaddr()
349 } else if (memcmp(lease->clid, clid, clid_len) != 0) in lease_set_hwaddr()
350 lease->aux_changed = file_dirty = 1; in lease_set_hwaddr()
352 lease->clid_len = clid_len; in lease_set_hwaddr()
353 memcpy(lease->clid, clid, clid_len); in lease_set_hwaddr()
362 free(lease->old_hostname); in kill_name()
367 if (lease->fqdn) { in kill_name()
368 lease->old_hostname = lease->fqdn; in kill_name()
369 free(lease->hostname); in kill_name()
371 lease->old_hostname = lease->hostname; in kill_name()
373 lease->hostname = lease->fqdn = NULL; in kill_name()
380 if (lease->hostname && name && hostname_isequal(lease->hostname, name)) { in lease_set_hostname()
381 lease->auth_name = auth; in lease_set_hostname()
385 if (!name && !lease->hostname) return; in lease_set_hostname()
394 char* suffix = get_domain(lease->addr); in lease_set_hostname()
404 for (lease_tmp = leases; lease_tmp; lease_tmp = lease_tmp->next) { in lease_set_hostname()
405 if (daemon->options & OPT_DHCP_FQDN) { in lease_set_hostname()
406 if (!new_fqdn || !lease_tmp->fqdn || !hostname_isequal(lease_tmp->fqdn, new_fqdn)) in lease_set_hostname()
409 if (!new_name || !lease_tmp->hostname || in lease_set_hostname()
410 !hostname_isequal(lease_tmp->hostname, new_name)) in lease_set_hostname()
414 if (lease_tmp->auth_name && !auth) { in lease_set_hostname()
425 if (lease->hostname) kill_name(lease); in lease_set_hostname()
427 lease->hostname = new_name; in lease_set_hostname()
428 lease->fqdn = new_fqdn; in lease_set_hostname()
429 lease->auth_name = auth; in lease_set_hostname()
433 lease->changed = 1; /* run script on change */ in lease_set_hostname()
437 if (lease->last_interface == interface) return; in lease_set_interface()
439 lease->last_interface = interface; in lease_set_interface()
440 lease->changed = 1; in lease_set_interface()
446 for (lease = leases; lease; lease = lease->next) lease->changed = 1; in rerun_scripts()
461 if (lease->old_hostname) { in do_script_run()
463 queue_script(ACTION_OLD_HOSTNAME, lease, lease->old_hostname, now); in do_script_run()
465 free(lease->old_hostname); in do_script_run()
466 lease->old_hostname = NULL; in do_script_run()
471 queue_script(ACTION_DEL, lease, lease->old_hostname, now); in do_script_run()
473 old_leases = lease->next; in do_script_run()
475 free(lease->old_hostname); in do_script_run()
476 free(lease->clid); in do_script_run()
477 free(lease->vendorclass); in do_script_run()
478 free(lease->userclass); in do_script_run()
479 free(lease->supplied_hostname); in do_script_run()
487 for (lease = leases; lease; lease = lease->next) in do_script_run()
488 if (lease->old_hostname) { in do_script_run()
490 queue_script(ACTION_OLD_HOSTNAME, lease, lease->old_hostname, now); in do_script_run()
492 free(lease->old_hostname); in do_script_run()
493 lease->old_hostname = NULL; in do_script_run()
497 for (lease = leases; lease; lease = lease->next) in do_script_run()
498 if (lease->new || lease->changed || in do_script_run()
499 (lease->aux_changed && (daemon->options & OPT_LEASE_RO))) { in do_script_run()
501 queue_script(lease->new ? ACTION_ADD : ACTION_OLD, lease, in do_script_run()
502 lease->fqdn ? lease->fqdn : lease->hostname, now); in do_script_run()
504 lease->new = lease->changed = lease->aux_changed = 0; in do_script_run()
507 free(lease->vendorclass); in do_script_run()
508 lease->vendorclass = NULL; in do_script_run()
510 free(lease->userclass); in do_script_run()
511 lease->userclass = NULL; in do_script_run()
513 free(lease->supplied_hostname); in do_script_run()
514 lease->supplied_hostname = NULL; in do_script_run()