diff options
author | Werner Koch <[email protected]> | 2006-09-06 16:36:45 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2006-09-06 16:36:45 +0000 |
commit | a731887cb92df9568c9d1baad20becbab83a8e55 (patch) | |
tree | 0191cf9f3389d6109360bcaeb074f69e5a78fdcd /tests/fdpassing.c | |
parent | Doc updates. (diff) | |
download | libassuan-a731887cb92df9568c9d1baad20becbab83a8e55.tar.gz libassuan-a731887cb92df9568c9d1baad20becbab83a8e55.zip |
Changes to support gpg-error style error codes.
Diffstat (limited to 'tests/fdpassing.c')
-rw-r--r-- | tests/fdpassing.c | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/tests/fdpassing.c b/tests/fdpassing.c new file mode 100644 index 0000000..9317ed2 --- /dev/null +++ b/tests/fdpassing.c @@ -0,0 +1,213 @@ +/* fdpassing - Check the fiel descriptor passing. + * Copyright (C) 2006 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 2.1 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <unistd.h> +#include <errno.h> +#include <sys/wait.h> /* Used by main driver. */ + +#include "../src/assuan.h" +#include "common.h" + + +/* + + S E R V E R + +*/ + +static int +cmd_echo (assuan_context_t ctx, char *line) +{ + log_info ("got ECHO command (%s)\n", line); + return 0; +} + +static assuan_error_t +register_commands (assuan_context_t ctx) +{ + static struct { + const char *name; + int (*handler)(assuan_context_t, char *line); + } table[] = { + { "ECHO", cmd_echo }, + { "INPUT", NULL }, + { "OUTPUT", NULL }, + { NULL } + }; + int i; + assuan_error_t rc; + + for (i=0; table[i].name; i++) + { + rc = assuan_register_command (ctx, table[i].name, table[i].handler); + if (rc) + return rc; + } + return 0; +} + + +static void +server (int fd) +{ + int rc; + assuan_context_t ctx; + + log_info ("server started on fd %d\n", fd); + + rc = assuan_init_domain_server (&ctx, fd, (pid_t)(-1)); + if (rc) + log_fatal ("assuan_init_domain_server failed: %s\n", assuan_strerror (rc)); + + rc = register_commands (ctx); + if (rc) + log_fatal ("register_commands failed: %s\n", assuan_strerror(rc)); + + assuan_set_assuan_log_prefix (log_prefix); + assuan_set_log_stream (ctx, stderr); + + for (;;) + { + rc = assuan_accept (ctx); + if (rc) + { + log_error ("assuan_accept failed: %s\n", assuan_strerror (rc)); + break; + } + + rc = assuan_process (ctx); + if (rc) + log_error ("assuan_process failed: %s\n", assuan_strerror (rc)); + } + + assuan_deinit_server (ctx); +} + + + + +/* + + C L I E N T + +*/ + + +/* Client main. If true is returned, a disconnect has not been done. */ +static int +client (int fd) +{ + int rc; + assuan_context_t ctx; + + log_info ("client started on fd %d\n", fd); + + rc = assuan_domain_connect (&ctx, fd, (pid_t)(-1)); + if (rc) + { + log_error ("assuan_domain_connect failed: %s\n", assuan_strerror (rc)); + return -1; + } + + + assuan_disconnect (ctx); + return 0; +} + + + + +/* + + M A I N + +*/ +int +main (int argc, char **argv) +{ + int last_argc = -1; + const char *srcdir = getenv ("srcdir"); + int fds[2]; + pid_t pid; + + if (!srcdir) + srcdir = "."; + + if (argc) + { + log_set_prefix (*argv); + argc--; argv++; + } + while (argc && last_argc != argc ) + { + last_argc = argc; + if (!strcmp (*argv, "--help")) + { + puts ( +"usage: ./fdpassing [options]\n" +"\n" +" Options are --verbose and --debug"); + exit (0); + } + if (!strcmp (*argv, "--verbose")) + { + verbose = 1; + argc--; argv++; + } + else if (!strcmp (*argv, "--debug")) + { + verbose = debug = 1; + argc--; argv++; + } + } + + /* Create a socketpair. */ + if ( socketpair (AF_LOCAL, SOCK_STREAM, 0, fds) ) + log_fatal ("socketpair failed: %s\n", strerror (errno)); + + /* Fork and run server and client. */ + pid = fork (); + if (pid == (pid_t)(-1)) + log_fatal ("fork failed: %s\n", strerror (errno)); + if (!pid) + { + server (fds[0]); /* The child is our server. */ + log_info ("server finished\n"); + } + else + { + if (client (fds[1])) /* The parent is the client. */ + { + log_info ("waiting for server to terminate...\n"); + waitpid (pid, NULL, 0); + } + log_info ("client finished\n"); + } + + return errorcount? 1:0; +} + |