2001-11-20 Marcus Brinkmann <marcus@g10code.de>
* version.c: Remove global variables lineno and tmp_engine_version. (version_handler): Removed. (_gpgme_get_program_version): New function. (get_engine_info): Don't use context and version_handler, but _gpgme_get_program_version. * ops.h (_gpgme_get_program_version): Add prototype for _gpgme_get_program_version (we expect to use it elsewhere soon).
This commit is contained in:
parent
1a9da605ad
commit
bf2b24ae11
@ -1,3 +1,14 @@
|
|||||||
|
2001-11-20 Marcus Brinkmann <marcus@g10code.de>
|
||||||
|
|
||||||
|
* version.c: Remove global variables lineno and
|
||||||
|
tmp_engine_version.
|
||||||
|
(version_handler): Removed.
|
||||||
|
(_gpgme_get_program_version): New function.
|
||||||
|
(get_engine_info): Don't use context and version_handler,
|
||||||
|
but _gpgme_get_program_version.
|
||||||
|
* ops.h (_gpgme_get_program_version): Add prototype for
|
||||||
|
_gpgme_get_program_version (we expect to use it elsewhere soon).
|
||||||
|
|
||||||
2001-11-18 Marcus Brinkmann <marcus@g10code.de>
|
2001-11-18 Marcus Brinkmann <marcus@g10code.de>
|
||||||
|
|
||||||
* version.c (get_engine_info): If GnuPG is not available, return
|
* version.c (get_engine_info): If GnuPG is not available, return
|
||||||
|
@ -95,4 +95,7 @@ void _gpgme_passphrase_status_handler (GpgmeCtx ctx, GpgStatusCode code,
|
|||||||
GpgmeError _gpgme_passphrase_start (GpgmeCtx ctx);
|
GpgmeError _gpgme_passphrase_start (GpgmeCtx ctx);
|
||||||
GpgmeError _gpgme_passphrase_result (GpgmeCtx ctx);
|
GpgmeError _gpgme_passphrase_result (GpgmeCtx ctx);
|
||||||
|
|
||||||
|
/*-- version.c --*/
|
||||||
|
char *_gpgme_get_program_version (const char *const path);
|
||||||
|
|
||||||
#endif /* OPS_H */
|
#endif /* OPS_H */
|
||||||
|
113
gpgme/version.c
113
gpgme/version.c
@ -31,9 +31,7 @@
|
|||||||
#include "sema.h"
|
#include "sema.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "key.h" /* for key_cache_init */
|
#include "key.h" /* for key_cache_init */
|
||||||
|
#include "io.h"
|
||||||
static int lineno;
|
|
||||||
static char *tmp_engine_version;
|
|
||||||
|
|
||||||
static const char *get_engine_info (void);
|
static const char *get_engine_info (void);
|
||||||
|
|
||||||
@ -192,36 +190,79 @@ gpgme_check_engine ()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
#define LINELENGTH 80
|
||||||
version_line_handler ( GpgmeCtx c, char *line )
|
|
||||||
|
char *
|
||||||
|
_gpgme_get_program_version (const char *const path)
|
||||||
{
|
{
|
||||||
char *p;
|
char line[LINELENGTH] = "";
|
||||||
size_t len;
|
int linelen = 0;
|
||||||
|
char *mark = NULL;
|
||||||
|
int rp[2];
|
||||||
|
pid_t pid;
|
||||||
|
int nread;
|
||||||
|
char *argv[] = {(char *) path, "--version", 0};
|
||||||
|
struct spawn_fd_item_s pfd[] = { {0, -1}, {-1, -1} };
|
||||||
|
struct spawn_fd_item_s cfd[] = { {0, -1}, {-1, 1 /* STDOUT_FILENO */},
|
||||||
|
{-1, -1} };
|
||||||
|
int status, signal;
|
||||||
|
|
||||||
lineno++;
|
if (!path)
|
||||||
if ( c->out_of_core )
|
return NULL;
|
||||||
return;
|
|
||||||
if (!line)
|
if (_gpgme_io_pipe (rp, 1) < 0)
|
||||||
return; /* EOF */
|
return NULL;
|
||||||
if (lineno==1) {
|
|
||||||
if ( memcmp (line, "gpg ", 4) )
|
pfd[0].fd = rp[1];
|
||||||
return;
|
cfd[0].fd = rp[0];
|
||||||
if ( !(p = strpbrk (line, "0123456789")) )
|
cfd[1].fd = rp[1];
|
||||||
return;
|
|
||||||
len = strcspn (p, " \t\r\n()<>" );
|
pid = _gpgme_io_spawn (path, argv, cfd, pfd);
|
||||||
p[len] = 0;
|
if (pid < 0)
|
||||||
tmp_engine_version = xtrystrdup (p);
|
{
|
||||||
|
_gpgme_io_close (rp[0]);
|
||||||
|
_gpgme_io_close (rp[1]);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
nread = _gpgme_io_read (rp[0], &line[linelen], LINELENGTH - linelen - 1);
|
||||||
|
if (nread > 0)
|
||||||
|
{
|
||||||
|
line[linelen + nread] = '\0';
|
||||||
|
mark = strchr (&line[linelen], '\n');
|
||||||
|
if (mark)
|
||||||
|
{
|
||||||
|
*mark = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
linelen += nread;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (nread > 0 && linelen < LINELENGTH - 1);
|
||||||
|
|
||||||
|
_gpgme_io_close (rp[0]);
|
||||||
|
_gpgme_io_waitpid (pid, 1, &status, &signal);
|
||||||
|
|
||||||
|
if (mark)
|
||||||
|
{
|
||||||
|
mark = strrchr (line, ' ');
|
||||||
|
if (!mark)
|
||||||
|
return NULL;
|
||||||
|
return xtrystrdup (mark + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
get_engine_info (void)
|
get_engine_info (void)
|
||||||
{
|
{
|
||||||
static const char *engine_info =NULL;
|
static const char *engine_info =NULL;
|
||||||
GpgmeCtx c = NULL;
|
|
||||||
GpgmeError err = 0;
|
GpgmeError err = 0;
|
||||||
const char *path = NULL;
|
const char *path = NULL;
|
||||||
|
char *version;
|
||||||
|
|
||||||
/* FIXME: make sure that only one instance does run */
|
/* FIXME: make sure that only one instance does run */
|
||||||
if (engine_info)
|
if (engine_info)
|
||||||
@ -235,26 +276,9 @@ get_engine_info (void)
|
|||||||
"</GnupgInfo>\n";
|
"</GnupgInfo>\n";
|
||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
err = gpgme_new (&c);
|
version = _gpgme_get_program_version (path);
|
||||||
if (err)
|
|
||||||
goto leave;
|
|
||||||
err = _gpgme_gpg_new ( &c->gpg );
|
|
||||||
if (err)
|
|
||||||
goto leave;
|
|
||||||
|
|
||||||
err = _gpgme_gpg_set_simple_line_handler ( c->gpg,
|
if (version) {
|
||||||
version_line_handler, c );
|
|
||||||
if (err)
|
|
||||||
goto leave;
|
|
||||||
|
|
||||||
_gpgme_gpg_add_arg ( c->gpg, "--version" );
|
|
||||||
lineno = 0;
|
|
||||||
xfree (tmp_engine_version); tmp_engine_version = NULL;
|
|
||||||
err = _gpgme_gpg_spawn ( c->gpg, c );
|
|
||||||
if (err)
|
|
||||||
goto leave;
|
|
||||||
gpgme_wait (c, 1);
|
|
||||||
if (tmp_engine_version) {
|
|
||||||
const char *fmt;
|
const char *fmt;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
@ -266,14 +290,14 @@ get_engine_info (void)
|
|||||||
"</GnupgInfo>\n";
|
"</GnupgInfo>\n";
|
||||||
/*(yes, I know that we allocating 2 extra bytes)*/
|
/*(yes, I know that we allocating 2 extra bytes)*/
|
||||||
p = xtrymalloc ( strlen(fmt) + strlen(path)
|
p = xtrymalloc ( strlen(fmt) + strlen(path)
|
||||||
+ strlen (tmp_engine_version) + 1);
|
+ strlen (version) + 1);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
err = mk_error (Out_Of_Core);
|
err = mk_error (Out_Of_Core);
|
||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
sprintf (p, fmt, tmp_engine_version, path);
|
sprintf (p, fmt, version, path);
|
||||||
engine_info = p;
|
engine_info = p;
|
||||||
xfree (tmp_engine_version); tmp_engine_version = NULL;
|
xfree (version);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
err = mk_error (General_Error);
|
err = mk_error (General_Error);
|
||||||
@ -303,6 +327,5 @@ get_engine_info (void)
|
|||||||
"</GnupgInfo>\n";
|
"</GnupgInfo>\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gpgme_release ( c );
|
|
||||||
return engine_info;
|
return engine_info;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user