diff options
Diffstat (limited to 'libc/inet')
| -rw-r--r-- | libc/inet/getaddrinfo.c | 3 | ||||
| -rw-r--r-- | libc/inet/hostid.c | 13 | ||||
| -rw-r--r-- | libc/inet/if_index.c | 17 | ||||
| -rw-r--r-- | libc/inet/socketcalls.c | 247 | 
4 files changed, 173 insertions, 107 deletions
| diff --git a/libc/inet/getaddrinfo.c b/libc/inet/getaddrinfo.c index b91486f53..8c7f7b9f1 100644 --- a/libc/inet/getaddrinfo.c +++ b/libc/inet/getaddrinfo.c @@ -56,6 +56,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  #include <assert.h>  #include <errno.h>  #include <netdb.h> +#include <tls.h>  #include <resolv.h>  #include <stdio.h>  #include <stdlib.h> @@ -307,7 +308,7 @@ gaih_local(const char *name, const struct gaih_service *service,  		char *buf = ((struct sockaddr_un *)ai->ai_addr)->sun_path;  		if (__path_search(buf, L_tmpnam, NULL, NULL, 0) != 0 -		 || __gen_tempname(buf, __GT_NOCREATE) != 0 +		 || __gen_tempname(buf, __GT_NOCREATE, 0) != 0  		) {  			return -EAI_SYSTEM;  		} diff --git a/libc/inet/hostid.c b/libc/inet/hostid.c index ac4c56c35..90b22ae7a 100644 --- a/libc/inet/hostid.c +++ b/libc/inet/hostid.c @@ -14,6 +14,7 @@  #include <stdlib.h>  #include <string.h>  #include <netdb.h> +#include <not-cancel.h>  #define HOSTID "/etc/hostid" @@ -25,11 +26,11 @@ int sethostid(long int new_id)  	if (geteuid() || getuid())  		return __set_errno(EPERM); -	fd = open(HOSTID, O_CREAT|O_WRONLY, 0644); +	fd = open_not_cancel(HOSTID, O_CREAT|O_WRONLY, 0644);  	if (fd < 0)  		return fd; -	ret = write(fd, &new_id, sizeof(new_id)) == sizeof(new_id) ? 0 : -1; -	close(fd); +	ret = write_not_cancel(fd, &new_id, sizeof(new_id)) == sizeof(new_id) ? 0 : -1; +	close_not_cancel_no_status (fd);  	return ret;  }  #endif @@ -44,10 +45,10 @@ long int gethostid(void)  	 * It is not an error if we cannot read this file. It is not even an  	 * error if we cannot read all the bytes, we just carry on trying...  	 */ -	fd = open(HOSTID, O_RDONLY); +	fd = open_not_cancel_2(HOSTID, O_RDONLY);  	if (fd >= 0) { -		int i = read(fd, &id, sizeof(id)); -		close(fd); +		int i = read_not_cancel(fd, &id, sizeof(id)); +		close_not_cancel_no_status(fd);  		if (i > 0)  			return id;  	} diff --git a/libc/inet/if_index.c b/libc/inet/if_index.c index 750a4649e..8efcd2a76 100644 --- a/libc/inet/if_index.c +++ b/libc/inet/if_index.c @@ -32,6 +32,7 @@  #include <sys/socket.h>  #include <sys/ioctl.h>  #include <libc-internal.h> +#include <not-cancel.h>  #include "netlinkaccess.h" @@ -55,13 +56,13 @@ if_nametoindex(const char* ifname)      {        /* close never fails here, fd is just a unconnected socket.         *int saved_errno = errno; */ -      close(fd); +      close_not_cancel_no_status(fd);        /*if (saved_errno == EINVAL)         *  __set_errno(ENOSYS); */        return 0;      } -  close(fd); +  close_not_cancel_no_status(fd);    return ifr.ifr_ifindex;  #endif  } @@ -112,7 +113,7 @@ if_nameindex (void)        if (ioctl (fd, SIOCGIFCONF, &ifc) < 0)  	{ -	  close (fd); +	  close_not_cancel_no_status (fd);  	  return NULL;  	}      } @@ -123,7 +124,7 @@ if_nameindex (void)    idx = malloc ((nifs + 1) * sizeof (struct if_nameindex));    if (idx == NULL)      { -      close(fd); +      close_not_cancel_no_status (fd);        __set_errno(ENOBUFS);        return NULL;      } @@ -141,7 +142,7 @@ if_nameindex (void)  	  for (j =  0; j < i; ++j)  	    free (idx[j].if_name);  	  free(idx); -	  close(fd); +	  close_not_cancel_no_status (fd);  	  if (saved_errno == EINVAL)  	    saved_errno = ENOSYS;  	  else if (saved_errno == ENOMEM) @@ -155,7 +156,7 @@ if_nameindex (void)    idx[i].if_index = 0;    idx[i].if_name = NULL; -  close(fd); +  close_not_cancel_no_status (fd);    return idx;  #endif  } @@ -298,14 +299,14 @@ if_indextoname (unsigned int ifindex, char *ifname)    if (ioctl (fd, SIOCGIFNAME, &ifr) < 0)      {        int serrno = errno; -      close (fd); +      close_not_cancel_no_status (fd);        if (serrno == ENODEV)  	/* POSIX requires ENXIO.  */  	serrno = ENXIO;        __set_errno (serrno);        return NULL;    } -  close (fd); +  close_not_cancel_no_status (fd);    return strncpy (ifname, ifr.ifr_name, IFNAMSIZ);  # else diff --git a/libc/inet/socketcalls.c b/libc/inet/socketcalls.c index 8bb09cabb..e4bdbcb59 100644 --- a/libc/inet/socketcalls.c +++ b/libc/inet/socketcalls.c @@ -33,27 +33,41 @@ extern int __socketcall(int call, unsigned long *args) attribute_hidden;  #define SYS_RECVMSG     17  #endif +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +#include <sysdep-cancel.h> +#include <pthreadP.h> +#else +#define SINGLE_THREAD_P 1 +#endif  #ifdef L_accept -# ifdef __NR_accept -_syscall3(int, accept, int, call, struct sockaddr *, addr, socklen_t *,addrlen) -# elif defined(__NR_socketcall) -int accept(int s, struct sockaddr *addr, socklen_t * addrlen) +extern __typeof(accept) __libc_accept; +#ifdef __NR_accept +#define __NR___libc_accept  __NR_accept +_syscall3(int, __libc_accept, int, call, struct sockaddr *, addr, socklen_t *,addrlen) +#elif defined(__NR_socketcall) +int __libc_accept(int s, struct sockaddr *addr, socklen_t * addrlen)  {  	unsigned long args[3];  	args[0] = s;  	args[1] = (unsigned long) addr;  	args[2] = (unsigned long) addrlen; -	return __socketcall(SYS_ACCEPT, args); + +	if (SINGLE_THREAD_P) +		return __socketcall(SYS_ACCEPT, args); + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +	int oldtype = LIBC_CANCEL_ASYNC (); +	int result = __socketcall(SYS_ACCEPT, args); +	LIBC_CANCEL_RESET (oldtype); +	return result; +#endif +  } -# endif -# ifndef __LINUXTHREADS_OLD__ -libc_hidden_def(accept) -# else +#endif +weak_alias(__libc_accept,accept)  libc_hidden_weak(accept) -strong_alias(accept,__libc_accept) -# endif  #endif  #ifdef L_bind @@ -74,25 +88,32 @@ libc_hidden_def(bind)  #endif  #ifdef L_connect -# ifdef __NR_connect -_syscall3(int, connect, int, sockfd, const struct sockaddr *, saddr, socklen_t, addrlen) -# elif defined(__NR_socketcall) -int connect(int sockfd, const struct sockaddr *saddr, socklen_t addrlen) +extern __typeof(connect) __libc_connect; +#ifdef __NR_connect +#define __NR___libc_connect __NR_connect +_syscall3(int, __libc_connect, int, sockfd, const struct sockaddr *, saddr, socklen_t, addrlen) +#elif defined(__NR_socketcall) +int __libc_connect(int sockfd, const struct sockaddr *saddr, socklen_t addrlen)  {  	unsigned long args[3];  	args[0] = sockfd;  	args[1] = (unsigned long) saddr;  	args[2] = addrlen; -	return __socketcall(SYS_CONNECT, args); + +	if (SINGLE_THREAD_P) +		return __socketcall(SYS_CONNECT, args); + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +	int oldtype = LIBC_CANCEL_ASYNC (); +	int result = __socketcall(SYS_CONNECT, args); +	LIBC_CANCEL_RESET (oldtype); +	return result; +#endif  } -# endif -# ifndef __LINUXTHREADS_OLD__ -libc_hidden_def(connect) -# else +#endif +weak_alias(__libc_connect,connect)  libc_hidden_weak(connect) -strong_alias(connect,__libc_connect) -# endif  #endif  #ifdef L_getpeername @@ -164,12 +185,14 @@ libc_hidden_def(listen)  #endif  #ifdef L_recv -# ifdef __NR_recv -_syscall4(ssize_t, recv, int, sockfd, __ptr_t, buffer, size_t, len, +extern __typeof(recv) __libc_recv; +#ifdef __NR_recv +#define __NR___libc_recv __NR_recv +_syscall4(ssize_t, __libc_recv, int, sockfd, __ptr_t, buffer, size_t, len,  	int, flags) -# elif defined(__NR_socketcall) +#elif defined(__NR_socketcall)  /* recv, recvfrom added by bir7@leland.stanford.edu */ -ssize_t recv(int sockfd, __ptr_t buffer, size_t len, int flags) +ssize_t __libc_recv(int sockfd, __ptr_t buffer, size_t len, int flags)  {  	unsigned long args[4]; @@ -177,29 +200,36 @@ ssize_t recv(int sockfd, __ptr_t buffer, size_t len, int flags)  	args[1] = (unsigned long) buffer;  	args[2] = len;  	args[3] = flags; -	return (__socketcall(SYS_RECV, args)); + +	if (SINGLE_THREAD_P) +		return (__socketcall(SYS_RECV, args)); + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +	int oldtype = LIBC_CANCEL_ASYNC (); +	int result = __socketcall(SYS_RECV, args); +	LIBC_CANCEL_RESET (oldtype); +	return result; +#endif  } -# elif defined(__NR_recvfrom) -ssize_t recv(int sockfd, __ptr_t buffer, size_t len, int flags) +#elif defined(__NR_recvfrom) +ssize_t __libc_recv(int sockfd, __ptr_t buffer, size_t len, int flags)  {  	return (recvfrom(sockfd, buffer, len, flags, NULL, NULL));  } -# endif -# ifndef __LINUXTHREADS_OLD__ -libc_hidden_def(recv) -# else +#endif +weak_alias(__libc_recv,recv)  libc_hidden_weak(recv) -strong_alias(recv,__libc_recv) -# endif  #endif  #ifdef L_recvfrom -# ifdef __NR_recvfrom -_syscall6(ssize_t, recvfrom, int, sockfd, __ptr_t, buffer, size_t, len, +extern __typeof(recvfrom) __libc_recvfrom; +#ifdef __NR_recvfrom +#define __NR___libc_recvfrom __NR_recvfrom +_syscall6(ssize_t, __libc_recvfrom, int, sockfd, __ptr_t, buffer, size_t, len,  	int, flags, struct sockaddr *, to, socklen_t *, tolen) -# elif defined(__NR_socketcall) +#elif defined(__NR_socketcall)  /* recv, recvfrom added by bir7@leland.stanford.edu */ -ssize_t recvfrom(int sockfd, __ptr_t buffer, size_t len, int flags, +ssize_t __libc_recvfrom(int sockfd, __ptr_t buffer, size_t len, int flags,  		 struct sockaddr *to, socklen_t * tolen)  {  	unsigned long args[6]; @@ -210,45 +240,59 @@ ssize_t recvfrom(int sockfd, __ptr_t buffer, size_t len, int flags,  	args[3] = flags;  	args[4] = (unsigned long) to;  	args[5] = (unsigned long) tolen; -	return (__socketcall(SYS_RECVFROM, args)); + +	if (SINGLE_THREAD_P) +		return (__socketcall(SYS_RECVFROM, args)); + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +	int oldtype = LIBC_CANCEL_ASYNC (); +	int result = __socketcall(SYS_RECVFROM, args); +	LIBC_CANCEL_RESET (oldtype); +	return result; +#endif  } -# endif -# ifndef __LINUXTHREADS_OLD__ -libc_hidden_def(recvfrom) -# else +#endif +weak_alias(__libc_recvfrom,recvfrom)  libc_hidden_weak(recvfrom) -strong_alias(recvfrom,__libc_recvfrom) -# endif  #endif  #ifdef L_recvmsg -# ifdef __NR_recvmsg -_syscall3(ssize_t, recvmsg, int, sockfd, struct msghdr *, msg, int, flags) -# elif defined(__NR_socketcall) -ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags) +extern __typeof(recvmsg) __libc_recvmsg; +#ifdef __NR_recvmsg +#define __NR___libc_recvmsg __NR_recvmsg +_syscall3(ssize_t, __libc_recvmsg, int, sockfd, struct msghdr *, msg, int, flags) +#elif defined(__NR_socketcall) +ssize_t __libc_recvmsg(int sockfd, struct msghdr *msg, int flags)  {  	unsigned long args[3];  	args[0] = sockfd;  	args[1] = (unsigned long) msg;  	args[2] = flags; -	return (__socketcall(SYS_RECVMSG, args)); + +	if (SINGLE_THREAD_P) +		return (__socketcall(SYS_RECVMSG, args)); + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +	int oldtype = LIBC_CANCEL_ASYNC (); +	int result = __socketcall(SYS_RECVMSG, args); +	LIBC_CANCEL_RESET (oldtype); +	return result; +#endif  } -# endif -# ifndef __LINUXTHREADS_OLD__ -libc_hidden_def(recvmsg) -# else +#endif +weak_alias(__libc_recvmsg,recvmsg)  libc_hidden_weak(recvmsg) -strong_alias(recvmsg,__libc_recvmsg) -# endif  #endif  #ifdef L_send -# ifdef __NR_send -_syscall4(ssize_t, send, int, sockfd, const void *, buffer, size_t, len, int, flags) -# elif defined(__NR_socketcall) +extern __typeof(send) __libc_send; +#ifdef __NR_send +#define __NR___libc_send    __NR_send +_syscall4(ssize_t, __libc_send, int, sockfd, const void *, buffer, size_t, len, int, flags) +#elif defined(__NR_socketcall)  /* send, sendto added by bir7@leland.stanford.edu */ -ssize_t send(int sockfd, const void *buffer, size_t len, int flags) +ssize_t __libc_send(int sockfd, const void *buffer, size_t len, int flags)  {  	unsigned long args[4]; @@ -256,51 +300,65 @@ ssize_t send(int sockfd, const void *buffer, size_t len, int flags)  	args[1] = (unsigned long) buffer;  	args[2] = len;  	args[3] = flags; -	return (__socketcall(SYS_SEND, args)); + +	if (SINGLE_THREAD_P) +		return (__socketcall(SYS_SEND, args)); + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +	int oldtype = LIBC_CANCEL_ASYNC (); +	int result = __socketcall(SYS_SEND, args); +	LIBC_CANCEL_RESET (oldtype); +	return result; +#endif  } -# elif defined(__NR_sendto) -ssize_t send(int sockfd, const void *buffer, size_t len, int flags) +#elif defined(__NR_sendto) +ssize_t __libc_send(int sockfd, const void *buffer, size_t len, int flags)  {  	return (sendto(sockfd, buffer, len, flags, NULL, 0));  } -# endif -# ifndef __LINUXTHREADS_OLD__ -libc_hidden_def(send) -# else +#endif +weak_alias(__libc_send,send)  libc_hidden_weak(send) -strong_alias(send,__libc_send) -# endif  #endif  #ifdef L_sendmsg -# ifdef __NR_sendmsg -_syscall3(ssize_t, sendmsg, int, sockfd, const struct msghdr *, msg, int, flags) -# elif defined(__NR_socketcall) -ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags) +extern __typeof(sendmsg) __libc_sendmsg; +#ifdef __NR_sendmsg +#define __NR___libc_sendmsg __NR_sendmsg +_syscall3(ssize_t, __libc_sendmsg, int, sockfd, const struct msghdr *, msg, int, flags) +#elif defined(__NR_socketcall) +ssize_t __libc_sendmsg(int sockfd, const struct msghdr *msg, int flags)  {  	unsigned long args[3];  	args[0] = sockfd;  	args[1] = (unsigned long) msg;  	args[2] = flags; -	return (__socketcall(SYS_SENDMSG, args)); + +	if (SINGLE_THREAD_P) +		return (__socketcall(SYS_SENDMSG, args)); + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +	int oldtype = LIBC_CANCEL_ASYNC (); +	int result = __socketcall(SYS_SENDMSG, args); +	LIBC_CANCEL_RESET (oldtype); +	return result; +#endif  } -# endif -# ifndef __LINUXTHREADS_OLD__ -libc_hidden_def(sendmsg) -# else +#endif +weak_alias(__libc_sendmsg,sendmsg)  libc_hidden_weak(sendmsg) -strong_alias(sendmsg,__libc_sendmsg) -# endif  #endif  #ifdef L_sendto -# ifdef __NR_sendto -_syscall6(ssize_t, sendto, int, sockfd, const void *, buffer, +extern __typeof(sendto) __libc_sendto; +#ifdef __NR_sendto +#define __NR___libc_sendto  __NR_sendto +_syscall6(ssize_t, __libc_sendto, int, sockfd, const void *, buffer,  	size_t, len, int, flags, const struct sockaddr *, to, socklen_t, tolen) -# elif defined(__NR_socketcall) +#elif defined(__NR_socketcall)  /* send, sendto added by bir7@leland.stanford.edu */ -ssize_t sendto(int sockfd, const void *buffer, size_t len, int flags, +ssize_t __libc_sendto(int sockfd, const void *buffer, size_t len, int flags,  	   const struct sockaddr *to, socklen_t tolen)  {  	unsigned long args[6]; @@ -311,15 +369,20 @@ ssize_t sendto(int sockfd, const void *buffer, size_t len, int flags,  	args[3] = flags;  	args[4] = (unsigned long) to;  	args[5] = tolen; -	return (__socketcall(SYS_SENDTO, args)); + +	if (SINGLE_THREAD_P) +		return (__socketcall(SYS_SENDTO, args)); + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +	int oldtype = LIBC_CANCEL_ASYNC (); +	int result = __socketcall(SYS_SENDTO, args); +	LIBC_CANCEL_RESET (oldtype); +	return result; +#endif  } -# endif -# ifndef __LINUXTHREADS_OLD__ -libc_hidden_def(sendto) -# else +#endif +weak_alias(__libc_sendto,sendto)  libc_hidden_weak(sendto) -strong_alias(sendto,__libc_sendto) -# endif  #endif  #ifdef L_setsockopt | 
