diff options
Diffstat (limited to 'soltools/checkdll/checkdll.c')
-rw-r--r-- | soltools/checkdll/checkdll.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/soltools/checkdll/checkdll.c b/soltools/checkdll/checkdll.c new file mode 100644 index 000000000000..7c5473fb2510 --- /dev/null +++ b/soltools/checkdll/checkdll.c @@ -0,0 +1,97 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <dlfcn.h> + +/* + * NOTE: Since no one is really interested in correct unload behavior I've + * disabled the shared library unload check. If you want to reenable it comment + * the following line out + */ +#define NO_UNLOAD_CHECK + +static const char *pprog_name = "checkdll"; +static const char *psymbol = "GetVersionInfo"; + +void usage() +{ + fprintf(stderr, "usage: %s [-s] <dllname>\n", pprog_name); + return; +} + +int main(int argc, char *argv[]) +{ + int rc; + int silent=0; + void *phandle; + char *(*pfun)(void); + + if ( argc < 2 || argc > 4) { + usage(); + return 1; + } + + if ( !strcmp(argv[1],"-s") ) { + silent = 1; + ++argv, --argc; + } + + if ( (rc = access( argv[1], R_OK )) == -1 ) { + fprintf(stderr, "%s: ERROR: %s: %s\n", + pprog_name, argv[1], strerror(errno)); + return 2; + } + + if (!silent) printf("Checking DLL %s ...", argv[1]); + fflush(stdout); + + if ( (phandle = dlopen(argv[1], RTLD_NOW)) != NULL ) { + if ( (pfun = (char *(*)(void))dlsym(phandle, psymbol)) != NULL ) { + if (!silent) printf(": ok\n"); + } + else + { + printf(": WARNING: %s\n", dlerror()); + } +#ifdef NO_UNLOAD_CHECK + _exit(0); +#else + dlclose(phandle); +#endif + return 0; + } + + printf(": ERROR: %s\n", dlerror()); + return 3; +} + + |