简单添加了fopen对mode参数的处理。请注意,它没有完全遵循posix,也与Linux的不一致,将来使用Rust的时候完善它。 (#141)

This commit is contained in:
login 2023-01-07 22:36:49 +08:00 committed by GitHub
parent 2224c93ea9
commit e9fdc57bf8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -49,20 +49,35 @@ int fclose(FILE *stream)
{ {
if (stream->fd >= 3) if (stream->fd >= 3)
{ {
int retcval = close(stream); int retcval = close(stream->fd);
free(stream); free(stream);
return; return 0;
} }
else else
return 0; return 0;
} }
// FIXME: 请注意这个函数的实现没有遵照posix行为也与Linux的不一致请在将来用Rust重构时改变它以使得它的行为与Linux的一致。
FILE *fopen(const char *restrict pathname, const char *restrict mode) FILE *fopen(const char *restrict pathname, const char *restrict mode)
{ {
FILE *stream = malloc(sizeof(FILE)); FILE *stream = malloc(sizeof(FILE));
memset(stream, 0, sizeof(FILE)); memset(stream, 0, sizeof(FILE));
int o_flags = 0;
int fd = open(pathname, mode); if (strcmp(mode, "r") == 0)
o_flags = O_RDONLY;
else if (strcmp(mode, "r+") == 0)
o_flags = O_RDWR;
else if (strcmp(mode, "w") == 0)
o_flags = O_WRONLY;
else if (strcmp(mode, "w+") == 0)
o_flags = O_RDWR | O_CREAT;
else if (strcmp(mode, "a") == 0)
o_flags = O_APPEND | O_CREAT;
else if (strcmp(mode, "a+") == 0)
o_flags = O_APPEND | O_CREAT;
int fd = open(pathname, o_flags);
if (fd >= 0) if (fd >= 0)
stream->fd = fd; stream->fd = fd;
return stream; return stream;