PatchworkOS
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1#include <errno.h>
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6#include <sys/io.h>
7#include <sys/proc.h>
8#include <threads.h>
9
10static void spawn_program(const char* path, priority_t priority)
11{
12 if (path == NULL)
13 {
14 return;
15 }
16
17 fd_t klog = open("/dev/klog");
18 if (klog == ERR)
19 {
20 printf("init: failed to open klog (%s)\n", strerror(errno));
21 return;
22 }
23
24 const char* argv[] = {path, NULL};
25 spawn_fd_t fds[] = {
26 {.parent = klog, .child = STDOUT_FILENO},
27 {.parent = klog, .child = STDERR_FILENO},
29 };
30 spawn_attr_t attr = {.priority = priority};
31 if (spawn(argv, fds, "/usr", &attr) == ERR)
32 {
33 printf("init: failed to spawn program '%s' (%s)\n", path, strerror(errno));
34 }
35
36 if (close(klog) == ERR)
37 {
38 printf("init: failed to close klog (%s)\n", strerror(errno));
39 }
40}
41
42static void start_services(config_t* config)
43{
44 priority_t servicePriority = config_get_int(config, "startup", "service_priority", 31);
45
46 config_array_t* services = config_get_array(config, "startup", "services");
47 for (uint64_t i = 0; i < services->length; i++)
48 {
49 spawn_program(services->items[i], servicePriority);
50 }
51
52 config_array_t* serviceFiles = config_get_array(config, "startup", "service_files");
53 for (uint64_t i = 0; i < serviceFiles->length; i++)
54 {
57 while (stat(serviceFiles->items[i], &info) == ERR)
58 {
59 thrd_yield();
60 if (uptime() - start > CLOCKS_PER_SEC)
61 {
62 printf("init: timeout waiting for service file '%s'\n", serviceFiles->items[i]);
63 abort();
64 }
65 }
66 }
67}
68
69static void start_programs(config_t* config)
70{
71 priority_t programPriority = config_get_int(config, "startup", "program_priority", 31);
72
73 config_array_t* programs = config_get_array(config, "startup", "programs");
74 for (uint64_t i = 0; i < programs->length; i++)
75 {
76 spawn_program(programs->items[i], programPriority);
77 }
78}
79
80static void execute_commands(config_t* config)
81{
82 config_array_t* commands = config_get_array(config, "startup", "commands");
83 for (uint64_t i = 0; i < commands->length; i++)
84 {
85 if (system(commands->items[i]) != 0)
86 {
87 printf("init: failed to execute command '%s' (%s)\n", commands->items[i], strerror(errno));
88 }
89 }
90}
91
92int main(void)
93{
94 printf("init: loading config file...\n");
95 config_t* config = config_open("init", "main");
96 if (config == NULL)
97 {
98 printf("init: failed to open config file! (%s)\n", strerror(errno));
99 return EXIT_FAILURE;
100 }
101
102 printf("init: starting services...\n");
103 start_services(config);
104 printf("init: starting programs...\n");
105 start_programs(config);
106
107 printf("init: executing commands...\n");
108 execute_commands(config);
109
110 printf("init: all startup tasks completed!\n");
111 config_close(config);
112 return 0;
113}
#define CLOCKS_PER_SEC
Definition clock_t.h:15
config_array_t * config_get_array(config_t *config, const char *section, const char *key)
Get an array of strings from a configuration file.
Definition config.c:300
config_t * config_open(const char *prefix, const char *name)
Open a configuration file.
Definition config.c:93
int64_t config_get_int(config_t *config, const char *section, const char *key, int64_t fallback)
Get an integer value from a configuration file.
Definition config.c:250
void config_close(config_t *config)
Close a configuration file.
Definition config.c:202
#define errno
Error number variable.
Definition errno.h:27
uint64_t stat(const char *path, stat_t *stat)
System call for retrieving info about a file or directory.
Definition stat.c:9
fd_t open(const char *path)
System call for opening files.
Definition open.c:9
uint64_t close(fd_t fd)
System call for closing files.
Definition close.c:9
#define STDOUT_FILENO
Definition io.h:45
#define STDERR_FILENO
Definition io.h:46
pid_t spawn(const char **argv, const spawn_fd_t *fds, const char *cwd, spawn_attr_t *attr)
System call for creating child processes.
Definition spawn.c:6
#define SPAWN_FD_END
Spawn fds termination constant.
Definition proc.h:82
clock_t uptime(void)
System call for retreving the time since boot.
Definition uptime.c:6
uint8_t priority_t
Priority type.
Definition proc.h:41
#define NULL
Pointer error value.
Definition NULL.h:23
__UINT64_TYPE__ fd_t
A file descriptor.
Definition fd_t.h:12
__UINT64_TYPE__ clock_t
A nanosecond time.
Definition clock_t.h:13
static fb_info_t info
Definition gop.c:41
#define ERR
Definition main.c:44
int main()
Definition main.c:97
static void start_services(config_t *config)
Definition main.c:42
static void execute_commands(config_t *config)
Definition main.c:80
static void start_programs(config_t *config)
Definition main.c:69
static void spawn_program(const char *path, priority_t priority)
Definition main.c:10
static void start()
Definition main.c:542
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
_PUBLIC int printf(const char *_RESTRICT format,...)
Definition printf.c:5
#define EXIT_FAILURE
Definition stdlib.h:47
_PUBLIC int system(const char *string)
Definition system.c:6
_PUBLIC _NORETURN void abort(void)
Definition abort.c:7
_PUBLIC char * strerror(int errnum)
Definition strerror.c:6
Configuration array structure.
Definition config.h:38
char ** items
Definition config.h:39
uint64_t length
Definition config.h:40
Opaque configuration structure.
Definition config.c:28
priority_t priority
Definition proc.h:91
Stucture used to duplicate fds in spawn().
Definition proc.h:55
fd_t parent
The source file descriptor in the parent.
Definition proc.h:57
Stat type.
Definition io.h:360
fd_t klog
Definition thrd_create.c:11
_PUBLIC void thrd_yield(void)
Definition thrd_yield.c:10