Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

SIOCGIFCONF ioctl family problems under compat netbsd32



Hi,
There was recently a report that SIOCGIFCONF ioctl doesn't work on
amd64 under compat linux32.
A quick look showed that netbsd32 SIOCGIFCONFs requests were
outdated. The attached patch update them to match the natives ones;
but some problems remains.
Here is a small testcase, i use to exercise SIOCGIFCONF, OSIOCGIFCONF,
and OOSIOCGIFCONF under compat netbsd32.
- OOSIOCGIFCONF, used by compat linux32 seems to work fine.
- OSIOCGIFCONF, used by NetBSD/i386 4.0 binary produce garbage.
- SIOCGIFCONF, use by NetBSD/i386 -current binary seems to work too.
I'm currently looking for fixing the remaining problem for
OSIOCGIFCONF, but got no more clues ...
Any help will be appreciated.
Thanks.
-- 
Nicolas Joly
Biological Software and Databanks.
Institut Pasteur, Paris.
Index: sys/compat/netbsd32/netbsd32_ioctl.c
===================================================================
RCS file: /cvsroot/src/sys/compat/netbsd32/netbsd32_ioctl.c,v
retrieving revision 1.39
diff -u -p -r1.39 netbsd32_ioctl.c
--- sys/compat/netbsd32/netbsd32_ioctl.c 29 May 2008 14:51:26 -0000 
1.39
+++ sys/compat/netbsd32/netbsd32_ioctl.c 23 Jun 2008 08:40:54 -0000
@@ -490,6 +490,8 @@ printf("netbsd32_ioctl(%d, %x, %x): %s g
 IOCTL_STRUCT_CONV_TO(SIOCPHASE2, ifreq);
 #endif
 
+ case OOSIOCGIFCONF32:
+ IOCTL_STRUCT_CONV_TO(OOSIOCGIFCONF, ifconf);
 case OSIOCGIFCONF32:
 IOCTL_STRUCT_CONV_TO(OSIOCGIFCONF, ifconf);
 case SIOCGIFCONF32:
Index: sys/compat/netbsd32/netbsd32_ioctl.h
===================================================================
RCS file: /cvsroot/src/sys/compat/netbsd32/netbsd32_ioctl.h,v
retrieving revision 1.23
diff -u -p -r1.23 netbsd32_ioctl.h
--- sys/compat/netbsd32/netbsd32_ioctl.h 22 Jun 2008 22:40:15 -0000 
1.23
+++ sys/compat/netbsd32/netbsd32_ioctl.h 23 Jun 2008 08:40:54 -0000
@@ -220,8 +220,9 @@ struct netbsd32_ifconf {
 };
 #if 1
 /* from <sys/sockio.h> */
-#define OSIOCGIFCONF32 _IOWR('i', 20, struct netbsd32_ifconf) /* get 
ifnet list */
-#define SIOCGIFCONF32 _IOWR('i', 36, struct netbsd32_ifconf) /* get 
ifnet list */
+#define OOSIOCGIFCONF32 _IOWR('i', 20, struct netbsd32_ifconf) /* get 
ifnet list */
+#define OSIOCGIFCONF32 _IOWR('i', 36, struct netbsd32_ifconf) /* get 
ifnet list */
+#define SIOCGIFCONF32 _IOWR('i', 38, struct netbsd32_ifconf) /* get 
ifnet list */
 #endif
 
 /* from <net/if.h> */
#include <arpa/inet.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
 char *buf;
 int res, fd;
 size_t len;
 struct ifconf cnf;
 size_t l;
 struct ifreq *cur;
 struct sockaddr *adr;
 fd = socket(AF_INET, SOCK_DGRAM, 0);
 if (fd == -1)
 err(1, "socket failed");
 len = 20 * sizeof(struct ifreq);
 buf = malloc(len);
 if (buf == NULL)
 err(1, "malloc failed");
 cnf.ifc_buf = buf;
 cnf.ifc_len = len;
 res = ioctl(fd, SIOCGIFCONF, &cnf);
 if (res == -1)
 err(1, "ioctl failed");
 if (cnf.ifc_len == len)
 errx(1, "ioctl data overflow");
 if ((cnf.ifc_len % sizeof(struct ifreq)) != 0)
 errx(1, "ioctl bogus size");
 cur = cnf.ifc_req; l = cnf.ifc_len;
 while (l) {
 adr = (struct sockaddr *)&cur->ifr_addr;
 printf("%s %d\n", cur->ifr_name, (int)adr->sa_family);
 cur++; l -= sizeof(struct ifreq); }
 free(buf);
 res = close(fd);
 if (res == -1)
 err(1, "close failed");
 return 0; }


Home | Main Index | Thread Index | Old Index

AltStyle によって変換されたページ (->オリジナル) /