Matthew Palmer <mpal...@debian.org> writes: > Index: netcfg/dhcp.c > =================================================================== > --- netcfg/dhcp.c (revision 66154) > +++ netcfg/dhcp.c (working copy) > @@ -521,6 +521,7 @@ (after udhcpc exited with a lease) > } > > netcfg_nameservers_to_array (nameservers, > nameserver_array); > + netcfg_write_resolv (domain, nameserver_array); > } > > state = HOSTNAME; > @@ -602,6 +603,16 @@ (in case DOMAIN:) > else { > netcfg_write_common(ipaddress, hostname, domain); > netcfg_write_dhcp(interface, dhostname); > + /* If the resolv.conf was written by udhcpc, then > nameserver_array > + * will be empty and we'll need to populate it. If we asked > for > + * the nameservers, then it'll be full, but nobody will care > if we > + * refill it. > + */ > + if (read_resolv_conf_nameservers(nameserver_array)) > + netcfg_write_resolv(domain, nameserver_array); > + else > + printf("Error reading resolv.conf for nameservers\n"); > + > return 0; > } > break;
Hi, This seems to do the job, but the control flow in netcfg is already convoluted enough, isn't there a better alternative? I mean, for a static configuration, netcfg_write_resolv is called from netcfg_write_static, can't we follow suit in netcfg_write_dhcp? If netcfg always removed resolv.conf before calling the DHCP client, then we could modify resolv_conf_entries to also populate nameserver_array, and then unconditionally write out resolv.conf in netcfg_write_dhcp, couldn't we? Just thinking out loud.... > @@ -646,3 +657,41 @@ > > return count; > } > + > +/* Read the nameserver entries out of resolv.conf and stick them into > + * nameservers_array, so we can write out a newer, shinier resolv.conf > + */ > +int read_resolv_conf_nameservers(struct in_addr array[]) > +{ > + FILE *f; > + int i = 0; > + > + if ((f = fopen(RESOLV_FILE, "r")) != NULL) { > + char buf[256]; > + > + while (fgets(buf, 256, f) != NULL) { > + char *ptr; > + > + if (strncmp(buf, "nameserver ", strlen("nameserver ")) == 0) { > + /* Chop off trailing \n */ > + while (buf[strlen(buf)-1] == '\n') > + buf[strlen(buf)-1] = '\0'; Why is this "while" instead of "if"? > + ptr = buf + strlen("nameserver "); > + inet_pton(AF_INET, ptr, &array[i++]); > + if (i == 3) { We really should use a global constant here (and in netcfg.h and in netcfg_nameservers_to_array at least) instead of the magic number 3... > + /* We can only hold so many nameservers, and we've > reached > + * our limit. Sorry. > + */ -- Regards, Feri. -- To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org