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