From 9c45d9ad13fdf439d44d7443ae75da15ea0223ed Mon Sep 17 00:00:00 2001 From: Sam Varshavchik Date: Mon, 19 Aug 2013 16:39:41 -0400 Subject: Initial checkin Imported from subversion report, converted to git. Updated all paths in scripts and makefiles, reflecting the new directory hierarchy. --- gpglib/libgpg.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 gpglib/libgpg.c (limited to 'gpglib/libgpg.c') diff --git a/gpglib/libgpg.c b/gpglib/libgpg.c new file mode 100644 index 0000000..7bea385 --- /dev/null +++ b/gpglib/libgpg.c @@ -0,0 +1,104 @@ +/* +** Copyright 2001-2003 Double Precision, Inc. See COPYING for +** distribution information. +*/ + + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#if HAVE_SYS_TIME_H +#include +#endif +#if HAVE_SYS_WAIT_H +#include +#endif +#ifndef WEXITSTATUS +#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif +#ifndef WIFEXITED +#define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +#include "gpg.h" +#include "gpglib.h" + +int libmail_gpg_stdin= -1, libmail_gpg_stdout= -1, + libmail_gpg_stderr= -1; +pid_t libmail_gpg_pid= -1; + +int libmail_gpg_cleanup() +{ + int rc=0; + + if (libmail_gpg_stdin >= 0) + { + close(libmail_gpg_stdin); + libmail_gpg_stdin= -1; + } + + if (libmail_gpg_stdout >= 0) + { + close(libmail_gpg_stdout); + libmail_gpg_stdout= -1; + } + + if (libmail_gpg_stderr >= 0) + { + close(libmail_gpg_stderr); + libmail_gpg_stderr= -1; + } + + if (libmail_gpg_pid >= 0 && kill(libmail_gpg_pid, 0) >= 0) + { + int waitstat; + pid_t p; + + while ((p=wait(&waitstat)) != libmail_gpg_pid) + { + if (p < 0 && errno == ECHILD) + return (-1); + } + + rc= WIFEXITED(waitstat) ? WEXITSTATUS(waitstat): -1; + libmail_gpg_pid= -1; + } + return (rc); +} + +static char *optionfile(const char *gpgdir) +{ + char *p=malloc(strlen(gpgdir)+sizeof("/options")); + + if (p) + strcat(strcpy(p, gpgdir), "/options"); + return (p); +} + +/* +** Determine of GPG is available by checking for the options file, and the +** gpg binary itself. +*/ + +int libmail_gpg_has_gpg(const char *gpgdir) +{ + char *p=optionfile(gpgdir); + struct stat stat_buf; + int rc; + + if (!p) + return (-1); + + rc=stat(p, &stat_buf); + free(p); + if (rc == 0) + rc=stat(GPG, &stat_buf); + + return (rc); +} -- cgit v1.2.3