Skip to content

Commit e095344

Browse files
att
1 parent ac1a110 commit e095344

File tree

3 files changed

+44
-7
lines changed

3 files changed

+44
-7
lines changed

src/consts.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
2-
31
#ifndef CONSTS_H
42
#define CONSTS_H
53

@@ -11,6 +9,7 @@ const char *HELP_MESSAGE = "Usage: ./program [options]\n"
119
" --port, -p <port> Set the server port\n"
1210
" --dynamic_lib, -d <path> Path to the dynamic library\n"
1311
" --callback, -c <name> Callback function name in the dynamic library\n"
12+
" --starter_callback, -s <name> Starter callback function name to initialize server\n"
1413
" --password, --pass <password> Password for firmware routes\n"
1514
" --allow_read_dynamic_lib Allow reading the dynamic library via firmware route\n"
1615
" --allow_exit Allow server exit via firmware route\n"
@@ -34,6 +33,11 @@ const char *CALLBACK_FLAGS[]={
3433
"c"
3534
};
3635

36+
const char *STARTER_CALLBACK_FLAGS[]={
37+
"starter_callback",
38+
"s"
39+
};
40+
3741
const char *HELP_FLAGS[]={
3842
"help",
3943
"h"
@@ -71,4 +75,4 @@ const char *WRITE_DYNAMIC_LIB = "/cweb_firmware/write_dynamic_lib";
7175
const char *EXIT_FIRMWARE = "/cweb_firmware/exit";
7276

7377
const char *PASSWORD_ENTRIE ="password";
74-
#endif
78+
#endif

src/globals.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
char dynamic_lib_path[2000] = {0};
55
const char *callback_name;
6+
const char *starter_callback_name;
67
int global_argc;
78
char **global_argv;
89
char password_sha[100] = {0};
@@ -12,4 +13,4 @@ bool allow_update_firmware = false;
1213
const char *VERSION = "0.1.0";
1314

1415

15-
#endif
16+
#endif

src/main.c

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
#include "consts.h"
32

43
#include "../dependencies/CWebStudioOne.c"
@@ -67,7 +66,7 @@ int main(int argc, char *argv[]){
6766
return 1;
6867
}
6968

70-
69+
starter_callback_name = CArgvParse_get_flag(&args,STARTER_CALLBACK_FLAGS,FLAGS_SIZE,0);
7170

7271

7372
allow_read_dynamic_lib = CArgvParse_is_flags_present(&args, ALLOW_READ_DYNAMIC_LIB_FLAGS, FLAGS_SIZE);
@@ -87,7 +86,40 @@ int main(int argc, char *argv[]){
8786

8887
}
8988

90-
CwebServer server = newCwebSever(port_num, main_sever);
89+
CwebServer server;
90+
if(starter_callback_name){
91+
#ifdef _WIN32
92+
HMODULE handler = LoadLibrary(dynamic_lib_path);
93+
if(!handler){
94+
printf("Error loading dynamic library for starter callback: %lu\n", GetLastError());
95+
return 1;
96+
}
97+
CwebServer (*starter_callback)() = (CwebServer (*)())GetProcAddress(handler,starter_callback_name);
98+
if(!starter_callback){
99+
printf("Starter callback function not found\n");
100+
FreeLibrary(handler);
101+
return 1;
102+
}
103+
server = starter_callback();
104+
FreeLibrary(handler);
105+
#else
106+
void *handler = dlopen(dynamic_lib_path, RTLD_LAZY);
107+
if(!handler){
108+
printf("Error loading dynamic library for starter callback: %s\n", dlerror());
109+
return 1;
110+
}
111+
CwebServer (*starter_callback)() = (CwebServer (*)())dlsym(handler,starter_callback_name);
112+
if(!starter_callback){
113+
printf("Starter callback function not found\n");
114+
dlclose(handler);
115+
return 1;
116+
}
117+
server = starter_callback();
118+
dlclose(handler);
119+
#endif
120+
} else {
121+
server = newCwebSever(port_num, main_sever);
122+
}
91123
CwebServer_start(&server);
92124
return 0;
93125
}

0 commit comments

Comments
 (0)