mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 19:27:44 +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;
|
||||
}
|
||||
|
||||
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: {
|
||||
u16 sa_family = AF_INET;
|
||||
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 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;
|
||||
|
@ -597,6 +653,11 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, FlatPtr arg)
|
|||
case SIOCSIFNETMASK:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCGIFHWADDR:
|
||||
case SIOCGIFNETMASK:
|
||||
case SIOCGIFBRDADDR:
|
||||
case SIOCGIFMTU:
|
||||
case SIOCGIFFLAGS:
|
||||
case SIOCGIFCONF:
|
||||
return ioctl_interface();
|
||||
|
||||
case SIOCADDRT:
|
||||
|
|
|
@ -66,7 +66,12 @@ enum IOCtlNumber {
|
|||
SIOCSIFADDR,
|
||||
SIOCGIFADDR,
|
||||
SIOCGIFHWADDR,
|
||||
SIOCGIFNETMASK,
|
||||
SIOCSIFNETMASK,
|
||||
SIOCGIFBRDADDR,
|
||||
SIOCGIFMTU,
|
||||
SIOCGIFFLAGS,
|
||||
SIOCGIFCONF,
|
||||
SIOCADDRT,
|
||||
SIOCDELRT,
|
||||
FIBMAP,
|
||||
|
@ -93,7 +98,12 @@ enum IOCtlNumber {
|
|||
#define SIOCSIFADDR SIOCSIFADDR
|
||||
#define SIOCGIFADDR SIOCGIFADDR
|
||||
#define SIOCGIFHWADDR SIOCGIFHWADDR
|
||||
#define SIOCGIFNETMASK SIOCGIFNETMASK
|
||||
#define SIOCSIFNETMASK SIOCSIFNETMASK
|
||||
#define SIOCGIFBRDADDR SIOCGIFBRDADDR
|
||||
#define SIOCGIFMTU SIOCGIFMTU
|
||||
#define SIOCGIFFLAGS SIOCGIFFLAGS
|
||||
#define SIOCGIFCONF SIOCGIFCONF
|
||||
#define SIOCADDRT SIOCADDRT
|
||||
#define SIOCDELRT SIOCDELRT
|
||||
#define FIBMAP FIBMAP
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue