--- trunk/mkinitrd-magellan/klibc/usr/kinit/ipconfig/main.c 2010/07/22 07:47:49 1121 +++ trunk/mkinitrd-magellan/klibc/usr/kinit/ipconfig/main.c 2010/08/18 21:11:40 1122 @@ -169,6 +169,11 @@ ifaces = dev; } +/* + * Returns: + * 0 = Not handled, the packet is still in the queue + * 1 = Handled + */ static int process_receive_event(struct state *s, time_t now) { int handled = 1; @@ -182,7 +187,7 @@ break; case 1: s->state = DEVST_COMPLETE; - DEBUG(("\n bootp reply\n")); + dprintf("\n bootp reply\n"); break; } break; @@ -214,6 +219,11 @@ break; } break; + + default: + dprintf("\n"); + handled = 0; + break; } switch (s->state) { @@ -224,9 +234,6 @@ case DEVST_ERROR: /* error occurred, try again in 10 seconds */ s->expire = now + 10; - default: - DEBUG(("\n")); - handled = 0; break; } @@ -288,23 +295,30 @@ static struct state *slist; struct netdev *ifaces; +/* + * Returns: + * 0 = Error, packet not received or discarded + * 1 = A packet was received and handled + */ static int do_pkt_recv(int pkt_fd, time_t now) { int ifindex, ret; struct state *s; ret = packet_peek(&ifindex); - if (ret < 0) - goto bail; + if (ret == 0) + return ret; for (s = slist; s; s = s->next) { if (s->dev->ifindex == ifindex) { - ret |= process_receive_event(s, now); + ret = process_receive_event(s, now); break; } } - bail: + if (ret == 0) + packet_discard(); + return ret; } @@ -337,7 +351,7 @@ int x; for (s = slist; s; s = s->next) { - DEBUG(("%s: state = %d\n", s->dev->name, s->state)); + dprintf("%s: state = %d\n", s->dev->name, s->state); if (s->state == DEVST_COMPLETE) { done++; @@ -347,7 +361,7 @@ pending++; if (s->expire - now.tv_sec <= 0) { - DEBUG(("timeout\n")); + dprintf("timeout\n"); process_timeout_event(s, now.tv_sec); } @@ -371,11 +385,8 @@ gettimeofday(&now, NULL); if ((fds[0].revents & POLLRDNORM)) { - nr = do_pkt_recv(pkt_fd, now.tv_sec); - if (nr == 1) + if (do_pkt_recv(pkt_fd, now.tv_sec) == 1) break; - else if (nr == 0) - packet_discard(); } if (loop_timeout >= 0 && @@ -388,7 +399,7 @@ delta_ms = (now.tv_sec - prev.tv_sec) * 1000; delta_ms += (now.tv_usec - prev.tv_usec) / 1000; - DEBUG(("Delta: %d ms\n", delta_ms)); + dprintf("Delta: %d ms\n", delta_ms); timeout_ms -= delta_ms; } @@ -472,7 +483,7 @@ int i, opt; int is_ip = 0; - DEBUG(("IP-Config: parse_device: \"%s\"\n", ip)); + dprintf("IP-Config: parse_device: \"%s\"\n", ip); if (strncmp(ip, "ip=", 3) == 0) { ip += 3; @@ -504,7 +515,7 @@ if (*ip == '\0') continue; - DEBUG(("IP-Config: opt #%d: '%s'\n", opt, ip)); + dprintf("IP-Config: opt #%d: '%s'\n", opt, ip); switch (opt) { case 0: parse_addr(&dev->ip_addr, ip); @@ -522,6 +533,8 @@ case 4: strncpy(dev->hostname, ip, SYS_NMLN - 1); dev->hostname[SYS_NMLN - 1] = '\0'; + memcpy(dev->reqhostname, dev->hostname, + SYS_NMLN); break; case 5: dev->name = ip; @@ -569,6 +582,8 @@ dev->ip_nameserver[1] = template->ip_nameserver[1]; if (template->hostname[0] != '\0') strcpy(dev->hostname, template->hostname); + if (template->reqhostname[0] != '\0') + strcpy(dev->reqhostname, template->reqhostname); dev->caps &= template->caps; bringup_device(dev); @@ -651,7 +666,7 @@ logic the in-kernel ipconfig uses... */ if (!(flags & IFF_LOOPBACK) && (flags & (IFF_BROADCAST | IFF_POINTOPOINT))) { - DEBUG(("Trying to bring up %s\n", de->d_name)); + dprintf("Trying to bring up %s\n", de->d_name); if (!(dev = add_device(de->d_name))) continue;