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 34extern unsigned long 35dllversion(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 57extern int 58dllcheck(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