diff options
author | Werner Koch <wk@gnupg.org> | 2004-04-21 14:42:17 +0000 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2004-04-21 14:42:17 +0000 |
commit | 93595de1ede96dedfcaa93c7442536a2cde0b6ef (patch) | |
tree | a0bd56b9a61f7f5301ea2337df1b215bbb318b38 | |
parent | 66a87269d11d55dc6b348a94a37b9176c4449bd0 (diff) | |
download | libassuan-93595de1ede96dedfcaa93c7442536a2cde0b6ef.tar.gz |
* assuan-socket-server.c (accept_connection_bottom): Save the pid
of the peer if it is available.
* assuan-socket-connect.c (assuan_socket_connect): Do not save the
dummy SERVED_PID arg.
* assuan-pipe-connect.c (do_finish): Don't wait if the pid is 0.
(assuan_pipe_connect2): Store the parents pid in the environment
of the child.
* assuan-pipe-server.c (assuan_init_pipe_server): Initialize the
peer's pid from the environment.
* assuan-connect.c (assuan_get_pid): Do not return 0 as a PID.
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | THANKS | 4 | ||||
-rw-r--r-- | src/ChangeLog | 13 | ||||
-rw-r--r-- | src/assuan-connect.c | 3 | ||||
-rw-r--r-- | src/assuan-defs.h | 6 | ||||
-rw-r--r-- | src/assuan-pipe-connect.c | 12 | ||||
-rw-r--r-- | src/assuan-pipe-server.c | 10 | ||||
-rw-r--r-- | src/assuan-socket-connect.c | 1 | ||||
-rw-r--r-- | src/assuan-socket-server.c | 9 |
9 files changed, 47 insertions, 13 deletions
@@ -1,6 +1,8 @@ Noteworthy changes in version 0.6.5 ------------------------------------------------ + * Pass the clien's pid to a pipe server. + Noteworthy changes in version 0.6.4 (2004-02-20) ------------------------------------------------ @@ -1 +1,5 @@ + +Michael Nottebrock michaelnottebrock at gmx.net + + diff --git a/src/ChangeLog b/src/ChangeLog index c84b161..4fc95a7 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,16 @@ +2004-04-21 Werner Koch <wk@gnupg.org> + + * assuan-socket-server.c (accept_connection_bottom): Save the pid + of the peer if it is available. + * assuan-socket-connect.c (assuan_socket_connect): Do not save the + dummy SERVED_PID arg. + * assuan-pipe-connect.c (do_finish): Don't wait if the pid is 0. + (assuan_pipe_connect2): Store the parents pid in the environment + of the child. + * assuan-pipe-server.c (assuan_init_pipe_server): Initialize the + peer's pid from the environment. + * assuan-connect.c (assuan_get_pid): Do not return 0 as a PID. + 2004-04-19 Werner Koch <wk@gnupg.org> * assuan-socket-server.c, assuan-socket-connect.c: Includes diff --git a/src/assuan-connect.c b/src/assuan-connect.c index 009aaab..cedaa66 100644 --- a/src/assuan-connect.c +++ b/src/assuan-connect.c @@ -47,8 +47,9 @@ assuan_disconnect (ASSUAN_CONTEXT ctx) } } +/* Return the PID of the perr or -1 if not known. */ pid_t assuan_get_pid (ASSUAN_CONTEXT ctx) { - return ctx ? ctx->pid : -1; + return (ctx && ctx->pid)? ctx->pid : -1; } diff --git a/src/assuan-defs.h b/src/assuan-defs.h index e2d9811..608c05a 100644 --- a/src/assuan-defs.h +++ b/src/assuan-defs.h @@ -90,14 +90,10 @@ struct assuan_context_s int pipe_mode; /* We are in pipe mode, i.e. we can handle just one connection and must terminate then */ - pid_t pid; /* In pipe mode, the pid of the child server process. - In socket mode, the pid of the server */ + pid_t pid; /* The the pid of the peer. */ int listen_fd; /* The fd we are listening on (used by socket servers) */ int connected_fd; /* helper */ - pid_t client_pid; /* for a socket server the PID of the client or -1 - if not available */ - /* Used for Unix domain sockets. */ struct sockaddr_un myaddr; struct sockaddr_un serveraddr; diff --git a/src/assuan-pipe-connect.c b/src/assuan-pipe-connect.c index 9c41aa9..ffb0202 100644 --- a/src/assuan-pipe-connect.c +++ b/src/assuan-pipe-connect.c @@ -78,7 +78,7 @@ do_finish (ASSUAN_CONTEXT ctx) close (ctx->outbound.fd); ctx->outbound.fd = -1; } - if (ctx->pid != -1) + if (ctx->pid != -1 && ctx->pid) { waitpid (ctx->pid, NULL, 0); /* FIXME Check return value. */ ctx->pid = -1; @@ -111,6 +111,7 @@ assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[], AssuanError err; int rp[2]; int wp[2]; + char mypidstr[50]; if (!ctx || !name || !argv || !argv[0]) return ASSUAN_Invalid_Value; @@ -131,6 +132,8 @@ assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[], /* FIXME: This is not MT safe */ } + sprintf (mypidstr, "%lu", (unsigned long)getpid ()); + if (pipe (rp) < 0) return ASSUAN_General_Error; @@ -239,6 +242,13 @@ assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[], } errno = 0; + /* We store our parents pid in the environment so that the + execed assuan server is able to read the actual pid of the + client. The server can't use getppid becuase it might have + been double forked before the assuan server has been + initialized. */ + setenv ("_assuan_pipe_connect_pid", mypidstr, 1); + execv (name, argv); /* oops - use the pipe to tell the parent about it */ snprintf (errbuf, sizeof(errbuf)-1, "ERR %d can't exec `%s': %.50s\n", diff --git a/src/assuan-pipe-server.c b/src/assuan-pipe-server.c index ba269b0..7b2d643 100644 --- a/src/assuan-pipe-server.c +++ b/src/assuan-pipe-server.c @@ -69,7 +69,6 @@ _assuan_new_context (ASSUAN_CONTEXT *r_ctx) ctx->io = &io; ctx->listen_fd = -1; - ctx->client_pid = (pid_t)-1; /* Use the pipe server handler as a default. */ ctx->deinit_handler = deinit_pipe_server; ctx->accept_handler = accept_connection; @@ -94,11 +93,20 @@ assuan_init_pipe_server (ASSUAN_CONTEXT *r_ctx, int filedes[2]) if (!rc) { ASSUAN_CONTEXT ctx = *r_ctx; + const char *s; + unsigned long ul; ctx->is_server = 1; ctx->inbound.fd = filedes[0]; ctx->outbound.fd = filedes[1]; ctx->pipe_mode = 1; + + s = getenv ("_assuan_pipe_connect_pid"); + if (s && (ul=strtoul (s, NULL, 10)) && ul) + ctx->pid = (pid_t)ul; + else + ctx->pid = (pid_t)-1; + } return rc; } diff --git a/src/assuan-socket-connect.c b/src/assuan-socket-connect.c index 6ce3f9c..cbe4df8 100644 --- a/src/assuan-socket-connect.c +++ b/src/assuan-socket-connect.c @@ -82,7 +82,6 @@ assuan_socket_connect (ASSUAN_CONTEXT *r_ctx, err = _assuan_new_context (&ctx); if (err) return err; - ctx->pid = server_pid; /* save it in case we need it later */ ctx->deinit_handler = do_deinit; ctx->finish_handler = do_finish; diff --git a/src/assuan-socket-server.c b/src/assuan-socket-server.c index d92e6e4..e81ee50 100644 --- a/src/assuan-socket-server.c +++ b/src/assuan-socket-server.c @@ -34,14 +34,16 @@ accept_connection_bottom (ASSUAN_CONTEXT ctx) { int fd = ctx->connected_fd; - ctx->client_pid = (pid_t)-1; #ifdef HAVE_SO_PEERCRED { + /* This overrides any already set PID if the function returns a + valid one. */ struct ucred cr; int cl = sizeof cr; - if ( !getsockopt (fd, SOL_SOCKET, SO_PEERCRED, &cr, &cl) ) - ctx->client_pid = cr.pid; + if ( !getsockopt (fd, SOL_SOCKET, SO_PEERCRED, &cr, &cl) + && cr.pid != (pid_t)-1 && cr.pid ) + ctx->pid = cr.pid; } #endif @@ -68,7 +70,6 @@ accept_connection (ASSUAN_CONTEXT ctx) struct sockaddr_un clnt_addr; size_t len = sizeof clnt_addr; - ctx->client_pid = (pid_t)-1; fd = accept (ctx->listen_fd, (struct sockaddr*)&clnt_addr, &len ); if (fd == -1) { |