2002-06-29 15:31:13 +02:00
|
|
|
/* dynload.c - load cipher extensions
|
2002-08-03 12:50:53 +02:00
|
|
|
* Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
|
2002-06-29 15:31:13 +02:00
|
|
|
*
|
|
|
|
* This file is part of GnuPG.
|
|
|
|
*
|
|
|
|
* GnuPG is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* GnuPG 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 General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include "util.h"
|
|
|
|
#include "cipher.h"
|
2002-08-03 12:50:53 +02:00
|
|
|
#include "algorithms.h"
|
2002-06-29 15:31:13 +02:00
|
|
|
|
|
|
|
|
|
|
|
typedef struct ext_list {
|
|
|
|
struct ext_list *next;
|
|
|
|
char name[1];
|
|
|
|
} *EXTLIST;
|
|
|
|
|
|
|
|
static EXTLIST extensions;
|
|
|
|
|
2002-08-03 12:50:53 +02:00
|
|
|
/* This is actually not used anymore but we keep a list of already
|
|
|
|
* set extensions modules here.
|
|
|
|
*
|
|
|
|
* Here is the ancient comment:
|
2002-06-29 15:31:13 +02:00
|
|
|
* Register an extension module. The last registered module will
|
|
|
|
* be loaded first. A name may have a list of classes
|
|
|
|
* appended; e.g:
|
|
|
|
* mymodule.so(1:17,3:20,3:109)
|
|
|
|
* means that this module provides digest algorithm 17 and public key
|
|
|
|
* algorithms 20 and 109. This is only a hint but if it is there the
|
|
|
|
* loader may decide to only load a module which claims to have a
|
|
|
|
* requested algorithm.
|
|
|
|
*
|
|
|
|
* mainpgm is the path to the program which wants to load a module
|
|
|
|
* it is only used in some environments.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
register_cipher_extension( const char *mainpgm, const char *fname )
|
|
|
|
{
|
|
|
|
EXTLIST r, el, intex;
|
|
|
|
char *p, *pe;
|
|
|
|
|
|
|
|
if( *fname != DIRSEP_C ) { /* do tilde expansion etc */
|
|
|
|
char *tmp;
|
|
|
|
|
|
|
|
if( strchr(fname, DIRSEP_C) )
|
|
|
|
tmp = make_filename(fname, NULL);
|
|
|
|
else
|
|
|
|
tmp = make_filename(GNUPG_LIBDIR, fname, NULL);
|
|
|
|
el = m_alloc_clear( sizeof *el + strlen(tmp) );
|
|
|
|
strcpy(el->name, tmp );
|
|
|
|
m_free(tmp);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
el = m_alloc_clear( sizeof *el + strlen(fname) );
|
|
|
|
strcpy(el->name, fname );
|
|
|
|
}
|
|
|
|
/* check whether we have a class hint */
|
2002-08-03 12:50:53 +02:00
|
|
|
if( (p=strchr(el->name,'(')) && (pe=strchr(p+1,')')) && !pe[1] )
|
2002-06-29 15:31:13 +02:00
|
|
|
*p = *pe = 0;
|
|
|
|
|
|
|
|
/* check that it is not already registered */
|
|
|
|
intex = NULL;
|
|
|
|
for(r = extensions; r; r = r->next ) {
|
|
|
|
if( !compare_filenames(r->name, el->name) ) {
|
|
|
|
log_info("extension `%s' already registered\n", el->name );
|
|
|
|
m_free(el);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* and register */
|
|
|
|
el->next = extensions;
|
|
|
|
extensions = el;
|
|
|
|
}
|
|
|
|
|
2002-08-03 12:50:53 +02:00
|
|
|
/* Return the module name with index SEQ, return NULL as as indication
|
|
|
|
for end of list. */
|
2002-06-29 15:31:13 +02:00
|
|
|
const char *
|
2002-08-03 12:50:53 +02:00
|
|
|
dynload_enum_module_names (int seq)
|
2002-06-29 15:31:13 +02:00
|
|
|
{
|
2002-08-03 12:50:53 +02:00
|
|
|
EXTLIST el = extensions;
|
2002-06-29 15:31:13 +02:00
|
|
|
|
2002-08-03 12:50:53 +02:00
|
|
|
for (; el && el->name && seq; el = el->next, seq--)
|
|
|
|
;
|
|
|
|
return el? el->name:NULL;
|
2002-06-29 15:31:13 +02:00
|
|
|
}
|