xref: /titanic_51/usr/src/contrib/ast/src/lib/libdll/dllcheck.c (revision b4dd7d09880f14016feece03929a224eca1cf39a)
1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1997-2012 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                 Glenn Fowler <gsf@research.att.com>                  *
18 *                                                                      *
19 ***********************************************************************/
20 #pragma prototyped
21 /*
22  * Glenn Fowler
23  * AT&T Research
24  */
25 
26 #include "dlllib.h"
27 
28 /*
29  * return plugin version for dll
30  * 0 if there is none
31  * path!=0 enables library level diagnostics
32  */
33 
34 extern unsigned long
35 dllversion(void* dll, const char* path)
36 {
37 	Dll_plugin_version_f	pvf;
38 
39 	if (pvf = (Dll_plugin_version_f)dlllook(dll, "plugin_version"))
40 		return (*pvf)();
41 	if (path)
42 	{
43 		state.error = 1;
44 		sfsprintf(state.errorbuf, sizeof(state.errorbuf), "plugin_version() not found");
45 		errorf("dll", NiL, 1, "dllversion: %s: %s", path, state.errorbuf);
46 	}
47 	return 0;
48 }
49 
50 /*
51  * check if dll on path has plugin version >= ver
52  * 1 returned on success, 0 on failure
53  * path!=0 enables library level diagnostics
54  * cur!=0 gets actual version
55  */
56 
57 extern int
58 dllcheck(void* dll, const char* path, unsigned long ver, unsigned long* cur)
59 {
60 	unsigned long		v;
61 
62 	state.error = 0;
63 	if (ver || cur)
64 	{
65 		v = dllversion(dll, path);
66 		if (cur)
67 			*cur = v;
68 	}
69 	if (!ver)
70 		return 1;
71 	if (!v)
72 		return 0;
73 	if (v < ver)
74 	{
75 		if (path)
76 		{
77 			state.error = 1;
78 			sfsprintf(state.errorbuf, sizeof(state.errorbuf), "plugin version %lu older than caller %lu", v, ver);
79 			errorf("dll", NiL, 1, "dllcheck: %s: %s", path, state.errorbuf);
80 		}
81 		return 0;
82 	}
83 	errorf("dll", NiL, -1, "dllversion: %s: %lu >= %lu", path, v, ver);
84 	return 1;
85 }
86