Compare commits

..

2 Commits

Author SHA1 Message Date
3cc2e4b2a4
app: Use C FILE instead of POSIX fd, and switch back to /etc/motd
All checks were successful
continuous-integration/drone/push Build is passing
2023-03-12 17:36:56 +01:00
9e9f268562
libc: Make fopen() parse the mode string 2023-03-12 17:36:04 +01:00
2 changed files with 29 additions and 12 deletions

View File

@ -15,23 +15,20 @@ int main()
atexit(bye); atexit(bye);
printf("Welcome to %s from userspace (pid %d)!\n", "Luna", getpid()); printf("Welcome to %s from userspace (pid %d)!\n", "Luna", getpid());
mkdir("/home", 0755); FILE* f = fopen("/etc/motd", "r");
mkdir("/home/user", 0755); if (!f)
int fd = open("/home/user/notes.txt", O_RDWR | O_CREAT, 0644);
if (fd < 0)
{ {
perror("open"); perror("fopen");
return 1; return 1;
} }
char buffer[512]; char buffer[512];
ssize_t nread = read(fd, buffer, sizeof(buffer)); size_t nread = fread(buffer, 1, sizeof(buffer), f);
buffer[nread] = 0; buffer[nread] = 0;
printf("/home/user/notes.txt says: %s", buffer); printf("/etc/motd says: %s", buffer);
close(fd); fclose(f);
time_t now = time(NULL); time_t now = time(NULL);
printf("date: %s", ctime(&now)); printf("date: %s", ctime(&now));

View File

@ -10,6 +10,23 @@
FILE* stderr = nullptr; FILE* stderr = nullptr;
static int fopen_parse_mode(const char* mode)
{
int result = 0;
switch (*mode)
{
case 'r': result |= O_RDONLY; break;
case 'w': result |= (O_WRONLY | O_CREAT | O_TRUNC); break;
case 'a': result |= (O_WRONLY | O_CREAT | O_APPEND); break;
default: errno = EINVAL; return -1;
}
if (strchr(mode, '+')) result |= O_RDWR;
return result;
}
extern "C" extern "C"
{ {
int console_write(const char* str, size_t size) int console_write(const char* str, size_t size)
@ -18,10 +35,13 @@ extern "C"
__errno_return(rc, int); __errno_return(rc, int);
} }
FILE* fopen(const char* path, const char*) FILE* fopen(const char* path, const char* mode)
{ {
// FIXME: Parse the mode string. int flags;
int fd = open(path, O_RDWR);
if ((flags = fopen_parse_mode(mode)) < 0) return nullptr;
int fd = open(path, flags, 0666);
if (fd < 0) return nullptr; if (fd < 0) return nullptr;
FILE* f = (FILE*)malloc(sizeof(FILE)); FILE* f = (FILE*)malloc(sizeof(FILE));