Put back the previous hack to make compat_cvtcmd() work for all the ioctls

that use struct ifreq which have not been explicitly versioned.
If someone feels like fixing it with a list aproach, I think below is
a complete list - the one used in the previous version missed a lot of them.

BIOCGETIF
BIOCSETIF
GREDSOCK
GREGADDRD
GREGADDRS
GREGPROTO
GRESADDRD
GRESADDRS
GRESPROTO
GRESSOCK
SIOCADDMULTI
SIOCDELMULTI
SIOCDIFADDR
SIOCDIFADDR_IN6
SIOCDIFPHYADDR
SIOCGDEFIFACE_IN6
SIOCGIFADDR
SIOCGIFADDR_IN6
SIOCGIFAFLAG_IN6
SIOCGIFALIFETIME_IN6
SIOCGIFBRDADDR
SIOCGIFDLT
SIOCGIFDSTADDR
SIOCGIFDSTADDR_IN6
SIOCGIFFLAGS
SIOCGIFGENERIC
SIOCGIFMETRIC
SIOCGIFMTU
SIOCGIFNETMASK
SIOCGIFNETMASK_IN6
SIOCGIFPDSTADDR
SIOCGIFPDSTADDR_IN6
SIOCGIFPSRCADDR
SIOCGIFPSRCADDR_IN6
SIOCGIFSTAT_ICMP6
SIOCGIFSTAT_IN6
SIOCGPVCSIF
SIOCGVH
SIOCIFCREATE
SIOCIFDESTROY
SIOCSDEFIFACE_IN6
SIOCSIFADDR
SIOCSIFADDR_IN6
SIOCSIFALIFETIME_IN6
SIOCSIFBRDADDR
SIOCSIFDSTADDR
SIOCSIFDSTADDR_IN6
SIOCSIFFLAGS
SIOCSIFGENERIC
SIOCSIFMEDIA
SIOCSIFMETRIC
SIOCSIFMTU
SIOCSIFNETMASK
SIOCSIFNETMASK_IN6
SIOCSNDFLUSH_IN6
SIOCSPFXFLUSH_IN6
SIOCSPVCSIF
SIOCSRTRFLUSH_IN6
SIOCSVH
TAPGIFNAME
This commit is contained in:
martin 2007-08-20 16:52:59 +00:00
parent 3749a6a002
commit 1bcc2150d3
1 changed files with 17 additions and 28 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: uipc_syscalls_43.c,v 1.33 2007/08/20 04:49:41 skd Exp $ */
/* $NetBSD: uipc_syscalls_43.c,v 1.34 2007/08/20 16:52:59 martin Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1990, 1993
@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls_43.c,v 1.33 2007/08/20 04:49:41 skd Exp $");
__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls_43.c,v 1.34 2007/08/20 16:52:59 martin Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -389,37 +389,26 @@ compat_43_sa_put(from)
return (0);
}
/*
* XXX: The following check depends on the fact that the only struct
* sized 0x20 bytes in the ifioctls is struct oifreq and struct ifcapreq.
* If that changes, then we'll need to use an explicit list here.
* (But the actual list is ~60 entries long and uses includes all over
* the tree...)
*/
u_long
compat_cvtcmd(u_long cmd)
{
u_long ncmd;
switch (cmd) {
case OSIOCSIFADDR:
case OOSIOCGIFADDR:
case OSIOCSIFDSTADDR:
case OOSIOCGIFDSTADDR:
case OSIOCSIFFLAGS:
case OSIOCGIFFLAGS:
case OOSIOCGIFBRDADDR:
case OSIOCSIFBRDADDR:
case OOSIOCGIFCONF:
case OOSIOCGIFNETMASK:
case OSIOCSIFNETMASK:
case OSIOCGIFCONF:
case OSIOCADDMULTI:
case OSIOCDELMULTI:
case OSIOCSIFMEDIA:
case OBIOCGETIF:
case OBIOCSETIF:
case OTAPGIFNAME:
ncmd = ((cmd) & ~(IOCPARM_MASK << IOCPARM_SHIFT)) |
(sizeof(struct ifreq) << IOCPARM_SHIFT);
break;
default:
ncmd = cmd;
}
return (ncmd);
#define ifcapreq(x) ((x) == SIOCGIFCAP || (x) == SIOCSIFCAP)
ncmd = ((IOCPARM_LEN(cmd) == sizeof(struct oifreq) && !ifcapreq(cmd)) ?
((cmd & ~(IOCPARM_MASK << IOCPARM_SHIFT)) |
(sizeof(struct ifreq) << IOCPARM_SHIFT)) : cmd);
return ncmd;
}
int