mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 23:18:21 +00:00
setsockopt: refactor
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
#include <kernel/sock.h>
|
#include <kernel/sock.h>
|
||||||
#include <kernel/abi.h>
|
#include <kernel/abi.h>
|
||||||
#include <kernel/file.h>
|
#include <kernel/file.h>
|
||||||
|
#include <kernel/usercopy.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
syscallret_t syscall_setsockopt(context_t *, int fd, int level, int optname, void *val, size_t len) {
|
syscallret_t syscall_setsockopt(context_t *, int fd, int level, int optname, void *val, size_t len) {
|
||||||
@@ -9,28 +10,8 @@ syscallret_t syscall_setsockopt(context_t *, int fd, int level, int optname, voi
|
|||||||
.ret = -1
|
.ret = -1
|
||||||
};
|
};
|
||||||
|
|
||||||
if (level != SOL_SOCKET) {
|
|
||||||
ret.errno = ENOPROTOOPT;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *buffer = NULL;
|
|
||||||
if (val) {
|
|
||||||
buffer = alloc(len);
|
|
||||||
if (buffer == NULL) {
|
|
||||||
ret.errno = ENOMEM;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
ret.errno = usercopy_fromuser(buffer, val, len);
|
|
||||||
if (ret.errno) {
|
|
||||||
free(buffer);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
file_t *file = fd_get(fd);
|
file_t *file = fd_get(fd);
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
free(buffer);
|
|
||||||
ret.errno = EBADF;
|
ret.errno = EBADF;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -42,36 +23,44 @@ syscallret_t syscall_setsockopt(context_t *, int fd, int level, int optname, voi
|
|||||||
|
|
||||||
socket_t *socket = SOCKFS_SOCKET_FROM_NODE(file->vnode);
|
socket_t *socket = SOCKFS_SOCKET_FROM_NODE(file->vnode);
|
||||||
|
|
||||||
|
|
||||||
MUTEX_ACQUIRE(&socket->mutex);
|
MUTEX_ACQUIRE(&socket->mutex);
|
||||||
switch (optname) {
|
if (level == SOL_SOCKET) {
|
||||||
case SO_BINDTODEVICE: {
|
// handle some generic cases here
|
||||||
if (val) {
|
switch (optname) {
|
||||||
socket->netdev = netdev_getdev(buffer);
|
case SO_BINDTODEVICE: {
|
||||||
ret.errno = socket->netdev ? 0 : ENODEV;
|
if (val) {
|
||||||
} else {
|
size_t size;
|
||||||
socket->netdev = NULL;
|
ret.errno = usercopy_strlen(val, &size);
|
||||||
|
if (ret.errno)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (size > 32) {
|
||||||
|
ret.errno = EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
char name[size + 1];
|
||||||
|
ret.errno = usercopy_fromuser(name, val, size);
|
||||||
|
if (ret.errno)
|
||||||
|
break;
|
||||||
|
name[size] = '\0';
|
||||||
|
|
||||||
|
socket->netdev = netdev_getdev(name);
|
||||||
|
ret.errno = socket->netdev ? 0 : ENODEV;
|
||||||
|
} else {
|
||||||
|
socket->netdev = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
case SO_BROADCAST: {
|
||||||
}
|
ret.errno = usercopy_fromuser(&socket->broadcast, val, sizeof(int));
|
||||||
case SO_BROADCAST: {
|
break;
|
||||||
if (val == NULL) {
|
|
||||||
ret.errno = EFAULT;
|
|
||||||
} else {
|
|
||||||
socket->broadcast = *((int *)buffer);
|
|
||||||
ret.errno = 0;
|
|
||||||
}
|
}
|
||||||
break;
|
default:
|
||||||
|
ret.errno = socket->ops->setopt ? socket->ops->setopt(socket, level, optname, val, len, ¤t_thread()->proc->cred) : ENOPROTOOPT;
|
||||||
}
|
}
|
||||||
case SO_KEEPALIVE: {
|
} else {
|
||||||
if (val == NULL)
|
ret.errno = socket->ops->setopt ? socket->ops->setopt(socket, level, optname, val, len, ¤t_thread()->proc->cred) : ENOPROTOOPT;
|
||||||
ret.errno = EFAULT;
|
|
||||||
else
|
|
||||||
ret.errno = socket->ops->setopt ? socket->ops->setopt(socket, optname, buffer, len, ¤t_thread()->proc->cred) : ENOPROTOOPT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
ret.errno = ENOPROTOOPT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MUTEX_RELEASE(&socket->mutex);
|
MUTEX_RELEASE(&socket->mutex);
|
||||||
@@ -81,8 +70,5 @@ syscallret_t syscall_setsockopt(context_t *, int fd, int level, int optname, voi
|
|||||||
|
|
||||||
fd_release(file);
|
fd_release(file);
|
||||||
|
|
||||||
if (val)
|
|
||||||
free(buffer);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user