kfile_posix.c
Go to the documentation of this file.00001
00039 #include <emul/kfile_posix.h>
00040 #include <string.h>
00041
00042 static size_t kfile_posix_read(struct KFile *_fd, void *buf, size_t size)
00043 {
00044 KFilePosix *fd = KFILEPOSIX_CAST(_fd);
00045 return fread(buf, sizeof(uint8_t), size, fd->fp);
00046 }
00047
00048 static size_t kfile_posix_write(struct KFile *_fd, const void *buf, size_t size)
00049 {
00050 KFilePosix *fd = KFILEPOSIX_CAST(_fd);
00051 return fwrite(buf, sizeof(uint8_t), size, fd->fp);
00052 }
00053
00054 static kfile_off_t kfile_posix_seek(struct KFile *_fd, kfile_off_t offset, KSeekMode whence)
00055 {
00056 KFilePosix *fd = KFILEPOSIX_CAST(_fd);
00057 int std_whence;
00058 switch (whence)
00059 {
00060 case KSM_SEEK_CUR:
00061 std_whence = SEEK_CUR;
00062 break;
00063 case KSM_SEEK_END:
00064 std_whence = SEEK_END;
00065 break;
00066 case KSM_SEEK_SET:
00067 std_whence = SEEK_SET;
00068 break;
00069 default:
00070 ASSERT(0);
00071 return EOF;
00072 }
00073 int err = fseek(fd->fp, offset, std_whence);
00074 if (err)
00075 return err;
00076
00077 return ftell(fd->fp);
00078 }
00079
00080 static int kfile_posix_close(struct KFile *_fd)
00081 {
00082 KFilePosix *fd = KFILEPOSIX_CAST(_fd);
00083 return fclose(fd->fp);
00084 }
00085
00086 static int kfile_posix_flush(struct KFile *_fd)
00087 {
00088 KFilePosix *fd = KFILEPOSIX_CAST(_fd);
00089 return fflush(fd->fp);
00090 }
00091
00092 FILE *kfile_posix_init(KFilePosix *file, const char *filename, const char *mode)
00093 {
00094 memset(file, 0, sizeof(*file));
00095 DB(file->fd._type = KFT_KFILEPOSIX);
00096 file->fd.read = kfile_posix_read;
00097 file->fd.write = kfile_posix_write;
00098 file->fd.close = kfile_posix_close;
00099 file->fd.seek = kfile_posix_seek;
00100 file->fd.flush = kfile_posix_flush;
00101
00102 file->fp = fopen(filename, mode);
00103 return file->fp;
00104 }