diff options
author | hpa <hpa> | 2004-11-10 22:31:50 +0000 |
---|---|---|
committer | hpa <hpa> | 2004-11-10 22:31:50 +0000 |
commit | 17f967640cef484f83d755c9dd016a946711236f (patch) | |
tree | 00bf0c0f2926cd6a9761eb372b55d090305aca44 /com32/lib/fopen.c | |
parent | c67a2ac96611fa6aeb9ff3602c5e0c8265f1cc9d (diff) | |
download | syslinux-17f967640cef484f83d755c9dd016a946711236f.tar.gz |
Very first cut at a klibc-derived C library for com32
Diffstat (limited to 'com32/lib/fopen.c')
-rw-r--r-- | com32/lib/fopen.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/com32/lib/fopen.c b/com32/lib/fopen.c new file mode 100644 index 00000000..5c841848 --- /dev/null +++ b/com32/lib/fopen.c @@ -0,0 +1,46 @@ +/* + * fopen.c + */ + +#include <stdio.h> +#include <unistd.h> +#include <fcntl.h> + +/* This depends on O_RDONLY == 0, O_WRONLY == 1, O_RDWR == 2 */ + + +FILE *fopen(const char *file, const char *mode) +{ + int flags = O_RDONLY; + int plus = 0; + int fd; + + while ( *mode ) { + switch ( *mode ) { + case 'r': + flags = O_RDONLY; + break; + case 'w': + flags = O_WRONLY|O_CREAT|O_TRUNC; + break; + case 'a': + flags = O_WRONLY|O_CREAT|O_APPEND; + break; + case '+': + plus = 1; + break; + } + mode++; + } + + if ( plus ) { + flags = (flags & ~(O_RDONLY|O_WRONLY)) | O_RDWR; + } + + fd = open(file, flags, 0666); + + if ( fd < 0 ) + return NULL; + else + return fdopen(fd, mode); +} |