summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2022-11-08 14:37:35 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2022-11-08 14:37:35 +0900
commit8962c1e774e716cde1a7afeaca86558e48960ab1 (patch)
tree924ad77d8f82aefea74efce927cf04c6f5b6b980
parent3297e453aa0e371e14fd26e53f4a6f84e20c21d3 (diff)
downloadlibassuan-8962c1e774e716cde1a7afeaca86558e48960ab1.tar.gz
tests: Add fdpassing-socket.sh script.
* tests/Makefile.am (TESTS_ENVIRONMENT): Export EXEEXT. (test_programs): New. Run pipeconnect for Windows, too. (check_SCRIPTS): New. (TESTS): Now, it's test_programs and check_SCRIPTS. (noinst_PROGRAMS): Not including check_SCRIPTS. (tests/fdpassing-socket.sh): New, to test socket connection. * tests/fdpassing.c: Include socket connection test. * tests/pipeconnect.c: Fix for Windows. -- Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
-rw-r--r--tests/Makefile.am16
-rwxr-xr-xtests/fdpassing-socket.sh22
-rw-r--r--tests/fdpassing.c222
-rw-r--r--tests/pipeconnect.c12
4 files changed, 208 insertions, 64 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 317c66d..fba3b8e 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -18,30 +18,34 @@
## Process this file with automake to produce Makefile.in
-TESTS_ENVIRONMENT =
+TESTS_ENVIRONMENT = EXEEXT=$(EXEEXT); export EXEEXT;
EXTRA_DIST = motd
BUILT_SOURCES =
CLEANFILES =
-TESTS = version
+test_programs = version
+test_programs += pipeconnect
if HAVE_W32_SYSTEM
-TESTS += fdpassing
+test_programs += fdpassing
+check_SCRIPTS = fdpassing-socket.sh
testtools =
else
-TESTS += pipeconnect
testtools = socks5
endif
if USE_DESCRIPTOR_PASSING
-TESTS += fdpassing
+test_programs += fdpassing
+check_SCRIPTS = fdpassing-socket.sh
endif
+TESTS = $(test_programs) $(check_SCRIPTS)
+
AM_CFLAGS = $(GPG_ERROR_CFLAGS)
AM_LDFLAGS = -no-install
noinst_HEADERS = common.h
-noinst_PROGRAMS = $(TESTS) $(w32cetools) $(testtools)
+noinst_PROGRAMS = $(test_programs) $(w32cetools) $(testtools)
LDADD = ../src/libassuan.la $(GPG_ERROR_LIBS) @LDADD_FOR_TESTS_KLUDGE@
diff --git a/tests/fdpassing-socket.sh b/tests/fdpassing-socket.sh
new file mode 100755
index 0000000..a006276
--- /dev/null
+++ b/tests/fdpassing-socket.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+if test -e a.sock; then
+ rm -f a.sock
+fi
+
+./fdpassing$EXEEXT --server --socketname a.sock 2>/dev/null &
+SERVER_PID=$!
+
+# Wait for server stats up
+sleep 1
+
+./fdpassing$EXEEXT --socketname file://a.sock
+STATUS=$?
+
+if test $STATUS -eq 0; then
+ exit 0
+else
+ kill $SERVER_PID
+ exit $STATUS
+fi
+rm -f a.sock
diff --git a/tests/fdpassing.c b/tests/fdpassing.c
index 9e1b6e9..a98f8a2 100644
--- a/tests/fdpassing.c
+++ b/tests/fdpassing.c
@@ -25,6 +25,15 @@
#include <string.h>
#include <assert.h>
#include <sys/stat.h>
+#if HAVE_W32_SYSTEM
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# include <wincrypt.h>
+# include <io.h>
+#else
+# include <sys/socket.h>
+# include <sys/un.h>
+#endif
#include <unistd.h>
#include <errno.h>
@@ -98,20 +107,9 @@ register_commands (assuan_context_t ctx)
static void
-server (void)
+server_common (assuan_context_t ctx)
{
int rc;
- assuan_context_t ctx;
-
- log_info ("server started\n");
-
- rc = assuan_new (&ctx);
- if (rc)
- log_fatal ("assuan_new failed: %s\n", gpg_strerror (rc));
-
- rc = assuan_init_pipe_server (ctx, NULL);
- if (rc)
- log_fatal ("assuan_init_pipe_server failed: %s\n", gpg_strerror (rc));
rc = register_commands (ctx);
if (rc)
@@ -140,8 +138,87 @@ server (void)
assuan_release (ctx);
}
+static void
+server_pipe (void)
+{
+ int rc;
+ assuan_context_t ctx;
+
+ log_info ("server started\n");
+ rc = assuan_new (&ctx);
+ if (rc)
+ log_fatal ("assuan_new failed: %s\n", gpg_strerror (rc));
+ rc = assuan_init_pipe_server (ctx, NULL);
+ if (rc)
+ log_fatal ("assuan_init_pipe_server failed: %s\n", gpg_strerror (rc));
+
+ server_common (ctx);
+}
+
+static assuan_sock_nonce_t socket_nonce;
+
+static void
+server_socket (const char *socketname)
+{
+ int rc;
+ assuan_context_t ctx;
+ assuan_fd_t fd;
+ struct sockaddr_un unaddr_struct;
+ struct sockaddr *addr;
+ socklen_t len;
+
+ log_info ("server on socket started\n");
+
+ fd = assuan_sock_new (AF_UNIX, SOCK_STREAM, 0);
+ if (fd == ASSUAN_INVALID_FD)
+ log_fatal ("assuan_sock_new failed\n");
+
+ addr = (struct sockaddr *)&unaddr_struct;
+ rc = assuan_sock_set_sockaddr_un (socketname, addr, NULL);
+ if (rc)
+ {
+ assuan_sock_close (fd);
+ log_fatal ("assuan_sock_set_sockaddr_un failed: %s\n", gpg_strerror (rc));
+ }
+
+ len = offsetof (struct sockaddr_un, sun_path)
+ + strlen (unaddr_struct.sun_path);
+ rc = assuan_sock_bind (fd, addr, len);
+ if (rc)
+ {
+ assuan_sock_close (fd);
+ log_fatal ("assuan_sock_bind failed: %s\n", gpg_strerror (rc));
+ }
+
+ rc = assuan_sock_get_nonce (addr, len, &socket_nonce);
+ if (rc)
+ {
+ assuan_sock_close (fd);
+ log_fatal ("assuan_sock_get_nonce failed: %s\n", gpg_strerror (rc));
+ }
+
+ rc = listen (HANDLE2SOCKET (fd), 5);
+ if (rc < 0)
+ {
+ assuan_sock_close (fd);
+ log_fatal ("listen failed: %s\n",
+ gpg_strerror (gpg_error_from_syserror ()));
+ }
+
+ rc = assuan_new (&ctx);
+ if (rc)
+ log_fatal ("assuan_new failed: %s\n", gpg_strerror (rc));
+
+ rc = assuan_init_socket_server (ctx, fd, ASSUAN_SOCKET_SERVER_FDPASSING);
+ if (rc)
+ log_fatal ("assuan_init_socket_server failed: %s\n", gpg_strerror (rc));
+
+ assuan_set_sock_nonce (ctx, &socket_nonce);
+
+ server_common (ctx);
+}
/*
@@ -217,11 +294,9 @@ main (int argc, char **argv)
int last_argc = -1;
assuan_context_t ctx;
gpg_error_t err;
- assuan_fd_t no_close_fds[2];
- const char *arglist[10];
int is_server = 0;
int with_exec = 0;
- char *fname = prepend_srcdir ("motd");
+ const char *socketname = NULL;
if (argc)
{
@@ -239,6 +314,7 @@ main (int argc, char **argv)
"Options:\n"
" --verbose Show what is going on\n"
" --with-exec Exec the child. Default is just a fork on POSIX machine\n"
+" --socketname Specify the socket path\n"
);
exit (0);
}
@@ -262,71 +338,113 @@ main (int argc, char **argv)
with_exec = 1;
argc--; argv++;
}
+ else if (!strcmp (*argv, "--socketname"))
+ {
+ argc--; argv++;
+ if (argc)
+ {
+ socketname = *argv++;
+ argc--;
+ }
+ }
}
+ if (socketname)
+ assuan_sock_init ();
+ else
+ {
#ifdef HAVE_W32_SYSTEM
- with_exec = 1;
+ with_exec = 1;
+#else
+ ;
#endif
+ }
assuan_set_assuan_log_prefix (log_prefix);
if (is_server)
{
- server ();
+ if (socketname)
+ server_socket (socketname);
+ else
+ server_pipe ();
log_info ("server finished\n");
}
else
{
- const char *loc;
- const char *program_name;
-
-#ifdef HAVE_W32_SYSTEM
- program_name = "fdpassing.exe";
-#else
- program_name = "fdpassing";
-#endif
-
- no_close_fds[0] = verbose? assuan_fd_from_posix_fd (2): (assuan_fd_t)-1;
- no_close_fds[1] = (assuan_fd_t)-1;
- if (with_exec)
- {
- arglist[0] = program_name;
- arglist[1] = "--server";
- arglist[2] = verbose? "--verbose":NULL;
- arglist[3] = NULL;
- }
+ char *fname;
err = assuan_new (&ctx);
if (err)
log_fatal ("assuan_new failed: %s\n", gpg_strerror (err));
- err = assuan_pipe_connect (ctx, with_exec? program_name : NULL,
- with_exec ? arglist : &loc,
- no_close_fds, NULL, NULL, 1);
- if (err)
- {
- log_error ("assuan_pipe_connect failed: %s\n", gpg_strerror (err));
- assuan_release (ctx);
- errorcount++;
- }
- else if (!with_exec && loc[0] == 's')
+ if (socketname)
{
- server ();
- assuan_release (ctx);
- log_info ("server finished\n");
+ err = assuan_socket_connect (ctx, socketname, 0,
+ ASSUAN_SOCKET_CONNECT_FDPASSING);
+ if (err)
+ {
+ log_error ("assuan_socket_connect failed: %s\n",
+ gpg_strerror (err));
+ assuan_release (ctx);
+ errorcount++;
+ goto done;
+ }
}
else
{
- if (client (ctx, fname))
+ assuan_fd_t no_close_fds[2];
+ const char *arglist[10];
+ const char *loc;
+ const char *program_name;
+
+#ifdef HAVE_W32_SYSTEM
+ program_name = "fdpassing.exe";
+#else
+ program_name = "fdpassing";
+#endif
+
+ no_close_fds[0] = verbose?
+ assuan_fd_from_posix_fd (2): (assuan_fd_t)-1;
+ no_close_fds[1] = (assuan_fd_t)-1;
+ if (with_exec)
+ {
+ arglist[0] = program_name;
+ arglist[1] = "--server";
+ arglist[2] = verbose? "--verbose":NULL;
+ arglist[3] = NULL;
+ }
+
+ err = assuan_pipe_connect (ctx, with_exec? program_name : NULL,
+ with_exec ? arglist : &loc,
+ no_close_fds, NULL, NULL, 1);
+ if (err)
+ {
+ log_error ("assuan_pipe_connect failed: %s\n",
+ gpg_strerror (err));
+ assuan_release (ctx);
+ errorcount++;
+ }
+ else if (!with_exec && loc[0] == 's')
{
- log_info ("waiting for server to terminate...\n");
+ server_pipe ();
assuan_release (ctx);
+ log_info ("server finished\n");
+ goto done;
}
- log_info ("client finished\n");
}
+
+ fname = prepend_srcdir ("motd");
+ if (client (ctx, fname))
+ {
+ log_info ("waiting for server to terminate...\n");
+ assuan_release (ctx);
+ }
+ log_info ("client finished\n");
+ xfree (fname);
}
- xfree (fname);
+ done:
return errorcount ? 1 : 0;
}
diff --git a/tests/pipeconnect.c b/tests/pipeconnect.c
index b477af1..f5abfb5 100644
--- a/tests/pipeconnect.c
+++ b/tests/pipeconnect.c
@@ -68,14 +68,14 @@ cmd_cat (assuan_context_t ctx, char *line)
fdout = assuan_get_output_fd (ctx);
if (fdout == ASSUAN_INVALID_FD)
return gpg_error (GPG_ERR_ASS_NO_OUTPUT);
- fp = fdopen (fd, "r");
+ fp = fdopen ((int)fd, "r");
if (!fp)
{
log_error ("fdopen failed on input fd: %s\n", strerror (errno));
return gpg_error (GPG_ERR_ASS_GENERAL);
}
- fpout = fdopen (fdout, "w");
+ fpout = fdopen ((int)fdout, "w");
if (!fpout)
{
log_error ("fdopen failed on output fd: %s\n", strerror (errno));
@@ -198,7 +198,7 @@ run_client (const char *servername)
assuan_fd_t no_close_fds[2];
const char *arglist[5];
- no_close_fds[0] = fileno (stderr);
+ no_close_fds[0] = assuan_fd_from_posix_fd (fileno (stderr));
no_close_fds[1] = ASSUAN_INVALID_FD;
arglist[0] = servername;
@@ -249,9 +249,9 @@ parse_std_file_handles (int *argcp, char ***argvp)
{
(void)argcp;
(void)argvp;
- my_stdin = 0;
- my_stdout = 1;
- my_stderr = 2;
+ my_stdin = assuan_fd_from_posix_fd (0);
+ my_stdout = assuan_fd_from_posix_fd (1);
+ my_stderr = assuan_fd_from_posix_fd (2);
}