Fix tests/nonet/
authorMatthew Mondor <mmondor@pulsar-zone.net>
Fri, 23 Mar 2018 15:05:13 +0000 (15:05 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Fri, 23 Mar 2018 15:05:13 +0000 (15:05 +0000)
tests/nonet/GNUmakefile
tests/nonet/README
tests/nonet/nonet [new file with mode: 0755]
tests/nonet/nonet-unix.c [new file with mode: 0644]
tests/nonet/nonet.c [deleted file]
tests/nonet/nonet.h [deleted file]

index 230ddd8..f809768 100644 (file)
@@ -1,21 +1,20 @@
-OBJS := nonet.o
-LIB := nonet.so
+LIBS := nonet-unix.so
 
-CFLAGS += -Wall -std=c99 -I . -fPIC
-LDFLAGS +=
+CFLAGS += -Wall -std=c99 -I . -fPIC -O0 -g
+LDFLAGS += -g
 
-all: $(LIB)
+all: $(LIBS)
 
 
 %.o: %.c
        cc -c ${CFLAGS} -o $@ $<
 
-$(LIB): $(OBJS)
-       cc -o $(LIB) -shared $(OBJS)
-
+%.so: %.o
+       cc -o $@ -shared $<
 
 install: all
-       install -c -o 0 -g 0 -m 555 $(LIB) /usr/local/lib/$(LIB)
+       install -c -o 0 -g 0 -m 555 $(LIBS) /usr/local/lib/
+       install -c -o 0 -g 0 -m 555 nonet /usr/local/bin/
 
 clean:
-       rm -f $(LIB) $(OBJS)
+       rm -f $(LIBS)
index 3dc8e5a..f9241f7 100644 (file)
@@ -1,10 +1,11 @@
 
 Deprives <program> from standard BSD IPC network system calls.
+However still allows AF_LOCAL/AF_UNIX, necessary for X11 applications.
 
 $ gmake
 $ su
 # gmake install; exit
 $ gmake clean
 
-$ LD_PRELOAD=/usr/local/lib/nonet.so <program>
+$ nonet <program>
 
diff --git a/tests/nonet/nonet b/tests/nonet/nonet
new file mode 100755 (executable)
index 0000000..c48615f
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+export LD_PRELOAD=/usr/local/lib/nonet-unix.so
+exec "$@"
diff --git a/tests/nonet/nonet-unix.c b/tests/nonet/nonet-unix.c
new file mode 100644 (file)
index 0000000..853f291
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2016, 2018, Matthew Mondor
+ * ALL RIGHTS RESERVED.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <dlfcn.h>
+#include <errno.h>
+#include <netdb.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+
+/*
+extern int socket(int domain, int type, int protocol);
+extern int connect(int s, const struct sockaddr *name, socklen_t namelen);
+extern int accept(int s, struct sockaddr * restrict addr,
+    socklen_t * restrict addrlen);
+extern int paccept(int s, struct sockaddr * restrict addr,
+    socklen_t * restrict addrlen, const sigset_t * restrict sigmask, int flags);
+extern int bind(int s, const struct sockaddr *name, socklen_t namelen);
+extern int listen(int s, int backlog);
+
+extern struct hostent *gethostbyname(const char *name);
+extern struct hostent *gethostbyname2(const char *name, int af);
+extern struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type);
+extern struct hostent *gethostent(void);
+extern void sethostent(int stayopen);
+extern void endhostent(void);
+
+extern int getnameinfo(const struct sockaddr * restrict sa, socklen_t salen,
+    char * restrict host, socklen_t hostlen, char * restrict serv,
+    socklen_t servlen, int flags);
+extern int getaddrinfo(const char * restrict hostname,
+    const char * restrict servname, const struct addrinfo * restrict hints,
+    struct addrinfo ** restrict res);
+
+extern int getsockopt(int s, int level, int optname, void * restrict optval,
+    socklen_t * restrict optlen);
+extern int setsockopt(int s, int level, int optname, const void *optval,
+    socklen_t optlen);
+*/
+
+
+static void            nonet_init(void);
+
+static bool            nonet_initialized = false;
+static void            *libc = NULL;
+static int             (*real_socket)(int, int, int) = NULL;
+struct hostent *       (*real_gethostbyname2)(const char *, int) = NULL;
+static struct hostent *        (*real_gethostbyaddr)(const void *, socklen_t, int)
+                           = NULL;
+static int             (*real_getnameinfo)(const struct sockaddr * restrict,
+                           socklen_t, char * restrict, socklen_t, char *
+                           restrict, socklen_t, int) = NULL;
+
+
+static void
+nonet_init(void)
+{
+
+       if (nonet_initialized)
+               return;
+
+       if ((libc = dlopen("/usr/lib/libc.so", RTLD_LAZY)) == NULL)
+               abort();
+
+       /* XXX "socket" here causes recursion */
+//     if ((real_socket = dlsym(RTLD_NEXT, "socket")) == NULL)
+       if ((real_socket = dlsym(libc, "__socket30")) == NULL)
+               abort();
+
+       if ((real_gethostbyname2 = dlsym(libc, "gethostbyname2")) == NULL)
+               abort();
+       if ((real_gethostbyaddr = dlsym(libc, "gethostbyaddr")) == NULL)
+               abort();
+       if ((real_getnameinfo = dlsym(libc, "getnameinfo")) == NULL)
+               abort();
+
+       nonet_initialized = true;
+}
+
+int
+socket(int domain, int type, int protocol)
+{
+
+       nonet_init();
+
+       if (domain == AF_LOCAL)
+               return real_socket(domain, type, protocol);
+
+       errno = EACCES;
+       return -1;
+}
+
+/* ARGSUSED */
+struct hostent *
+gethostbyname(const char *name)
+{
+
+       h_errno = NO_RECOVERY;
+       return NULL;
+}
+
+struct hostent *
+gethostbyname2(const char *name, int af)
+{
+
+       nonet_init();
+       if (af == AF_LOCAL)
+               return real_gethostbyname2(name, af);
+
+       h_errno = NO_RECOVERY;
+       return NULL;
+}
+
+struct hostent *
+gethostbyaddr(const void *addr, socklen_t len, int type)
+{
+
+       nonet_init();
+       if (type == AF_LOCAL)
+               return real_gethostbyaddr(addr, len, type);
+
+       h_errno = NO_RECOVERY;
+       return NULL;
+}
+
+int
+getnameinfo(const struct sockaddr * restrict sa, socklen_t salen,
+    char * restrict host, socklen_t hostlen, char * restrict serv,
+    socklen_t servlen, int flags)
+{
+
+       nonet_init();
+       if (sa != NULL && sa->sa_family == AF_LOCAL)
+               return real_getnameinfo(sa, salen, host, hostlen, serv,
+                   servlen, flags);
+
+       return EAI_FAIL;
+}
+
+/* ARGSUSED */
+int
+getaddrinfo(const char * restrict hostname, const char * restrict servname,
+    const struct addrinfo * restrict hints, struct addrinfo ** restrict res)
+{
+
+       return EAI_FAIL;
+}
diff --git a/tests/nonet/nonet.c b/tests/nonet/nonet.c
deleted file mode 100644 (file)
index 6377b6e..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (c) 2016, Matthew Mondor
- * ALL RIGHTS RESERVED.
- */
-
-#include <nonet.h>
-
-
-/* ARGSUSED */
-int
-socket(int domain, int type, int protocol)
-{
-       errno = EACCES;
-       return -1;
-}
-
-/* ARGSUSED */
-int
-connect(int s, const struct sockaddr *name, socklen_t namelen)
-{
-       errno = EBADF;
-       return -1;
-}
-
-/* ARGSUSED */
-int
-accept(int s, struct sockaddr * restrict addr, socklen_t * restrict addrlen)
-{
-       errno = EBADF;
-       return -1;
-}
-
-/* ARGSUSED */
-int
-paccept(int s, struct sockaddr * restrict addr, socklen_t * restrict addrlen,
-    const sigset_t * restrict sigmask, int flags)
-{
-       errno = EBADF;
-       return -1;
-}
-
-/* ARGSUSED */
-int
-bind(int s, const struct sockaddr *name, socklen_t namelen)
-{
-       errno = EACCES;
-       return -1;
-}
-
-/* ARGSUSED */
-int
-listen(int s, int backlog)
-{
-       errno = EBADF;
-       return -1;
-}
-
-/* ARGSUSED */
-struct hostent *
-gethostbyname(const char *name)
-{
-       h_errno = NO_RECOVERY;
-       return NULL;
-}
-
-/* ARGSUSED */
-struct hostent *
-gethostbyname2(const char *name, int af)
-{
-       h_errno = NO_RECOVERY;
-       return NULL;
-}
-
-/* ARGSUSED */
-struct hostent *
-gethostbyaddr(const void *addr, socklen_t len, int type)
-{
-       h_errno = NO_RECOVERY;
-       return NULL;
-}
-
-struct hostent *
-gethostent(void)
-{
-       h_errno = NO_RECOVERY;
-       return NULL;
-}
-
-/* ARGSUSED */
-void
-sethostent(int stayopen)
-{
-       /* NOOP */
-}
-
-void
-endhostent(void)
-{
-       /* NOOP */
-}
-
-/* ARGSUSED */
-int
-getnameinfo(const struct sockaddr * restrict sa, socklen_t salen,
-    char * restrict host, socklen_t hostlen, char * restrict serv,
-    socklen_t servlen, int flags)
-{
-       return EAI_FAIL;
-}
-
-/* ARGSUSED */
-int
-getaddrinfo(const char * restrict hostname,
-    const char * restrict servname, const struct addrinfo * restrict hints,
-    struct addrinfo ** restrict res)
-{
-       return EAI_FAIL;
-}
-
-/* ARGSUSED */
-int
-getsockopt(int s, int level, int optname, void * restrict optval,
-    socklen_t * restrict optlen)
-{
-       errno = EBADF;
-       return -1;
-}
-
-/* ARGSUSED */
-int
-setsockopt(int s, int level, int optname, const void *optval,
-    socklen_t optlen)
-{
-       errno = EBADF;
-       return -1;
-}
-
diff --git a/tests/nonet/nonet.h b/tests/nonet/nonet.h
deleted file mode 100644 (file)
index 46f8e9a..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2016, Matthew Mondor
- * ALL RIGHTS RESERVED.
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <errno.h>
-#include <netdb.h>
-#include <stddef.h>
-
-extern int socket(int domain, int type, int protocol);
-extern int connect(int s, const struct sockaddr *name, socklen_t namelen);
-extern int accept(int s, struct sockaddr * restrict addr,
-    socklen_t * restrict addrlen);
-extern int paccept(int s, struct sockaddr * restrict addr,
-    socklen_t * restrict addrlen, const sigset_t * restrict sigmask, int flags);
-extern int bind(int s, const struct sockaddr *name, socklen_t namelen);
-extern int listen(int s, int backlog);
-
-extern struct hostent *gethostbyname(const char *name);
-extern struct hostent *gethostbyname2(const char *name, int af);
-extern struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type);
-extern struct hostent *gethostent(void);
-extern void sethostent(int stayopen);
-extern void endhostent(void);
-
-extern int getnameinfo(const struct sockaddr * restrict sa, socklen_t salen,
-    char * restrict host, socklen_t hostlen, char * restrict serv,
-    socklen_t servlen, int flags);
-extern int getaddrinfo(const char * restrict hostname,
-    const char * restrict servname, const struct addrinfo * restrict hints,
-    struct addrinfo ** restrict res);
-
-extern int getsockopt(int s, int level, int optname, void * restrict optval,
-    socklen_t * restrict optlen);
-extern int setsockopt(int s, int level, int optname, const void *optval,
-    socklen_t optlen);
-