mirror of
https://github.com/subhobhai943/SUB-OS.git
synced 2026-10-25 16:52:29 +00:00
113 lines
4.0 KiB
C
113 lines
4.0 KiB
C
#include <init/service.h>
|
|
#include <arch/x86_64/pit.h>
|
|
#include <lib/string.h>
|
|
#include <kernel/printk.h>
|
|
|
|
static service_unit_t services_table[MAX_SERVICES];
|
|
static size_t registered_count = 0;
|
|
|
|
static int default_dummy_start(void) { return 0; }
|
|
static int default_dummy_stop(void) { return 0; }
|
|
|
|
void service_manager_init(void) {
|
|
memset(services_table, 0, sizeof(services_table));
|
|
registered_count = 0;
|
|
|
|
service_register("syslogd.service", "System Logging Daemon", default_dummy_start, default_dummy_stop, true);
|
|
service_register("networking.service", "IPv4 Network Interface Manager", default_dummy_start, default_dummy_stop, true);
|
|
service_register("httpd.service", "Embedded Micro HTTP Web Server", default_dummy_start, default_dummy_stop, true);
|
|
service_register("sshd.service", "OpenSSH Remote Secure Shell Server", default_dummy_start, default_dummy_stop, true);
|
|
service_register("crond.service", "Periodic Command Scheduler Daemon", default_dummy_start, default_dummy_stop, true);
|
|
service_register("firewall.service", "NetFilter Stateful Packet Inspection", default_dummy_start, default_dummy_stop, true);
|
|
|
|
// Boot all enabled services
|
|
for (size_t i = 0; i < MAX_SERVICES; i++) {
|
|
if (services_table[i].in_use && services_table[i].enabled) {
|
|
service_start(services_table[i].name);
|
|
}
|
|
}
|
|
|
|
printk(KERN_INFO "SYSTEMD: Service Unit Manager initialized (6 services online)\n");
|
|
}
|
|
|
|
int service_register(const char* name, const char* desc, service_func_t start_fn, service_func_t stop_fn, bool enable_at_boot) {
|
|
if (!name) return -1;
|
|
|
|
for (size_t i = 0; i < MAX_SERVICES; i++) {
|
|
if (!services_table[i].in_use) {
|
|
service_unit_t* s = &services_table[i];
|
|
s->id = (uint32_t)(i + 1);
|
|
s->in_use = true;
|
|
strncpy(s->name, name, sizeof(s->name) - 1);
|
|
s->name[sizeof(s->name) - 1] = '\0';
|
|
strncpy(s->description, desc ? desc : name, sizeof(s->description) - 1);
|
|
s->description[sizeof(s->description) - 1] = '\0';
|
|
|
|
s->state = SERVICE_STATE_STOPPED;
|
|
s->enabled = enable_at_boot;
|
|
s->pid = (uint32_t)(100 + i);
|
|
s->start_time = 0;
|
|
s->restart_count = 0;
|
|
s->start_fn = start_fn ? start_fn : default_dummy_start;
|
|
s->stop_fn = stop_fn ? stop_fn : default_dummy_stop;
|
|
|
|
if (i >= registered_count) registered_count = i + 1;
|
|
return 0;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int service_start(const char* name) {
|
|
if (!name) return -1;
|
|
for (size_t i = 0; i < MAX_SERVICES; i++) {
|
|
if (services_table[i].in_use && strcmp(services_table[i].name, name) == 0) {
|
|
service_unit_t* s = &services_table[i];
|
|
s->state = SERVICE_STATE_STARTING;
|
|
if (s->start_fn) s->start_fn();
|
|
s->state = SERVICE_STATE_RUNNING;
|
|
s->start_time = pit_get_ticks();
|
|
return 0;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int service_stop(const char* name) {
|
|
if (!name) return -1;
|
|
for (size_t i = 0; i < MAX_SERVICES; i++) {
|
|
if (services_table[i].in_use && strcmp(services_table[i].name, name) == 0) {
|
|
service_unit_t* s = &services_table[i];
|
|
s->state = SERVICE_STATE_STOPPING;
|
|
if (s->stop_fn) s->stop_fn();
|
|
s->state = SERVICE_STATE_STOPPED;
|
|
return 0;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int service_restart(const char* name) {
|
|
service_stop(name);
|
|
return service_start(name);
|
|
}
|
|
|
|
service_state_t service_get_state(const char* name) {
|
|
if (!name) return SERVICE_STATE_FAILED;
|
|
for (size_t i = 0; i < MAX_SERVICES; i++) {
|
|
if (services_table[i].in_use && strcmp(services_table[i].name, name) == 0) {
|
|
return services_table[i].state;
|
|
}
|
|
}
|
|
return SERVICE_STATE_FAILED;
|
|
}
|
|
|
|
size_t service_get_count(void) {
|
|
return registered_count;
|
|
}
|
|
|
|
const service_unit_t* service_get_by_index(size_t index) {
|
|
if (index >= MAX_SERVICES || !services_table[index].in_use) return NULL;
|
|
return &services_table[index];
|
|
}
|