Lines Matching +full:timeout +full:- +full:lp +full:- +full:ms
3 /*-
4 * SPDX-License-Identifier: BSD-3-Clause
50 * Consortium DHCP server uses. Much system-specific configuration code
53 * system-specific configuration code to these operating systems - instead,
102 static int nullfd = -1;
120 * the end of time (~2038 when a 32-bit time_t is being used).
122 #define TIME_MAX ((((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1)
146 ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
147 #define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
161 return -1; in findproto()
170 if (sa->sa_family == AF_INET) in findproto()
172 if (sa->sa_family == AF_INET6) in findproto()
181 return (-1); in findproto()
214 if (_ifi->client->active != NULL) { in disassoc()
217 _ifi->client->active); in disassoc()
218 if (_ifi->client->alias) in disassoc()
220 _ifi->client->alias); in disassoc()
223 _ifi->client->state = S_INIT; in disassoc()
244 if (n < (ssize_t)sizeof(rtm->rtm_msglen) || in routehandler()
245 n < (ssize_t)rtm->rtm_msglen || in routehandler()
246 rtm->rtm_version != RTM_VERSION) in routehandler()
249 switch (rtm->rtm_type) { in routehandler()
254 if (ifam->ifam_index != ifi->index) in routehandler()
256 if (findproto((char *)(ifam + 1), ifam->ifam_addrs) != AF_INET) in routehandler()
261 sa = (struct sockaddr_in*)get_ifa((char *)(ifam + 1), ifam->ifam_addrs); in routehandler()
267 memcpy(a.iabuf, &sa->sin_addr, a.len); in routehandler()
271 for (l = ifi->client->active; l != NULL; l = l->next) in routehandler()
272 if (addr_eq(a, l->address)) in routehandler()
278 addr = inet_ntoa(sa->sin_addr); in routehandler()
279 if (rtm->rtm_type == RTM_NEWADDR) { in routehandler()
286 warning("My address (%s) was re-added", addr); in routehandler()
295 if (ifm->ifm_index != ifi->index) in routehandler()
297 if ((rtm->rtm_flags & RTF_UP) == 0) { in routehandler()
299 ifi->name); in routehandler()
302 linkstat = interface_link_status(ifi->name); in routehandler()
303 if (linkstat != ifi->linkstat) { in routehandler()
304 debug("%s link state %s -> %s", ifi->name, in routehandler()
305 ifi->linkstat ? "up" : "down", in routehandler()
307 ifi->linkstat = linkstat; in routehandler()
314 if (ifan->ifan_what == IFAN_DEPARTURE && in routehandler()
315 ifan->ifan_index == ifi->index) { in routehandler()
317 ifi->name); in routehandler()
323 if (ifan->ifan_index != ifi->index) in routehandler()
325 switch (ifan->ifan_what) { in routehandler()
334 if (memcmp(curbssid, jev->iev_addr, 6)) { in routehandler()
338 memcpy(curbssid, jev->iev_addr, 6); in routehandler()
349 if (ifi->client->alias) in routehandler()
350 script_write_params("alias_", ifi->client->alias); in routehandler()
389 while ((ch = getopt(argc, argv, "bc:dl:np:qu")) != -1) in main()
419 argc -= optind; in main()
442 if (strlcpy(ifi->name, argv[0], IFNAMSIZ) >= IFNAMSIZ) in main()
445 _PATH_DHCLIENT_DB, ifi->name) == -1) in main()
460 /* The next bit is potentially very time-consuming, so write out in main()
466 if (!interface_link_status(ifi->name)) { in main()
467 fprintf(stderr, "%s: no link ...", ifi->name); in main()
470 while (!interface_link_status(ifi->name)) { in main()
481 ifi->linkstat = 1; in main()
483 if ((nullfd = open(_PATH_DEVNULL, O_RDWR, 0)) == -1) in main()
493 * Obtain hostname before entering capability mode - it won't be in main()
500 if (ifi->client->alias) in main()
501 priv_script_write_params("alias_", ifi->client->alias); in main()
507 if (pipe(pipe_fd) == -1) in main()
512 close(ifi->ufdesc); in main()
513 ifi->ufdesc = -1; in main()
514 close(ifi->wfdesc); in main()
515 ifi->wfdesc = -1; in main()
523 if ((fd = open(path_dhclient_db, O_RDONLY|O_EXLOCK|O_CREAT, 0)) == -1) in main()
529 if ((routefd = socket(PF_ROUTE, SOCK_RAW, 0)) != -1) in main()
539 setproctitle("%s", ifi->name); in main()
542 if (setgroups(1, &pw->pw_gid) != 0) in main()
554 if (chroot(_PATH_VAREMPTY) == -1) in main()
556 if (chdir("/") == -1) in main()
560 if (setegid(pw->pw_gid) || setgid(pw->pw_gid) || in main()
561 seteuid(pw->pw_uid) || setuid(pw->pw_uid)) in main()
567 ifi->client->state = S_INIT; in main()
582 fprintf(stderr, "usage: %s [-bdnqu] ", getprogname()); in usage()
583 fprintf(stderr, "[-c conffile] [-l leasefile] interface\n"); in usage()
592 * -> entering INIT state
593 * -> recvpacket_flag == 0: timeout in this state
594 * -> otherwise: received a packet in this state
601 * Several per-interface variables are used to keep track of the process:
610 * In addition, there are several relevant per-lease variables.
623 if (!ip->client->active || ip->client->active->is_bootp) { in state_reboot()
629 ip->client->state = S_REBOOTING; in state_reboot()
634 ip->client->xid = arc4random(); in state_reboot()
636 /* Make a DHCPREQUEST packet, and set appropriate per-interface in state_reboot()
638 make_request(ip, ip->client->active); in state_reboot()
639 ip->client->destination = iaddr_broadcast; in state_reboot()
640 ip->client->first_sending = cur_time; in state_reboot()
641 ip->client->interval = ip->client->config->initial_interval; in state_reboot()
644 ip->client->medium = NULL; in state_reboot()
661 /* Make a DHCPDISCOVER packet, and set appropriate per-interface in state_init()
663 make_discover(ip, ip->client->active); in state_init()
664 ip->client->xid = ip->client->packet.xid; in state_init()
665 ip->client->destination = iaddr_broadcast; in state_init()
666 ip->client->state = S_SELECTING; in state_init()
667 ip->client->first_sending = cur_time; in state_init()
668 ip->client->interval = ip->client->config->initial_interval; in state_init()
670 /* Add an immediate timeout to cause the first DHCPDISCOVER packet in state_init()
683 struct client_lease *lp, *next, *picked; in state_selecting() local
696 for (lp = ip->client->offered_leases; lp; lp = next) { in state_selecting()
697 next = lp->next; in state_selecting()
702 script_init("ARPCHECK", lp->medium); in state_selecting()
703 script_write_params("check_", lp); in state_selecting()
710 make_decline(ip, lp); in state_selecting()
714 picked = lp; in state_selecting()
715 picked->next = NULL; in state_selecting()
718 free_client_lease(lp); in state_selecting()
721 ip->client->offered_leases = NULL; in state_selecting()
726 ip->client->state = S_INIT; in state_selecting()
732 if (!picked->options[DHO_DHCP_MESSAGE_TYPE].len) { in state_selecting()
733 ip->client->new = picked; in state_selecting()
737 ip->client->new->expiry = cur_time + 12000; in state_selecting()
738 ip->client->new->renewal += cur_time + 8000; in state_selecting()
739 ip->client->new->rebind += cur_time + 10000; in state_selecting()
741 ip->client->state = S_REQUESTING; in state_selecting()
749 ip->client->destination = iaddr_broadcast; in state_selecting()
750 ip->client->state = S_REQUESTING; in state_selecting()
751 ip->client->first_sending = cur_time; in state_selecting()
752 ip->client->interval = ip->client->config->initial_interval; in state_selecting()
756 ip->client->xid = ip->client->packet.xid; in state_selecting()
758 /* Toss the lease we picked - we'll get it back in a DHCPACK. */ in state_selecting()
761 /* Add an immediate timeout to send the first DHCPREQUEST packet. */ in state_selecting()
771 struct interface_info *ip = packet->interface; in dhcpack()
776 if (packet->interface->client->xid != packet->raw->xid || in dhcpack()
777 (packet->interface->hw_address.hlen != packet->raw->hlen) || in dhcpack()
778 (memcmp(packet->interface->hw_address.haddr, in dhcpack()
779 packet->raw->chaddr, packet->raw->hlen))) in dhcpack()
782 if (ip->client->state != S_REBOOTING && in dhcpack()
783 ip->client->state != S_REQUESTING && in dhcpack()
784 ip->client->state != S_RENEWING && in dhcpack()
785 ip->client->state != S_REBINDING) in dhcpack()
788 note("DHCPACK from %s", piaddr(packet->client_addr)); in dhcpack()
796 ip->client->new = lease; in dhcpack()
802 if (ip->client->config->default_actions[DHO_DHCP_LEASE_TIME] == in dhcpack()
804 ip->client->new->expiry = getULong( in dhcpack()
805 ip->client->config->defaults[DHO_DHCP_LEASE_TIME].data); in dhcpack()
806 else if (ip->client->new->options[DHO_DHCP_LEASE_TIME].len >= 4) in dhcpack()
807 ip->client->new->expiry = getULong( in dhcpack()
808 ip->client->new->options[DHO_DHCP_LEASE_TIME].data); in dhcpack()
810 ip->client->new->expiry = default_lease_time; in dhcpack()
814 if (ip->client->new->expiry < 0 || in dhcpack()
815 ip->client->new->expiry > TIME_MAX - cur_time) in dhcpack()
816 ip->client->new->expiry = TIME_MAX - cur_time; in dhcpack()
818 if (ip->client->new->expiry < 60) in dhcpack()
819 ip->client->new->expiry = 60; in dhcpack()
821 /* Unless overridden in the config, take the server-provided renewal in dhcpack()
825 if (ip->client->config->default_actions[DHO_DHCP_RENEWAL_TIME] == in dhcpack()
827 ip->client->new->renewal = getULong( in dhcpack()
828 ip->client->config->defaults[DHO_DHCP_RENEWAL_TIME].data); in dhcpack()
829 else if (ip->client->new->options[DHO_DHCP_RENEWAL_TIME].len >= 4) in dhcpack()
830 ip->client->new->renewal = getULong( in dhcpack()
831 ip->client->new->options[DHO_DHCP_RENEWAL_TIME].data); in dhcpack()
833 ip->client->new->renewal = ip->client->new->expiry / 2; in dhcpack()
834 if (ip->client->new->renewal < 0 || in dhcpack()
835 ip->client->new->renewal > ip->client->new->expiry / 2) in dhcpack()
836 ip->client->new->renewal = ip->client->new->expiry / 2; in dhcpack()
839 if (ip->client->config->default_actions[DHO_DHCP_REBINDING_TIME] == in dhcpack()
841 ip->client->new->rebind = getULong( in dhcpack()
842 ip->client->config->defaults[DHO_DHCP_REBINDING_TIME].data); in dhcpack()
843 else if (ip->client->new->options[DHO_DHCP_REBINDING_TIME].len >= 4) in dhcpack()
844 ip->client->new->rebind = getULong( in dhcpack()
845 ip->client->new->options[DHO_DHCP_REBINDING_TIME].data); in dhcpack()
847 ip->client->new->rebind = ip->client->new->renewal / 4 * 7; in dhcpack()
848 if (ip->client->new->rebind < 0 || in dhcpack()
849 ip->client->new->rebind > ip->client->new->renewal / 4 * 7) in dhcpack()
850 ip->client->new->rebind = ip->client->new->renewal / 4 * 7; in dhcpack()
852 /* Convert the time offsets into seconds-since-the-epoch */ in dhcpack()
853 ip->client->new->expiry += cur_time; in dhcpack()
854 ip->client->new->renewal += cur_time; in dhcpack()
855 ip->client->new->rebind += cur_time; in dhcpack()
866 ip->client->new->medium = ip->client->medium; in bind_lease()
868 opt = &ip->client->new->options[DHO_INTERFACE_MTU]; in bind_lease()
869 if (opt->len == sizeof(u_int16_t)) { in bind_lease()
872 bool supersede = (ip->client->config->default_actions[DHO_INTERFACE_MTU] == in bind_lease()
876 mtu = getUShort(ip->client->config->defaults[DHO_INTERFACE_MTU].data); in bind_lease()
878 mtu = be16dec(opt->data); in bind_lease()
880 if (ip->client->active) { in bind_lease()
881 opt = &ip->client->active->options[DHO_INTERFACE_MTU]; in bind_lease()
882 if (opt->len == sizeof(u_int16_t)) { in bind_lease()
883 old_mtu = be16dec(opt->data); in bind_lease()
892 } else if (ip->client->state != S_RENEWING || mtu != old_mtu) { in bind_lease()
898 write_client_lease(ip, ip->client->new, 0); in bind_lease()
901 script_init((ip->client->state == S_REQUESTING ? "BOUND" : in bind_lease()
902 (ip->client->state == S_RENEWING ? "RENEW" : in bind_lease()
903 (ip->client->state == S_REBOOTING ? "REBOOT" : "REBIND"))), in bind_lease()
904 ip->client->new->medium); in bind_lease()
905 if (ip->client->active && ip->client->state != S_REBOOTING) in bind_lease()
906 script_write_params("old_", ip->client->active); in bind_lease()
907 script_write_params("new_", ip->client->new); in bind_lease()
908 if (ip->client->alias) in bind_lease()
909 script_write_params("alias_", ip->client->alias); in bind_lease()
913 if (ip->client->active) in bind_lease()
914 free_client_lease(ip->client->active); in bind_lease()
915 ip->client->active = ip->client->new; in bind_lease()
916 ip->client->new = NULL; in bind_lease()
918 /* Set up a timeout to start the renewal process. */ in bind_lease()
919 add_timeout(ip->client->active->renewal, state_bound, ip); in bind_lease()
921 note("bound to %s -- renewal in %d seconds.", in bind_lease()
922 piaddr(ip->client->active->address), in bind_lease()
923 (int)(ip->client->active->renewal - cur_time)); in bind_lease()
924 ip->client->state = S_BOUND; in bind_lease()
945 make_request(ip, ip->client->active); in state_bound()
946 ip->client->xid = ip->client->packet.xid; in state_bound()
948 if (ip->client->config->default_actions[DHO_DHCP_SERVER_IDENTIFIER] == in state_bound()
950 dp = ip->client->config->defaults[DHO_DHCP_SERVER_IDENTIFIER].data; in state_bound()
951 len = ip->client->config->defaults[DHO_DHCP_SERVER_IDENTIFIER].len; in state_bound()
953 dp = ip->client->active->options[DHO_DHCP_SERVER_IDENTIFIER].data; in state_bound()
954 len = ip->client->active->options[DHO_DHCP_SERVER_IDENTIFIER].len; in state_bound()
957 memcpy(ip->client->destination.iabuf, dp, len); in state_bound()
958 ip->client->destination.len = len; in state_bound()
960 ip->client->destination = iaddr_broadcast; in state_bound()
962 ip->client->first_sending = cur_time; in state_bound()
963 ip->client->interval = ip->client->config->initial_interval; in state_bound()
964 ip->client->state = S_RENEWING; in state_bound()
975 if (packet->raw->op != BOOTREPLY) in bootp()
980 for (ap = packet->interface->client->config->reject_list; in bootp()
981 ap; ap = ap->next) { in bootp()
982 if (addr_eq(packet->client_addr, ap->addr)) { in bootp()
983 note("BOOTREPLY from %s rejected.", piaddr(ap->addr)); in bootp()
997 switch (packet->packet_type) { in dhcp()
1016 for (ap = packet->interface->client->config->reject_list; in dhcp()
1017 ap; ap = ap->next) { in dhcp()
1018 if (addr_eq(packet->client_addr, ap->addr)) { in dhcp()
1019 note("%s from %s rejected.", type, piaddr(ap->addr)); in dhcp()
1029 struct interface_info *ip = packet->interface; in dhcpoffer()
1030 struct client_lease *lease, *lp; in dhcpoffer() local
1035 const char *name = packet->options[DHO_DHCP_MESSAGE_TYPE].len ? in dhcpoffer()
1042 if (ip->client->state != S_SELECTING || in dhcpoffer()
1043 packet->interface->client->xid != packet->raw->xid || in dhcpoffer()
1044 (packet->interface->hw_address.hlen != packet->raw->hlen) || in dhcpoffer()
1045 (memcmp(packet->interface->hw_address.haddr, in dhcpoffer()
1046 packet->raw->chaddr, packet->raw->hlen))) in dhcpoffer()
1049 note("%s from %s", name, piaddr(packet->client_addr)); in dhcpoffer()
1053 for (i = 0; ip->client->config->required_options[i]; i++) { in dhcpoffer()
1054 if (!packet->options[ip->client->config-> in dhcpoffer()
1062 for (lease = ip->client->offered_leases; in dhcpoffer()
1063 lease; lease = lease->next) { in dhcpoffer()
1064 if (lease->address.len == sizeof(packet->raw->yiaddr) && in dhcpoffer()
1065 !memcmp(lease->address.iabuf, in dhcpoffer()
1066 &packet->raw->yiaddr, lease->address.len)) { in dhcpoffer()
1080 if (!packet->options[DHO_DHCP_MESSAGE_TYPE].len) in dhcpoffer()
1081 lease->is_bootp = 1; in dhcpoffer()
1084 lease->medium = ip->client->medium; in dhcpoffer()
1087 script_init("ARPSEND", lease->medium); in dhcpoffer()
1099 ip->client->first_sending + ip->client->config->select_interval; in dhcpoffer()
1102 list, and don't mess with the arp request timeout. */ in dhcpoffer()
1103 if (lease->address.len == ip->client->requested_address.len && in dhcpoffer()
1104 !memcmp(lease->address.iabuf, in dhcpoffer()
1105 ip->client->requested_address.iabuf, in dhcpoffer()
1106 ip->client->requested_address.len)) { in dhcpoffer()
1107 lease->next = ip->client->offered_leases; in dhcpoffer()
1108 ip->client->offered_leases = lease; in dhcpoffer()
1111 offer would take us past the selection timeout, in dhcpoffer()
1112 then don't extend the timeout - just hope for the in dhcpoffer()
1118 if (ip->client->offered_leases && in dhcpoffer()
1123 lease->next = NULL; in dhcpoffer()
1124 if (!ip->client->offered_leases) in dhcpoffer()
1125 ip->client->offered_leases = lease; in dhcpoffer()
1127 for (lp = ip->client->offered_leases; lp->next; in dhcpoffer()
1128 lp = lp->next) in dhcpoffer()
1130 lp->next = lease; in dhcpoffer()
1137 * the first case only occurs if select-timeout is set to nonzero in dhcpoffer()
1141 {.tv_sec = stop_selecting - cur_time, .tv_nsec = 0}; in dhcpoffer()
1157 struct interface_info *ip = packet->interface; in packet_to_lease()
1172 if (packet->options[i].len) { in packet_to_lease()
1174 for (j = 0; ip->client->config->ignored_options[j]; j++) in packet_to_lease()
1176 ip->client->config->ignored_options[j]) { in packet_to_lease()
1182 lease->options[i].data = in packet_to_lease()
1183 malloc(packet->options[i].len + 1); in packet_to_lease()
1184 if (!lease->options[i].data) { in packet_to_lease()
1189 memcpy(lease->options[i].data, in packet_to_lease()
1190 packet->options[i].data, in packet_to_lease()
1191 packet->options[i].len); in packet_to_lease()
1192 lease->options[i].len = in packet_to_lease()
1193 packet->options[i].len; in packet_to_lease()
1194 lease->options[i].data[lease->options[i].len] = in packet_to_lease()
1199 warning("Invalid lease option - ignoring offer"); in packet_to_lease()
1206 lease->address.len = sizeof(packet->raw->yiaddr); in packet_to_lease()
1207 memcpy(lease->address.iabuf, &packet->raw->yiaddr, lease->address.len); in packet_to_lease()
1209 lease->nextserver.len = sizeof(packet->raw->siaddr); in packet_to_lease()
1210 memcpy(lease->nextserver.iabuf, &packet->raw->siaddr, lease->nextserver.len); in packet_to_lease()
1214 RFC 2131 merely states that sname is NUL-terminated (which do in packet_to_lease()
1218 if ((!packet->options[DHO_DHCP_OPTION_OVERLOAD].len || in packet_to_lease()
1219 !(packet->options[DHO_DHCP_OPTION_OVERLOAD].data[0] & 2)) && in packet_to_lease()
1220 packet->raw->sname[0]) { in packet_to_lease()
1221 lease->server_name = malloc(DHCP_SNAME_LEN + 1); in packet_to_lease()
1222 if (!lease->server_name) { in packet_to_lease()
1227 memcpy(lease->server_name, packet->raw->sname, DHCP_SNAME_LEN); in packet_to_lease()
1228 lease->server_name[DHCP_SNAME_LEN]='\0'; in packet_to_lease()
1232 if ((!packet->options[DHO_DHCP_OPTION_OVERLOAD].len || in packet_to_lease()
1233 !(packet->options[DHO_DHCP_OPTION_OVERLOAD].data[0] & 1)) && in packet_to_lease()
1234 packet->raw->file[0]) { in packet_to_lease()
1236 lease->filename = malloc(DHCP_FILE_LEN + 1); in packet_to_lease()
1237 if (!lease->filename) { in packet_to_lease()
1242 memcpy(lease->filename, packet->raw->file, DHCP_FILE_LEN); in packet_to_lease()
1243 lease->filename[DHCP_FILE_LEN]='\0'; in packet_to_lease()
1251 struct interface_info *ip = packet->interface; in dhcpnak()
1255 if (packet->interface->client->xid != packet->raw->xid || in dhcpnak()
1256 (packet->interface->hw_address.hlen != packet->raw->hlen) || in dhcpnak()
1257 (memcmp(packet->interface->hw_address.haddr, in dhcpnak()
1258 packet->raw->chaddr, packet->raw->hlen))) in dhcpnak()
1261 if (ip->client->state != S_REBOOTING && in dhcpnak()
1262 ip->client->state != S_REQUESTING && in dhcpnak()
1263 ip->client->state != S_RENEWING && in dhcpnak()
1264 ip->client->state != S_REBINDING) in dhcpnak()
1267 note("DHCPNAK from %s", piaddr(packet->client_addr)); in dhcpnak()
1269 if (!ip->client->active) { in dhcpnak()
1274 free_client_lease(ip->client->active); in dhcpnak()
1275 ip->client->active = NULL; in dhcpnak()
1280 ip->client->state = S_INIT; in dhcpnak()
1284 /* Send out a DHCPDISCOVER packet, and set a timeout to send out another
1295 interval = cur_time - ip->client->first_sending; in send_discover()
1297 /* If we're past the panic timeout, call the script and tell it in send_discover()
1299 if (interval > ip->client->config->timeout) { in send_discover()
1307 if (!ip->client->offered_leases && in send_discover()
1308 ip->client->config->media) { in send_discover()
1311 if (ip->client->medium) { in send_discover()
1312 ip->client->medium = ip->client->medium->next; in send_discover()
1315 if (!ip->client->medium) { in send_discover()
1317 error("No valid media types for %s!", ip->name); in send_discover()
1318 ip->client->medium = ip->client->config->media; in send_discover()
1322 note("Trying medium \"%s\" %d", ip->client->medium->string, in send_discover()
1324 script_init("MEDIUM", ip->client->medium); in send_discover()
1337 if (!ip->client->interval) in send_discover()
1338 ip->client->interval = in send_discover()
1339 ip->client->config->initial_interval; in send_discover()
1341 ip->client->interval += (arc4random() >> 2) % in send_discover()
1342 (2 * ip->client->interval); in send_discover()
1346 if (ip->client->interval > in send_discover()
1347 ip->client->config->backoff_cutoff) in send_discover()
1348 ip->client->interval = in send_discover()
1349 ((ip->client->config->backoff_cutoff / 2) in send_discover()
1351 ip->client->config->backoff_cutoff)); in send_discover()
1352 } else if (!ip->client->interval) in send_discover()
1353 ip->client->interval = in send_discover()
1354 ip->client->config->initial_interval; in send_discover()
1356 /* If the backoff would take us to the panic timeout, just use that in send_discover()
1358 if (cur_time + ip->client->interval > in send_discover()
1359 ip->client->first_sending + ip->client->config->timeout) in send_discover()
1360 ip->client->interval = in send_discover()
1361 (ip->client->first_sending + in send_discover()
1362 ip->client->config->timeout) - cur_time + 1; in send_discover()
1366 ip->client->packet.secs = htons(interval); in send_discover()
1368 ip->client->packet.secs = htons(65535); in send_discover()
1369 ip->client->secs = ip->client->packet.secs; in send_discover()
1372 ip->name, inet_ntoa(inaddr_broadcast), REMOTE_PORT, in send_discover()
1373 (int)ip->client->interval); in send_discover()
1376 send_packet_unpriv(privfd, &ip->client->packet, in send_discover()
1377 ip->client->packet_length, inaddr_any, inaddr_broadcast); in send_discover()
1379 add_timeout(cur_time + ip->client->interval, send_discover, ip); in send_discover()
1392 struct client_lease *loop = ip->client->active; in state_panic()
1393 struct client_lease *lp; in state_panic() local
1399 if (!ip->client->active && ip->client->leases) in state_panic()
1403 while (ip->client->active) { in state_panic()
1404 if (ip->client->active->expiry > cur_time) { in state_panic()
1406 piaddr(ip->client->active->address)); in state_panic()
1409 script_init("TIMEOUT", in state_panic()
1410 ip->client->active->medium); in state_panic()
1411 script_write_params("new_", ip->client->active); in state_panic()
1412 if (ip->client->alias) in state_panic()
1414 ip->client->alias); in state_panic()
1418 timeout at the renewal time. */ in state_panic()
1421 ip->client->active->renewal) { in state_panic()
1422 ip->client->state = S_BOUND; in state_panic()
1424 (int)(ip->client->active->renewal - in state_panic()
1427 ip->client->active->renewal, in state_panic()
1430 ip->client->state = S_BOUND; in state_panic()
1441 if (!ip->client->leases) { in state_panic()
1442 ip->client->leases = ip->client->active; in state_panic()
1443 ip->client->active = NULL; in state_panic()
1450 for (lp = ip->client->leases; lp->next; lp = lp->next) in state_panic()
1452 lp->next = ip->client->active; in state_panic()
1453 if (lp->next) in state_panic()
1454 lp->next->next = NULL; in state_panic()
1455 ip->client->active = ip->client->leases; in state_panic()
1456 ip->client->leases = ip->client->leases->next; in state_panic()
1461 if (ip->client->active == loop) in state_panic()
1464 loop = ip->client->active; in state_panic()
1470 note("No working leases in persistent database - sleeping.\n"); in state_panic()
1472 if (ip->client->alias) in state_panic()
1473 script_write_params("alias_", ip->client->alias); in state_panic()
1475 ip->client->state = S_INIT; in state_panic()
1476 add_timeout(cur_time + ip->client->config->retry_interval, state_init, in state_panic()
1489 interval = cur_time - ip->client->first_sending; in send_request()
1491 /* If we're in the INIT-REBOOT or REQUESTING state and we're in send_request()
1492 past the reboot timeout, go to INIT and see if we can in send_request()
1494 /* XXX In the INIT-REBOOT state, if we don't get an ACK, it in send_request()
1500 anyway. This is not a win-prone situation. */ in send_request()
1501 if ((ip->client->state == S_REBOOTING || in send_request()
1502 ip->client->state == S_REQUESTING) && in send_request()
1503 interval > ip->client->config->reboot_timeout) { in send_request()
1505 ip->client->state = S_INIT; in send_request()
1513 if (ip->client->state == S_REBOOTING && in send_request()
1514 !ip->client->medium && in send_request()
1515 ip->client->active->medium ) { in send_request()
1516 script_init("MEDIUM", ip->client->active->medium); in send_request()
1523 ip->client->medium = ip->client->active->medium; in send_request()
1528 if (ip->client->state != S_REQUESTING && in send_request()
1529 cur_time > ip->client->active->expiry) { in send_request()
1532 script_write_params("old_", ip->client->active); in send_request()
1533 if (ip->client->alias) in send_request()
1534 script_write_params("alias_", ip->client->alias); in send_request()
1540 if (ip->client->alias) in send_request()
1541 script_write_params("alias_", ip->client->alias); in send_request()
1544 ip->client->state = S_INIT; in send_request()
1550 if (!ip->client->interval) in send_request()
1551 ip->client->interval = ip->client->config->initial_interval; in send_request()
1553 ip->client->interval += ((arc4random() >> 2) % in send_request()
1554 (2 * ip->client->interval)); in send_request()
1557 if (ip->client->interval > in send_request()
1558 ip->client->config->backoff_cutoff) in send_request()
1559 ip->client->interval = in send_request()
1560 ((ip->client->config->backoff_cutoff / 2) + in send_request()
1561 ((arc4random() >> 2) % ip->client->interval)); in send_request()
1564 timeout to the expiry time. */ in send_request()
1565 if (ip->client->state != S_REQUESTING && in send_request()
1566 cur_time + ip->client->interval > in send_request()
1567 ip->client->active->expiry) in send_request()
1568 ip->client->interval = in send_request()
1569 ip->client->active->expiry - cur_time + 1; in send_request()
1573 if (ip->client->state == S_REQUESTING || in send_request()
1574 ip->client->state == S_REBOOTING || in send_request()
1575 cur_time > ip->client->active->rebind) in send_request()
1578 memcpy(&to.s_addr, ip->client->destination.iabuf, in send_request()
1581 if (ip->client->state != S_REQUESTING && in send_request()
1582 ip->client->state != S_REBOOTING) in send_request()
1583 memcpy(&from, ip->client->active->address.iabuf, in send_request()
1589 if (ip->client->state == S_REQUESTING) in send_request()
1590 ip->client->packet.secs = ip->client->secs; in send_request()
1593 ip->client->packet.secs = htons(interval); in send_request()
1595 ip->client->packet.secs = htons(65535); in send_request()
1598 note("DHCPREQUEST on %s to %s port %d", ip->name, inet_ntoa(to), in send_request()
1602 send_packet_unpriv(privfd, &ip->client->packet, in send_request()
1603 ip->client->packet_length, from, to); in send_request()
1605 add_timeout(cur_time + ip->client->interval, send_request, ip); in send_request()
1613 note("DHCPDECLINE on %s to %s port %d", ip->name, in send_decline()
1617 send_packet_unpriv(privfd, &ip->client->packet, in send_decline()
1618 ip->client->packet_length, inaddr_any, inaddr_broadcast); in send_decline()
1631 memset(&ip->client->packet, 0, sizeof(ip->client->packet)); in make_discover()
1636 options[i]->value = &discover; in make_discover()
1637 options[i]->len = sizeof(discover); in make_discover()
1638 options[i]->buf_size = sizeof(discover); in make_discover()
1639 options[i]->timeout = 0xFFFFFFFF; in make_discover()
1644 options[i]->value = ip->client->config->requested_options; in make_discover()
1645 options[i]->len = ip->client->config->requested_option_count; in make_discover()
1646 options[i]->buf_size = in make_discover()
1647 ip->client->config->requested_option_count; in make_discover()
1648 options[i]->timeout = 0xFFFFFFFF; in make_discover()
1652 ip->client->requested_address = lease->address; in make_discover()
1655 options[i]->value = lease->address.iabuf; in make_discover()
1656 options[i]->len = lease->address.len; in make_discover()
1657 options[i]->buf_size = lease->address.len; in make_discover()
1658 options[i]->timeout = 0xFFFFFFFF; in make_discover()
1660 ip->client->requested_address.len = 0; in make_discover()
1665 ip->client->config->send_options[i].data) { in make_discover()
1667 options[i]->value = in make_discover()
1668 ip->client->config->send_options[i].data; in make_discover()
1669 options[i]->len = in make_discover()
1670 ip->client->config->send_options[i].len; in make_discover()
1671 options[i]->buf_size = in make_discover()
1672 ip->client->config->send_options[i].len; in make_discover()
1673 options[i]->timeout = 0xFFFFFFFF; in make_discover()
1682 len = posDot - hostname; in make_discover()
1686 options[DHO_HOST_NAME]->value = hostname; in make_discover()
1687 options[DHO_HOST_NAME]->len = len; in make_discover()
1688 options[DHO_HOST_NAME]->buf_size = len; in make_discover()
1689 options[DHO_HOST_NAME]->timeout = 0xFFFFFFFF; in make_discover()
1694 char client_ident[sizeof(ip->hw_address.haddr) + 1]; in make_discover()
1696 int hwlen = (ip->hw_address.hlen < sizeof(client_ident)-1) ? in make_discover()
1697 ip->hw_address.hlen : sizeof(client_ident)-1; in make_discover()
1698 client_ident[0] = ip->hw_address.htype; in make_discover()
1699 memcpy(&client_ident[1], ip->hw_address.haddr, hwlen); in make_discover()
1701 options[DHO_DHCP_CLIENT_IDENTIFIER]->value = client_ident; in make_discover()
1702 options[DHO_DHCP_CLIENT_IDENTIFIER]->len = hwlen+1; in make_discover()
1703 options[DHO_DHCP_CLIENT_IDENTIFIER]->buf_size = hwlen+1; in make_discover()
1704 options[DHO_DHCP_CLIENT_IDENTIFIER]->timeout = 0xFFFFFFFF; in make_discover()
1708 ip->client->packet_length = cons_options(NULL, &ip->client->packet, 0, in make_discover()
1710 if (ip->client->packet_length < BOOTP_MIN_LEN) in make_discover()
1711 ip->client->packet_length = BOOTP_MIN_LEN; in make_discover()
1713 ip->client->packet.op = BOOTREQUEST; in make_discover()
1714 ip->client->packet.htype = ip->hw_address.htype; in make_discover()
1715 ip->client->packet.hlen = ip->hw_address.hlen; in make_discover()
1716 ip->client->packet.hops = 0; in make_discover()
1717 ip->client->packet.xid = arc4random(); in make_discover()
1718 ip->client->packet.secs = 0; /* filled in by send_discover. */ in make_discover()
1719 ip->client->packet.flags = 0; in make_discover()
1721 memset(&(ip->client->packet.ciaddr), in make_discover()
1722 0, sizeof(ip->client->packet.ciaddr)); in make_discover()
1723 memset(&(ip->client->packet.yiaddr), in make_discover()
1724 0, sizeof(ip->client->packet.yiaddr)); in make_discover()
1725 memset(&(ip->client->packet.siaddr), in make_discover()
1726 0, sizeof(ip->client->packet.siaddr)); in make_discover()
1727 memset(&(ip->client->packet.giaddr), in make_discover()
1728 0, sizeof(ip->client->packet.giaddr)); in make_discover()
1729 memcpy(ip->client->packet.chaddr, in make_discover()
1730 ip->hw_address.haddr, ip->hw_address.hlen); in make_discover()
1743 memset(&ip->client->packet, 0, sizeof(ip->client->packet)); in make_request()
1748 options[i]->value = &request; in make_request()
1749 options[i]->len = sizeof(request); in make_request()
1750 options[i]->buf_size = sizeof(request); in make_request()
1751 options[i]->timeout = 0xFFFFFFFF; in make_request()
1756 options[i]->value = ip->client->config->requested_options; in make_request()
1757 options[i]->len = ip->client->config->requested_option_count; in make_request()
1758 options[i]->buf_size = in make_request()
1759 ip->client->config->requested_option_count; in make_request()
1760 options[i]->timeout = 0xFFFFFFFF; in make_request()
1764 if (ip->client->state == S_REQUESTING) { in make_request()
1768 options[i]->value = lease->options[i].data; in make_request()
1769 options[i]->len = lease->options[i].len; in make_request()
1770 options[i]->buf_size = lease->options[i].len; in make_request()
1771 options[i]->timeout = 0xFFFFFFFF; in make_request()
1773 if (ip->client->state == S_REQUESTING || in make_request()
1774 ip->client->state == S_REBOOTING) { in make_request()
1775 ip->client->requested_address = lease->address; in make_request()
1778 options[i]->value = lease->address.iabuf; in make_request()
1779 options[i]->len = lease->address.len; in make_request()
1780 options[i]->buf_size = lease->address.len; in make_request()
1781 options[i]->timeout = 0xFFFFFFFF; in make_request()
1783 ip->client->requested_address.len = 0; in make_request()
1788 ip->client->config->send_options[i].data) { in make_request()
1790 options[i]->value = in make_request()
1791 ip->client->config->send_options[i].data; in make_request()
1792 options[i]->len = in make_request()
1793 ip->client->config->send_options[i].len; in make_request()
1794 options[i]->buf_size = in make_request()
1795 ip->client->config->send_options[i].len; in make_request()
1796 options[i]->timeout = 0xFFFFFFFF; in make_request()
1805 len = posDot - hostname; in make_request()
1809 options[DHO_HOST_NAME]->value = hostname; in make_request()
1810 options[DHO_HOST_NAME]->len = len; in make_request()
1811 options[DHO_HOST_NAME]->buf_size = len; in make_request()
1812 options[DHO_HOST_NAME]->timeout = 0xFFFFFFFF; in make_request()
1817 char client_ident[sizeof(ip->hw_address.haddr) + 1]; in make_request()
1819 int hwlen = (ip->hw_address.hlen < sizeof(client_ident)-1) ? in make_request()
1820 ip->hw_address.hlen : sizeof(client_ident)-1; in make_request()
1821 client_ident[0] = ip->hw_address.htype; in make_request()
1822 memcpy(&client_ident[1], ip->hw_address.haddr, hwlen); in make_request()
1824 options[DHO_DHCP_CLIENT_IDENTIFIER]->value = client_ident; in make_request()
1825 options[DHO_DHCP_CLIENT_IDENTIFIER]->len = hwlen+1; in make_request()
1826 options[DHO_DHCP_CLIENT_IDENTIFIER]->buf_size = hwlen+1; in make_request()
1827 options[DHO_DHCP_CLIENT_IDENTIFIER]->timeout = 0xFFFFFFFF; in make_request()
1831 ip->client->packet_length = cons_options(NULL, &ip->client->packet, 0, in make_request()
1833 if (ip->client->packet_length < BOOTP_MIN_LEN) in make_request()
1834 ip->client->packet_length = BOOTP_MIN_LEN; in make_request()
1836 ip->client->packet.op = BOOTREQUEST; in make_request()
1837 ip->client->packet.htype = ip->hw_address.htype; in make_request()
1838 ip->client->packet.hlen = ip->hw_address.hlen; in make_request()
1839 ip->client->packet.hops = 0; in make_request()
1840 ip->client->packet.xid = ip->client->xid; in make_request()
1841 ip->client->packet.secs = 0; /* Filled in by send_request. */ in make_request()
1845 if (ip->client->state == S_BOUND || in make_request()
1846 ip->client->state == S_RENEWING || in make_request()
1847 ip->client->state == S_REBINDING) { in make_request()
1848 memcpy(&ip->client->packet.ciaddr, in make_request()
1849 lease->address.iabuf, lease->address.len); in make_request()
1850 ip->client->packet.flags = 0; in make_request()
1852 memset(&ip->client->packet.ciaddr, 0, in make_request()
1853 sizeof(ip->client->packet.ciaddr)); in make_request()
1854 ip->client->packet.flags = 0; in make_request()
1857 memset(&ip->client->packet.yiaddr, 0, in make_request()
1858 sizeof(ip->client->packet.yiaddr)); in make_request()
1859 memset(&ip->client->packet.siaddr, 0, in make_request()
1860 sizeof(ip->client->packet.siaddr)); in make_request()
1861 memset(&ip->client->packet.giaddr, 0, in make_request()
1862 sizeof(ip->client->packet.giaddr)); in make_request()
1863 memcpy(ip->client->packet.chaddr, in make_request()
1864 ip->hw_address.haddr, ip->hw_address.hlen); in make_request()
1877 memset(&ip->client->packet, 0, sizeof(ip->client->packet)); in make_decline()
1882 options[i]->value = &decline; in make_decline()
1883 options[i]->len = sizeof(decline); in make_decline()
1884 options[i]->buf_size = sizeof(decline); in make_decline()
1885 options[i]->timeout = 0xFFFFFFFF; in make_decline()
1890 options[i]->value = lease->options[i].data; in make_decline()
1891 options[i]->len = lease->options[i].len; in make_decline()
1892 options[i]->buf_size = lease->options[i].len; in make_decline()
1893 options[i]->timeout = 0xFFFFFFFF; in make_decline()
1898 options[i]->value = lease->address.iabuf; in make_decline()
1899 options[i]->len = lease->address.len; in make_decline()
1900 options[i]->buf_size = lease->address.len; in make_decline()
1901 options[i]->timeout = 0xFFFFFFFF; in make_decline()
1905 if (ip->client->config->send_options[i].len) { in make_decline()
1907 options[i]->value = ip->client->config->send_options[i].data; in make_decline()
1908 options[i]->len = ip->client->config->send_options[i].len; in make_decline()
1909 options[i]->buf_size = ip->client->config->send_options[i].len; in make_decline()
1910 options[i]->timeout = 0xFFFFFFFF; in make_decline()
1915 ip->client->packet_length = cons_options(NULL, &ip->client->packet, 0, in make_decline()
1917 if (ip->client->packet_length < BOOTP_MIN_LEN) in make_decline()
1918 ip->client->packet_length = BOOTP_MIN_LEN; in make_decline()
1920 ip->client->packet.op = BOOTREQUEST; in make_decline()
1921 ip->client->packet.htype = ip->hw_address.htype; in make_decline()
1922 ip->client->packet.hlen = ip->hw_address.hlen; in make_decline()
1923 ip->client->packet.hops = 0; in make_decline()
1924 ip->client->packet.xid = ip->client->xid; in make_decline()
1925 ip->client->packet.secs = 0; /* Filled in by send_request. */ in make_decline()
1926 ip->client->packet.flags = 0; in make_decline()
1929 memset(&ip->client->packet.ciaddr, 0, in make_decline()
1930 sizeof(ip->client->packet.ciaddr)); in make_decline()
1931 memset(&ip->client->packet.yiaddr, 0, in make_decline()
1932 sizeof(ip->client->packet.yiaddr)); in make_decline()
1933 memset(&ip->client->packet.siaddr, 0, in make_decline()
1934 sizeof(ip->client->packet.siaddr)); in make_decline()
1935 memset(&ip->client->packet.giaddr, 0, in make_decline()
1936 sizeof(ip->client->packet.giaddr)); in make_decline()
1937 memcpy(ip->client->packet.chaddr, in make_decline()
1938 ip->hw_address.haddr, ip->hw_address.hlen); in make_decline()
1946 if (lease->server_name) in free_client_lease()
1947 free(lease->server_name); in free_client_lease()
1948 if (lease->filename) in free_client_lease()
1949 free(lease->filename); in free_client_lease()
1951 if (lease->options[i].len) in free_client_lease()
1952 free(lease->options[i].data); in free_client_lease()
1962 struct client_lease *lp; in rewrite_client_leases() local
1982 for (lp = ifi->client->leases; lp; lp = lp->next) in rewrite_client_leases()
1983 write_client_lease(ifi, lp, 1); in rewrite_client_leases()
1984 if (ifi->client->active) in rewrite_client_leases()
1985 write_client_lease(ifi, ifi->client->active, 1); in rewrite_client_leases()
2009 if (lease->is_static) in write_client_lease()
2019 if (lease->is_bootp) in write_client_lease()
2021 fprintf(leaseFile, " interface \"%s\";\n", ip->name); in write_client_lease()
2022 fprintf(leaseFile, " fixed-address %s;\n", piaddr(lease->address)); in write_client_lease()
2023 if (lease->nextserver.len == sizeof(inaddr_any) && in write_client_lease()
2024 0 != memcmp(lease->nextserver.iabuf, &inaddr_any, in write_client_lease()
2026 fprintf(leaseFile, " next-server %s;\n", in write_client_lease()
2027 piaddr(lease->nextserver)); in write_client_lease()
2028 if (lease->filename) in write_client_lease()
2029 fprintf(leaseFile, " filename \"%s\";\n", lease->filename); in write_client_lease()
2030 if (lease->server_name) in write_client_lease()
2031 fprintf(leaseFile, " server-name \"%s\";\n", in write_client_lease()
2032 lease->server_name); in write_client_lease()
2033 if (lease->medium) in write_client_lease()
2034 fprintf(leaseFile, " medium \"%s\";\n", lease->medium->string); in write_client_lease()
2036 if (lease->options[i].len) in write_client_lease()
2039 pretty_print_option(i, lease->options[i].data, in write_client_lease()
2040 lease->options[i].len, 1, 1)); in write_client_lease()
2042 t = gmtime(&lease->renewal); in write_client_lease()
2044 t->tm_wday, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, in write_client_lease()
2045 t->tm_hour, t->tm_min, t->tm_sec); in write_client_lease()
2046 t = gmtime(&lease->rebind); in write_client_lease()
2048 t->tm_wday, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, in write_client_lease()
2049 t->tm_hour, t->tm_min, t->tm_sec); in write_client_lease()
2050 t = gmtime(&lease->expiry); in write_client_lease()
2052 t->tm_wday, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, in write_client_lease()
2053 t->tm_hour, t->tm_min, t->tm_sec); in write_client_lease()
2066 if (medium != NULL && medium->string != NULL) in script_init()
2067 mediumlen = strlen(medium->string); in script_init()
2081 errs += buf_add(buf, medium->string, mediumlen); in script_init()
2089 if (buf_close(privfd, buf) == -1) in script_init()
2099 ip->client->scriptEnvsize = 100; in priv_script_init()
2100 if (ip->client->scriptEnv == NULL) in priv_script_init()
2101 ip->client->scriptEnv = in priv_script_init()
2102 malloc(ip->client->scriptEnvsize * sizeof(char *)); in priv_script_init()
2103 if (ip->client->scriptEnv == NULL) in priv_script_init()
2106 ip->client->scriptEnv[0] = strdup(CLIENT_PATH); in priv_script_init()
2107 if (ip->client->scriptEnv[0] == NULL) in priv_script_init()
2110 ip->client->scriptEnv[1] = NULL; in priv_script_init()
2112 script_set_env(ip->client, "", "interface", ip->name); in priv_script_init()
2115 script_set_env(ip->client, "", "medium", medium); in priv_script_init()
2117 script_set_env(ip->client, "", "reason", reason); in priv_script_init()
2130 script_set_env(ip->client, prefix, "ip_address", in priv_script_write_params()
2131 piaddr(lease->address)); in priv_script_write_params()
2133 if (ip->client->config->default_actions[DHO_SUBNET_MASK] == in priv_script_write_params()
2135 dp = ip->client->config->defaults[DHO_SUBNET_MASK].data; in priv_script_write_params()
2136 len = ip->client->config->defaults[DHO_SUBNET_MASK].len; in priv_script_write_params()
2138 dp = lease->options[DHO_SUBNET_MASK].data; in priv_script_write_params()
2139 len = lease->options[DHO_SUBNET_MASK].len; in priv_script_write_params()
2141 if (len && (len < sizeof(lease->address.iabuf))) { in priv_script_write_params()
2146 subnet = subnet_number(lease->address, netmask); in priv_script_write_params()
2148 script_set_env(ip->client, prefix, "network_number", in priv_script_write_params()
2150 if (!lease->options[DHO_BROADCAST_ADDRESS].len) { in priv_script_write_params()
2153 script_set_env(ip->client, prefix, in priv_script_write_params()
2160 if (lease->filename) in priv_script_write_params()
2161 script_set_env(ip->client, prefix, "filename", lease->filename); in priv_script_write_params()
2162 if (lease->server_name) in priv_script_write_params()
2163 script_set_env(ip->client, prefix, "server_name", in priv_script_write_params()
2164 lease->server_name); in priv_script_write_params()
2168 if (ip->client->config->defaults[i].len) { in priv_script_write_params()
2169 if (lease->options[i].len) { in priv_script_write_params()
2171 ip->client->config->default_actions[i]) { in priv_script_write_params()
2173 dp = lease->options[i].data; in priv_script_write_params()
2174 len = lease->options[i].len; in priv_script_write_params()
2178 dp = ip->client-> in priv_script_write_params()
2179 config->defaults[i].data; in priv_script_write_params()
2180 len = ip->client-> in priv_script_write_params()
2181 config->defaults[i].len; in priv_script_write_params()
2184 len = ip->client-> in priv_script_write_params()
2185 config->defaults[i].len + in priv_script_write_params()
2186 lease->options[i].len; in priv_script_write_params()
2195 ip->client-> in priv_script_write_params()
2196 config->defaults[i].data, in priv_script_write_params()
2197 ip->client-> in priv_script_write_params()
2198 config->defaults[i].len); in priv_script_write_params()
2199 memcpy(dp + ip->client-> in priv_script_write_params()
2200 config->defaults[i].len, in priv_script_write_params()
2201 lease->options[i].data, in priv_script_write_params()
2202 lease->options[i].len); in priv_script_write_params()
2208 * appending to text. Some MS servers in priv_script_write_params()
2212 len = ip->client-> in priv_script_write_params()
2213 config->defaults[i].len + in priv_script_write_params()
2214 lease->options[i].len; in priv_script_write_params()
2222 lease->options[i].data, in priv_script_write_params()
2223 lease->options[i].len); in priv_script_write_params()
2224 for (dp = dbuf + lease->options[i].len; in priv_script_write_params()
2225 dp > dbuf; dp--, len--) in priv_script_write_params()
2226 if (dp[-1] != '\0') in priv_script_write_params()
2229 ip->client-> in priv_script_write_params()
2230 config->defaults[i].data, in priv_script_write_params()
2231 ip->client-> in priv_script_write_params()
2232 config->defaults[i].len); in priv_script_write_params()
2237 dp = ip->client-> in priv_script_write_params()
2238 config->defaults[i].data; in priv_script_write_params()
2239 len = ip->client-> in priv_script_write_params()
2240 config->defaults[i].len; in priv_script_write_params()
2242 } else if (lease->options[i].len) { in priv_script_write_params()
2243 len = lease->options[i].len; in priv_script_write_params()
2244 dp = lease->options[i].data; in priv_script_write_params()
2253 script_set_env(ip->client, prefix, name, in priv_script_write_params()
2257 snprintf(tbuf, sizeof(tbuf), "%d", (int)lease->expiry); in priv_script_write_params()
2258 script_set_env(ip->client, prefix, "expiry", tbuf); in priv_script_write_params()
2269 if (lease->filename != NULL) in script_write_params()
2270 fn_len = strlen(lease->filename); in script_write_params()
2271 if (lease->server_name != NULL) in script_write_params()
2272 sn_len = strlen(lease->server_name); in script_write_params()
2282 hdr.len += sizeof(lease->options[i].len); in script_write_params()
2283 hdr.len += lease->options[i].len; in script_write_params()
2295 errs += buf_add(buf, lease->filename, fn_len); in script_write_params()
2297 errs += buf_add(buf, lease->server_name, sn_len); in script_write_params()
2302 errs += buf_add(buf, &lease->options[i].len, in script_write_params()
2303 sizeof(lease->options[i].len)); in script_write_params()
2304 errs += buf_add(buf, lease->options[i].data, in script_write_params()
2305 lease->options[i].len); in script_write_params()
2311 if (buf_close(privfd, buf) == -1) in script_write_params()
2331 if (buf_close(privfd, buf) == -1) in script_go()
2358 scriptName = ip->client->config->script_name; in priv_script_go()
2359 envp = ip->client->scriptEnv; in priv_script_go()
2389 script_flush_env(ip->client); in priv_script_go()
2415 for (i = 0; client->scriptEnv[i]; i++) in script_set_env()
2416 if (strncmp(client->scriptEnv[i], name, namelen) == 0 && in script_set_env()
2417 client->scriptEnv[i][namelen] == '=') in script_set_env()
2420 if (client->scriptEnv[i]) in script_set_env()
2422 free(client->scriptEnv[i]); in script_set_env()
2425 if (i >= client->scriptEnvsize - 1) { in script_set_env()
2427 int newscriptEnvsize = client->scriptEnvsize + 50; in script_set_env()
2429 newscriptEnv = realloc(client->scriptEnv, in script_set_env()
2432 free(client->scriptEnv); in script_set_env()
2433 client->scriptEnv = NULL; in script_set_env()
2434 client->scriptEnvsize = 0; in script_set_env()
2437 client->scriptEnv = newscriptEnv; in script_set_env()
2438 client->scriptEnvsize = newscriptEnvsize; in script_set_env()
2442 client->scriptEnv[i + 1] = NULL; in script_set_env()
2445 client->scriptEnv[i] = malloc(strlen(prefix) + strlen(name) + 1 + in script_set_env()
2447 if (client->scriptEnv[i] == NULL) in script_set_env()
2449 snprintf(client->scriptEnv[i], strlen(prefix) + strlen(name) + in script_set_env()
2458 for (i = 0; client->scriptEnv[i]; i++) { in script_flush_env()
2459 free(client->scriptEnv[i]); in script_flush_env()
2460 client->scriptEnv[i] = NULL; in script_flush_env()
2462 client->scriptEnvsize = 0; in script_flush_env()
2470 for (i = 0; option->name[i]; i++) { in dhcp_option_ev_name()
2473 if (option->name[i] == '-') in dhcp_option_ev_name()
2476 buf[i] = option->name[i]; in dhcp_option_ev_name()
2497 if (daemonfd(-1, nullfd) == -1) in go_daemon()
2509 if (nullfd != -1) { in go_daemon()
2511 nullfd = -1; in go_daemon()
2529 /* we use this, since this is what gets passed to dhclient-script */ in check_option()
2531 opbuf = pretty_print_option(option, l->options[option].data, in check_option()
2532 l->options[option].len, 0, 0); in check_option()
2534 sbuf = option_as_string(option, l->options[option].data, in check_option()
2535 l->options[option].len); in check_option()
2578 l->options[option].len = 0; in check_option()
2579 free(l->options[option].data); in check_option()
2588 l->options[option].len = 0; in check_option()
2589 free(l->options[option].data); in check_option()
2643 return (check_classless_option(l->options[option].data, in check_option()
2644 l->options[option].len)); in check_option()
2690 mask = (in_addr_t)(~0) << (32 - width); in check_classless_option()
2703 data[i - 1] = (unsigned char)( in check_classless_option()
2704 (addr >> (((32 - width)/8)*8)) & 0xFF); in check_classless_option()
2825 opleft -= 4; in option_as_string()
2831 opleft -= 2; in option_as_string()
2834 opleft--; in option_as_string()
2853 case -1: in fork_privchld()
2861 setproctitle("%s [priv]", ifi->name); in fork_privchld()
2869 close(ifi->rfdesc); in fork_privchld()
2870 ifi->rfdesc = -1; in fork_privchld()
2875 if ((nfds = poll(pfd, 1, INFTIM)) == -1) in fork_privchld()