diff options
author | Werner Koch <wk@gnupg.org> | 2010-03-22 12:16:18 +0000 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2010-03-22 12:16:18 +0000 |
commit | f807c38fc5e6b703b85fe86ea8946c9f42bc3e53 (patch) | |
tree | b1467ffba675527d6dafe50c9c6b8b200b8e7026 /tests | |
parent | 4266559927264f0cce31b07a207dbd23d578e147 (diff) | |
download | libassuan-f807c38fc5e6b703b85fe86ea8946c9f42bc3e53.tar.gz |
Changed the implementation of CreatePipe under W32CE.
Reorganized the source.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/ChangeLog | 67 | ||||
-rw-r--r-- | tests/Makefile.am | 2 | ||||
-rw-r--r-- | tests/ce-createpipe.c | 4 | ||||
-rw-r--r-- | tests/ce-server.c | 2 | ||||
-rw-r--r-- | tests/pipeconnect.c | 397 |
5 files changed, 469 insertions, 3 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog new file mode 100644 index 0000000..c263c65 --- /dev/null +++ b/tests/ChangeLog @@ -0,0 +1,67 @@ +2010-03-17 Werner Koch <wk@g10code.com> + + * pipeconnect.c: New. Based on fdpassing.c + +2010-02-24 Werner Koch <wk@g10code.com> + + * ce-server.c: New. + + * ce-createpipe.c [W32CE]: New. + +2010-01-27 Werner Koch <wk@g10code.com> + + * common.h (SOCKET2HANDLE, HANDLE2SOCKET): New. + +2009-11-05 Marcus Brinkmann <marcus@g10code.de> + + * fdpassing.c (main): Call assuan_pipe_connect instead + of assuan_pipe_connect_ext. + +2009-11-04 Werner Koch <wk@g10code.com> + + * fdpassing.c (register_commands): Add NULL arg to + assuan_register_command. + +2009-09-19 Marcus Brinkmann <marcus@g10code.de> + + * fdpassing.c: Update to new API. + +2009-08-26 Marcus Brinkmann <marcus@g10code.de> + + * Makefile.am (AM_CFLAGS, LDADD): Add gpg-error. + * fdpassing.c: Change error values to gpg-error ones. + +2008-11-03 Marcus Brinkmann <marcus@g10code.de> + + * fdpassing.c (register_commands): Add missing initializer + to silence gcc -W warning. + +2006-10-10 Werner Koch <wk@g10code.com> + + * Makefile.am (LDADD): Add NETLIBS. + +2006-09-19 Werner Koch <wk@g10code.com> + + * fdpassing.c: Reverted Marcus changes. + (client): New arg FNAME to replace hardwired file name. + (main): Pass motd to client. + * Makefile.am (AM_CPPFLAGS): Removed. + (EXTRA_DIST): Add motd. + +2006-09-19 Marcus Brinkmann <marcus@g10code.de> + + * fdpassing.c (MOTD): New macro. + * Makefile.am (AM_CPPFLAGS): New variable. + * motd: New file. + + + Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + + This file is free software; as a special exception the author gives + unlimited permission to copy and/or distribute it, with or without + modifications, as long as this notice is preserved. + + This file is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + diff --git a/tests/Makefile.am b/tests/Makefile.am index 692748c..ef68924 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -25,7 +25,7 @@ EXTRA_DIST = motd ce-createpipe.c BUILT_SOURCES = CLEANFILES = -TESTS = +TESTS = pipeconnect if HAVE_W32CE_SYSTEM w32cetools = ce-createpipe diff --git a/tests/ce-createpipe.c b/tests/ce-createpipe.c index 810edbc..b44784c 100644 --- a/tests/ce-createpipe.c +++ b/tests/ce-createpipe.c @@ -49,7 +49,7 @@ reader_thread (void *arg) log_error ("reader: ReadFile failed: rc=%d\n", (int)GetLastError ()); break; } - log_info ("reader: red %d bytes\n", (int)nread); + log_info ("reader: read %d bytes\n", (int)nread); log_printhex ("got: ", buffer, nread); } @@ -117,7 +117,7 @@ run_test (void) switch (WaitForMultipleObjects (2, threads, FALSE, INFINITE)) { case WAIT_OBJECT_0: - log_info ("reader thread finished firstt\n"); + log_info ("reader thread finished first\n"); break; case WAIT_OBJECT_0 + 1: log_info ("writer thread finished first\n"); diff --git a/tests/ce-server.c b/tests/ce-server.c index 6ff3cae..9975e53 100644 --- a/tests/ce-server.c +++ b/tests/ce-server.c @@ -898,6 +898,8 @@ cmd_run (assuan_context_t ctx, char *line) #endif /*HAVE_W32CE_SYSTEM*/ + + static const char hlp_newdataport[] = "NEWDATAPORT\n" diff --git a/tests/pipeconnect.c b/tests/pipeconnect.c new file mode 100644 index 0000000..ddb4a06 --- /dev/null +++ b/tests/pipeconnect.c @@ -0,0 +1,397 @@ +/* pipeconnect.c - Check the assuan_pipe_connect call. + Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc. + + This file is part of Assuan. + + Assuan is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + Assuan is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +/* + This tests creates a program which starts an assuan server and runs + some simple tests on it. The other program is actually the same + program but called with the option --server. +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <errno.h> + +#include "../src/assuan.h" +#include "common.h" + +static assuan_fd_t my_stdin = ASSUAN_INVALID_FD; +static assuan_fd_t my_stdout = ASSUAN_INVALID_FD; +static assuan_fd_t my_stderr = ASSUAN_INVALID_FD; + + +static gpg_error_t +cmd_echo (assuan_context_t ctx, char *line) +{ + log_info ("got ECHO command (%s)\n", line); + + assuan_send_data (ctx, line, strlen (line)); + + return 0; +} + + +static gpg_error_t +cmd_cat (assuan_context_t ctx, char *line) +{ + assuan_fd_t fd, fdout; + int c; + FILE *fp, *fpout; + int nbytes; + + log_info ("got CAT command (%s)\n", line); + + fd = assuan_get_input_fd (ctx); + if (fd == ASSUAN_INVALID_FD) + return gpg_error (GPG_ERR_ASS_NO_INPUT); + fdout = assuan_get_output_fd (ctx); + if (fdout == ASSUAN_INVALID_FD) + return gpg_error (GPG_ERR_ASS_NO_OUTPUT); + fp = fdopen (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"); + if (!fpout) + { + log_error ("fdopen failed on output fd: %s\n", strerror (errno)); + fclose (fp); + return gpg_error (GPG_ERR_ASS_GENERAL); + } + + nbytes = 0; + while ( (c=getc (fp)) != -1) + { + putc (c, fpout); + nbytes++; + } + log_info ("done printing %d bytes to output fd\n", nbytes); + + /* Fixme: This also closes the original fd. */ + fclose (fp); + fclose (fpout); + return 0; +} + + +static gpg_error_t +server_register_commands (assuan_context_t ctx) +{ + static struct + { + const char *name; + gpg_error_t (*handler) (assuan_context_t, char *line); + } table[] = + { + { "ECHO", cmd_echo }, + { "CAT", cmd_cat }, + { "INPUT", NULL }, + { "OUTPUT", NULL }, + { NULL, NULL } + }; + int i; + gpg_error_t rc; + + for (i=0; table[i].name; i++) + { + rc = assuan_register_command (ctx, table[i].name, table[i].handler, NULL); + if (rc) + return rc; + } + return 0; +} + + +static void +run_server (int enable_debug) +{ + int rc; + assuan_context_t ctx; + assuan_fd_t filedes[2]; + + filedes[0] = my_stdin; + filedes[1] = my_stdout; + + rc = assuan_new (&ctx); + if (rc) + log_fatal ("assuan_new failed: %s\n", gpg_strerror (rc)); + + rc = assuan_init_pipe_server (ctx, filedes); + if (rc) + log_fatal ("assuan_init_pipe_server failed: %s\n", + gpg_strerror (rc)); + + rc = server_register_commands (ctx); + if (rc) + log_fatal ("register_commands failed: %s\n", gpg_strerror(rc)); + + if (enable_debug) + assuan_set_log_stream (ctx, stderr); + + for (;;) + { + rc = assuan_accept (ctx); + if (rc) + { + if (rc != -1) + log_error ("assuan_accept failed: %s\n", gpg_strerror (rc)); + break; + } + + log_info ("client connected. Client's pid is %ld\n", + (long)assuan_get_pid (ctx)); + + rc = assuan_process (ctx); + if (rc) + log_error ("assuan_process failed: %s\n", gpg_strerror (rc)); + } + + assuan_release (ctx); +} + + + + + + + +static gpg_error_t +data_cb (void *opaque, const void *buffer, size_t length) +{ + (void)opaque; + + if (buffer) + printf ("Received data `%.*s'\n", (int)length, (char*)buffer); + return 0; +} + + +static void +run_client (const char *servername) +{ + gpg_error_t err; + assuan_context_t ctx; + assuan_fd_t no_close_fds[2]; + const char *arglist[5]; + + no_close_fds[0] = fileno (stderr); + no_close_fds[1] = ASSUAN_INVALID_FD; + + arglist[0] = servername; + arglist[1] = "--server"; + arglist[2] = debug? "--debug" : verbose? "--verbose":NULL; + arglist[3] = NULL; + + err = assuan_new (&ctx); + if (err) + log_fatal ("assuan_new failed: %s\n", gpg_strerror (err)); + + err = assuan_pipe_connect (ctx, servername, arglist, no_close_fds, + NULL, NULL, 0); + if (err) + { + log_error ("assuan_pipe_connect failed: %s\n", + gpg_strerror (err)); + assuan_release (ctx); + return; + } + + log_info ("server started; pid is %ld\n", + (long)assuan_get_pid (ctx)); + + err = assuan_transact (ctx, "ECHO Your lucky number is 3552664958674928. " + "Watch for it everywhere.", + data_cb, NULL, NULL, NULL, NULL, NULL); + if (err) + { + log_error ("sending ECHO failed: %s\n", gpg_strerror (err)); + return; + } + + err = assuan_transact (ctx, "BYE", NULL, NULL, NULL, NULL, NULL, NULL); + if (err) + { + log_error ("sending BYE failed: %s\n", gpg_strerror (err)); + return; + } + + assuan_release (ctx); + return; +} + + +static void +parse_std_file_handles (int *argcp, char ***argvp) +{ +#ifdef HAVE_W32CE_SYSTEM + int argc = *argcp; + char **argv = *argvp; + const char *s; + assuan_fd_t fd; + int i; + int fixup = 0; + + if (!argc) + return; + + for (argc--, argv++; argc; argc--, argv++) + { + s = *argv; + if (*s == '-' && s[1] == '&' && s[2] == 'S' + && (s[3] == '0' || s[3] == '1' || s[3] == '2') + && s[4] == '=' + && (strchr ("-01234567890", s[5]) || !strcmp (s+5, "null"))) + { + if (s[5] == 'n') + fd = ASSUAN_INVALID_FD; + else + fd = _assuan_w32ce_finish_pipe (atoi (s+5), s[3] != '0'); + switch (s[3] - '0') + { + case 0: my_stdin = fd; break; + case 1: my_stdout = fd; break; + case 2: my_stderr = fd; break; + } + + fixup++; + } + else + break; + } + + if (fixup) + { + argc = *argcp; + argc -= fixup; + *argcp = argc; + + argv = *argvp; + for (i=1; i < argc; i++) + argv[i] = argv[i + fixup]; + for (; i < argc + fixup; i++) + argv[i] = NULL; + } +#else + (void)argcp; + (void)argvp; + my_stdin = 0; + my_stdout = 1; + my_stderr = 2; +#endif +} + + +/* + M A I N + */ +int +main (int argc, char **argv) +{ + gpg_error_t err; + const char *myname = "no-pgm"; + int last_argc = -1; + int server = 0; + int silent_client = 0; + int silent_server = 0; + + parse_std_file_handles (&argc, &argv); + if (argc) + { + myname = *argv; + log_set_prefix (*argv); + argc--; argv++; + } + while (argc && last_argc != argc ) + { + last_argc = argc; + if (!strcmp (*argv, "--help")) + { + printf ("usage: %s [options]\n" + "\n" + "Options:\n" + " --verbose Show what is going on\n" + " --server Run in server mode\n", + log_get_prefix ()); + exit (0); + } + if (!strcmp (*argv, "--verbose")) + { + verbose = 1; + argc--; argv++; + } + else if (!strcmp (*argv, "--debug")) + { + verbose = debug = 1; + argc--; argv++; + } + else if (!strcmp (*argv, "--server")) + { + server = 1; + argc--; argv++; + } + else if (!strcmp (*argv, "--silent-server")) + { + silent_server = 1; + argc--; argv++; + } + else if (!strcmp (*argv, "--silent-client")) + { + silent_client = 1; + argc--; argv++; + } + else + log_fatal ("invalid option `%s' (try --help)\n", *argv); + } + + log_set_prefix (xstrconcat (log_get_prefix (), + server? ".server":".client", NULL)); + assuan_set_assuan_log_prefix (log_get_prefix ()); + + err = assuan_sock_init (); + if (err) + log_fatal ("socket init failed: %s\n", gpg_strerror (err)); + + if (server) + { + log_info ("server started\n"); + if (debug && !silent_server) + assuan_set_assuan_log_stream (stderr); + run_server (debug && !silent_server); + log_info ("server finished\n"); + } + else + { + log_info ("client started\n"); + if (debug && !silent_client) + assuan_set_assuan_log_stream (stderr); + run_client (myname); + log_info ("client finished\n"); + } + + return errorcount ? 1 : 0; +} + |