dllcheck.c revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu/***********************************************************************
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* This software is part of the ast package *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* Copyright (c) 1997-2012 AT&T Intellectual Property *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* and is licensed under the *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* Eclipse Public License, Version 1.0 *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* by AT&T Intellectual Property *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* A copy of the License is available at *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* http://www.eclipse.org/org/documents/epl-v10.html *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* Information and Software Systems Research *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* AT&T Research *
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu* Florham Park NJ *
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu* *
69b1e90bbb27ce2dd365628c07c0f03a3ae97b26Robert Savu* Glenn Fowler <gsf@research.att.com> *
ad2e68e571352b6759441733df697e075ceed341Robert Savu* *
0a03acf9fa28e6ff00f4d7c9c6acbae64cf09c56Ewaryst Schulz***********************************************************************/
0a03acf9fa28e6ff00f4d7c9c6acbae64cf09c56Ewaryst Schulz#pragma prototyped
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu/*
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu * Glenn Fowler
37dd4c99dbe470cce3fe0d89a011186f080e8910Robert Savu * AT&T Research
37dd4c99dbe470cce3fe0d89a011186f080e8910Robert Savu */
37dd4c99dbe470cce3fe0d89a011186f080e8910Robert Savu
37dd4c99dbe470cce3fe0d89a011186f080e8910Robert Savu#include "dlllib.h"
0a03acf9fa28e6ff00f4d7c9c6acbae64cf09c56Ewaryst Schulz
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu/*
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu * return plugin version for dll
0a03acf9fa28e6ff00f4d7c9c6acbae64cf09c56Ewaryst Schulz * 0 if there is none
ad306df140215d8fb88d14bbb7d685011e0f770bRobert Savu * path!=0 enables library level diagnostics
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu */
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu
0a03acf9fa28e6ff00f4d7c9c6acbae64cf09c56Ewaryst Schulzextern unsigned long
ad2e68e571352b6759441733df697e075ceed341Robert Savudllversion(void* dll, const char* path)
ad2e68e571352b6759441733df697e075ceed341Robert Savu{
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu Dll_plugin_version_f pvf;
ad2e68e571352b6759441733df697e075ceed341Robert Savu
ad2e68e571352b6759441733df697e075ceed341Robert Savu if (pvf = (Dll_plugin_version_f)dlllook(dll, "plugin_version"))
ad2e68e571352b6759441733df697e075ceed341Robert Savu return (*pvf)();
ad2e68e571352b6759441733df697e075ceed341Robert Savu if (path)
ad2e68e571352b6759441733df697e075ceed341Robert Savu {
ad2e68e571352b6759441733df697e075ceed341Robert Savu state.error = 1;
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu sfsprintf(state.errorbuf, sizeof(state.errorbuf), "plugin_version() not found");
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu errorf("dll", NiL, 1, "dllversion: %s: %s", path, state.errorbuf);
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu }
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu return 0;
ad2e68e571352b6759441733df697e075ceed341Robert Savu}
ad2e68e571352b6759441733df697e075ceed341Robert Savu
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu/*
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu * check if dll on path has plugin version >= ver
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu * 1 returned on success, 0 on failure
ad306df140215d8fb88d14bbb7d685011e0f770bRobert Savu * path!=0 enables library level diagnostics
ad306df140215d8fb88d14bbb7d685011e0f770bRobert Savu * cur!=0 gets actual version
ad2e68e571352b6759441733df697e075ceed341Robert Savu */
ad2e68e571352b6759441733df697e075ceed341Robert Savu
0a03acf9fa28e6ff00f4d7c9c6acbae64cf09c56Ewaryst Schulzextern int
ad2e68e571352b6759441733df697e075ceed341Robert Savudllcheck(void* dll, const char* path, unsigned long ver, unsigned long* cur)
ad2e68e571352b6759441733df697e075ceed341Robert Savu{
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu unsigned long v;
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu
ad306df140215d8fb88d14bbb7d685011e0f770bRobert Savu state.error = 0;
ad306df140215d8fb88d14bbb7d685011e0f770bRobert Savu if (ver || cur)
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu {
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu v = dllversion(dll, path);
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu if (cur)
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu *cur = v;
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu }
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu if (!ver)
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu return 1;
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu if (!v)
0a03acf9fa28e6ff00f4d7c9c6acbae64cf09c56Ewaryst Schulz return 0;
ad2e68e571352b6759441733df697e075ceed341Robert Savu if (v < ver)
ad2e68e571352b6759441733df697e075ceed341Robert Savu {
0a03acf9fa28e6ff00f4d7c9c6acbae64cf09c56Ewaryst Schulz if (path)
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu {
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu state.error = 1;
239330cd665aac95fcf9cf95449594c96667cbc2Robert Savu sfsprintf(state.errorbuf, sizeof(state.errorbuf), "plugin version %lu older than caller %lu", v, ver);
ad2e68e571352b6759441733df697e075ceed341Robert Savu errorf("dll", NiL, 1, "dllcheck: %s: %s", path, state.errorbuf);
ad2e68e571352b6759441733df697e075ceed341Robert Savu }
e09066e7b76cea97557974b825bb057455b24ab0Robert Savu return 0;
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu }
0a03acf9fa28e6ff00f4d7c9c6acbae64cf09c56Ewaryst Schulz errorf("dll", NiL, -1, "dllversion: %s: %lu >= %lu", path, v, ver);
ad2e68e571352b6759441733df697e075ceed341Robert Savu return 1;
b3df7e69d4d6066fdfae0a8a2f3b4a161eaaf540Robert Savu}
ad306df140215d8fb88d14bbb7d685011e0f770bRobert Savu