b50b17bdf8055769ad364df7206b519a3cdae696
[gpgme.git] / assuan / assuan-connect.c
1 /* assuan-connect.c - Establish a connection (client) 
2  *      Copyright (C) 2001, 2002 Free Software Foundation, Inc.
3  *
4  * This file is part of Assuan.
5  *
6  * Assuan is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Assuan is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19  * USA. 
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <string.h>
29 #include <signal.h>
30 #include <unistd.h>
31 #include <errno.h>
32 #include <sys/types.h>
33 #ifndef HAVE_W32_SYSTEM
34 #include <sys/wait.h>
35 #endif
36
37 #include "assuan-defs.h"
38
39 /* Disconnect and release the context CTX. */
40 void
41 assuan_disconnect (assuan_context_t ctx)
42 {
43   if (ctx)
44     {
45       assuan_write_line (ctx, "BYE");
46       ctx->finish_handler (ctx);
47       ctx->deinit_handler (ctx);
48       ctx->deinit_handler = NULL;
49       _assuan_release_context (ctx);
50     }
51 }
52
53 /* Return the PID of the peer or -1 if not known. This function works
54    in some situations where assuan_get_ucred fails. */
55 pid_t
56 assuan_get_pid (assuan_context_t ctx)
57 {
58   return (ctx && ctx->pid)? ctx->pid : -1;
59 }
60
61
62 #ifndef HAVE_W32_SYSTEM
63 /* Return user credentials. PID, UID and GID amy be gived as NULL if
64    you are not interested in this value.  For getting the pid of the
65    peer the assuan_get_pid is usually better suited. */
66 assuan_error_t
67 assuan_get_peercred (assuan_context_t ctx, pid_t *pid, uid_t *uid, gid_t *gid)
68 {
69   if (!ctx)
70     return _assuan_error (ASSUAN_Invalid_Value);
71   if (!ctx->peercred.valid)
72     return _assuan_error (ASSUAN_General_Error);
73
74 #ifdef HAVE_SO_PEERCRED
75   if (pid)
76     *pid = ctx->peercred.pid;
77   if (uid)
78     *uid = ctx->peercred.uid;
79   if (gid)
80     *gid = ctx->peercred.gid;
81 #endif
82
83   return 0;
84 }
85 #endif /* HAVE_W32_SYSTEM */