File: SharedLibrary.c

package info (click to toggle)
spring 98.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 41,928 kB
  • ctags: 60,665
  • sloc: cpp: 356,167; ansic: 39,434; python: 12,228; java: 12,203; awk: 5,856; sh: 1,719; xml: 997; perl: 405; php: 253; objc: 194; makefile: 72; sed: 2
file content (92 lines) | stat: -rw-r--r-- 2,369 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
	Copyright (c) 2008 Robin Vobruba <hoijui.quaero@gmail.com>

	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.

	This program 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 General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "SharedLibrary.h"

#include "System/maindefines.h"

#include <stdio.h>

const char* sharedLib_getLibExtension() {

#ifdef _WIN32
	return "dll";
#elif defined __APPLE__
	return "dylib";
#else
	return "so";
#endif
}

void sharedLib_createFullLibName(const char* libBaseName,
		char* libFullName, const size_t libFullName_sizeMax) {

#ifdef _WIN32
	static const char* prefix = "";
#else
	static const char* prefix = "lib";
#endif

	SNPRINTF(libFullName, libFullName_sizeMax, "%s%s.%s",
			prefix, libBaseName, sharedLib_getLibExtension());
}

sharedLib_t sharedLib_load(const char* libFilePath) {
	sharedLib_t lib = NULL;

#if defined _WIN32
	if ((lib = LoadLibrary(libFilePath)) == NULL) {
		fprintf(stderr, "[SharedLibrary.c::sharedLib_load(%s)] LoadLibrary() error %d\n", libFilePath, GetLastError());
	}
#else /* defined _WIN32 */
	if ((lib = dlopen(libFilePath, RTLD_LAZY)) == NULL) {
		fprintf(stderr, "[SharedLibrary.c::sharedLib_load(%s)] dlopen() error %s\n", libFilePath, dlerror());
	}
#endif /* else defined _WIN32 */
	return lib;
}

void sharedLib_unload(sharedLib_t sharedLib) {

	if (!sharedLib_isLoaded(sharedLib)) {
		return;
	}

#if defined _WIN32
	FreeLibrary(sharedLib);
#else /* defined _WIN32 */
	dlclose(sharedLib);
#endif /* else defined _WIN32 */
	sharedLib = NULL;
}

bool sharedLib_isLoaded(sharedLib_t sharedLib) {
	return (sharedLib != NULL);
}

void* sharedLib_findAddress(sharedLib_t sharedLib, const char* symbol) {

	if (!sharedLib_isLoaded(sharedLib)) {
		return NULL;
	}

#if defined _WIN32
	return (void*) GetProcAddress(sharedLib, symbol);
#else /* defined _WIN32 */
	return dlsym(sharedLib, symbol);
#endif /* else defined _WIN32 */
}