Hi.
I noticed that -current's SIOC[GZ]IFDATA doesn't work correctly.
It's OK on netbsd-8.
static int
doifioctl(struct socket *so, u_long cmd, void *data, struct lwp *l)
{
struct ifnet *ifp;
struct ifreq *ifr;
int error = 0;
#if defined(COMPAT_OSOCK) || defined(COMPAT_OIFREQ)
u_long ocmd = cmd;
#endif
short oif_flags;
#ifdef COMPAT_OIFREQ
struct ifreq ifrb;
struct oifreq *oifr = NULL;
#endif
int r;
struct psref psref;
int bound;
switch (cmd) {
case SIOCGIFCONF:
return ifconf(cmd, data);
case SIOCINITIFADDR:
return EPERM;
default:
error = (*vec_compat_ifconf)(l, cmd, data);
if (error != ENOSYS)
return error;
error = (*vec_compat_ifdatareq)(l, cmd, data);
if (error != ENOSYS) <<==================
return error;
break;
}
The call of vec_compat_ifdatareq() always returns other than ENOSYS.
Patch:
----------------
Index: uipc_syscalls_50.c
===================================================================
RCS file: /cvsroot/src/sys/compat/common/uipc_syscalls_50.c,v
retrieving revision 1.5
diff -u -p -r1.5 uipc_syscalls_50.c
--- uipc_syscalls_50.c 26 Apr 2018 08:11:18 -0000 1.5
+++ uipc_syscalls_50.c 11 Sep 2018 09:45:31 -0000
@@ -65,23 +65,24 @@ compat_ifdatareq(struct lwp *l, u_long c
/* Validate arguments. */
switch (cmd) {
- case SIOCGIFDATA:
- case SIOCZIFDATA:
- ifp = ifunit(ifdr->ifdr_name);
- if (ifp == NULL)
- return ENXIO;
+ case OSIOCGIFDATA:
+ case OSIOCZIFDATA:
break;
default:
return ENOSYS;
}
+ ifp = ifunit(ifdr->ifdr_name);
+ if (ifp == NULL)
+ return ENXIO;
+
/* Do work. */
switch (cmd) {
- case SIOCGIFDATA:
+ case OSIOCGIFDATA:
ifdatan2o(&ifdr->ifdr_data, &ifp->if_data);
return 0;
- case SIOCZIFDATA:
+ case OSIOCZIFDATA:
if (l != NULL) {
error = kauth_authorize_network(l->l_cred,
KAUTH_NETWORK_INTERFACE,
----------------
OK?
--
-----------------------------------------------
SAITOH Masanobu (msai...@execsw.org
msai...@netbsd.org)