1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 08:48:11 +00:00

Kernel: Modify the IOCTL API to return KResult

The kernel has been gradually moving towards KResult from just bare
int's, this change migrates the IOCTL paths.
This commit is contained in:
Brian Gianforcaro 2021-07-26 03:47:25 -07:00 committed by Ali Mohammad Pur
parent 46c9b1d81c
commit de9ff0af50
16 changed files with 151 additions and 151 deletions

View file

@ -568,75 +568,75 @@ KResult IPv4Socket::getsockopt(FileDescription& description, int level, int opti
}
}
int IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
KResult IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
{
REQUIRE_PROMISE(inet);
auto ioctl_route = [request, arg]() {
auto ioctl_route = [request, arg]() -> KResult {
auto user_route = static_ptr_cast<rtentry*>(arg);
rtentry route;
if (!copy_from_user(&route, user_route))
return -EFAULT;
return EFAULT;
auto copied_ifname = copy_string_from_user(route.rt_dev, IFNAMSIZ);
if (copied_ifname.is_null())
return -EFAULT;
return EFAULT;
auto adapter = NetworkingManagement::the().lookup_by_name(copied_ifname);
if (!adapter)
return -ENODEV;
return ENODEV;
switch (request) {
case SIOCADDRT:
if (!Process::current()->is_superuser())
return -EPERM;
return EPERM;
if (route.rt_gateway.sa_family != AF_INET)
return -EAFNOSUPPORT;
return EAFNOSUPPORT;
if ((route.rt_flags & (RTF_UP | RTF_GATEWAY)) != (RTF_UP | RTF_GATEWAY))
return -EINVAL; // FIXME: Find the correct value to return
return EINVAL; // FIXME: Find the correct value to return
adapter->set_ipv4_gateway(IPv4Address(((sockaddr_in&)route.rt_gateway).sin_addr.s_addr));
return 0;
return KSuccess;
case SIOCDELRT:
// FIXME: Support gateway deletion
return 0;
return KSuccess;
}
return -EINVAL;
return EINVAL;
};
auto ioctl_arp = [request, arg]() {
auto ioctl_arp = [request, arg]() -> KResult {
auto user_req = static_ptr_cast<arpreq*>(arg);
arpreq arp_req;
if (!copy_from_user(&arp_req, user_req))
return -EFAULT;
return EFAULT;
switch (request) {
case SIOCSARP:
if (!Process::current()->is_superuser())
return -EPERM;
return EPERM;
if (arp_req.arp_pa.sa_family != AF_INET)
return -EAFNOSUPPORT;
return EAFNOSUPPORT;
update_arp_table(IPv4Address(((sockaddr_in&)arp_req.arp_pa).sin_addr.s_addr), *(MACAddress*)&arp_req.arp_ha.sa_data[0], UpdateArp::Set);
return 0;
return KSuccess;
case SIOCDARP:
if (!Process::current()->is_superuser())
return -EPERM;
return EPERM;
if (arp_req.arp_pa.sa_family != AF_INET)
return -EAFNOSUPPORT;
return EAFNOSUPPORT;
update_arp_table(IPv4Address(((sockaddr_in&)arp_req.arp_pa).sin_addr.s_addr), *(MACAddress*)&arp_req.arp_ha.sa_data[0], UpdateArp::Delete);
return 0;
return KSuccess;
}
return -EINVAL;
return EINVAL;
};
auto ioctl_interface = [request, arg]() {
auto ioctl_interface = [request, arg]() -> KResult {
auto user_ifr = static_ptr_cast<ifreq*>(arg);
ifreq ifr;
if (!copy_from_user(&ifr, user_ifr))
return -EFAULT;
return EFAULT;
char namebuf[IFNAMSIZ + 1];
memcpy(namebuf, ifr.ifr_name, IFNAMSIZ);
@ -644,24 +644,24 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
auto adapter = NetworkingManagement::the().lookup_by_name(namebuf);
if (!adapter)
return -ENODEV;
return ENODEV;
switch (request) {
case SIOCSIFADDR:
if (!Process::current()->is_superuser())
return -EPERM;
return EPERM;
if (ifr.ifr_addr.sa_family != AF_INET)
return -EAFNOSUPPORT;
return EAFNOSUPPORT;
adapter->set_ipv4_address(IPv4Address(((sockaddr_in&)ifr.ifr_addr).sin_addr.s_addr));
return 0;
return KSuccess;
case SIOCSIFNETMASK:
if (!Process::current()->is_superuser())
return -EPERM;
return EPERM;
if (ifr.ifr_addr.sa_family != AF_INET)
return -EAFNOSUPPORT;
return EAFNOSUPPORT;
adapter->set_ipv4_netmask(IPv4Address(((sockaddr_in&)ifr.ifr_netmask).sin_addr.s_addr));
return 0;
return KSuccess;
case SIOCGIFADDR: {
auto ip4_addr = adapter->ipv4_address().to_u32();
@ -669,8 +669,8 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
socket_address_in.sin_family = AF_INET;
socket_address_in.sin_addr.s_addr = ip4_addr;
if (!copy_to_user(user_ifr, &ifr))
return -EFAULT;
return 0;
return EFAULT;
return KSuccess;
}
case SIOCGIFNETMASK: {
@ -681,8 +681,8 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
socket_address_in.sin_addr.s_addr = ip4_netmask;
if (!copy_to_user(user_ifr, &ifr))
return -EFAULT;
return 0;
return EFAULT;
return KSuccess;
}
case SIOCGIFHWADDR: {
@ -690,8 +690,8 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
ifr.ifr_hwaddr.sa_family = AF_INET;
mac_address.copy_to(Bytes { ifr.ifr_hwaddr.sa_data, sizeof(ifr.ifr_hwaddr.sa_data) });
if (!copy_to_user(user_ifr, &ifr))
return -EFAULT;
return 0;
return EFAULT;
return KSuccess;
}
case SIOCGIFBRDADDR: {
@ -703,8 +703,8 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
socket_address_in.sin_family = AF_INET;
socket_address_in.sin_addr.s_addr = broadcast_addr;
if (!copy_to_user(user_ifr, &ifr))
return -EFAULT;
return 0;
return EFAULT;
return KSuccess;
}
case SIOCGIFMTU: {
@ -713,8 +713,8 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
ifr.ifr_addr.sa_family = AF_INET;
ifr.ifr_metric = ip4_metric;
if (!copy_to_user(user_ifr, &ifr))
return -EFAULT;
return 0;
return EFAULT;
return KSuccess;
}
case SIOCGIFFLAGS: {
@ -723,17 +723,17 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
ifr.ifr_addr.sa_family = AF_INET;
ifr.ifr_flags = flags;
if (!copy_to_user(user_ifr, &ifr))
return -EFAULT;
return 0;
return EFAULT;
return KSuccess;
}
case SIOCGIFCONF: {
// FIXME: stub!
return -EINVAL;
return EINVAL;
}
}
return -EINVAL;
return EINVAL;
};
switch (request) {
@ -757,7 +757,7 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace<void*> arg)
return ioctl_arp();
}
return -EINVAL;
return EINVAL;
}
KResult IPv4Socket::close()