changeset 83:28623d1e2c59 draft

Use strlcpy if available, if not define our own.
author Roy Marples <roy@marples.name>
date Thu, 05 Apr 2007 17:31:05 +0000
parents 550f223e6a0f
children bb98e91a2fea
files common.c common.h configure.c dhcp.c dhcpcd.c interface.c socket.c
diffstat 7 files changed, 45 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/common.c	Thu Apr 05 16:56:58 2007 +0000
+++ b/common.c	Thu Apr 05 17:31:05 2007 +0000
@@ -27,15 +27,32 @@
 #include "common.h"
 #include "logger.h"
 
-/* A way of safely handling strncpy */
-char *safe_strncpy (char *dst, const char *src, size_t size)
+/* strlcpy is nice, shame glibc does not define it */
+#ifdef __GLIBC__
+size_t strlcpy (char *dst, const char *src, size_t size)
 {
-  if (! size)
-    return dst;
+  const char *s = src;
+  size_t n = size;
+
+  if (n && --n)
+    do
+      {
+	if (! (*dst++ = *src++))
+	  break;
+      }
+    while (--n);
 
-  dst[--size] = '\0';
-  return strncpy (dst, src, size);
+  if (! n)
+    {
+      if (size)
+	*dst = '\0';
+      while (*src++)
+	;
+    }
+
+  return (src - s - 1);
 }
+#endif
 
 /* This requires us to link to rt on glibc, so we use sysinfo instead */
 #ifdef __linux__
--- a/common.h	Thu Apr 05 16:56:58 2007 +0000
+++ b/common.h	Thu Apr 05 17:31:05 2007 +0000
@@ -22,7 +22,10 @@
 #ifndef COMMON_H
 #define COMMON_H
 
-char *safe_strncpy (char *dst, const char *src, size_t size);
+#ifdef __GLIBC__
+size_t strlcpy (char *dst, const char *src, size_t size);
+#endif
+
 long uptime (void);
 void *xmalloc (size_t size);
 
--- a/configure.c	Thu Apr 05 16:56:58 2007 +0000
+++ b/configure.c	Thu Apr 05 17:31:05 2007 +0000
@@ -689,7 +689,7 @@
       || strcmp (curhostname, "localhost") == 0)
     {
       if (dhcp->hostname)
-	safe_strncpy (newhostname, dhcp->hostname, sizeof (newhostname)); 
+	strlcpy (newhostname, dhcp->hostname, sizeof (newhostname)); 
 
       if (*newhostname)
 	{
--- a/dhcp.c	Thu Apr 05 16:56:58 2007 +0000
+++ b/dhcp.c	Thu Apr 05 17:31:05 2007 +0000
@@ -513,7 +513,7 @@
   memset (first_route, 0, sizeof (route_t));
 
   dhcp->address.s_addr = message->yiaddr;
-  safe_strncpy (dhcp->servername, message->servername,
+  strlcpy (dhcp->servername, message->servername,
 		sizeof (dhcp->servername));
 
 #define LEN_ERR \
--- a/dhcpcd.c	Thu Apr 05 16:56:58 2007 +0000
+++ b/dhcpcd.c	Thu Apr 05 17:31:05 2007 +0000
@@ -206,7 +206,7 @@
 	    exit (EXIT_FAILURE);
 	  }
 	else
-	  safe_strncpy (options.hostname, optarg, sizeof (options.hostname));
+	  strlcpy (options.hostname, optarg, sizeof (options.hostname));
 	break;
       case 'i':
 	if (strlen (optarg) > CLASS_ID_MAX_LEN)
@@ -216,7 +216,7 @@
 	    exit (EXIT_FAILURE);
 	  }
 	else
-	  sprintf (options.classid, "%s", optarg);
+	  strlcpy (options.classid, optarg, sizeof (options.classid));
 	break;
       case 'k':
 	options.signal = SIGHUP;
@@ -298,7 +298,7 @@
 	    exit (EXIT_FAILURE);
 	  }
 	else
-	  sprintf(options.clientid, "%s", optarg);
+	  strlcpy (options.clientid, optarg, sizeof (options.clientid));
 	break;
       case 'M':
 	options.domtu = false;
@@ -334,7 +334,7 @@
 		  argv[optind], IF_NAMESIZE);
 	  exit (EXIT_FAILURE);
 	}
-      safe_strncpy (options.interface, argv[optind],
+      strlcpy (options.interface, argv[optind],
 		    sizeof (options.interface));
     }
   else
--- a/interface.c	Thu Apr 05 16:56:58 2007 +0000
+++ b/interface.c	Thu Apr 05 17:31:05 2007 +0000
@@ -190,7 +190,7 @@
 #endif
 
   memset (&ifr, 0, sizeof (struct ifreq));
-  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if ((s = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
     {
       logger (LOG_ERR, "socket: %s", strerror (errno));
@@ -200,7 +200,7 @@
 #ifdef __linux__
   /* Do something with the metric parameter to satisfy the compiler warning */
   metric = 0;
-  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if (ioctl (s, SIOCGIFHWADDR, &ifr) <0)
     {
       logger (LOG_ERR, "ioctl SIOCGIFHWADDR: %s", strerror (errno));
@@ -227,7 +227,7 @@
   family = ifr.ifr_hwaddr.sa_family;
 #else
   ifr.ifr_metric = metric;
-  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if (ioctl (s, SIOCSIFMETRIC, &ifr) < 0)
     {
       logger (LOG_ERR, "ioctl SIOCSIFMETRIC: %s", strerror (errno));
@@ -236,7 +236,7 @@
     }
 #endif
 
-  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if (ioctl(s, SIOCGIFMTU, &ifr) < 0)
     {
       logger (LOG_ERR, "ioctl SIOCGIFMTU: %s", strerror (errno));
@@ -247,7 +247,7 @@
     {
       logger (LOG_DEBUG, "MTU of %d is too low, setting to %d", ifr.ifr_mtu, MTU_MIN);
       ifr.ifr_mtu = MTU_MIN;
-      safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+      strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
       if (ioctl(s, SIOCSIFMTU, &ifr) < 0)
 	{
 	  logger (LOG_ERR, "ioctl SIOCSIFMTU,: %s", strerror (errno));
@@ -257,7 +257,7 @@
     }
   mtu = ifr.ifr_mtu;
 
-  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0)
     {
       logger (LOG_ERR, "ioctl SIOCGIFFLAGS: %s", strerror (errno));
@@ -266,7 +266,7 @@
     }
 
   ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
-  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0)
     {
       logger (LOG_ERR, "ioctl SIOCSIFFLAGS: %s", strerror (errno));
@@ -278,7 +278,7 @@
 
   iface = xmalloc (sizeof (interface_t));
   memset (iface, 0, sizeof (interface_t));
-  safe_strncpy (iface->name, ifname, IF_NAMESIZE);
+  strlcpy (iface->name, ifname, IF_NAMESIZE);
   snprintf (iface->infofile, PATH_MAX, INFOFILE, ifname);
   memcpy (&iface->hwaddr, hwaddr, hwlen);
   iface->hwlen = hwlen;
@@ -309,7 +309,7 @@
     }
 
   memset (&ifr, 0, sizeof (struct ifreq));
-  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   r = ioctl (s, SIOCGIFMTU, &ifr);
   close (s);
 
@@ -336,7 +336,7 @@
 
   memset (&ifr, 0, sizeof (struct ifreq));
   logger (LOG_DEBUG, "setting MTU to %d", mtu);
-  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   ifr.ifr_mtu = mtu;
   r = ioctl (s, SIOCSIFMTU, &ifr);
   close (s);
@@ -365,7 +365,7 @@
     }
 
   memset (&ifa, 0, sizeof (ifa));
-  safe_strncpy (ifa.ifra_name, ifname, sizeof (ifa.ifra_name));
+  strlcpy (ifa.ifra_name, ifname, sizeof (ifa.ifra_name));
 
 #define ADDADDR(_var, _addr) \
     { \
--- a/socket.c	Thu Apr 05 16:56:58 2007 +0000
+++ b/socket.c	Thu Apr 05 17:31:05 2007 +0000
@@ -262,7 +262,7 @@
     }
 
   memset (&ifr, 0, sizeof (struct ifreq));
-  safe_strncpy (ifr.ifr_name, iface->name, sizeof (ifr.ifr_name));
+  strlcpy (ifr.ifr_name, iface->name, sizeof (ifr.ifr_name));
   if (ioctl (fd, BIOCSETIF, &ifr) < 0)
     {
       logger (LOG_ERR, "cannot attach interface `%s' to bpf device `%s': %s",