diff options
Diffstat (limited to 'usr.sbin/init/main.c')
-rw-r--r-- | usr.sbin/init/main.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/usr.sbin/init/main.c b/usr.sbin/init/main.c index e1ee4d8..12bb98c 100644 --- a/usr.sbin/init/main.c +++ b/usr.sbin/init/main.c @@ -29,11 +29,49 @@ #include <sys/spawn.h> #include <stddef.h> +#include <unistd.h> +#include <stdio.h> +#include <string.h> + +#define log_trace(fmt, ...) printf("[init]: " fmt, ##__VA_ARGS__) +#define log_error(fmt, ...) printf("[error]: " fmt, ##__VA_ARGS__) #define SHELL_PATH "/usr/bin/osh" #define LOGIN_PATH "/usr/bin/login" #define INIT_RC_PATH "/usr/rc/init.rc" +static void +init_hostname(void) +{ + char hostname[128]; + size_t len; + FILE *fp; + + fp = fopen("/etc/hostname", "r"); + if (fp == NULL) { + log_error("[init]: error opening /etc/hostname\n"); + return; + } + + len = fread(hostname, sizeof(char), sizeof(hostname), fp); + if (len == 0) { + log_error("[init]: error reading /etc/hostname\n"); + fclose(fp); + return; + } + + hostname[len - 1] = '\0'; + if (sethostname(hostname, len) < 0) { + log_error("[init]: error setting hostname\n"); + log_error("[init]: tried to set %s (len=%d)\n", hostname, len); + fclose(fp); + return; + } + + log_trace("hostname -> %s\n", hostname); + fclose(fp); +} + int main(int argc, char **argv) { @@ -41,7 +79,11 @@ main(int argc, char **argv) char *start_argv[] = { SHELL_PATH, INIT_RC_PATH, NULL }; char *envp[] = { NULL }; + /* Initialize the system hostname */ + init_hostname(); + /* Start the init.rc */ + log_trace("init.rc up\n"); spawn(SHELL_PATH, start_argv, envp, 0); start_argv[1] = NULL; |