summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Green <paulg@samba.org>2003-04-30 17:48:46 +0000
committerPaul Green <paulg@samba.org>2003-04-30 17:48:46 +0000
commit5a6138082024d17eedab317038e8969c9f536530 (patch)
tree04e2c55cb287d4c8ddf3b202c898cc8c401a0a64
parent72e786496d644ef48f1f40d8e556e4bbcae8c364 (diff)
downloadsamba-5a6138082024d17eedab317038e8969c9f536530.tar.gz
samba-5a6138082024d17eedab317038e8969c9f536530.tar.bz2
samba-5a6138082024d17eedab317038e8969c9f536530.zip
Refactor existing sock_exec() and socketpair_tcp() functions into their own
source file. I will be making changes to sock_exec to work on VOS, which has a blocking connect() call, but first I want to get it in its own source file so that it can be called from a test program. (This used to be commit 10bf65d335b7d7076484172faa2b4689ed437552)
-rw-r--r--source3/Makefile.in2
-rw-r--r--source3/lib/util_sock.c93
2 files changed, 1 insertions, 94 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in
index 4f08187f33..3d99315777 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -167,7 +167,7 @@ LIB_OBJ = lib/charcnv.o lib/debug.o lib/fault.o \
lib/xfile.o lib/wins_srv.o \
lib/util_str.o lib/clobber.o lib/util_sid.o lib/util_uuid.o \
lib/util_unistr.o lib/util_file.o lib/data_blob.o \
- lib/util.o lib/util_sock.o lib/util_sec.o \
+ lib/util.o lib/util_sock.o lib/sock_exec.o lib/util_sec.o \
lib/talloc.o lib/hash.o lib/substitute.o lib/fsusage.o \
lib/ms_fnmatch.o lib/select.o lib/messages.o \
lib/tallocmsg.o lib/dmallocmsg.o \
diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c
index 2439cd8eac..8c171852ab 100644
--- a/source3/lib/util_sock.c
+++ b/source3/lib/util_sock.c
@@ -997,96 +997,3 @@ out_umask:
return -1;
#endif /* HAVE_UNIXSOCKET */
}
-
-/*******************************************************************
-this is like socketpair but uses tcp. It is used by the Samba
-regression test code
-The function guarantees that nobody else can attach to the socket,
-or if they do that this function fails and the socket gets closed
-returns 0 on success, -1 on failure
-the resulting file descriptors are symmetrical
- ******************************************************************/
-static int socketpair_tcp(int fd[2])
-{
- int listener;
- struct sockaddr_in sock;
- struct sockaddr_in sock2;
- socklen_t socklen = sizeof(sock);
- int connect_done = 0;
-
- fd[0] = fd[1] = listener = -1;
-
- memset(&sock, 0, sizeof(sock));
-
- if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed;
-
- memset(&sock2, 0, sizeof(sock2));
-#ifdef HAVE_SOCK_SIN_LEN
- sock2.sin_len = sizeof(sock2);
-#endif
- sock2.sin_family = PF_INET;
-
- bind(listener, (struct sockaddr *)&sock2, sizeof(sock2));
-
- if (listen(listener, 1) != 0) goto failed;
-
- if (getsockname(listener, (struct sockaddr *)&sock, &socklen) != 0) goto failed;
-
- if ((fd[1] = socket(PF_INET, SOCK_STREAM, 0)) == -1) goto failed;
-
- set_blocking(fd[1], 0);
-
- sock.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-
- if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) == -1) {
- if (errno != EINPROGRESS) goto failed;
- } else {
- connect_done = 1;
- }
-
- if ((fd[0] = accept(listener, (struct sockaddr *)&sock, &socklen)) == -1) goto failed;
-
- close(listener);
- if (connect_done == 0) {
- if (connect(fd[1],(struct sockaddr *)&sock,sizeof(sock)) != 0
- && errno != EISCONN) goto failed;
- }
-
- set_blocking(fd[1], 1);
-
- /* all OK! */
- return 0;
-
- failed:
- if (fd[0] != -1) close(fd[0]);
- if (fd[1] != -1) close(fd[1]);
- if (listener != -1) close(listener);
- return -1;
-}
-
-
-/*******************************************************************
-run a program on a local tcp socket, this is used to launch smbd
-when regression testing
-the return value is a socket which is attached to a subprocess
-running "prog". stdin and stdout are attached. stderr is left
-attached to the original stderr
- ******************************************************************/
-int sock_exec(const char *prog)
-{
- int fd[2];
- if (socketpair_tcp(fd) != 0) {
- DEBUG(0,("socketpair_tcp failed (%s)\n", strerror(errno)));
- return -1;
- }
- if (fork() == 0) {
- close(fd[0]);
- close(0);
- close(1);
- dup(fd[1]);
- dup(fd[1]);
- exit(system(prog));
- }
- close(fd[1]);
- return fd[0];
-}