[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