From 03a2f3e48caec15b1a9cebccc85328e9b8169df0 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Tue, 15 Feb 2011 04:40:40 -0500 Subject: [PATCH] cleanup socketcall syscall interface to ease porting to sane(r) archs --- arch/i386/bits/ioctl.h | 7 +++++++ arch/i386/syscall.h | 21 +++++++++++++++++++++ src/network/accept.c | 4 +--- src/network/bind.c | 4 +--- src/network/connect.c | 4 +--- src/network/getpeername.c | 4 +--- src/network/getsockname.c | 4 +--- src/network/getsockopt.c | 8 +------- src/network/listen.c | 4 +--- src/network/recv.c | 8 +------- src/network/recvfrom.c | 7 +------ src/network/recvmsg.c | 4 +--- src/network/send.c | 8 +------- src/network/sendmsg.c | 4 +--- src/network/sendto.c | 7 +------ src/network/setsockopt.c | 4 +--- src/network/shutdown.c | 4 +--- src/network/sockatmark.c | 1 - src/network/socket.c | 4 +--- src/network/socketcall.h | 24 ------------------------ src/network/socketpair.c | 4 +--- 21 files changed, 45 insertions(+), 94 deletions(-) delete mode 100644 src/network/socketcall.h diff --git a/arch/i386/bits/ioctl.h b/arch/i386/bits/ioctl.h index 544bbdce..336c71c3 100644 --- a/arch/i386/bits/ioctl.h +++ b/arch/i386/bits/ioctl.h @@ -127,6 +127,13 @@ struct winsize { #define N_SYNC_PPP 14 #define N_HCI 15 +#define FIOSETOWN 0x8901 +#define SIOCSPGRP 0x8902 +#define FIOGETOWN 0x8903 +#define SIOCGPGRP 0x8904 +#define SIOCATMARK 0x8905 +#define SIOCGSTAMP 0x8906 + #define SIOCADDRT 0x890B #define SIOCDELRT 0x890C #define SIOCRTMSG 0x890D diff --git a/arch/i386/syscall.h b/arch/i386/syscall.h index 114aa688..fcdae241 100644 --- a/arch/i386/syscall.h +++ b/arch/i386/syscall.h @@ -501,6 +501,27 @@ static inline long syscall6(long n, long a1, long a2, long a3, long a4, long a5, #define __NR_pread __NR_pread64 #define __NR_pwrite __NR_pwrite64 +#define __SC_socket 1 +#define __SC_bind 2 +#define __SC_connect 3 +#define __SC_listen 4 +#define __SC_accept 5 +#define __SC_getsockname 6 +#define __SC_getpeername 7 +#define __SC_socketpair 8 +#define __SC_send 9 +#define __SC_recv 10 +#define __SC_sendto 11 +#define __SC_recvfrom 12 +#define __SC_shutdown 13 +#define __SC_setsockopt 14 +#define __SC_getsockopt 15 +#define __SC_sendmsg 16 +#define __SC_recvmsg 17 + + +#define socketcall(nm, a, b, c, d, e, f) syscall2(__NR_socketcall, __SC_##nm, \ + (long)(long [6]){ (long)a, (long)b, (long)c, (long)d, (long)e, (long)f }) #undef O_LARGEFILE diff --git a/src/network/accept.c b/src/network/accept.c index 83704096..46adff5c 100644 --- a/src/network/accept.c +++ b/src/network/accept.c @@ -1,14 +1,12 @@ #include #include "syscall.h" -#include "socketcall.h" #include "libc.h" int accept(int fd, struct sockaddr *addr, socklen_t *len) { - unsigned long args[] = { fd, (unsigned long)addr, (unsigned long)len }; int ret; CANCELPT_BEGIN; - ret = syscall2(__NR_socketcall, SYS_ACCEPT, (long)args); + ret = socketcall(accept, fd, addr, len, 0, 0, 0); CANCELPT_END; return ret; } diff --git a/src/network/bind.c b/src/network/bind.c index 3bef382c..07bb669a 100644 --- a/src/network/bind.c +++ b/src/network/bind.c @@ -1,9 +1,7 @@ #include #include "syscall.h" -#include "socketcall.h" int bind(int fd, const struct sockaddr *addr, socklen_t len) { - unsigned long args[] = { fd, (unsigned long)addr, len }; - return syscall2(__NR_socketcall, SYS_BIND, (long)args); + return socketcall(bind, fd, addr, len, 0, 0, 0); } diff --git a/src/network/connect.c b/src/network/connect.c index 6074122e..29bffbcb 100644 --- a/src/network/connect.c +++ b/src/network/connect.c @@ -1,14 +1,12 @@ #include #include "syscall.h" -#include "socketcall.h" #include "libc.h" int connect(int fd, const struct sockaddr *addr, socklen_t len) { - unsigned long args[] = { fd, (unsigned long)addr, len }; int ret; CANCELPT_BEGIN; - ret = syscall2(__NR_socketcall, SYS_CONNECT, (long)args); + ret = socketcall(connect, fd, addr, len, 0, 0, 0); CANCELPT_END; return ret; } diff --git a/src/network/getpeername.c b/src/network/getpeername.c index 7ecbe375..22effdae 100644 --- a/src/network/getpeername.c +++ b/src/network/getpeername.c @@ -1,9 +1,7 @@ #include #include "syscall.h" -#include "socketcall.h" int getpeername(int fd, struct sockaddr *addr, socklen_t *len) { - unsigned long args[] = { fd, (unsigned long)addr, (unsigned long)len }; - return syscall2(__NR_socketcall, SYS_GETPEERNAME, (long)args); + return socketcall(getpeername, fd, addr, len, 0, 0, 0); } diff --git a/src/network/getsockname.c b/src/network/getsockname.c index 4b1002f8..271e3b41 100644 --- a/src/network/getsockname.c +++ b/src/network/getsockname.c @@ -1,9 +1,7 @@ #include #include "syscall.h" -#include "socketcall.h" int getsockname(int fd, struct sockaddr *addr, socklen_t *len) { - unsigned long args[] = { fd, (unsigned long)addr, (unsigned long)len }; - return syscall2(__NR_socketcall, SYS_GETSOCKNAME, (long)args); + return socketcall(getsockname, fd, addr, len, 0, 0, 0); } diff --git a/src/network/getsockopt.c b/src/network/getsockopt.c index 8c818863..a9e0a72d 100644 --- a/src/network/getsockopt.c +++ b/src/network/getsockopt.c @@ -1,13 +1,7 @@ #include #include "syscall.h" -#include "socketcall.h" int getsockopt(int fd, int level, int optname, void *optval, socklen_t *optlen) { - unsigned long args[] = { - fd, level, optname, - (unsigned long)optval, - (unsigned long)optlen - }; - return syscall2(__NR_socketcall, SYS_GETSOCKOPT, (long)args); + return socketcall(getsockopt, fd, level, optname, optval, optlen, 0); } diff --git a/src/network/listen.c b/src/network/listen.c index 7c8c1a8a..f84ad03b 100644 --- a/src/network/listen.c +++ b/src/network/listen.c @@ -1,9 +1,7 @@ #include #include "syscall.h" -#include "socketcall.h" int listen(int fd, int backlog) { - unsigned long args[] = { fd, backlog }; - return syscall2(__NR_socketcall, SYS_LISTEN, (long)args); + return socketcall(listen, fd, backlog, 0, 0, 0, 0); } diff --git a/src/network/recv.c b/src/network/recv.c index 521a4b19..d04a54aa 100644 --- a/src/network/recv.c +++ b/src/network/recv.c @@ -1,14 +1,8 @@ #include #include "syscall.h" -#include "socketcall.h" #include "libc.h" ssize_t recv(int fd, void *buf, size_t len, int flags) { - unsigned long args[] = { fd, (unsigned long)buf, len, flags }; - ssize_t r; - CANCELPT_BEGIN; - r = syscall2(__NR_socketcall, SYS_RECV, (long)args); - CANCELPT_END; - return r; + return recvfrom(fd, buf, len, flags, 0, 0); } diff --git a/src/network/recvfrom.c b/src/network/recvfrom.c index df50114b..d5222932 100644 --- a/src/network/recvfrom.c +++ b/src/network/recvfrom.c @@ -1,17 +1,12 @@ #include #include "syscall.h" -#include "socketcall.h" #include "libc.h" ssize_t recvfrom(int fd, void *buf, size_t len, int flags, struct sockaddr *addr, socklen_t *alen) { - unsigned long args[] = { - fd, (unsigned long)buf, len, flags, - (unsigned long)addr, (unsigned long)alen - }; ssize_t r; CANCELPT_BEGIN; - r = syscall2(__NR_socketcall, SYS_RECVFROM, (long)args); + r = socketcall(recvfrom, fd, buf, len, flags, addr, alen); CANCELPT_END; return r; } diff --git a/src/network/recvmsg.c b/src/network/recvmsg.c index ead16f9c..edc5f241 100644 --- a/src/network/recvmsg.c +++ b/src/network/recvmsg.c @@ -1,14 +1,12 @@ #include #include "syscall.h" -#include "socketcall.h" #include "libc.h" ssize_t recvmsg(int fd, struct msghdr *msg, int flags) { - unsigned long args[] = { fd, (unsigned long)msg, flags }; ssize_t r; CANCELPT_BEGIN; - r = syscall2(__NR_socketcall, SYS_RECVMSG, (long)args); + r = socketcall(recvmsg, fd, msg, flags, 0, 0, 0); CANCELPT_END; return r; } diff --git a/src/network/send.c b/src/network/send.c index d72fb03c..b6ec3101 100644 --- a/src/network/send.c +++ b/src/network/send.c @@ -1,14 +1,8 @@ #include #include "syscall.h" -#include "socketcall.h" #include "libc.h" ssize_t send(int fd, const void *buf, size_t len, int flags) { - unsigned long args[] = { fd, (unsigned long)buf, len, flags }; - ssize_t r; - CANCELPT_BEGIN; - r = syscall2(__NR_socketcall, SYS_SEND, (long)args); - CANCELPT_END; - return r; + return sendto(fd, buf, len, flags, 0, 0); } diff --git a/src/network/sendmsg.c b/src/network/sendmsg.c index ea2fe482..5d1123f0 100644 --- a/src/network/sendmsg.c +++ b/src/network/sendmsg.c @@ -1,14 +1,12 @@ #include #include "syscall.h" -#include "socketcall.h" #include "libc.h" ssize_t sendmsg(int fd, const struct msghdr *msg, int flags) { - unsigned long args[] = { fd, (unsigned long)msg, flags }; ssize_t r; CANCELPT_BEGIN; - r = syscall2(__NR_socketcall, SYS_SENDMSG, (long)args); + r = socketcall(sendmsg, fd, msg, flags, 0, 0, 0); CANCELPT_END; return r; } diff --git a/src/network/sendto.c b/src/network/sendto.c index 5d224b0b..1cfc621d 100644 --- a/src/network/sendto.c +++ b/src/network/sendto.c @@ -1,17 +1,12 @@ #include #include "syscall.h" -#include "socketcall.h" #include "libc.h" ssize_t sendto(int fd, const void *buf, size_t len, int flags, const struct sockaddr *addr, socklen_t alen) { - unsigned long args[] = { - fd, (unsigned long)buf, len, flags, - (unsigned long)addr, alen - }; ssize_t r; CANCELPT_BEGIN; - r = syscall2(__NR_socketcall, SYS_SENDTO, (long)args); + r = socketcall(sendto, fd, buf, len, flags, addr, alen); CANCELPT_END; return r; } diff --git a/src/network/setsockopt.c b/src/network/setsockopt.c index b50303b8..c960c9ca 100644 --- a/src/network/setsockopt.c +++ b/src/network/setsockopt.c @@ -1,9 +1,7 @@ #include #include "syscall.h" -#include "socketcall.h" int setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen) { - unsigned long args[] = { fd, level, optname, (unsigned long)optval, optlen }; - return syscall2(__NR_socketcall, SYS_SETSOCKOPT, (long)args); + return socketcall(setsockopt, fd, level, optname, optval, optlen, 0); } diff --git a/src/network/shutdown.c b/src/network/shutdown.c index 91950c8a..10ca21aa 100644 --- a/src/network/shutdown.c +++ b/src/network/shutdown.c @@ -1,9 +1,7 @@ #include #include "syscall.h" -#include "socketcall.h" int shutdown(int fd, int how) { - unsigned long args[] = { fd, how }; - return syscall2(__NR_socketcall, SYS_SHUTDOWN, (long)args); + return socketcall(shutdown, fd, how, 0, 0, 0, 0); } diff --git a/src/network/sockatmark.c b/src/network/sockatmark.c index 5328a855..f474551a 100644 --- a/src/network/sockatmark.c +++ b/src/network/sockatmark.c @@ -1,6 +1,5 @@ #include #include -#include "socketcall.h" int sockatmark(int s) { diff --git a/src/network/socket.c b/src/network/socket.c index afaeb411..4f1e86db 100644 --- a/src/network/socket.c +++ b/src/network/socket.c @@ -1,9 +1,7 @@ #include #include "syscall.h" -#include "socketcall.h" int socket(int domain, int type, int protocol) { - unsigned long args[] = { domain, type, protocol }; - return syscall2(__NR_socketcall, SYS_SOCKET, (long)args); + return socketcall(socket, domain, type, protocol, 0, 0, 0); } diff --git a/src/network/socketcall.h b/src/network/socketcall.h deleted file mode 100644 index 9ae98587..00000000 --- a/src/network/socketcall.h +++ /dev/null @@ -1,24 +0,0 @@ -#define SYS_SOCKET 1 -#define SYS_BIND 2 -#define SYS_CONNECT 3 -#define SYS_LISTEN 4 -#define SYS_ACCEPT 5 -#define SYS_GETSOCKNAME 6 -#define SYS_GETPEERNAME 7 -#define SYS_SOCKETPAIR 8 -#define SYS_SEND 9 -#define SYS_RECV 10 -#define SYS_SENDTO 11 -#define SYS_RECVFROM 12 -#define SYS_SHUTDOWN 13 -#define SYS_SETSOCKOPT 14 -#define SYS_GETSOCKOPT 15 -#define SYS_SENDMSG 16 -#define SYS_RECVMSG 17 - -#define FIOSETOWN 0x8901 -#define SIOCSPGRP 0x8902 -#define FIOGETOWN 0x8903 -#define SIOCGPGRP 0x8904 -#define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 diff --git a/src/network/socketpair.c b/src/network/socketpair.c index 65a47fd9..b15f8467 100644 --- a/src/network/socketpair.c +++ b/src/network/socketpair.c @@ -1,9 +1,7 @@ #include #include "syscall.h" -#include "socketcall.h" int socketpair(int domain, int type, int protocol, int fd[2]) { - unsigned long args[] = { domain, type, protocol, (unsigned long)fd }; - return syscall2(__NR_socketcall, SYS_SOCKETPAIR, (long)args); + return socketcall(socketpair, domain, type, protocol, fd, 0, 0); } -- 2.25.1