Compare commits

...

2 Commits

3 changed files with 34 additions and 9 deletions

View File

@ -32,6 +32,9 @@ extern "C"
/* Opens the file specified by pathname. Returns the file handle on success, or NULL on error. */ /* Opens the file specified by pathname. Returns the file handle on success, or NULL on error. */
FILE* fopen(const char* pathname, const char* mode); FILE* fopen(const char* pathname, const char* mode);
/* Returns a new file associated with the file descriptor fd. */
FILE* fdopen(int fd, const char* mode);
/* Writes formatted output according to the string format to the file stream. */ /* Writes formatted output according to the string format to the file stream. */
int fprintf(FILE* stream, const char* format, ...); int fprintf(FILE* stream, const char* format, ...);

View File

@ -40,6 +40,19 @@ extern "C"
return stream; return stream;
} }
FILE* fdopen(int fd, const char*)
{
if (fd < 0) // FIXME: Also check if the mode string is compatible with how fd was opened.
{
errno = EBADF;
return 0;
}
FILE* stream = (FILE*)malloc(sizeof(FILE));
stream->f_fd = fd;
clearerr(stream);
return stream;
}
size_t fread(void* buf, size_t size, size_t nmemb, FILE* stream) size_t fread(void* buf, size_t size, size_t nmemb, FILE* stream)
{ {
ssize_t status = read(stream->f_fd, buf, size * nmemb); ssize_t status = read(stream->f_fd, buf, size * nmemb);

View File

@ -6,13 +6,22 @@
extern "C" void initialize_libc() extern "C" void initialize_libc()
{ {
close(0); // If it was already open, close it if (lseek(0, 0, SEEK_CUR) < 0)
close(1); // If it was already open, close it {
errno = 0; // If it was not open. the kernel will throw us EBADF. Let's ignore that, since we don't care. if (errno == EBADF) stdout = fopen("/dev/console", "rw");
stderr = fopen("/dev/console", "rw"); else
if (!stderr) exit(errno); exit(errno);
stdout = fopen("/dev/console", "rw");
if (!stdout) exit(errno); if (!stdout) exit(errno);
clearerr(stderr); errno = 0;
clearerr(stdout); }
else { stdout = fdopen(0, "rw"); }
if (lseek(1, 0, SEEK_CUR) < 0)
{
if (errno == EBADF) stderr = fopen("/dev/console", "rw");
else
exit(errno);
if (!stderr) exit(errno);
errno = 0;
}
else { stderr = fdopen(1, "rw"); }
} }