/[mcrypt]/libmcrypt/lib/mcrypt_extra.c
ViewVC logotype

Annotation of /libmcrypt/lib/mcrypt_extra.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.8 - (hide annotations)
Wed May 16 08:55:12 2001 UTC (22 years, 11 months ago) by nmav
Branch: MAIN
Changes since 1.7: +74 -1 lines
File MIME type: text/plain
added libmcrypt-config so programs that use libmcrypt can be configured
easier

1 nmav 1.1 /*
2     * Copyright (C) 1998,1999 Nikos Mavroyanopoulos
3     *
4     * This library is free software; you can redistribute it and/or modify it under the terms of the
5     * GNU Library General Public License as published by the Free Software
6     * Foundation; either version 2 of the License, or (at your option) any
7     * later version.
8     *
9     * This library is distributed in the hope that it will be useful,
10     * but WITHOUT ANY WARRANTY; without even the implied warranty of
11     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12     * Library General Public License for more details.
13     *
14     * You should have received a copy of the GNU Library General Public
15     * License along with this library; if not, write to the
16     * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17     * Boston, MA 02111-1307, USA.
18     */
19    
20 nmav 1.8 /* $Id: mcrypt_extra.c,v 1.7 2001/01/23 11:51:19 nmav Exp $ */
21 nmav 1.1
22     #ifndef LIBDEFS_H
23     #define LIBDEFS_H
24     #include <libdefs.h>
25     #endif
26     #include <bzero.h>
27     #include <xmemory.h>
28     #include <mcrypt_internal.h>
29    
30     #if 0
31     extern int preloaded_symbols;
32 nmav 1.3 #endif
33 nmav 1.1
34 nmav 1.3 int mcrypt_algorithm_module_ok(const char *file, const char *directory);
35     int mcrypt_mode_module_ok(const char *file, const char *directory);
36 nmav 1.2 #ifndef USE_LTDL
37 nmav 1.3 void *mcrypt_dlopen_ext(const char *filename);
38 nmav 1.2 #endif
39 nmav 1.6 void *mcrypt_dlopen(const char *a_directory, const char *m_directory,
40     const char *filename);
41 nmav 1.3
42 nmav 1.6 #define MAXPATHLEN 256
43     WIN32DLL_DEFINE char *mcrypt_readdir(DIR * dirstream)
44 nmav 1.3 {
45 nmav 1.2
46 nmav 1.6 char *result;
47 nmav 1.3 struct dirent *ret = NULL;
48 nmav 1.6 #ifdef HAVE_READDIR_R
49     struct dirent ret2[sizeof(struct dirent)+MAXPATHLEN];
50     #endif
51    
52     #ifdef DT_REG
53     do {
54     #endif
55 nmav 1.2
56     #ifdef HAVE_READDIR_R
57 nmav 1.6 readdir_r(dirstream, ret2, &ret);
58     if (ret==NULL) return NULL;
59 nmav 1.2 #else
60 nmav 1.6 ret = readdir(dirstream);
61 nmav 1.2 #endif
62 nmav 1.6
63     result = calloc(1, strlen(ret->d_name) + 1);
64     if (result == NULL) {
65     return NULL;
66     }
67     strcpy(result, ret->d_name);
68     #ifdef DT_REG
69 nmav 1.3 }
70 nmav 1.6 while ((ret->d_type != DT_REG) && (ret->d_type != DT_UNKNOWN)
71     && (ret != NULL));
72     #endif
73 nmav 1.3
74     return result;
75    
76 nmav 1.2 }
77 nmav 1.1
78 nmav 1.6 WIN32DLL_DEFINE char **mcrypt_list_algorithms(char *libdir, int *size)
79 nmav 1.1 {
80     DIR *pdir;
81 nmav 1.2 char directory[512];
82 nmav 1.6 char *dirname;
83 nmav 1.1 char **filename = NULL, *ptr;
84     int tmpsize;
85    
86     *size = 0;
87    
88     if (libdir == NULL) {
89     strcpy(directory, LIBDIR);
90     } else {
91     strcpy(directory, libdir);
92     }
93    
94     pdir = opendir(directory);
95     if (pdir == NULL) {
96     fprintf(stderr, "Unable to open directory %s.\n",
97     directory);
98     return NULL;
99     }
100    
101     for (;;) {
102 nmav 1.2 dirname = mcrypt_readdir(pdir);
103 nmav 1.1 if (dirname != NULL) {
104 nmav 1.6 tmpsize = strlen(dirname);
105 nmav 1.3 if (tmpsize > 3) {
106 nmav 1.6 if (mcrypt_algorithm_module_ok
107     (dirname, directory) > 0) {
108     filename =
109     realloc(filename,
110     (*size +
111     1) * sizeof(char *));
112 nmav 1.7 if (filename==NULL) return NULL;
113 nmav 1.6 filename[*size] =
114     calloc(1, tmpsize + 1);
115 nmav 1.7 if (filename[*size]==NULL) return NULL;
116 nmav 1.6 strcpy(filename[*size], dirname);
117 nmav 1.3
118 nmav 1.6 ptr =
119     strrchr(filename[*size], '.');
120 nmav 1.3 if (ptr != NULL)
121     *ptr = '\0';
122     (*size)++;
123 nmav 1.1 }
124 nmav 1.3 }
125 nmav 1.1 } else {
126     break;
127     }
128    
129     }
130    
131    
132 nmav 1.3 closedir(pdir);
133 nmav 1.1
134     return filename;
135    
136     }
137    
138 nmav 1.6 WIN32DLL_DEFINE char **mcrypt_list_modes(char *libdir, int *size)
139 nmav 1.1 {
140     DIR *pdir;
141 nmav 1.2 char directory[512];
142 nmav 1.6 char *dirname;
143 nmav 1.1 char **filename = NULL, *ptr;
144     int tmpsize;
145    
146     if (libdir == NULL) {
147     strcpy(directory, LIBDIR);
148     } else {
149     strcpy(directory, libdir);
150     }
151    
152     pdir = opendir(directory);
153     if (pdir == NULL) {
154     fprintf(stderr, "Unable to open directory %s.\n",
155     directory);
156     return NULL;
157     }
158    
159     *size = 0;
160     for (;;) {
161    
162 nmav 1.2 dirname = mcrypt_readdir(pdir);
163 nmav 1.1 if (dirname != NULL) {
164 nmav 1.6 tmpsize = strlen(dirname);
165     if (tmpsize > 3) {
166     if (mcrypt_mode_module_ok
167     (dirname, directory) > 0) {
168     filename =
169     realloc(filename,
170     (*size +
171     1) * sizeof(char *));
172 nmav 1.7 if (filename==NULL) return NULL;
173    
174 nmav 1.6 filename[*size] =
175     calloc(1, tmpsize + 1);
176 nmav 1.7 if (filename[*size]==NULL) return NULL;
177    
178 nmav 1.6 strcpy(filename[*size], dirname);
179     ptr =
180     strrchr(filename[*size], '.');
181     if (ptr != NULL)
182     *ptr = '\0';
183     (*size)++;
184 nmav 1.1 }
185     }
186 nmav 1.6 free(dirname);
187 nmav 1.1 } else {
188     break;
189     }
190    
191     }
192    
193     closedir(pdir);
194     return filename;
195     }
196    
197 nmav 1.6 WIN32DLL_DEFINE void mcrypt_free_p(char **p, int size)
198 nmav 1.3 {
199     int i;
200 nmav 1.1
201 nmav 1.3 for (i = 0; i < size; i++) {
202 nmav 1.1 free(p[i]);
203     }
204     free(p);
205     }
206    
207 nmav 1.5 WIN32DLL_DEFINE
208 nmav 1.6 int mcrypt_algorithm_module_ok(const char *file, const char *directory)
209 nmav 1.1 {
210     word32 ret;
211     lt_dlhandle *_handle;
212     int (*_version) (void);
213    
214 nmav 1.3 if (file == NULL && directory == NULL) {
215 nmav 1.1 return MCRYPT_UNKNOWN_ERROR;
216     }
217 nmav 1.4
218 nmav 1.3 if (lt_dlinit() != 0) {
219 nmav 1.1 return MCRYPT_UNKNOWN_ERROR;
220     }
221 nmav 1.4
222 nmav 1.3
223 nmav 1.2 /* LTDL_SET_PRELOADED_SYMBOLS(); */
224 nmav 1.3
225 nmav 1.2 _handle = mcrypt_dlopen(directory, NULL, file);
226 nmav 1.1
227     if (!_handle) {
228     /* fputs(lt_dlerror(), stderr);
229     * fputs("\n", stderr);
230     */
231     lt_dlexit();
232     return MCRYPT_UNKNOWN_ERROR;
233     }
234    
235    
236     _version = lt_dlsym(_handle, "_mcrypt_algorithm_version");
237    
238 nmav 1.3 if (_version == NULL) {
239 nmav 1.1 lt_dlclose(_handle);
240     lt_dlexit();
241     return MCRYPT_UNKNOWN_ERROR;
242     }
243    
244     ret = _version();
245    
246     lt_dlclose(_handle);
247     lt_dlexit();
248    
249     return ret;
250    
251     }
252    
253 nmav 1.5 WIN32DLL_DEFINE
254 nmav 1.6 int mcrypt_mode_module_ok(const char *file, const char *directory)
255 nmav 1.1 {
256     word32 ret;
257     lt_dlhandle *_handle;
258     int (*_version) (void);
259    
260 nmav 1.3 if (file == NULL && directory == NULL) {
261 nmav 1.1 return MCRYPT_UNKNOWN_ERROR;
262     }
263    
264 nmav 1.3 if (lt_dlinit() != 0) {
265 nmav 1.1 return MCRYPT_UNKNOWN_ERROR;
266 nmav 1.3 }
267 nmav 1.1 /* LTDL_SET_PRELOADED_SYMBOLS(); */
268 nmav 1.3
269 nmav 1.2 _handle = mcrypt_dlopen(directory, NULL, file);
270 nmav 1.3
271 nmav 1.1 if (!_handle) {
272     lt_dlexit();
273     return MCRYPT_UNKNOWN_ERROR;
274     }
275 nmav 1.3
276 nmav 1.1
277     _version = lt_dlsym(_handle, "_mcrypt_mode_version");
278    
279 nmav 1.3 if (_version == NULL) {
280 nmav 1.1 lt_dlclose(_handle);
281     lt_dlexit();
282     return MCRYPT_UNKNOWN_ERROR;
283     }
284 nmav 1.3
285 nmav 1.1 ret = _version();
286    
287     lt_dlclose(_handle);
288     lt_dlexit();
289    
290     return ret;
291    
292     }
293 nmav 1.8
294     /* Taken from libgcrypt */
295    
296     static const char*
297     parse_version_number( const char *s, int *number )
298     {
299     int val = 0;
300    
301     if( *s == '0' && isdigit(s[1]) )
302     return NULL; /* leading zeros are not allowed */
303     for ( ; isdigit(*s); s++ ) {
304     val *= 10;
305     val += *s - '0';
306     }
307     *number = val;
308     return val < 0? NULL : s;
309     }
310    
311    
312     static const char *
313     parse_version_string( const char *s, int *major, int *minor, int *micro )
314     {
315     s = parse_version_number( s, major );
316     if( !s || *s != '.' )
317     return NULL;
318     s++;
319     s = parse_version_number( s, minor );
320     if( !s || *s != '.' )
321     return NULL;
322     s++;
323     s = parse_version_number( s, micro );
324     if( !s )
325     return NULL;
326     return s; /* patchlevel */
327     }
328    
329     /****************
330     * Check that the the version of the library is at minimum the requested one
331     * and return the version string; return NULL if the condition is not
332     * satisfied. If a NULL is passed to this function, no check is done,
333     * but the version string is simply returned.
334     */
335     const char *
336     mcrypt_check_version( const char *req_version )
337     {
338     const char *ver = VERSION;
339     int my_major, my_minor, my_micro;
340     int rq_major, rq_minor, rq_micro;
341     const char *my_plvl, *rq_plvl;
342    
343     if ( !req_version )
344     return ver;
345    
346     my_plvl = parse_version_string( ver, &my_major, &my_minor, &my_micro );
347     if ( !my_plvl )
348     return NULL; /* very strange our own version is bogus */
349     rq_plvl = parse_version_string( req_version, &rq_major, &rq_minor,
350     &rq_micro );
351     if ( !rq_plvl )
352     return NULL; /* req version string is invalid */
353    
354     if ( my_major > rq_major
355     || (my_major == rq_major && my_minor > rq_minor)
356     || (my_major == rq_major && my_minor == rq_minor
357     && my_micro > rq_micro)
358     || (my_major == rq_major && my_minor == rq_minor
359     && my_micro == rq_micro
360     && strcmp( my_plvl, rq_plvl ) >= 0) ) {
361     return ver;
362     }
363     return NULL;
364     }
365    

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26