From: Roy Marples Date: Fri, 25 Jan 2008 10:18:13 +0000 (+0000) Subject: Store and validate the duid using our generic hwaddr_ calls X-Git-Tag: v3.2.3~66 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6d0509623a8376d5394da10f9a8d45c67709303c;p=thirdparty%2Fdhcpcd.git Store and validate the duid using our generic hwaddr_ calls --- diff --git a/duid.c b/duid.c index aafc703d..f2d75468 100644 --- a/duid.c +++ b/duid.c @@ -45,7 +45,7 @@ void get_duid (interface_t *iface) { - FILE *fp; + FILE *f; uint16_t type = 0; uint16_t hw = 0; uint32_t ul; @@ -62,28 +62,24 @@ void get_duid (interface_t *iface) /* If we already have a DUID then use it as it's never supposed * to change once we have one even if the interfaces do */ - if ((fp = fopen (DUIDFILE, "r"))) { - char *fduid; - char *fdp; - fduid = fdp = xmalloc ((sizeof (char) * DUID_LEN * 2) + 1); - if (fscanf (fp, "%260s", fduid) == 1) { - char c[3]; - c[2] = '\0'; - while (*fdp) { - c[0] = *fdp++; - c[1] = *fdp++; - *p++ = (char) strtol (c, NULL, 16); - } + if ((f = fopen (DUIDFILE, "r"))) { + char *duid = getline (f); + if (duid) { + iface->duid_length = hwaddr_aton (NULL, duid); + if (iface->duid_length && + iface->duid_length <= DUID_LEN) + hwaddr_aton (iface->duid, duid); + free (duid); + } + fclose (f); + if (iface->duid_length) + return; + } else { + if (errno != ENOENT) { + logger (LOG_ERR, "fopen `%s': %s", + DUIDFILE, strerror (errno)); + return; } - free (fduid); - iface->duid_length = p - iface->duid; - fclose (fp); - return; - } - - if (errno != ENOENT) { - logger (LOG_ERR, "fopen `%s': %s", DUIDFILE, strerror (errno)); - return; } /* No file? OK, lets make one based on our interface */ @@ -108,20 +104,19 @@ void get_duid (interface_t *iface) iface->duid_length = p - iface->duid; - if (! (fp = fopen (DUIDFILE, "w"))) + if (! (f = fopen (DUIDFILE, "w"))) logger (LOG_ERR, "fopen `%s': %s", DUIDFILE, strerror (errno)); else { - size_t i; - for (i = 0; i < iface->duid_length; i++) - x += fprintf (fp, "%.2X", iface->duid[i]); - fprintf (fp, "\n"); - fclose (fp); + x = fprintf (f, "%s\n", + hwaddr_ntoa (iface->duid, iface->duid_length)); + fclose (f); } /* Failed to write the duid? scrub it, we cannot use it */ if (x < 1) { memset (iface->duid, 0, sizeof (iface->duid)); iface->duid_length = 0; + unlink (DUIDFILE); } } #endif diff --git a/interface.c b/interface.c index 04364650..e634c18a 100644 --- a/interface.c +++ b/interface.c @@ -180,8 +180,6 @@ size_t hwaddr_aton (unsigned char *buffer, const char *addr) len++; } - printf ("vaid\n"); - if (bp) return (bp - buffer); return (len);