Skip to content

Commit 8761daa

Browse files
author
Duckxz
committed
git missed the dynlink implementation
1 parent 545ec58 commit 8761daa

File tree

2 files changed

+145
-0
lines changed

2 files changed

+145
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Dynamic Link Library by Parra Studios
3+
* Copyright (C) 2009 - 2016 Vicente Eduardo Ferrer Garcia <[email protected]>
4+
*
5+
* A library for dynamic loading and linking shared objects at run-time.
6+
*
7+
*/
8+
9+
#ifndef DYNLINK_IMPL_BEOS_H
10+
#define DYNLINK_IMPL_BEOS_H 1
11+
12+
/* -- Headers -- */
13+
14+
#include <dynlink/dynlink_api.h>
15+
16+
#include <dynlink/dynlink_impl_symbol_beos.h>
17+
18+
#ifdef __cplusplus
19+
extern "C" {
20+
#endif
21+
22+
/* -- Forward declarations -- */
23+
24+
struct dynlink_impl_interface_type;
25+
26+
/* -- Type definitions -- */
27+
28+
typedef struct dynlink_impl_interface_type * dynlink_impl_interface;
29+
30+
/* -- Methods -- */
31+
32+
/**
33+
* @brief
34+
* BeOS/Haiku image add-on object implementation singleton
35+
*
36+
* @return
37+
* A pointer to the image add-on object implementation singleton
38+
*/
39+
DYNLINK_API dynlink_impl_interface dynlink_impl_interface_singleton_beos(void);
40+
41+
#ifdef __cplusplus
42+
}
43+
#endif
44+
45+
#endif /* DYNLINK_IMPL_BEOS_H */
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*
2+
* Dynamic Link Library by Parra Studios
3+
* Copyright (C) 2009 - 2016 Vicente Eduardo Ferrer Garcia <[email protected]>
4+
*
5+
* A library for dynamic loading and linking shared objects at run-time.
6+
*
7+
*/
8+
9+
/* -- Headers -- */
10+
11+
#include <dynlink/dynlink.h>
12+
13+
#include <dynlink/dynlink_impl.h>
14+
15+
#include <log/log.h>
16+
17+
#include <string.h>
18+
19+
#include <be/kernel/image.h>
20+
21+
/* -- Methods -- */
22+
23+
const char * dynlink_impl_interface_extension_beos(void)
24+
{
25+
static const char extension_beos[0x03] = "so";
26+
27+
return extension_beos;
28+
}
29+
30+
void dynlink_impl_interface_get_name_beos(dynlink handle, dynlink_name_impl name_impl, size_t length)
31+
{
32+
strncpy(name_impl, "lib", length);
33+
34+
strncat(name_impl, dynlink_get_name(handle), length);
35+
36+
strncat(name_impl, ".", length);
37+
38+
strncat(name_impl, dynlink_impl_extension(), length);
39+
}
40+
41+
dynlink_impl dynlink_impl_interface_load_beos(dynlink handle)
42+
{
43+
dynlink_flags flags = dynlink_get_flags(handle);
44+
45+
int flags_impl;
46+
47+
void* impl;
48+
49+
DYNLINK_FLAGS_SET(flags_impl, 0);
50+
51+
impl = (void*)load_add_on(dynlink_get_name_impl(handle));
52+
53+
if (impl != NULL || impl == B_OK)
54+
{
55+
return (dynlink_impl)impl;
56+
}
57+
58+
log_write("metacall", LOG_LEVEL_ERROR, "DynLink error: failed to load BeOS/Haiku image add-on");
59+
60+
return NULL;
61+
}
62+
63+
int dynlink_impl_interface_symbol_beos(dynlink handle, dynlink_impl impl, dynlink_symbol_name name, dynlink_symbol_addr * addr)
64+
{
65+
void * symbol = NULL;
66+
get_image_symbol((image_id)impl, name, B_SYMBOL_TYPE_TEXT, &symbol);
67+
68+
(void)handle;
69+
70+
*addr = (dynlink_symbol_addr)symbol;
71+
72+
return (*addr == NULL);
73+
}
74+
75+
int dynlink_impl_interface_unload_beos(dynlink handle, dynlink_impl impl)
76+
{
77+
(void)handle;
78+
79+
#if defined(__ADDRESS_SANITIZER__)
80+
/* Disable dlclose when running with address sanitizer in order to maintain stacktraces */
81+
(void)impl;
82+
return 0;
83+
#else
84+
return unload_add_on((image_id)impl);
85+
#endif
86+
}
87+
88+
dynlink_impl_interface dynlink_impl_interface_singleton_beos(void)
89+
{
90+
static struct dynlink_impl_interface_type impl_interface_beos =
91+
{
92+
&dynlink_impl_interface_extension_beos,
93+
&dynlink_impl_interface_get_name_beos,
94+
&dynlink_impl_interface_load_beos,
95+
&dynlink_impl_interface_symbol_beos,
96+
&dynlink_impl_interface_unload_beos
97+
};
98+
99+
return &impl_interface_beos;
100+
}

0 commit comments

Comments
 (0)