diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 16 | ||||
-rwxr-xr-x | tests/fdpassing-socket.sh | 22 | ||||
-rw-r--r-- | tests/fdpassing.c | 222 | ||||
-rw-r--r-- | tests/pipeconnect.c | 12 |
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); } |