[netfilter-cvslog] r3374 - trunk/nfsim/core

jk at netfilter.org jk at netfilter.org
Tue Dec 14 06:44:26 CET 2004


Author: jk at netfilter.org
Date: 2004-12-14 06:44:25 +0100 (Tue, 14 Dec 2004)
New Revision: 3374

Modified:
   trunk/nfsim/core/fakesockopt.c
   trunk/nfsim/core/message.c
   trunk/nfsim/core/message.h
   trunk/nfsim/core/nfsockopt.h
Log:
Use socketpair() to communicate with facksockopt library


Modified: trunk/nfsim/core/fakesockopt.c
===================================================================
--- trunk/nfsim/core/fakesockopt.c	2004-12-14 05:31:23 UTC (rev 3373)
+++ trunk/nfsim/core/fakesockopt.c	2004-12-14 05:44:25 UTC (rev 3374)
@@ -88,9 +88,8 @@
 void _init(void);
 void _init(void)
 {
-	struct sockaddr_un unix_addr;
-	int addrlen;
 	char *prefix;
+	char *fdstr;
 
 	if (!(handle = dlopen("libc.so.6", RTLD_LAZY))) {
 		fprintf(stderr, "%s\n", dlerror());
@@ -106,24 +105,13 @@
 
 	dlclose(handle);
 
-	addrlen = sizeof(struct sockaddr_un);
-
-	memset(&unix_addr, 0, addrlen);
-	unix_addr.sun_family = AF_UNIX;
-	strncpy(unix_addr.sun_path, FAKE_SOCKET, sizeof(unix_addr.sun_path));
-
-	if ((sd = (*__socket)(AF_UNIX, SOCK_STREAM, 0)) < 0) {
-		perror("socket");
+	if (!(fdstr = getenv("NFSIM_FAKESOCK_FD"))) {
+		fprintf(stderr, "The facksockopt.so library can only be used  "
+				"from within nfsim");
 		exit(EXIT_FAILURE);
 	}
+	sd = atoi(fdstr);
 
-	if (connect(sd, (struct sockaddr *)&unix_addr, addrlen)) {
-		perror("connect");
-		fprintf(stderr, "Couldn't connect to simulator through socket "
-		                "%s\n", FAKE_SOCKET);
-		exit(EXIT_FAILURE);
-	}
-
 	prefix = getenv("NFSIM_PROC_PREFIX");
 	if (prefix)
 		proc_prefix = prefix;
@@ -150,14 +138,16 @@
 
 	case KOP_COPY_TO_USER:
 		/* dst, src, len */
-		memcpy((char *)(msg->args[0]), (char *)msg + m_offset, msg->args[2]);
+		memcpy((char *)(msg->args[0]),
+				(char *)msg + m_offset, msg->args[2]);
 		reply = msg;
 		reply->len = 0;
 		break;
 	case KOP_COPY_FROM_USER:
 		reply = malloc(m_offset + msg->args[2]);
 		memcpy(reply, msg, m_offset);
-		memcpy((char *)reply + m_offset, (char *)msg->args[1], msg->args[2]);
+		memcpy((char *)reply + m_offset,
+				(char *)msg->args[1], msg->args[2]);
 		reply->len = msg->args[2];
 
 		break;

Modified: trunk/nfsim/core/message.c
===================================================================
--- trunk/nfsim/core/message.c	2004-12-14 05:31:23 UTC (rev 3373)
+++ trunk/nfsim/core/message.c	2004-12-14 05:44:25 UTC (rev 3374)
@@ -23,36 +23,33 @@
 #include "utils.h"
 
 #include <signal.h>
+#include <fcntl.h>
 #include <sys/stat.h>
+#include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/un.h>
 
-static int sockfd; /* listening socket */
-static int msgfd; /* current client */
+static int sock[2]; /* socket for messages. 0 = parent, 1 = child */
 
 static int send_userspace_message(struct nf_userspace_message *msg);
 static int handle_userspace_message(int fd);
 
 void message_init(void)
 {
-	struct sockaddr_un unix_addr;
 	sigset_t ss;
+	char *fdstr;
+	int fdflags;
 
-	unlink(FAKE_SOCKET);
-
-	sockfd = socket(PF_UNIX, SOCK_STREAM, 0);
-	if (sockfd < 0)
+	if (socketpair(PF_UNIX, SOCK_STREAM, PF_UNSPEC, sock))
 		barf_perror("socket");
 
-	memset(&unix_addr, 0, sizeof(struct sockaddr_un));
-	unix_addr.sun_family = AF_UNIX;
-	strncpy(unix_addr.sun_path, FAKE_SOCKET, sizeof(unix_addr.sun_path));
-	
-	if (bind(sockfd, (struct sockaddr *)&unix_addr, sizeof(struct sockaddr_un)))
-		barf_perror("bind");
+	fdflags = fcntl(sock[0], F_GETFD);
+	if (fcntl(sock[0], F_SETFD, fdflags & ~FD_CLOEXEC))
+		barf_perror("fcntl");
 
-	if (listen(sockfd, 0))
-		barf_perror("listen");
+	fdstr = talloc_asprintf(NULL, "%d", sock[1]);
+	setenv("NFSIM_FAKESOCK_FD", fdstr, 1);
+	talloc_free(fdstr);
 
 	sigemptyset(&ss);
 	sigaddset(&ss, SIGPIPE);
@@ -63,29 +60,14 @@
 {
 	sigset_t ss;
 
-	close(sockfd);
+	close(sock[0]);
+	close(sock[1]);
 
 	sigemptyset(&ss);
 	sigaddset(&ss, SIGPIPE);
 	sigprocmask(SIG_UNBLOCK, &ss, NULL);
 }
 
-int message_client_connection(int fd)
-{
-	int addrlen;
-	struct sockaddr_un addr;
-
-	addrlen = sizeof(struct sockaddr_un);
-	if ((msgfd = accept(fd, (struct sockaddr *)&addr, &addrlen)) < 0)
-		barf_perror("accept");
-
-	while (!handle_userspace_message(msgfd));
-
-	close(msgfd);
-	msgfd = 0;
-	return 0;
-}
-
 int handle_userspace_message(int fd)
 {
 	int len;
@@ -121,8 +103,8 @@
 		switch (msg.opcode) {
 
 		case KOP_COPY_FROM_USER:
-			if (complete_read(fd, (char *)msg.args[0], msg.args[2]) !=
-					msg.args[2])
+			if (complete_read(fd, (char *)msg.args[0],
+					msg.args[2]) !=	msg.args[2])
 				barf_perror("read");
 			break;
 		case KOP_COPY_TO_USER:
@@ -141,9 +123,9 @@
 
 int send_userspace_message(struct nf_userspace_message *msg)
 {
-	write(msgfd, msg, sizeof(struct nf_userspace_message) + msg->len);
+	write(sock[0], msg, sizeof(struct nf_userspace_message) + msg->len);
 	/* expect a reply */
-	return handle_userspace_message(msgfd);
+	return handle_userspace_message(sock[0]);
 
 }
 
@@ -151,7 +133,8 @@
 {
 	struct nf_userspace_message *msg;
 
-	msg = talloc_zero_named_const(NULL, sizeof(struct nf_userspace_message) + n, "copy_to_user");
+	msg = talloc_zero_named_const(NULL,
+		sizeof(struct nf_userspace_message) + n, "copy_to_user");
 
 	msg->type = UM_KERNELOP;
 	msg->opcode = KOP_COPY_TO_USER;
@@ -206,9 +189,9 @@
 
 		FD_ZERO(&fdset);
 		FD_SET(extra_fd, &fdset);
-		FD_SET(sockfd, &fdset);
+		FD_SET(sock[0], &fdset);
 
-		maxfd = max(extra_fd, sockfd);
+		maxfd = max(extra_fd, sock[0]);
 		sret = select(maxfd + 1, &fdset, NULL, NULL, NULL);
 		if (sret < 0) {
 			if ((errno == EINTR || errno == EAGAIN)
@@ -217,7 +200,7 @@
 			barf_perror("select");
 		}
 
-		if (FD_ISSET(sockfd, &fdset))
-			message_client_connection(sockfd);
+		if (FD_ISSET(sock[0], &fdset))
+			handle_userspace_message(sock[0]);
 	} while (!FD_ISSET(extra_fd, &fdset));
 }

Modified: trunk/nfsim/core/message.h
===================================================================
--- trunk/nfsim/core/message.h	2004-12-14 05:31:23 UTC (rev 3373)
+++ trunk/nfsim/core/message.h	2004-12-14 05:44:25 UTC (rev 3374)
@@ -26,7 +26,6 @@
 #include "nfsockopt.h"
 
 void message_init(void);
-int message_client_connection(int fd);
 void message_cleanup(void);
 
 int copy_to_user(void *to, const void *from, unsigned long n);

Modified: trunk/nfsim/core/nfsockopt.h
===================================================================
--- trunk/nfsim/core/nfsockopt.h	2004-12-14 05:31:23 UTC (rev 3373)
+++ trunk/nfsim/core/nfsockopt.h	2004-12-14 05:44:25 UTC (rev 3374)
@@ -22,8 +22,6 @@
 #ifndef __HAVE_NFSOCKOPT_H
 #define __HAVE_NFSOCKOPT_H
 
-#define FAKE_SOCKET "/tmp/nf_fake_socket"
-
 /* TODO: use the proper values insetad */
 #define SYS_GETSOCKOPT 1
 #define SYS_SETSOCKOPT 2




More information about the netfilter-cvslog mailing list