summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2000-10-23 23:23:54 +0000
committerEric Andersen <andersen@codepoet.org>2000-10-23 23:23:54 +0000
commit5606e4d6f92c10af214b54a01db79cf561067e58 (patch)
treef50c5adf765ad7492736b3fb0e9ae669573e4e5e
parent56c9a8402ff4c9004331efc77e5a5fe62aa65014 (diff)
More reorg. A place for everything and everything in its place...
-rw-r--r--include/sys/socket.h4
-rw-r--r--libc/inet/Makefile11
-rw-r--r--libc/inet/socketcalls.c232
-rw-r--r--libc/misc/time/Makefile2
-rw-r--r--libc/misc/time/adjtime.c51
-rw-r--r--libc/misc/time/utimes.c16
-rw-r--r--libc/signal/Makefile3
-rw-r--r--libc/signal/bsd_sig.c34
-rw-r--r--libc/signal/sigblock.c45
-rw-r--r--libc/signal/siggtmsk.c39
-rw-r--r--libc/signal/sigjmp.c35
-rw-r--r--libc/signal/signal.c20
-rw-r--r--libc/signal/sigpause.c37
-rw-r--r--libc/signal/sigstmsk.c46
-rw-r--r--libc/string/Makefile2
-rw-r--r--libc/string/strsignal.c11
-rw-r--r--libc/string/sys_errlist.c140
-rw-r--r--libc/sysdeps/linux/common/setegid.c2
-rw-r--r--libc/sysdeps/linux/common/waitpid.c10
19 files changed, 716 insertions, 24 deletions
diff --git a/include/sys/socket.h b/include/sys/socket.h
index 7642e7502..43bd6d6ea 100644
--- a/include/sys/socket.h
+++ b/include/sys/socket.h
@@ -117,8 +117,6 @@ extern int getsockname __P ((int __fd, __SOCKADDR_ARG __addr,
For connectionless socket types, just set the default address to send to
and the only address from which to accept transmissions.
Return 0 on success, -1 for errors. */
-extern int __connect __P ((int __fd,
- __CONST_SOCKADDR_ARG __addr, socklen_t __len));
extern int connect __P ((int __fd,
__CONST_SOCKADDR_ARG __addr, socklen_t __len));
@@ -129,8 +127,6 @@ extern int getpeername __P ((int __fd, __SOCKADDR_ARG __addr,
/* Send N bytes of BUF to socket FD. Returns the number sent or -1. */
-extern int __send __P ((int __fd, __const __ptr_t __buf, size_t __n,
- int __flags));
extern int send __P ((int __fd, __const __ptr_t __buf, size_t __n,
int __flags));
diff --git a/libc/inet/Makefile b/libc/inet/Makefile
index 95432060e..45db1c13f 100644
--- a/libc/inet/Makefile
+++ b/libc/inet/Makefile
@@ -35,7 +35,12 @@ MOBJ2=encodeh.o decodeh.o encoded.o decoded.o lengthd.o encodeq.o \
formquery.o dnslookup.o resolveaddress.o resolvemailbox.o \
opennameservers.o closenameservers.o resolvename.o gethostbyname.o\
gethostbyaddr.o
-OBJS=$(MOBJ) $(MOBJ2)
+
+MSRC3=socketcalls.c
+MOBJ3= accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o \
+ listen.o recv.o recvfrom.o recvmsg.o send.o sendmsg.o sendto.o \
+ setsockopt.o shutdown.o socket.o socketpair.o
+OBJS=$(MOBJ) $(MOBJ2) $(MOBJ3)
all: $(OBJS) $(LIBC)
@@ -53,6 +58,10 @@ $(MOBJ2): $(MSRC2)
$(CC) $(CFLAGS) -DL_$* $< -c -o $*.o
$(STRIPTOOL) -x -R .note -R .comment $*.o
+$(MOBJ3): $(MSRC2)
+ $(CC) $(CFLAGS) -DL_$* $< -c -o $*.o
+ $(STRIPTOOL) -x -R .note -R .comment $*.o
+
$(OBJS): Makefile
clean: subdirs_clean
diff --git a/libc/inet/socketcalls.c b/libc/inet/socketcalls.c
new file mode 100644
index 000000000..162e0770b
--- /dev/null
+++ b/libc/inet/socketcalls.c
@@ -0,0 +1,232 @@
+#include <errno.h>
+#include <syscall.h>
+#include <sys/socket.h>
+#include <sys/socketcall.h>
+
+extern int socketcall(int call, unsigned long *args);
+
+#ifdef L_accept
+int 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);
+}
+#endif
+
+#ifdef L_bind
+int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen)
+{
+ unsigned long args[3];
+
+ args[0] = sockfd;
+ args[1] = (unsigned long) myaddr;
+ args[2] = addrlen;
+ return socketcall(SYS_BIND, args);
+}
+#endif
+
+#ifdef L_connect
+int 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);
+}
+#endif
+
+#ifdef L_getpeername
+int getpeername(int sockfd, struct sockaddr *addr, socklen_t * paddrlen)
+{
+ unsigned long args[3];
+
+ args[0] = sockfd;
+ args[1] = (unsigned long) addr;
+ args[2] = (unsigned long) paddrlen;
+ return socketcall(SYS_GETPEERNAME, args);
+}
+#endif
+
+#ifdef L_getsockname
+int getsockname(int sockfd, struct sockaddr *addr, socklen_t * paddrlen)
+{
+ unsigned long args[3];
+
+ args[0] = sockfd;
+ args[1] = (unsigned long) addr;
+ args[2] = (unsigned long) paddrlen;
+ return socketcall(SYS_GETSOCKNAME, args);
+}
+#endif
+
+#ifdef L_getsockopt
+int getsockopt(int fd, int level, int optname, __ptr_t optval,
+ socklen_t * optlen)
+{
+ unsigned long args[5];
+
+ args[0] = fd;
+ args[1] = level;
+ args[2] = optname;
+ args[3] = (unsigned long) optval;
+ args[4] = (unsigned long) optlen;
+ return (socketcall(SYS_GETSOCKOPT, args));
+}
+#endif
+
+#ifdef L_listen
+int listen(int sockfd, unsigned int backlog)
+{
+ unsigned long args[2];
+
+ args[0] = sockfd;
+ args[1] = backlog;
+ return socketcall(SYS_LISTEN, args);
+}
+#endif
+
+#ifdef L_recv
+/* recv, recvfrom added by bir7@leland.stanford.edu */
+int recv(int sockfd, __ptr_t buffer, size_t len, int flags)
+{
+ unsigned long args[4];
+
+ args[0] = sockfd;
+ args[1] = (unsigned long) buffer;
+ args[2] = len;
+ args[3] = flags;
+ return (socketcall(SYS_RECV, args));
+}
+#endif
+
+#ifdef L_recvfrom
+/* recv, recvfrom added by bir7@leland.stanford.edu */
+int recvfrom(int sockfd, __ptr_t buffer, size_t len, int flags,
+ struct sockaddr *to, socklen_t * tolen)
+{
+ unsigned long args[6];
+
+ args[0] = sockfd;
+ args[1] = (unsigned long) buffer;
+ args[2] = len;
+ args[3] = flags;
+ args[4] = (unsigned long) to;
+ args[5] = (unsigned long) tolen;
+ return (socketcall(SYS_RECVFROM, args));
+}
+#endif
+
+#ifdef L_recvmsg
+int 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));
+}
+#endif
+
+#ifdef L_send
+/* send, sendto added by bir7@leland.stanford.edu */
+int send(int sockfd, const void *buffer, size_t len, int flags)
+{
+ unsigned long args[4];
+
+ args[0] = sockfd;
+ args[1] = (unsigned long) buffer;
+ args[2] = len;
+ args[3] = flags;
+ return (socketcall(SYS_SEND, args));
+}
+#endif
+
+#ifdef L_sendmsg
+int 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));
+}
+#endif
+
+#ifdef L_sendto
+/* send, sendto added by bir7@leland.stanford.edu */
+int sendto(int sockfd, const void *buffer, size_t len, int flags,
+ const struct sockaddr *to, socklen_t tolen)
+{
+ unsigned long args[6];
+
+ args[0] = sockfd;
+ args[1] = (unsigned long) buffer;
+ args[2] = len;
+ args[3] = flags;
+ args[4] = (unsigned long) to;
+ args[5] = tolen;
+ return (socketcall(SYS_SENDTO, args));
+}
+#endif
+
+#ifdef L_setsockopt
+/* [sg]etsockoptions by bir7@leland.stanford.edu */
+int setsockopt(int fd, int level, int optname, const void *optval,
+ socklen_t optlen)
+{
+ unsigned long args[5];
+
+ args[0] = fd;
+ args[1] = level;
+ args[2] = optname;
+ args[3] = (unsigned long) optval;
+ args[4] = optlen;
+ return (socketcall(SYS_SETSOCKOPT, args));
+}
+#endif
+
+#ifdef L_shutdown
+/* shutdown by bir7@leland.stanford.edu */
+int shutdown(int sockfd, int how)
+{
+ unsigned long args[2];
+
+ args[0] = sockfd;
+ args[1] = how;
+ return (socketcall(SYS_SHUTDOWN, args));
+}
+#endif
+
+#ifdef L_socket
+int socket(int family, int type, int protocol)
+{
+ unsigned long args[3];
+
+ args[0] = family;
+ args[1] = type;
+ args[2] = (unsigned long) protocol;
+ return socketcall(SYS_SOCKET, args);
+}
+#endif
+
+#ifdef L_socketpair
+int socketpair(int family, int type, int protocol, int sockvec[2])
+{
+ unsigned long args[4];
+
+ args[0] = family;
+ args[1] = type;
+ args[2] = protocol;
+ args[3] = (unsigned long) sockvec;
+ return socketcall(SYS_SOCKETPAIR, args);
+}
+#endif
+
diff --git a/libc/misc/time/Makefile b/libc/misc/time/Makefile
index ec8199c69..76adb2e2f 100644
--- a/libc/misc/time/Makefile
+++ b/libc/misc/time/Makefile
@@ -25,7 +25,7 @@ include $(TOPDIR)Rules.mak
LIBC=$(TOPDIR)libc.a
CSRC=localtime.c gmtime.c asctime.c ctime.c asc_conv.c tm_conv.c mktime.c \
- localtime_r.c gmtime_r.c asctime_r.c ctime_r.c
+ localtime_r.c gmtime_r.c asctime_r.c ctime_r.c utimes.c adjtime.c
COBJS=$(patsubst %.c,%.o, $(CSRC))
OBJS=$(COBJS)
diff --git a/libc/misc/time/adjtime.c b/libc/misc/time/adjtime.c
new file mode 100644
index 000000000..12c1a2a40
--- /dev/null
+++ b/libc/misc/time/adjtime.c
@@ -0,0 +1,51 @@
+#include <limits.h>
+#include <sys/time.h>
+#include <sys/timex.h>
+#include <errno.h>
+
+#define MAX_SEC (LONG_MAX / 1000000L - 2)
+#define MIN_SEC (LONG_MIN / 1000000L + 2)
+
+#ifndef MOD_OFFSET
+#define modes mode
+#endif
+
+int
+adjtime(const struct timeval * itv, struct timeval * otv)
+{
+ struct timex tntx;
+
+ if (itv)
+ {
+ struct timeval tmp;
+
+ /* We will do some check here. */
+ tmp.tv_sec = itv->tv_sec + itv->tv_usec / 1000000L;
+ tmp.tv_usec = itv->tv_usec % 1000000L;
+ if (tmp.tv_sec > MAX_SEC || tmp.tv_sec < MIN_SEC)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ tntx.offset = tmp.tv_usec + tmp.tv_sec * 1000000L;
+ tntx.modes = ADJ_OFFSET_SINGLESHOT;
+ }
+ else
+ {
+ tntx.modes = 0;
+ }
+ if (adjtimex(&tntx) < 0) return -1;
+ if (otv) {
+ if (tntx.offset < 0)
+ {
+ otv->tv_usec = -(-tntx.offset % 1000000);
+ otv->tv_sec = -(-tntx.offset / 1000000);
+ }
+ else
+ {
+ otv->tv_usec = tntx.offset % 1000000;
+ otv->tv_sec = tntx.offset / 1000000;
+ }
+ }
+ return 0;
+}
diff --git a/libc/misc/time/utimes.c b/libc/misc/time/utimes.c
new file mode 100644
index 000000000..364bf83e7
--- /dev/null
+++ b/libc/misc/time/utimes.c
@@ -0,0 +1,16 @@
+#include <utime.h>
+#include <sys/time.h>
+
+int utimes(const char *path, struct timeval tvp[2])
+{
+ struct utimbuf buf, *times;
+
+ if (tvp) {
+ times = &buf;
+ times->actime = tvp[0].tv_sec;
+ times->modtime = tvp[1].tv_sec;
+ }
+ else
+ times = NULL;
+ return utime(path, times);
+}
diff --git a/libc/signal/Makefile b/libc/signal/Makefile
index f59f2cd27..9fb8e1d46 100644
--- a/libc/signal/Makefile
+++ b/libc/signal/Makefile
@@ -24,7 +24,8 @@ TOPDIR=../
include $(TOPDIR)Rules.mak
LIBC=$(TOPDIR)libc.a
-CSRC=raise.c
+CSRC=bsd_sig.c raise.c sigblock.c siggtmsk.c sigjmp.c signal.c sigpause.c sigstmsk.c
+
COBJS=$(patsubst %.c,%.o, $(CSRC))
OBJS=$(COBJS)
diff --git a/libc/signal/bsd_sig.c b/libc/signal/bsd_sig.c
new file mode 100644
index 000000000..509de87cb
--- /dev/null
+++ b/libc/signal/bsd_sig.c
@@ -0,0 +1,34 @@
+#define __USE_BSD_SIGNAL
+
+#include <signal.h>
+
+#undef signal
+
+/* The `sig' bit is set if the interrupt on it
+ * is enabled via siginterrupt (). */
+extern sigset_t _sigintr;
+
+__sighandler_t
+__bsd_signal (int sig, __sighandler_t handler)
+{
+ int ret;
+ struct sigaction action, oaction;
+ action.sa_handler = handler;
+ __sigemptyset (&action.sa_mask);
+ if (!__sigismember (&_sigintr, sig)) {
+#ifdef SA_RESTART
+ action.sa_flags = SA_RESTART;
+#else
+ action.sa_flags = 0;
+#endif
+ }
+ else {
+#ifdef SA_INTERRUPT
+ action.sa_flags = SA_INTERRUPT;
+#else
+ action.sa_flags = 0;
+#endif
+ }
+ ret = __sigaction (sig, &action, &oaction);
+ return (ret == -1) ? SIG_ERR : oaction.sa_handler;
+}
diff --git a/libc/signal/sigblock.c b/libc/signal/sigblock.c
new file mode 100644
index 000000000..8edfe0df2
--- /dev/null
+++ b/libc/signal/sigblock.c
@@ -0,0 +1,45 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#define __USE_BSD
+#include <signal.h>
+
+/* Block signals in MASK, returning the old mask. */
+int sigblock (int mask)
+{
+ register int sig;
+ sigset_t set, oset;
+
+ if (sigemptyset(&set) < 0)
+ return -1;
+
+ for (sig = 1; sig < NSIG; ++sig)
+ if ((mask & sigmask(sig)) && sigaddset(&set, sig) < 0)
+ return -1;
+
+ if (sigprocmask(SIG_BLOCK, &set, &oset) < 0)
+ return -1;
+
+ mask = 0;
+ for (sig = 1; sig < NSIG; ++sig)
+ if (sigismember(&oset, sig))
+ mask |= sigmask(sig);
+
+ return mask;
+}
diff --git a/libc/signal/siggtmsk.c b/libc/signal/siggtmsk.c
new file mode 100644
index 000000000..517cb49fb
--- /dev/null
+++ b/libc/signal/siggtmsk.c
@@ -0,0 +1,39 @@
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#define __USE_BSD
+#include <signal.h>
+
+/* Get the mask of blocked signals. */
+int siggetmask()
+{
+ sigset_t oset;
+ register int sig;
+ int mask;
+
+ if (sigprocmask(SIG_SETMASK, 0, &oset) < 0)
+ return -1;
+
+ mask = 0;
+ for (sig = 1; sig < NSIG; ++sig)
+ if (sigismember(&oset, sig) == 1)
+ mask |= sigmask(sig);
+
+ return mask;
+}
diff --git a/libc/signal/sigjmp.c b/libc/signal/sigjmp.c
new file mode 100644
index 000000000..ec70e0ec9
--- /dev/null
+++ b/libc/signal/sigjmp.c
@@ -0,0 +1,35 @@
+/* Copyright (C) 1992, 1994, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <stddef.h>
+#include <setjmp.h>
+#include <signal.h>
+
+/* This function is called by the `sigsetjmp' macro
+ before doing a `__setjmp' on ENV[0].__jmpbuf.
+ Always return zero. */
+
+int
+__sigjmp_save (sigjmp_buf env, int savemask)
+{
+ env[0].__mask_was_saved = (savemask &&
+ sigprocmask (SIG_BLOCK, (sigset_t *) NULL,
+ &env[0].__saved_mask) == 0);
+
+ return 0;
+}
diff --git a/libc/signal/signal.c b/libc/signal/signal.c
new file mode 100644
index 000000000..62af55f38
--- /dev/null
+++ b/libc/signal/signal.c
@@ -0,0 +1,20 @@
+#include <string.h>
+#include <signal.h>
+
+__sighandler_t
+__signal (int sig, __sighandler_t handler, int flags)
+{
+ int ret;
+ struct sigaction action, oaction;
+ memset(&action, 0, sizeof(struct sigaction));
+ action.sa_handler = handler;
+ action.sa_flags = flags;
+ ret = sigaction (sig, &action, &oaction);
+ return (ret == -1) ? SIG_ERR : oaction.sa_handler;
+}
+
+__sighandler_t
+signal (int sig, __sighandler_t handler)
+{
+ return __signal(sig, handler, (SA_ONESHOT | SA_NOMASK | SA_INTERRUPT) & ~SA_RESTART);
+}
diff --git a/libc/signal/sigpause.c b/libc/signal/sigpause.c
new file mode 100644
index 000000000..ff9809482
--- /dev/null
+++ b/libc/signal/sigpause.c
@@ -0,0 +1,37 @@
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#include <signal.h>
+
+#undef sigpause
+
+/* Set the mask of blocked signals to MASK,
+ wait for a signal to arrive, and then restore the mask. */
+int sigpause(int mask)
+{
+ sigset_t set;
+ int sig;
+
+ sigemptyset(&set);
+ for (sig = 1; sig < NSIG; ++sig)
+ if (mask & sigmask(sig))
+ sigaddset(&set, sig);
+
+ return sigsuspend (&set);
+}
diff --git a/libc/signal/sigstmsk.c b/libc/signal/sigstmsk.c
new file mode 100644
index 000000000..6b1876b32
--- /dev/null
+++ b/libc/signal/sigstmsk.c
@@ -0,0 +1,46 @@
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#define __USE_BSD
+#include <signal.h>
+
+/* Set the mask of blocked signals to MASK, returning the old mask. */
+int sigsetmask (int mask)
+{
+ register int sig;
+ sigset_t set, oset;
+
+ if (sigemptyset(&set) < 0)
+ return -1;
+
+ for (sig = 1; sig < NSIG; ++sig)
+ if ((mask & sigmask(sig)) &&
+ sigaddset(&set, sig) < 0)
+ return -1;
+
+ if (sigprocmask(SIG_SETMASK, &set, &oset) < 0)
+ return -1;
+
+ mask = 0;
+ for (sig = 1; sig < NSIG; ++sig)
+ if (sigismember(&oset, sig) == 1)
+ mask |= sigmask(sig);
+
+ return mask;
+}
diff --git a/libc/string/Makefile b/libc/string/Makefile
index 39d9f0b5d..107b787ef 100644
--- a/libc/string/Makefile
+++ b/libc/string/Makefile
@@ -34,7 +34,7 @@ MOBJ1=index.o rindex.o
CSRC=strpbrk.c strsep.c strstr.c strtok.c strcspn.c config.c strspn.c \
strcasecmp.c strncasecmp.c strerror.c bcopy.c bzero.c bcmp.c \
- strsignal.c
+ strsignal.c sys_errlist.c
COBJS=$(patsubst %.c,%.o, $(CSRC))
OBJS=$(MOBJ) $(MOBJ1) $(COBJS)
diff --git a/libc/string/strsignal.c b/libc/string/strsignal.c
index ff4f69923..83a862bfb 100644
--- a/libc/string/strsignal.c
+++ b/libc/string/strsignal.c
@@ -8,7 +8,7 @@
#include <malloc.h>
#include <signal.h>
-const char *const sys_siglist[NSIG] = {
+const char *const sys_siglist[] = {
"Unknown signal",
"Hangup",
"Interrupt",
@@ -32,20 +32,21 @@ const char *const sys_siglist[NSIG] = {
"Stopped",
"Stopped (tty input)",
"Stopped (tty output)",
- "Possible I/O",
+ "Urgent condition",
"CPU time limit exceeded",
"File size limit exceeded",
"Virtual time alarm",
"Profile signal",
"Window size changed",
- "File lock lost",
+ "Possible I/O",
"Power failure",
- "Unused signal"
+ "Unused signal",
+ NULL
};
/********************** Function strsignal ************************************/
-char *strsignal (int sig)
+char *strsignal(int sig)
{
static char retbuf[80];
diff --git a/libc/string/sys_errlist.c b/libc/string/sys_errlist.c
new file mode 100644
index 000000000..c92302fce
--- /dev/null
+++ b/libc/string/sys_errlist.c
@@ -0,0 +1,140 @@
+#include <stddef.h>
+#if 0
+#include <errno.h>
+#endif
+
+/* This is a list of all known signal numbers. */
+
+const char * const sys_errlist[] = {
+ "Success", /* 0 */
+ "Operation not permitted", /* EPERM */
+ "No such file or directory", /* ENOENT */
+ "No such process", /* ESRCH */
+ "Interrupted system call", /* EINTR */
+ "I/O error", /* EIO */
+ "No such device or address", /* ENXIO */
+ "Arg list too long", /* E2BIG */
+ "Exec format error", /* ENOEXEC */
+ "Bad file number", /* EBADF */
+ "No child processes", /* ECHILD */
+ "Try again", /* EAGAIN */
+ "Out of memory", /* ENOMEM */
+ "Permission denied", /* EACCES */
+ "Bad address", /* EFAULT */
+ "Block device required", /* ENOTBLK */
+ "Device or resource busy", /* EBUSY */
+ "File exists", /* EEXIST */
+ "Cross-device link", /* EXDEV */
+ "No such device", /* ENODEV */
+ "Not a directory", /* ENOTDIR */
+ "Is a directory", /* EISDIR */
+ "Invalid argument", /* EINVAL */
+ "File table overflow", /* ENFILE */
+ "Too many open files", /* EMFILE */
+ "Not a typewriter", /* ENOTTY */
+ "Text file busy", /* ETXTBSY */
+ "File too large", /* EFBIG */
+ "No space left on device", /* ENOSPC */
+ "Illegal seek", /* ESPIPE */
+ "Read-only file system", /* EROFS */
+ "Too many links", /* EMLINK */
+ "Broken pipe", /* EPIPE */
+ "Math argument out of domain of func", /* EDOM */
+ "Math result not representable", /* ERANGE */
+ "Resource deadlock would occur", /* EDEADLK */
+ "File name too long", /* ENAMETOOLONG */
+ "No record locks available", /* ENOLCK */
+ "Function not implemented", /* ENOSYS */
+ "Directory not empty", /* ENOTEMPTY */
+ "Too many symbolic links encountered", /* ELOOP */
+ "Operation would block", /* EWOULDBLOCK */
+ "No message of desired type", /* ENOMSG */
+ "Identifier removed", /* EIDRM */
+ "Channel number out of range", /* ECHRNG */
+ "Level 2 not synchronized", /* EL2NSYNC */
+ "Level 3 halted", /* EL3HLT */
+ "Level 3 reset", /* EL3RST */
+ "Link number out of range", /* ELNRNG */
+ "Protocol driver not attached", /* EUNATCH */
+ "No CSI structure available", /* ENOCSI */
+ "Level 2 halted", /* EL2HLT */
+ "Invalid exchange", /* EBADE */
+ "Invalid request descriptor", /* EBADR */
+ "Exchange full", /* EXFULL */
+ "No anode", /* ENOANO */
+ "Invalid request code", /* EBADRQC */
+ "Invalid slot", /* EBADSLT */
+ "File locking deadlock error", /* EDEADLOCK */
+ "Bad font file format", /* EBFONT */
+ "Device not a stream", /* ENOSTR */
+ "No data available", /* ENODATA */
+ "Timer expired", /* ETIME */
+ "Out of streams resources", /* ENOSR */
+ "Machine is not on the network", /* ENONET */
+ "Package not installed", /* ENOPKG */
+ "Object is remote", /* EREMOTE */
+ "Link has been severed", /* ENOLINK */
+ "Advertise error", /* EADV */
+ "Srmount error", /* ESRMNT */
+ "Communication error on send", /* ECOMM */
+ "Protocol error", /* EPROTO */
+ "Multihop attempted", /* EMULTIHOP */
+ "RFS specific error", /* EDOTDOT */
+ "Not a data message", /* EBADMSG */
+ "Value too large for defined data type", /* EOVERFLOW */
+ "Name not unique on network", /* ENOTUNIQ */
+ "File descriptor in bad state", /* EBADFD */
+ "Remote address changed", /* EREMCHG */
+ "Can not access a needed shared library", /* ELIBACC */
+ "Accessing a corrupted shared library", /* ELIBBAD */
+ ".lib section in a.out corrupted", /* ELIBSCN */
+ "Attempting to link in too many shared libraries", /* ELIBMAX */
+ "Cannot exec a shared library directly", /* ELIBEXEC */
+ "Illegal byte sequence", /* EILSEQ */
+ "Interrupted system call should be restarted", /* ERESTART */
+ "Streams pipe error", /* ESTRPIPE */
+ "Too many users", /* EUSERS */
+ "Socket operation on non-socket", /* ENOTSOCK */
+ "Destination address required", /* EDESTADDRREQ */
+ "Message too long", /* EMSGSIZE */
+ "Protocol wrong type for socket", /* EPROTOTYPE */
+ "Protocol not available", /* ENOPROTOOPT */
+ "Protocol not supported", /* EPROTONOSUPPORT */
+ "Socket type not supported", /* ESOCKTNOSUPPORT */
+ "Operation not supported on transport endpoint", /* EOPNOTSUPP */
+ "Protocol family not supported", /* EPFNOSUPPORT */
+ "Address family not supported by protocol", /* EAFNOSUPPORT */
+ "Address already in use", /* EADDRINUSE */
+ "Cannot assign requested address", /* EADDRNOTAVAIL */
+ "Network is down", /* ENETDOWN */
+ "Network is unreachable", /* ENETUNREACH */
+ "Network dropped connection because of reset", /* ENETRESET */
+ "Software caused connection abort", /* ECONNABORTED */
+ "Connection reset by peer", /* ECONNRESET */
+ "No buffer space available", /* ENOBUFS */
+ "Transport endpoint is already connected", /* EISCONN */
+ "Transport endpoint is not connected", /* ENOTCONN */
+ "Cannot send after transport endpoint shutdown", /* ESHUTDOWN */
+ "Too many references: cannot splice", /* ETOOMANYREFS */
+ "Connection timed out", /* ETIMEDOUT */
+ "Connection refused", /* ECONNREFUSED */
+ "Host is down", /* EHOSTDOWN */
+ "No route to host", /* EHOSTUNREACH */
+ "Operation already in progress", /* EALREADY */
+ "Operation now in progress", /* EINPROGRESS */
+ "Stale NFS file handle", /* ESTALE */
+ "Structure needs cleaning", /* EUCLEAN */
+ "Not a XENIX named type file", /* ENOTNAM */
+ "No XENIX semaphores available", /* ENAVAIL */
+ "Is a named type file", /* EISNAM */
+ "Remote I/O error", /* EREMOTEIO */
+ "Quota exceeded", /* EDQUOT */
+ "No medium found", /* ENOMEDIUM */
+ "Wrong medium type", /* EMEDIUMTYPE */
+ NULL
+};
+
+
+#define NR_ERRORS ((sizeof (sys_errlist))/(sizeof(char *))-1)
+
+const int sys_nerr = NR_ERRORS;
diff --git a/libc/sysdeps/linux/common/setegid.c b/libc/sysdeps/linux/common/setegid.c
index 3eebf60fb..19d8e3f9c 100644
--- a/libc/sysdeps/linux/common/setegid.c
+++ b/libc/sysdeps/linux/common/setegid.c
@@ -2,5 +2,5 @@
int setegid(gid_t gid)
{
- return __setregid(-1, gid);
+ return setregid(-1, gid);
}
diff --git a/libc/sysdeps/linux/common/waitpid.c b/libc/sysdeps/linux/common/waitpid.c
deleted file mode 100644
index 0d95b4e81..000000000
--- a/libc/sysdeps/linux/common/waitpid.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <syscall.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/resource.h>
-
-__pid_t
-waitpid(__pid_t pid, int *wait_stat, int options)
-{
- return wait4(pid, (__WAIT_STATUS) wait_stat, options, NULL);
-}