mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:47:36 +00:00
Kernel: Add some missing socket ioctls
This patch adds a few missing ioctls which were required by Wine. SIOCGIFNETMASK, SIOCGIFBRDADDR and SIOCGIFMTU are fully implemented, while SIOCGIFFLAGS and SIOCGIFCONF are stubs.
This commit is contained in:
parent
afb04cf544
commit
091d352526
2 changed files with 71 additions and 0 deletions
|
@ -578,6 +578,17 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, FlatPtr arg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case SIOCGIFNETMASK: {
|
||||||
|
u16 sa_family = AF_INET;
|
||||||
|
if (!copy_to_user(&user_ifr->ifr_addr.sa_family, &sa_family))
|
||||||
|
return -EFAULT;
|
||||||
|
auto ip4_netmask = adapter->ipv4_netmask().to_u32();
|
||||||
|
// NOTE: NOT ifr_netmask.
|
||||||
|
if (!copy_to_user(&((sockaddr_in&)user_ifr->ifr_addr).sin_addr.s_addr, &ip4_netmask, sizeof(ip4_netmask)))
|
||||||
|
return -EFAULT;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
case SIOCGIFHWADDR: {
|
case SIOCGIFHWADDR: {
|
||||||
u16 sa_family = AF_INET;
|
u16 sa_family = AF_INET;
|
||||||
if (!copy_to_user(&user_ifr->ifr_hwaddr.sa_family, &sa_family))
|
if (!copy_to_user(&user_ifr->ifr_hwaddr.sa_family, &sa_family))
|
||||||
|
@ -587,6 +598,51 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, FlatPtr arg)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case SIOCGIFBRDADDR: {
|
||||||
|
u16 sa_family = AF_INET;
|
||||||
|
if (!copy_to_user(&user_ifr->ifr_addr.sa_family, &sa_family))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
// Broadcast address is basically the reverse of the netmask, i.e.
|
||||||
|
// instead of zeroing out the end, you OR with 1 instead.
|
||||||
|
auto ip4_netmask = adapter->ipv4_netmask().to_u32();
|
||||||
|
auto broadcast_addr = adapter->ipv4_address().to_u32() | ~ip4_netmask;
|
||||||
|
|
||||||
|
if (!copy_to_user(&((sockaddr_in&)user_ifr->ifr_addr).sin_addr.s_addr, &broadcast_addr, sizeof(broadcast_addr)))
|
||||||
|
return -EFAULT;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SIOCGIFMTU: {
|
||||||
|
u16 sa_family = AF_INET;
|
||||||
|
if (!copy_to_user(&user_ifr->ifr_addr.sa_family, &sa_family))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
auto ip4_metric = adapter->mtu();
|
||||||
|
|
||||||
|
if (!copy_to_user(&user_ifr->ifr_metric, &ip4_metric, sizeof(ip4_metric)))
|
||||||
|
return -EFAULT;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SIOCGIFFLAGS: {
|
||||||
|
u16 sa_family = AF_INET;
|
||||||
|
if (!copy_to_user(&user_ifr->ifr_addr.sa_family, &sa_family))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
// FIXME: stub!
|
||||||
|
short flags = 1;
|
||||||
|
|
||||||
|
if (!copy_to_user(&user_ifr->ifr_flags, &flags, sizeof(flags)))
|
||||||
|
return -EFAULT;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SIOCGIFCONF: {
|
||||||
|
// FIXME: stub!
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -597,6 +653,11 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, FlatPtr arg)
|
||||||
case SIOCSIFNETMASK:
|
case SIOCSIFNETMASK:
|
||||||
case SIOCGIFADDR:
|
case SIOCGIFADDR:
|
||||||
case SIOCGIFHWADDR:
|
case SIOCGIFHWADDR:
|
||||||
|
case SIOCGIFNETMASK:
|
||||||
|
case SIOCGIFBRDADDR:
|
||||||
|
case SIOCGIFMTU:
|
||||||
|
case SIOCGIFFLAGS:
|
||||||
|
case SIOCGIFCONF:
|
||||||
return ioctl_interface();
|
return ioctl_interface();
|
||||||
|
|
||||||
case SIOCADDRT:
|
case SIOCADDRT:
|
||||||
|
|
|
@ -66,7 +66,12 @@ enum IOCtlNumber {
|
||||||
SIOCSIFADDR,
|
SIOCSIFADDR,
|
||||||
SIOCGIFADDR,
|
SIOCGIFADDR,
|
||||||
SIOCGIFHWADDR,
|
SIOCGIFHWADDR,
|
||||||
|
SIOCGIFNETMASK,
|
||||||
SIOCSIFNETMASK,
|
SIOCSIFNETMASK,
|
||||||
|
SIOCGIFBRDADDR,
|
||||||
|
SIOCGIFMTU,
|
||||||
|
SIOCGIFFLAGS,
|
||||||
|
SIOCGIFCONF,
|
||||||
SIOCADDRT,
|
SIOCADDRT,
|
||||||
SIOCDELRT,
|
SIOCDELRT,
|
||||||
FIBMAP,
|
FIBMAP,
|
||||||
|
@ -93,7 +98,12 @@ enum IOCtlNumber {
|
||||||
#define SIOCSIFADDR SIOCSIFADDR
|
#define SIOCSIFADDR SIOCSIFADDR
|
||||||
#define SIOCGIFADDR SIOCGIFADDR
|
#define SIOCGIFADDR SIOCGIFADDR
|
||||||
#define SIOCGIFHWADDR SIOCGIFHWADDR
|
#define SIOCGIFHWADDR SIOCGIFHWADDR
|
||||||
|
#define SIOCGIFNETMASK SIOCGIFNETMASK
|
||||||
#define SIOCSIFNETMASK SIOCSIFNETMASK
|
#define SIOCSIFNETMASK SIOCSIFNETMASK
|
||||||
|
#define SIOCGIFBRDADDR SIOCGIFBRDADDR
|
||||||
|
#define SIOCGIFMTU SIOCGIFMTU
|
||||||
|
#define SIOCGIFFLAGS SIOCGIFFLAGS
|
||||||
|
#define SIOCGIFCONF SIOCGIFCONF
|
||||||
#define SIOCADDRT SIOCADDRT
|
#define SIOCADDRT SIOCADDRT
|
||||||
#define SIOCDELRT SIOCDELRT
|
#define SIOCDELRT SIOCDELRT
|
||||||
#define FIBMAP FIBMAP
|
#define FIBMAP FIBMAP
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue