diff options
Diffstat (limited to 'libkdenetwork/libgpgme-copy/gpgme/version.c')
-rw-r--r-- | libkdenetwork/libgpgme-copy/gpgme/version.c | 231 |
1 files changed, 0 insertions, 231 deletions
diff --git a/libkdenetwork/libgpgme-copy/gpgme/version.c b/libkdenetwork/libgpgme-copy/gpgme/version.c deleted file mode 100644 index 133b23c7e..000000000 --- a/libkdenetwork/libgpgme-copy/gpgme/version.c +++ /dev/null @@ -1,231 +0,0 @@ -/* version.c - Version check routines. - Copyright (C) 2000 Werner Koch (dd9jn) - Copyright (C) 2001, 2002, 2003, 2004, 2005 g10 Code GmbH - - This file is part of GPGME. - - GPGME is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of - the License, or (at your option) any later version. - - GPGME is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#if HAVE_CONFIG_H -#include <config.h> -#endif -#include <string.h> -#include <limits.h> -#include <ctype.h> - -#include "gpgme.h" -#include "priv-io.h" - -/* For _gpgme_sema_subsystem_init (). */ -#include "sema.h" - -#ifdef HAVE_ASSUAN_H -#include "assuan.h" -#endif - - -/* Bootstrap the subsystems needed for concurrent operation. This - must be done once at startup. We can not guarantee this using a - lock, though, because the semaphore subsystem needs to be - initialized itself before it can be used. So we expect that the - user performs the necessary syncrhonization. */ -static void -do_subsystem_inits (void) -{ - static int done = 0; - - if (done) - return; - - _gpgme_sema_subsystem_init (); - _gpgme_io_subsystem_init (); -#ifdef HAVE_ASSUAN_H - assuan_set_assuan_err_source (GPG_ERR_SOURCE_GPGME); -#endif - - done = 1; -} - - -/* Read the next number in the version string STR and return it in - *NUMBER. Return a pointer to the tail of STR after parsing, or - *NULL if the version string was invalid. */ -static const char * -parse_version_number (const char *str, int *number) -{ -#define MAXVAL ((INT_MAX - 10) / 10) - int val = 0; - - /* Leading zeros are not allowed. */ - if (*str == '0' && isdigit(str[1])) - return NULL; - - while (isdigit (*str) && val <= MAXVAL) - { - val *= 10; - val += *(str++) - '0'; - } - *number = val; - return val > MAXVAL ? NULL : str; -} - - -/* Parse the version string STR in the format MAJOR.MINOR.MICRO (for - example, 9.3.2) and return the components in MAJOR, MINOR and MICRO - as integers. The function returns the tail of the string that - follows the version number. This might be te empty string if there - is nothing following the version number, or a patchlevel. The - function returns NULL if the version string is not valid. */ -static const char * -parse_version_string (const char *str, int *major, int *minor, int *micro) -{ - str = parse_version_number (str, major); - if (!str || *str != '.') - return NULL; - str++; - - str = parse_version_number (str, minor); - if (!str || *str != '.') - return NULL; - str++; - - str = parse_version_number (str, micro); - if (!str) - return NULL; - - /* A patchlevel might follow. */ - return str; -} - - -/* Return true if MY_VERSION is at least RETQ_VERSION, and false - otherwise. */ -int -_gpgme_compare_versions (const char *my_version, - const char *rq_version) -{ - int my_major, my_minor, my_micro; - int rq_major, rq_minor, rq_micro; - const char *my_plvl, *rq_plvl; - - if (!rq_version) - return 1; - if (!my_version) - return 0; - - my_plvl = parse_version_string (my_version, &my_major, &my_minor, &my_micro); - if (!my_plvl) - return 0; - - rq_plvl = parse_version_string (rq_version, &rq_major, &rq_minor, &rq_micro); - if (!rq_plvl) - return 0; - - if (my_major > rq_major - || (my_major == rq_major && my_minor > rq_minor) - || (my_major == rq_major && my_minor == rq_minor - && my_micro > rq_micro) - || (my_major == rq_major && my_minor == rq_minor - && my_micro == rq_micro && strcmp (my_plvl, rq_plvl) >= 0)) - return 1; - - return 0; -} - - -/* Check that the the version of the library is at minimum the - requested one and return the version string; return NULL if the - condition is not met. If a NULL is passed to this function, no - check is done and the version string is simply returned. - - This function must be run once at startup, as it also initializes - some subsystems. Its invocation must be synchronized against - calling any of the other functions in a multi-threaded - environments. */ -const char * -gpgme_check_version (const char *req_version) -{ - do_subsystem_inits (); - return _gpgme_compare_versions (VERSION, req_version) ? VERSION : NULL; -} - - -#define LINELENGTH 80 - -/* Retrieve the version number from the --version output of the - program FILE_NAME. */ -char * -_gpgme_get_program_version (const char *const file_name) -{ - char line[LINELENGTH] = ""; - int linelen = 0; - char *mark = NULL; - int rp[2]; - int nread; - char *argv[] = {NULL /* file_name */, "--version", 0}; - struct spawn_fd_item_s pfd[] = { {0, -1}, {-1, -1} }; - struct spawn_fd_item_s cfd[] = { {-1, 1 /* STDOUT_FILENO */}, {-1, -1} }; - int status; - - if (!file_name) - return NULL; - argv[0] = (char *) file_name; - - if (_gpgme_io_pipe (rp, 1) < 0) - return NULL; - - pfd[0].fd = rp[1]; - cfd[0].fd = rp[1]; - - status = _gpgme_io_spawn (file_name, argv, cfd, pfd); - if (status < 0) - { - _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) - { - if (mark > &line[0] && *mark == '\r') - mark--; - *mark = '\0'; - break; - } - linelen += nread; - } - } - while (nread > 0 && linelen < LINELENGTH - 1); - - _gpgme_io_close (rp[0]); - - if (mark) - { - mark = strrchr (line, ' '); - if (!mark) - return NULL; - return strdup (mark + 1); - } - - return NULL; -} |