#include "../cdb_system.h" #define _GNU_SOURCE #include #include #include #include #include #include #include struct sys_File_impl{ void * memory; size_t length; int fd; }; sys_File sys_fileOpenInMem(char * fileName, unsigned long parameter) { int flags = O_RDWR; if(parameter & SYS_FILE_NEW) flags |= O_CREAT | O_EXCL; int fd = open(fileName, flags, S_IRWXU); if(fd == -1) return NULL; if(flock(fd, LOCK_EX | LOCK_NB)) { close(fd); return NULL; } struct stat info; if(stat(fileName, &info)) { close(fd); return NULL; } if((parameter & SYS_FILE_TEMP) == SYS_FILE_TEMP) unlink(fileName); if(info.st_size == 0) { write(fd, "", 1); info.st_size++; } void *mem = mmap(NULL, info.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(mem == MAP_FAILED) { close(fd); return NULL; } sys_File file = (sys_File) sys_heapAlloc(sizeof(struct sys_File_impl)); file->memory = mem; file->length = info.st_size; file->fd = fd; return file; } void * sys_fileFileToMemory(sys_File file) { return file->memory; } sys_Bool sys_fileExists(char * fileName) { struct stat bro; return !stat(fileName, &bro); } void sys_fileClose(sys_File file) { if(file->memory != NULL) { msync(file->memory, file->length, MS_SYNC); munmap(file->memory, file->length); close(file->fd); } sys_heapFree(file); } void sys_fileFlush(sys_File file) { msync(file->memory, file->length, MS_SYNC); } void * sys_fileResize(sys_File file, signed long appendBytes) { size_t newSize = file->length + appendBytes; lseek(file->fd, newSize - 1, SEEK_SET); write(file->fd, "", 1); munmap(file->memory, file->length); void *newMem = mmap(NULL, newSize, PROT_READ | PROT_WRITE, MAP_SHARED, file->fd, 0); if(newMem == MAP_FAILED) { sys_fileClose(file); file->fd = 0; file->length = 0; file->memory = NULL; return NULL; } file->length = newSize; file->memory = newMem; return newMem; } void sys_fileDelete(char * fileName) { unlink(fileName); } void sys_fileRename(char * fileName, char * newFileName) { link(fileName, newFileName); unlink(fileName); }