tools: Fix option parsing for gpg-zip.
[gnupg.git] / cipher / dynload.c
1 /* dynload.c - load cipher extensions
2  *      Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <unistd.h>
25 #include "util.h"
26 #include "cipher.h"
27 #include "algorithms.h"
28
29
30 typedef struct ext_list {
31     struct ext_list *next;
32     char name[1];
33 } *EXTLIST;
34
35 static EXTLIST extensions;
36
37 /* This is actually not used anymore but we keep a list of already
38  * set extensions modules here.
39  *
40  * Here is the ancient comment:
41  * Register an extension module.  The last registered module will
42  * be loaded first.  A name may have a list of classes
43  * appended; e.g:
44  *      mymodule.so(1:17,3:20,3:109)
45  * means that this module provides digest algorithm 17 and public key
46  * algorithms 20 and 109.  This is only a hint but if it is there the
47  * loader may decide to only load a module which claims to have a
48  * requested algorithm.
49  *
50  * mainpgm is the path to the program which wants to load a module
51  * it is only used in some environments.
52  */
53 void
54 register_cipher_extension( const char *mainpgm, const char *fname )
55 {
56     EXTLIST r, el;
57     char *p, *pe;
58
59     if( *fname != DIRSEP_C ) { /* do tilde expansion etc */
60         char *tmp;
61
62         if( strchr(fname, DIRSEP_C) )
63             tmp = make_filename(fname, NULL);
64         else
65             tmp = make_filename(GNUPG_LIBDIR, fname, NULL);
66         el = xmalloc_clear( sizeof *el + strlen(tmp) );
67         strcpy(el->name, tmp );
68         xfree(tmp);
69     }
70     else {
71         el = xmalloc_clear( sizeof *el + strlen(fname) );
72         strcpy(el->name, fname );
73     }
74     /* check whether we have a class hint */
75     if( (p=strchr(el->name,'(')) && (pe=strchr(p+1,')')) && !pe[1] )
76         *p = *pe = 0;
77
78     /* check that it is not already registered */
79     for(r = extensions; r; r = r->next ) {
80         if( !compare_filenames(r->name, el->name) ) {
81             log_info("extension `%s' already registered\n", el->name );
82             xfree(el);
83             return;
84         }
85     }
86     /* and register */
87     el->next = extensions;
88     extensions = el;
89 }
90
91 /* Return the module name with index SEQ, return NULL as as indication
92    for end of list. */
93 const char *
94 dynload_enum_module_names (int seq)
95 {
96   EXTLIST el = extensions;
97
98   for (; el && el->name && seq; el = el->next, seq--)
99     ;
100   return el? el->name:NULL;
101 }