Line data Source code
1 : /** @file mkernel.c
2 : * @brief Micro-kernel core main source
3 : * @date 10/11/2017
4 : * @author François Cerbelle (Fanfan), francois@cerbelle.net
5 : * @copyright Copyright (c) 2017, François Cerbelle
6 : *
7 : * @internal
8 : * Compiler gcc
9 : * Last modified 2024-07-26 13:37
10 : * Organization Cerbelle.net
11 : * Company Home
12 : *
13 : * This source code is released for free distribution under the terms of the
14 : * GNU General Public License as published by the Free Software Foundation.
15 : */
16 :
17 : #ifdef HAVE_CONFIG_H
18 : #include "config.h"
19 : #endif
20 :
21 : #include "revision.h"
22 : #include "gettext.h"
23 : /** GetText helper */
24 : #define _(String) gettext (String)
25 : #include <locale.h>
26 :
27 : /* Exclude inclusion for static code analysis with cppcheck */
28 : #ifndef NOCPPCHECK
29 : #include "mkernel-opt.h"
30 : #endif
31 :
32 : #include "modmgr.h"
33 : #include "mkmod.h"
34 : #include "ansi-color-codes.h"
35 :
36 : #include <stdlib.h> /* EXIT_SUCCESS / EXIT_FAILURE */
37 : #include <libgen.h> /* dirname */
38 :
39 : #ifndef PATH_MAX
40 : # define PATH_MAX 255
41 : #endif
42 :
43 : #include "debug/assert.h"
44 : #include "debug/memory.h"
45 :
46 : /** @todo Define in configure.ac with default value */
47 : #ifndef MODULE_PATH_ENV
48 : /** Default environment variable name to get module patch from */
49 : # define MODULE_PATH_ENV "MODULE_PATH"
50 : #endif
51 :
52 : #ifndef MODULE_PATH_DEFAULT
53 : /** Default path to search modules in, if not defined by autotools (should be) */
54 : # define MODULE_PATH_DEFAULT "."
55 : #endif
56 :
57 17 : int main(int argc, char** argv, char**env)
58 : {
59 : char *appDir;
60 :
61 : (void)env;
62 :
63 : /* Get executable relative invocation path from argv0 BEFORE AutoOpts */
64 : {
65 17 : char* execCmdCopy = strdup(argv[0]);
66 17 : appDir = strdup(dirname(execCmdCopy));
67 : }
68 :
69 : /* LibIntl/GetText setup for Internationalization i18n */
70 17 : setlocale (LC_ALL, "");
71 17 : bindtextdomain (PACKAGE, LOCALEDIR);
72 17 : textdomain (PACKAGE);
73 :
74 : /* Application banner */
75 17 : printf(BCYN PACKAGE_NAME " " PACKAGE_VERSION RESET);
76 : #ifdef REVISION
77 17 : printf("." BBLU REVISION RESET);
78 : #endif
79 : #ifdef BBID
80 17 : printf("." BBID);
81 : #endif
82 17 : printf("\n");
83 :
84 : #pragma GCC diagnostic push /* save the actual diag context */
85 : #pragma GCC diagnostic ignored "-Wdate-time" /* locally disable warnings because of non reproductible build triggered by pbuild */
86 17 : printf(_("Compiled %s at %s\n"),__DATE__, __TIME__);
87 : #pragma GCC diagnostic pop /* restore previous diag context */
88 : /* TRANSLATORS: This is a French proper name. "fraa-swa sEr\-bEl" "François Cerbelle" */
89 17 : printf("Copyright 2024 François Cerbelle\n");
90 17 : printf(_("Report bugs to %s\n\n"), BYEL PACKAGE_BUGREPORT RESET);
91 :
92 : /* AutoGen option parsing and consumming */
93 : {
94 17 : int arg_ct = optionProcess( &mkernelOptions, argc, argv );
95 11 : argc -= arg_ct;
96 11 : argv += arg_ct;
97 : /* Avoid assignement without usage warnings from cppcheck */
98 : (void)argc;
99 : }
100 :
101 : /* Default (least significant) module search path */
102 11 : if (0!=modmgr_addpath(MODULE_PATH_DEFAULT))
103 0 : fprintf(stderr,_("The module search path can not add MODULE_PATH_DEFAULT (%s)\n"),MODULE_PATH_DEFAULT);
104 :
105 : /* Add Application root and plugins subdir to module path */
106 : {
107 : char *modulePath;
108 11 : modulePath = (char*)malloc(strlen(appDir)+strlen("/plugins")+1);
109 11 : strcpy(modulePath,appDir);
110 11 : strcat(modulePath,"/plugins");
111 11 : if (0!=modmgr_addpath(appDir))
112 0 : fprintf(stderr,_("The module search path can not add the application folder (%s)\n"),appDir);
113 11 : if (0!=modmgr_addpath(modulePath))
114 0 : fprintf(stderr,_("The module search path can not add the application plugin folder (%s)\n"),modulePath);
115 11 : free(modulePath);
116 : }
117 :
118 : /* Override whole module path if environment defined */
119 11 : if ((getenv(MODULE_PATH_ENV)) && (strlen(getenv(MODULE_PATH_ENV))>0))
120 3 : if (0!=modmgr_setpath(getenv (MODULE_PATH_ENV)))
121 0 : fprintf(stderr,_("The module path can not be reset from MODULE_PATH_ENV (%s)\n"),getenv (MODULE_PATH_ENV));
122 :
123 : /* Override whole module path if options passed in CLI */
124 11 : if (HAVE_OPT(MODULE_PATH))
125 3 : if (0!=modmgr_setpath(OPT_ARG(MODULE_PATH)))
126 0 : fprintf(stderr,_("The module path can not be reset from CLI parameter (%s)\n"),OPT_ARG(MODULE_PATH));
127 :
128 : /* Main payload */
129 11 : printf (_("Hello from main\n"));
130 :
131 : /* AutoGen/AutoOpts shifted left argv */
132 : /* Try to load the module provided as first invocation argument */
133 : {
134 11 : modmgr_module_t m1=NULL;
135 11 : modmgr_module_t m2=NULL;
136 11 : modmgr_module_t m3=NULL;
137 11 : mkmod_api_t* api1=NULL;
138 11 : mkmod_api_t* api2=NULL;
139 11 : mkmod_api_t* api3=NULL;
140 :
141 11 : DBG_ITRACE(modmgr_list());
142 :
143 11 : if (argc>=1) {
144 11 : DBG_PRINTF("Loading %s",argv[0]);
145 11 : MODMGR_LOAD(m1,api1,argv[0]);
146 11 : DBG_ITRACE(modmgr_list());
147 11 : if (NULL!=m1) {
148 9 : if ((NULL!=api1)&&(NULL!=api1->mkmod_function))
149 9 : api1->mkmod_function();
150 : else
151 0 : fprintf(stderr,_("mkmod_function not found\n"));
152 : } else
153 2 : fprintf(stderr,_("Module not loaded\n"));
154 : }
155 :
156 11 : if (argc>=2) {
157 5 : DBG_PRINTF("Loading %s",argv[1]);
158 5 : MODMGR_LOAD(m2,api2,argv[1]);
159 5 : DBG_ITRACE(modmgr_list());
160 5 : if (NULL!=m2) {
161 3 : if ((NULL!=api2)&&(NULL!=api2->mkmod_function))
162 3 : api2->mkmod_function();
163 : else
164 0 : fprintf(stderr,_("mkmod_function not found\n"));
165 : } else
166 2 : fprintf(stderr,_("Module not loaded\n"));
167 : }
168 :
169 11 : if (argc>=3) {
170 2 : DBG_PRINTF("Loading %s",argv[2]);
171 2 : MODMGR_LOAD(m3,api3,argv[2]);
172 2 : DBG_ITRACE(modmgr_list());
173 2 : if (NULL!=m3) {
174 1 : if ((NULL!=api3)&&(NULL!=api3->mkmod_function))
175 1 : api3->mkmod_function();
176 : else
177 0 : fprintf(stderr,_("mkmod_function not found\n"));
178 : } else
179 1 : fprintf(stderr,_("Module not loaded\n"));
180 : }
181 :
182 11 : if (NULL!=m1) {
183 9 : modmgr_unload(m1);
184 : } else
185 2 : fprintf(stderr,_("Module not loaded\n"));
186 11 : DBG_ITRACE(modmgr_list());
187 :
188 11 : if (NULL!=m2) {
189 3 : modmgr_unload(m2);
190 : } else
191 8 : fprintf(stderr,_("Module not loaded\n"));
192 11 : DBG_ITRACE(modmgr_list());
193 :
194 11 : if (NULL!=m3) {
195 1 : modmgr_unload(m3);
196 : } else
197 10 : fprintf(stderr,_("Module not loaded\n"));
198 11 : DBG_ITRACE(modmgr_list());
199 : }
200 :
201 11 : free(appDir);
202 11 : memreport();
203 :
204 : #ifdef _WIN32
205 : system("PAUSE"); /* Pour la console Windows. */
206 : #endif
207 :
208 11 : return EXIT_SUCCESS;
209 : }
|