init, get/sethostname
This commit is contained in:
parent
84bbcf5f95
commit
238278c3fc
@ -136,21 +136,16 @@ int main(struct multiboot *mboot, uint32_t mboot_mag, uintptr_t esp) {
|
||||
parse_args(cmdline);
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX: Execute /bin/init
|
||||
*/
|
||||
/* Prepare to run /bin/init */
|
||||
char * argv[] = {
|
||||
"terminal",
|
||||
#if 1
|
||||
"-f",
|
||||
#endif
|
||||
"/bin/init",
|
||||
NULL
|
||||
};
|
||||
int argc = 0;
|
||||
while (argv[argc]) {
|
||||
argc++;
|
||||
}
|
||||
system("/bin/terminal", argc, argv); /* Run init */
|
||||
system(argv[0], argc, argv); /* Run init */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -340,6 +340,28 @@ static char * getcwd(char * buf, size_t size) {
|
||||
return buf;
|
||||
}
|
||||
|
||||
static char hostname[256];
|
||||
static size_t hostname_len = 0;
|
||||
|
||||
static int sethostname(char * new_hostname) {
|
||||
if (current_process->user == USER_ROOT_UID) {
|
||||
size_t len = strlen(new_hostname) + 1;
|
||||
if (len > 256) {
|
||||
return 1;
|
||||
}
|
||||
hostname_len = len;
|
||||
memcpy(hostname, new_hostname, hostname_len);
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static int gethostname(char * buffer) {
|
||||
memcpy(buffer, hostname, hostname_len);
|
||||
return hostname_len;
|
||||
}
|
||||
|
||||
/*
|
||||
* System Call Internals
|
||||
*/
|
||||
@ -377,6 +399,8 @@ static uintptr_t syscalls[] = {
|
||||
(uintptr_t)&chdir, /* 28 */
|
||||
(uintptr_t)&getcwd,
|
||||
(uintptr_t)&clone,
|
||||
(uintptr_t)&sethostname,
|
||||
(uintptr_t)&gethostname, /* 32 */
|
||||
0
|
||||
};
|
||||
uint32_t num_syscalls;
|
||||
|
@ -18,6 +18,7 @@ DEFN_SYSCALL2(getcwd, 29, char *, size_t);
|
||||
DEFN_SYSCALL1(chdir, 28, char *);
|
||||
|
||||
DEFN_SYSCALL0(getuid, 23);
|
||||
DEFN_SYSCALL0(gethostname, 32);
|
||||
|
||||
#define LINE_LEN 4096
|
||||
|
||||
@ -28,6 +29,7 @@ struct timeval {
|
||||
};
|
||||
|
||||
char username[1024];
|
||||
char _hostname[256];
|
||||
|
||||
void getusername() {
|
||||
FILE * passwd = fopen("/etc/passwd", "r");
|
||||
@ -54,6 +56,12 @@ void getusername() {
|
||||
fclose(passwd);
|
||||
}
|
||||
|
||||
void gethostname() {
|
||||
char buffer[256];
|
||||
size_t len = syscall_gethostname(buffer);
|
||||
memcpy(_hostname, buffer, len);
|
||||
}
|
||||
|
||||
void draw_prompt(int ret) {
|
||||
struct tm * timeinfo;
|
||||
struct timeval now;
|
||||
@ -64,7 +72,7 @@ void draw_prompt(int ret) {
|
||||
char time_buffer[80];
|
||||
strftime(time_buffer, 80, "%H:%M:%S", timeinfo);
|
||||
printf("\033[1m[\033[1;33m%s \033[1;32m%s \033[1;31m%s \033[1;34m%s\033[0m ",
|
||||
username, "esh", date_buffer, time_buffer);
|
||||
username, _hostname, date_buffer, time_buffer);
|
||||
if (ret != 0) {
|
||||
printf("\033[1;31m%d ", ret);
|
||||
}
|
||||
@ -114,6 +122,7 @@ int main(int argc, char ** argv) {
|
||||
int last_ret = 0;
|
||||
|
||||
getusername();
|
||||
gethostname();
|
||||
|
||||
FILE * motd = fopen("/etc/motd", "r");
|
||||
if (motd) {
|
||||
|
53
userspace/init.c
Normal file
53
userspace/init.c
Normal file
@ -0,0 +1,53 @@
|
||||
/* vim: tabstop=4 shiftwidth=4 noexpandtab
|
||||
*
|
||||
* Initial Startup
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <syscall.h>
|
||||
|
||||
DEFN_SYSCALL1(sethostname, 31, char *);
|
||||
|
||||
#define DEFAULT_HOSTNAME "toaru-test"
|
||||
#define FORK_FOR_TERMINAL 0
|
||||
#define FREETYPE 1
|
||||
|
||||
/* Set the hostname to whatever is in /etc/hostname */
|
||||
void set_hostname() {
|
||||
FILE * _host_file = fopen("/etc/hostname", "r");
|
||||
if (!_host_file) {
|
||||
/* No /etc/hostname, use the default */
|
||||
syscall_sethostname(DEFAULT_HOSTNAME);
|
||||
} else {
|
||||
char buf[256];
|
||||
fgets(buf, 255, _host_file);
|
||||
syscall_sethostname(buf);
|
||||
fclose(_host_file);
|
||||
}
|
||||
}
|
||||
|
||||
void start_terminal() {
|
||||
#if FORK_FOR_TERMINAL
|
||||
int pid = fork();
|
||||
if (!pid) {
|
||||
#endif
|
||||
char * tokens[] = {
|
||||
"/bin/terminal",
|
||||
#if FREETYPE
|
||||
"-f",
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
int i = execve(tokens[0], tokens, NULL);
|
||||
exit(0);
|
||||
#if FORK_FOR_TEMRINAL
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void main(int argc, char * argv[]) {
|
||||
/* Hostname */
|
||||
set_hostname();
|
||||
/* Terminal */
|
||||
start_terminal();
|
||||
}
|
@ -17,6 +17,7 @@
|
||||
DEFN_SYSCALL1(wait, 17, unsigned int);
|
||||
DEFN_SYSCALL1(setuid, 24, unsigned int);
|
||||
DEFN_SYSCALL1(kernel_string_XXX, 25, char *);
|
||||
DEFN_SYSCALL0(gethostname, 32);
|
||||
|
||||
int readline(char * buf, size_t size, uint8_t display) {
|
||||
size_t collected = 0;
|
||||
@ -104,7 +105,8 @@ int main(int argc, char ** argv) {
|
||||
char * password = malloc(sizeof(char) * 1024);
|
||||
|
||||
/* TODO: gethostname() */
|
||||
char * _hostname = "test";
|
||||
char _hostname[256];
|
||||
syscall_gethostname(_hostname);
|
||||
|
||||
fprintf(stdout, "%s login: ", _hostname);
|
||||
fflush(stdout);
|
||||
|
Loading…
Reference in New Issue
Block a user