12 struct plugin_list *next;
15 struct plugin_list *plugins = NULL;
16 struct plugin_list **next = &plugins;
18 static void *load_plugin(const char *name)
20 for (struct plugin_list *ptr = plugins; ptr != NULL; ptr = ptr->next) {
21 if (strcmp(ptr->name, name) == 0)
25 size_t len = strlen(name);
27 char dependency_file_name[1 + 1 + 7 + 1 + len + 1 + 12 + 1 + 3 + 1];
28 sprintf(dependency_file_name, "./plugins/%s/dependencies.txt", name);
30 FILE *dependency_file = fopen(dependency_file_name, "r");
32 if (dependency_file) {
33 char dependency[BUFSIZ];
35 while (fscanf(dependency_file, "%s", dependency) != EOF)
36 load_plugin(dependency);
38 fclose(dependency_file);
41 char library_name[1 + 1 + 7 + 1 + len + 1 + len + 1 + 2 + 1];
42 sprintf(library_name, "./plugins/%s/%s.so", name, name);
44 void *handle = dlmopen(LM_ID_BASE, library_name, RTLD_NOW | RTLD_GLOBAL);
47 printf("%s\n", dlerror());
51 char *namebuf = malloc(len + 1);
52 strcpy(namebuf, name);
54 *next = malloc(sizeof(struct plugin_list));
55 **next = (struct plugin_list) {
60 next = &(*next)->next;
62 printf("Loaded %s\n", name);
69 void *main_plugin = load_plugin("game");
71 DIR *dir = opendir("plugins");
76 while (dp = readdir(dir))
77 if (dp->d_name[0] != '.')
78 load_plugin(dp->d_name);
82 void (*game_func)() = dlsym(main_plugin, "game");