Index: src/dhcpconfig.c =================================================================== --- src/dhcpconfig.c (revision 63) +++ src/dhcpconfig.c (working copy) @@ -389,6 +389,7 @@ struct stat buf; int resolvconf = 0; if ( ! stat("/sbin/resolvconf", &buf) ) { + logger(LOG_DEBUG, "sending DNS information to resolvconf"); resolvconf = 1; char *arg = malloc(strlen("/sbin/resolvconf -a ")+strlen(IfName)+1); snprintf(arg, strlen("/sbin/resolvconf -a ")+strlen(IfName)+1, @@ -420,7 +421,10 @@ ((unsigned char *)DhcpOptions.val[dns])[i+3]); if (resolvconf) - pclose(f); + { + logger(LOG_DEBUG, "resolvconf completed"); + pclose(f); + } else fclose(f); } @@ -432,6 +436,7 @@ * reread. Otherwise, we won't be able to find out about our hostname, * because the resolver won't notice the change in resolv.conf */ (void)res_init(); + logger(LOG_DEBUG, "done res_init"); } if ( ReplNISConf && (DhcpOptions.len[nisDomainName] || DhcpOptions.len[nisServers])) { Index: src/arp.c =================================================================== --- src/arp.c (revision 63) +++ src/arp.c (working copy) @@ -80,82 +80,102 @@ memcpy(&ArpMsgSend.tInaddr,&DhcpIface.ciaddr,4); logger(LOG_DEBUG, - "broadcasting ARPOP_REQUEST for %u.%u.%u.%u", - ArpMsgSend.tInaddr[0],ArpMsgSend.tInaddr[1], - ArpMsgSend.tInaddr[2],ArpMsgSend.tInaddr[3]); + "broadcasting ARPOP_REQUEST for %u.%u.%u.%u", + ArpMsgSend.tInaddr[0],ArpMsgSend.tInaddr[1], + ArpMsgSend.tInaddr[2],ArpMsgSend.tInaddr[3]); do { do - { - if ( i++ > 4 ) return 0; /* 5 probes */ - memset(&addr,0,sizeof(struct sockaddr)); - memcpy(addr.sa_data,IfName,IfName_len); + { + if ( i++ > 4 ) + { + logger(LOG_DEBUG, "sent all probes"); + return 0; /* 5 probes */ + } + logger(LOG_DEBUG, "sending probe %d", i); + memset(&addr,0,sizeof(struct sockaddr)); + memcpy(addr.sa_data,IfName,IfName_len); if ( TokenRingIf ) len = eth2tr(&ArpMsgSend.ethhdr,BasicArpLen(ArpMsgSend)); else len = sizeof(arpMessage); if ( sendto(dhcpSocket,&ArpMsgSend,len,0, - &addr,sizeof(struct sockaddr)) == -1 ) + &addr,sizeof(struct sockaddr)) == -1 ) { logger(LOG_ERR, "arpCheck: sendto: %m"); return -1; } - } + } while ( peekfd(dhcpSocket,50000) ); /* 50 msec timeout */ + logger(LOG_DEBUG, "done sending probes"); do - { - memset(&ArpMsgRecv,0,sizeof(arpMessage)); - slen = sizeof(struct sockaddr); - if ( recvfrom(dhcpSocket,&ArpMsgRecv,sizeof(arpMessage),0, - (struct sockaddr *)&addr, &slen) == -1 ) - { - logger(LOG_ERR, "arpCheck: recvfrom: %m"); - return -1; - } + { + logger(LOG_DEBUG, "waiting ARP reply"); + memset(&ArpMsgRecv,0,sizeof(arpMessage)); + slen = sizeof(struct sockaddr); + if ( recvfrom(dhcpSocket,&ArpMsgRecv,sizeof(arpMessage),0, + (struct sockaddr *)&addr, &slen) == -1 ) + { + logger(LOG_ERR, "arpCheck: recvfrom: %m"); + return -1; + } if ( TokenRingIf ) { - if ( tr2eth(&ArpMsgRecv.ethhdr) ) continue; + if ( tr2eth(&ArpMsgRecv.ethhdr) ) + { + logger(LOG_DEBUG, "wtf"); + continue; + } } if ( ArpMsgRecv.ethhdr.ether_type != htons(ETHERTYPE_ARP) ) - continue; - if ( ArpMsgRecv.operation == htons(ARPOP_REPLY) ) { + logger(LOG_DEBUG, "not ethernet ARP"); + continue; + } + if ( ArpMsgRecv.operation == htons(ARPOP_REPLY) ) + { logger(LOG_DEBUG, - "ARPOP_REPLY received from %u.%u.%u.%u for %u.%u.%u.%u", - ArpMsgRecv.sInaddr[0],ArpMsgRecv.sInaddr[1], - ArpMsgRecv.sInaddr[2],ArpMsgRecv.sInaddr[3], - ArpMsgRecv.tInaddr[0],ArpMsgRecv.tInaddr[1], - ArpMsgRecv.tInaddr[2],ArpMsgRecv.tInaddr[3]); + "ARPOP_REPLY received from %u.%u.%u.%u for %u.%u.%u.%u", + ArpMsgRecv.sInaddr[0],ArpMsgRecv.sInaddr[1], + ArpMsgRecv.sInaddr[2],ArpMsgRecv.sInaddr[3], + ArpMsgRecv.tInaddr[0],ArpMsgRecv.tInaddr[1], + ArpMsgRecv.tInaddr[2],ArpMsgRecv.tInaddr[3]); } - else - continue; + else + { + logger(LOG_DEBUG, "not ARPOP_REPLY"); + continue; + } if ( memcmp(ArpMsgRecv.tHaddr,ClientHwAddr,ETH_ALEN) ) { - logger(LOG_DEBUG, - "target hardware address mismatch: %02X.%02X.%02X.%02X.%02X.%02X received, %02X.%02X.%02X.%02X.%02X.%02X expected", - ArpMsgRecv.tHaddr[0],ArpMsgRecv.tHaddr[1],ArpMsgRecv.tHaddr[2], - ArpMsgRecv.tHaddr[3],ArpMsgRecv.tHaddr[4],ArpMsgRecv.tHaddr[5], - ClientHwAddr[0],ClientHwAddr[1], - ClientHwAddr[2],ClientHwAddr[3], - ClientHwAddr[4],ClientHwAddr[5]); - // continue; + logger(LOG_DEBUG, + "target hardware address mismatch: %02X.%02X.%02X.%02X.%02X.%02X received, %02X.%02X.%02X.%02X.%02X.%02X expected", + ArpMsgRecv.tHaddr[0],ArpMsgRecv.tHaddr[1],ArpMsgRecv.tHaddr[2], + ArpMsgRecv.tHaddr[3],ArpMsgRecv.tHaddr[4],ArpMsgRecv.tHaddr[5], + ClientHwAddr[0],ClientHwAddr[1], + ClientHwAddr[2],ClientHwAddr[3], + ClientHwAddr[4],ClientHwAddr[5]); + continue; } - if ( memcmp(&ArpMsgRecv.sInaddr,&DhcpIface.ciaddr,4) ) + if ( memcmp(&ArpMsgRecv.sInaddr,&DhcpIface.ciaddr,4) ) { logger(LOG_DEBUG, - "sender IP address mismatch: %u.%u.%u.%u received, %u.%u.%u.%u expected", - ArpMsgRecv.sInaddr[0],ArpMsgRecv.sInaddr[1],ArpMsgRecv.sInaddr[2],ArpMsgRecv.sInaddr[3], - ((unsigned char *)&DhcpIface.ciaddr)[0], - ((unsigned char *)&DhcpIface.ciaddr)[1], - ((unsigned char *)&DhcpIface.ciaddr)[2], - ((unsigned char *)&DhcpIface.ciaddr)[3]); + "sender IP address mismatch: %u.%u.%u.%u received, %u.%u.%u.%u expected", + ArpMsgRecv.sInaddr[0],ArpMsgRecv.sInaddr[1],ArpMsgRecv.sInaddr[2],ArpMsgRecv.sInaddr[3], + ((unsigned char *)&DhcpIface.ciaddr)[0], + ((unsigned char *)&DhcpIface.ciaddr)[1], + ((unsigned char *)&DhcpIface.ciaddr)[2], + ((unsigned char *)&DhcpIface.ciaddr)[3]); continue; } - return 1; - } + logger(LOG_DEBUG, "return 1"); + return 1; + } while ( peekfd(dhcpSocket,50000) == 0 ); + logger(LOG_DEBUG, "timeout"); } while ( 1 ); + logger(LOG_DEBUG, "how"); return 0; } /*****************************************************************************/ @@ -165,20 +185,20 @@ struct sockaddr addr; int len; -/* build Ethernet header */ + /* build Ethernet header */ memset(&ArpMsgSend,0,sizeof(arpMessage)); memcpy(ArpMsgSend.ethhdr.ether_dhost,MAC_BCAST_ADDR,ETH_ALEN); memcpy(ArpMsgSend.ethhdr.ether_shost,ClientHwAddr,ETH_ALEN); ArpMsgSend.ethhdr.ether_type = htons(ETHERTYPE_ARP); -/* build UNARP message */ + /* build UNARP message */ ArpMsgSend.htype = (TokenRingIf) ? htons(ARPHRD_IEEE802_TR) : htons(ARPHRD_ETHER); ArpMsgSend.ptype = htons(ETHERTYPE_IP); ArpMsgSend.plen = 4; ArpMsgSend.operation = htons(ARPOP_REPLY); memcpy(&ArpMsgSend.sInaddr,&DhcpIface.ciaddr,4); memcpy(&ArpMsgSend.tInaddr,&inaddr_broadcast,4); - + memset(&addr,0,sizeof(struct sockaddr)); memcpy(addr.sa_data,IfName,IfName_len); if ( TokenRingIf ) @@ -214,7 +234,7 @@ memcpy(ArpMsgSend.tHaddr,DhcpIface.shaddr,ETH_ALEN); memcpy(ArpMsgSend.sInaddr,&DhcpIface.ciaddr,4); memcpy(ArpMsgSend.tInaddr,&inaddr_broadcast,4); - + memset(&addr,0,sizeof(struct sockaddr)); memcpy(addr.sa_data,IfName,IfName_len); if ( TokenRingIf )