diff options
author | ps <ps@FreeBSD.org> | 2006-02-02 19:58:37 +0000 |
---|---|---|
committer | ps <ps@FreeBSD.org> | 2006-02-02 19:58:37 +0000 |
commit | 5025ffa6d7b9fd52c83ce82c2301f94b93127a49 (patch) | |
tree | 36b70587703e5ca6ebc8b744205d0a4ca7b61cb0 /sys/net | |
parent | b0da6f80ec5fdfbdcd357918a01e1734039ac784 (diff) | |
download | FreeBSD-src-5025ffa6d7b9fd52c83ce82c2301f94b93127a49.zip FreeBSD-src-5025ffa6d7b9fd52c83ce82c2301f94b93127a49.tar.gz |
Implement SIOCGIFCONF for 32bit binaries.
Diffstat (limited to 'sys/net')
-rw-r--r-- | sys/net/if.c | 22 | ||||
-rw-r--r-- | sys/net/if.h | 9 |
2 files changed, 31 insertions, 0 deletions
diff --git a/sys/net/if.c b/sys/net/if.c index 814815b..e1811a3 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -191,6 +191,10 @@ netioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *td */ if (cmd == SIOCGIFCONF) return (ifconf(cmd, data)); /* XXX remove cmd */ +#ifdef __amd64__ + if (cmd == SIOCGIFCONF32) + return (ifconf(cmd, data)); /* XXX remove cmd */ +#endif return (EOPNOTSUPP); } @@ -1493,6 +1497,9 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td) switch (cmd) { case SIOCGIFCONF: case OSIOCGIFCONF: +#ifdef __amd64__ + case SIOCGIFCONF32: +#endif return (ifconf(cmd, data)); } ifr = (struct ifreq *)data; @@ -1699,12 +1706,23 @@ static int ifconf(u_long cmd, caddr_t data) { struct ifconf *ifc = (struct ifconf *)data; +#ifdef __amd64__ + struct ifconf32 *ifc32 = (struct ifconf32 *)data; + struct ifconf ifc_swab; +#endif struct ifnet *ifp; struct ifaddr *ifa; struct ifreq ifr; struct sbuf *sb; int error, full = 0, valid_len, max_len; +#ifdef __amd64__ + if (cmd == SIOCGIFCONF32) { + ifc_swab.ifc_len = ifc32->ifc_len; + ifc_swab.ifc_buf = (caddr_t)(uintptr_t)ifc32->ifc_buf; + ifc = &ifc_swab; + } +#endif /* Limit initial buffer size to MAXPHYS to avoid DoS from userspace. */ max_len = MAXPHYS - 1; @@ -1793,6 +1811,10 @@ again: } ifc->ifc_len = valid_len; +#ifdef __amd64__ + if (cmd == SIOCGIFCONF32) + ifc32->ifc_len = valid_len; +#endif sbuf_finish(sb); error = copyout(sbuf_data(sb), ifc->ifc_req, ifc->ifc_len); sbuf_delete(sb); diff --git a/sys/net/if.h b/sys/net/if.h index 8e483cc..4e97601 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -348,6 +348,15 @@ struct ifconf { #define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ }; +#if defined (__amd64__) || defined (COMPAT_32BIT) +struct ifconf32 { + int ifc_len; /* size of associated buffer */ + union { + u_int ifcu_buf; + u_int ifcu_req; + } ifc_ifcu; +}; +#endif /* * Structure for SIOC[AGD]LIFADDR |