about summary refs log tree commit diff
path: root/sysdeps/unix/sysv
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv')
-rw-r--r--sysdeps/unix/sysv/linux/bits/socket.h7
-rw-r--r--sysdeps/unix/sysv/linux/if_index.c49
-rw-r--r--sysdeps/unix/sysv/linux/mips/bits/socket.h15
3 files changed, 49 insertions, 22 deletions
diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h
index a17c37fd8e..fd13e124a8 100644
--- a/sysdeps/unix/sysv/linux/bits/socket.h
+++ b/sysdeps/unix/sysv/linux/bits/socket.h
@@ -32,6 +32,9 @@
 
 __BEGIN_DECLS
 
+/* Type for length arguments in socket calls.  */
+typedef unsigned int socklen_t;
+
 /* Types of sockets.  */
 enum __socket_type
 {
@@ -130,14 +133,14 @@ enum
 struct msghdr
   {
     __ptr_t msg_name;		/* Address to send to/receive from.  */
-    int msg_namelen;		/* Length of address data.  */
-    /* XXX Should be type `socklen_t' according to POSIX.1g.  */
+    socklen_t msg_namelen;	/* Length of address data.  */
 
     struct iovec *msg_iov;	/* Vector of data to send/receive into.  */
     size_t msg_iovlen;		/* Number of elements in the vector.  */
 
     __ptr_t msg_control;	/* Ancillary data (eg BSD filedesc passing). */
     socklen_t msg_controllen;	/* Ancillary data buffer length.  */
+
     int msg_flags;		/* Flags on received message.  */
   };
 
diff --git a/sysdeps/unix/sysv/linux/if_index.c b/sysdeps/unix/sysv/linux/if_index.c
index 41bd0535c9..c8eefa9b98 100644
--- a/sysdeps/unix/sysv/linux/if_index.c
+++ b/sysdeps/unix/sysv/linux/if_index.c
@@ -66,20 +66,27 @@ opensock (void)
 unsigned int
 if_nametoindex (const char *ifname)
 {
+#ifndef SIOGIFINDEX
+  __set_errno (ENOSYS);
+#else
   struct ifreq ifr;
+  int rc;
   int fd = opensock ();
 
   if (fd < 0)
     return 0;
 
   strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
-  if (ioctl (fd, SIOGIFINDEX, &ifr) < 0)
+  rc = ioctl (fd, SIOGIFINDEX, &ifr);
+  if (rc < 0)
     {
       close (fd);
+      __set_errno (rc == -EINVAL ? ENOSYS : -rc);
       return 0;
     }
   close (fd);
   return ifr.ifr_ifindex;
+#endif
 }
 
 void
@@ -98,6 +105,11 @@ if_freenameindex (struct if_nameindex *ifn)
 struct if_nameindex *
 if_nameindex (void)
 {
+#ifndef SIOGIFINDEX
+  __set_errno (ENOSYS);
+  return NULL;
+#else
+  int rc;
   int fd = opensock ();
   struct ifconf ifc;
   unsigned int rq_ifs = 4, nifs, i;
@@ -141,10 +153,12 @@ if_nameindex (void)
 	  goto jump;
 	}
       strcpy (idx[i].if_name, ifr->ifr_name);
-      if (ioctl (fd, SIOGIFINDEX, ifr) < 0)
+      rc = ioctl (fd, SIOGIFINDEX, ifr);
+      if (rc < 0)
 	{
 	  free (idx);
 	  idx = NULL;
+	  __set_errno (rc == -EINVAL ? ENOSYS : -rc);
 	  goto jump;
 	}
       idx[i].if_index = ifr->ifr_ifindex;
@@ -156,22 +170,33 @@ jump:
   free (ifc.ifc_buf);
   close (fd);
   return idx;
+#endif
 }
 
 char *
 if_indextoname (unsigned int ifindex, char *ifname)
 {
+#ifndef SIOGIFINDEX
+  __set_errno (ENOSYS);
+  return NULL;
+#else
   struct if_nameindex *idx = if_nameindex ();
   struct if_nameindex *p;
+  char *result;
 
-  for (p = idx; p->if_index || p->if_name; ++p)
-    if (p->if_index == ifindex)
-      {
-	strncpy (ifname, p->if_name, IFNAMSIZ);
-	if_freenameindex (idx);
-	return ifname;
-      }
-
-  if_freenameindex (idx);
-  return NULL;
+  if (idx == NULL)
+    result = NULL;
+  else
+    {
+      for (p = idx; p->if_index || p->if_name; ++p)
+	if (p->if_index == ifindex)
+	  {
+	    result = strncpy (ifname, p->if_name, IFNAMSIZ);
+	    break;
+	  }
+
+      if_freenameindex (idx);
+    }
+  return result;
+#endif
 }
diff --git a/sysdeps/unix/sysv/linux/mips/bits/socket.h b/sysdeps/unix/sysv/linux/mips/bits/socket.h
index 15f420fc9c..02f1d22a6c 100644
--- a/sysdeps/unix/sysv/linux/mips/bits/socket.h
+++ b/sysdeps/unix/sysv/linux/mips/bits/socket.h
@@ -28,9 +28,11 @@
 #define __need_NULL
 #include <stddef.h>
 
-
 __BEGIN_DECLS
 
+/* Type for length arguments in socket calls.  */
+typedef unsigned int socklen_t;
+
 /* Supported address families. */
 #define PF_UNSPEC	0
 #define PF_UNIX		1		/* Unix domain sockets 		*/
@@ -103,25 +105,22 @@ enum
 struct msghdr
   {
     __ptr_t msg_name;		/* Address to send to/receive from.  */
-    int msg_namelen;		/* Length of address data.  */
-    /* XXX Should be type `size_t' according to POSIX.1g.  */
+    socklen_t msg_namelen;	/* Length of address data.  */
 
     struct iovec *msg_iov;	/* Vector of data to send/receive into.  */
     int msg_iovlen;		/* Number of elements in the vector.  */
-    /* XXX Should be type `size_t' according to POSIX.1g.  */
 
     __ptr_t msg_control;	/* Ancillary data (eg BSD filedesc passing). */
-    int msg_controllen;		/* Ancillary data buffer length.  */
-    /* XXX Should be type `size_t' according to POSIX.1g.  */
+    socklen_t msg_controllen;	/* Ancillary data buffer length.  */
+
     int msg_flags;		/* Flags on received message.  */
   };
 
 /* Structure used for storage of ancillary data object information.  */
 struct cmsghdr
   {
-    int cmsg_len;		/* Length of data in cmsg_data plus length
+    socklen_t cmsg_len;		/* Length of data in cmsg_data plus length
 				   of cmsghdr structure.  */
-    /* XXX Should be type `size_t' according to POSIX.1g.  */
     int cmsg_level;		/* Originating protocol.  */
     int cmsg_type;		/* Protocol specific type.  */
 #if !defined __STRICT_ANSI__ && defined __GNUC__ && __GNUC__ >= 2