Allow for engine version lines with a suffix.

This commit is contained in:
Werner Koch 2008-05-06 08:13:39 +00:00
parent 914ace7a37
commit 14d099181c
2 changed files with 66 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2008-05-06 Werner Koch <wk@g10code.com>
* version.c (extract_version_string): New.
(_gpgme_get_program_version): Use it to allow for suffixes in the
version line.
2008-04-28 Werner Koch <wk@g10code.com> 2008-04-28 Werner Koch <wk@g10code.com>
* engine-gpgconf.c (gpgconf_read): Fixed segv. Avoid memmove for * engine-gpgconf.c (gpgconf_read): Fixed segv. Avoid memmove for

View File

@ -1,6 +1,6 @@
/* version.c - Version check routines. /* version.c - Version check routines.
Copyright (C) 2000 Werner Koch (dd9jn) Copyright (C) 2000 Werner Koch (dd9jn)
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007 g10 Code GmbH Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 g10 Code GmbH
This file is part of GPGME. This file is part of GPGME.
@ -187,6 +187,55 @@ gpgme_check_version (const char *req_version)
#define LINELENGTH 80 #define LINELENGTH 80
/* Extract the version string of a program from STRING. The version
number is expected to be in GNU style format:
foo 1.2.3
foo (bar system) 1.2.3
foo 1.2.3 cruft
foo (bar system) 1.2.3 cruft.
Spaces and tabs are skipped and used as delimiters, a term in
(nested) parenthesis before the version string is skipped, the
version string may consist of any non-space and non-tab characters
but needs to bstart with a digit.
*/
static const char *
extract_version_string (const char *string, size_t *r_len)
{
const char *s;
int count, len;
for (s=string; *s; s++)
if (*s == ' ' || *s == '\t')
break;
while (*s == ' ' || *s == '\t')
s++;
if (*s == '(')
{
for (count=1, s++; count && *s; s++)
if (*s == '(')
count++;
else if (*s == ')')
count--;
}
/* For robustness we look for a digit. */
while ( *s && !(*s >= '0' && *s <= '9') )
s++;
if (*s >= '0' && *s <= '9')
{
for (len=0; s[len]; len++)
if (s[len] == ' ' || s[len] == '\t')
break;
}
else
len = 0;
*r_len = len;
return s;
}
/* Retrieve the version number from the --version output of the /* Retrieve the version number from the --version output of the
program FILE_NAME. */ program FILE_NAME. */
char * char *
@ -243,10 +292,18 @@ _gpgme_get_program_version (const char *const file_name)
if (mark) if (mark)
{ {
mark = strrchr (line, ' '); size_t len;
const char *s;
s = extract_version_string (line, &len);
if (!len)
return NULL;
mark = malloc (len + 1);
if (!mark) if (!mark)
return NULL; return NULL;
return strdup (mark + 1); memcpy (mark, s, len);
mark[len] = 0;
return mark;
} }
return NULL; return NULL;