OreBolt-OS/main.c

104 lines
5.1 KiB
C

/*
* main.c -- OreBolt OS v1.4 master launcher
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
* Boots the LVGL UI, registers all 16 modules, and runs the input dispatch
* loop. Installed at /usr/bin/h2_test on the device.
*
* v1.4: module table now includes the AGPL-licensed bitchat module. The
* bitchat module is loaded the same way as every other module; its
* AGPL-3.0-only status is enforced at compile time (-DAGPL_BITCHAT
* in Makefile.orebolt-v1.4) and at runtime via the .license field
* displayed in the module-info panel.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include "h2_ui.h"
#include "log_manager.h"
/* Forward declarations for module init/deinit -- one per module. */
extern void vault_init(lv_obj_t *); extern void vault_deinit(void);
extern void nettap_init(lv_obj_t *); extern void nettap_deinit(void);
extern void deploy_init(lv_obj_t *); extern void deploy_deinit(void);
extern void studio_init(lv_obj_t *); extern void studio_deinit(void);
extern void probe_init(lv_obj_t *); extern void probe_deinit(void);
extern void vterm_init(lv_obj_t *); extern void vterm_deinit(void);
extern void radar_init(lv_obj_t *); extern void radar_deinit(void);
extern void ducky_init(lv_obj_t *); extern void ducky_deinit(void);
extern void extract_init(lv_obj_t *); extern void extract_deinit(void);
extern void noise_init(lv_obj_t *); extern void noise_deinit(void);
extern void reset_init(lv_obj_t *); extern void reset_deinit(void);
extern void emulate_init(lv_obj_t *); extern void emulate_deinit(void);
extern void mapper_init(lv_obj_t *); extern void mapper_deinit(void);
extern void rfid_init(lv_obj_t *); extern void rfid_deinit(void);
extern void wifi_init(lv_obj_t *); extern void wifi_deinit(void);
extern void glitch_init(lv_obj_t *); extern void glitch_deinit(void);
extern void pwdb_init(lv_obj_t *); extern void pwdb_deinit(void);
extern void bitchat_init(lv_obj_t *); extern void bitchat_deinit(void);
static const h2_module_t modules[] = {
{ H2_MOD_VAULT, "vault", "1.4", "GPL-2.0-or-later", vault_init, vault_deinit, NULL },
{ H2_MOD_NETTAP, "nettaps", "1.4", "GPL-2.0-or-later", nettap_init, nettap_deinit, NULL },
{ H2_MOD_DEPLOY, "deploy", "1.4", "GPL-2.0-or-later", deploy_init, deploy_deinit, NULL },
{ H2_MOD_STUDIO, "studio", "1.4", "GPL-2.0-or-later", studio_init, studio_deinit, NULL },
{ H2_MOD_PROBE, "probe", "1.4", "GPL-2.0-or-later", probe_init, probe_deinit, NULL },
{ H2_MOD_VTERM, "vterm", "1.4", "GPL-2.0-or-later", vterm_init, vterm_deinit, NULL },
{ H2_MOD_RADAR, "radar", "1.4", "GPL-2.0-or-later", radar_init, radar_deinit, NULL },
{ H2_MOD_DUCKY, "ducky", "1.4", "GPL-2.0-or-later", ducky_init, ducky_deinit, NULL },
{ H2_MOD_EXTRACT, "extract", "1.4", "GPL-2.0-or-later", extract_init, extract_deinit, NULL },
{ H2_MOD_NOISE, "noise", "1.4", "GPL-2.0-or-later", noise_init, noise_deinit, NULL },
{ H2_MOD_RESET, "reset", "1.4", "GPL-2.0-or-later", reset_init, reset_deinit, NULL },
{ H2_MOD_EMULATE, "emulate", "1.4", "GPL-2.0-or-later", emulate_init, emulate_deinit, NULL },
{ H2_MOD_EMULATOR_INPUT_MAPPER, "emulator_input_mapper", "1.4", "GPL-2.0-or-later", mapper_init, mapper_deinit, NULL },
{ H2_MOD_RFID, "rfid", "1.4", "GPL-2.0-or-later", rfid_init, rfid_deinit, NULL },
{ H2_MOD_WIFI, "wifi", "1.4", "GPL-2.0-or-later", wifi_init, wifi_deinit, NULL },
{ H2_MOD_GLITCH, "glitch", "1.4", "GPL-2.0-or-later", glitch_init, glitch_deinit, NULL },
{ H2_MOD_PWDB, "pwdb", "1.4", "GPL-2.0-or-later", pwdb_init, pwdb_deinit, NULL },
{ H2_MOD_BITCHAT, "bitchat", "1.4", "AGPL-3.0-only", bitchat_init, bitchat_deinit, NULL },
};
static volatile sig_atomic_t running = 1;
static void on_signal(int sig) { (void)sig; running = 0; }
int main(int argc, char **argv)
{
(void)argc; (void)argv;
signal(SIGINT, on_signal);
signal(SIGTERM, on_signal);
if (log_init("/data/vault/syslog.log") < 0) {
fprintf(stderr, "[-] log_init failed\n");
return 1;
}
LOG_INF("OreBolt OS v1.4 starting (target: Ingenic X1000E)");
/* Register all 16 modules with the UI. */
for (size_t i = 0; i < sizeof(modules)/sizeof(modules[0]); ++i) {
if (h2_ui_register_module(&modules[i]) < 0) {
LOG_ERR("failed to register module: %s", modules[i].name);
} else {
LOG_DBG("registered module: %s (%s)",
modules[i].name, modules[i].license);
}
}
/* Main dispatch loop -- the LVGL fbdev driver handles the actual
* rendering; we just pump the tick. */
while (running) {
lv_timer_handler();
usleep(5000);
}
/* Clean shutdown -- deinit in reverse registration order. */
for (ssize_t i = (ssize_t)(sizeof(modules)/sizeof(modules[0])) - 1; i >= 0; --i) {
modules[i].deinit();
}
log_close();
return 0;
}