void sys_close(int fd) { struct file* close_file = map_find(get_filemap(), fd); if(close_file != NULL) { filesys_close(close_file); map_remove(get_filemap(), fd); // important to remove from file hEHE } }
static int filemap_alloc(int fd, struct file **file_store) { struct file *file = get_filemap(); if (fd == NO_FD) { for (fd = 0; fd < FS_STRUCT_NENTRY; fd++, file++) { if (file->status == FD_NONE) { goto found; } } return -E_MAX_OPEN; } else { if (testfd(fd)) { file += fd; if (file->status == FD_NONE) { goto found; } return -E_BUSY; } return -E_INVAL; } found: assert(fopen_count(file) == 0); file->status = FD_INIT, file->node = NULL; *file_store = file; return 0; }
/** * Skriver till fd (skärm eller fil) * Returnerar antalet skrivna tecken eller -1 om antalet tecken som ska skrivas * är 0 eller om filen inte finns. */ int sys_write(int fd, const void* buffer, unsigned length) { if (fd == STDIN_FILENO) // Vi kan inte skriva till tangentbordet { return -1; } if (fd == STDOUT_FILENO) // skärmen { putbuf(buffer, length); return length; } else { // Skriva till fil struct file* write_to = map_find(get_filemap(), fd); if(write_to != NULL) { // Skriver buffer till write_to. Returnerar antalet skrivna tecken // Kan returnera ett antal tecken < length om filen är för liten return file_write(write_to, buffer, length); } else { return -1; // Filen finns inte, eller så ville vi skriva 0 tecken. } } // Hit ska vi inte komma! }
void sys_seek(int fd, unsigned position) { struct file* file = map_find(get_filemap(), fd); if (file != NULL && position <= (unsigned)sys_filesize(fd)) file_seek(file, position); }
int sys_filesize(int fd) { struct file* file = map_find(get_filemap(), fd); if (file != NULL) return file_length(file); return -1; }
unsigned sys_tell (int fd) { struct file* file = map_find(get_filemap(), fd); if (file != NULL) return file_tell(file); return -1; }
bool sys_create(const char* file, unsigned initial_size) { if (filesys_create(file, initial_size) && initial_size >= 0) { map_insert(get_filemap(), filesys_open(file)); return true; } return false; }
static inline int fd2file(int fd, struct file **file_store) { if (testfd(fd)) { struct file *file = get_filemap() + fd; if (file->status == FD_OPENED && file->fd == fd) { *file_store = file; return 0; } } return -E_INVAL; }
int sys_open(const char* file) { struct file* temp = filesys_open(file); if(temp != NULL) { // Mata in pekaren till filen i mapen // filemap finns initierad i thread.h/c return map_insert(get_filemap(), temp); // returnerar värdet i mapen } return -1; // filen fanns inte }
/* * Initilize drifile object and check file * file : file name array * cnt : number in file name array * mmapping: mmap file or not * return: drifile object */ drifiles *dri_init(char **file, int cnt, boolean mmapping) { drifiles *d = g_new0(drifiles, 1); FILE *fp; int i; boolean gotmap = FALSE; long filesize; char **filetop = file; for (i = 0; i < cnt; i++) { if (*(file + i) == NULL) continue; /* open check */ if (NULL == (fp = fopen(*(file + i), "r"))) { SYSERROR("File %s is not found\n", *(file + i)); } /* check is drifile or noe */ if (!filecheck(fp)) { SYSERROR("File %s is not dri file\n", *(file + i)); } /* get file map */ if (!gotmap) { get_filemap(d, fp); gotmap = TRUE; } /* get pointer */ get_fileptr(d, fp, i); /* get file size for mmap */ filesize = getfilesize(fp); /* copy filenme */ d->fnames[i] = strdup(*(file + i)); /* close */ fclose(fp); /* mmap */ if (mmapping) { int fd; if (0 > (fd = open(*(file + i), O_RDONLY))) { SYSERROR("open: %s\n", strerror(errno)); } if (MAP_FAILED == (d->mmapadr[i] = mmap(0, filesize, PROT_READ, MAP_SHARED, fd, 0))) { WARNING("mmap: %s\n", strerror(errno)); close(fd); mmapping = d->mmapped = FALSE; i = 0; file = filetop; /* retry */ continue; } d->mmapped = TRUE; } } return d; }
int main( int argc, char **argv ) { int fd; uint64_t length = 4294967296ULL; filemap_S fmap; int rc; if ( argc != 2 ) { printf( "Usage: %s <filename>\n", argv[ 0 ] ); return 1; } /* if ( 0 != my_fallocate( argv[1], length ) ) printf( "my_fallocate failed\n" ); else printf( "my_fallocate success\n" ); */ fd = open( argv[ 1 ], O_RDWR | O_CREAT ); if ( 0 >= fd ) { perror( "open" ); return 1; } /* rc = posix_fallocate( fd, 0, length ); if ( rc ) { printf( "posix_fallocate failed: %s\n", strerror( rc ) ); goto out; } */ rc = get_filemap( &fmap, fd, length ); if ( 0 == rc ) print_filemap( &fmap ); destroy_filemap( &fmap ); out: close( fd ); return 0; }
int sys_read(int fd, char* buffer, unsigned length) { if (fd == STDOUT_FILENO) return -1; // Vi kan inte läsa från skärmen unsigned i = 0; char key; for (i = 0; i != length; i++) { if (fd == STDIN_FILENO) // Tangentbord { key = (char)input_getc(); if (key == '\r') // enter { key = '\n'; // lägg till ny rad-tecken buffer[i] = key; break; } else buffer[i] = key; putbuf(&buffer[i], 1); } else { //Read from file struct file* read_from = map_find(get_filemap(), fd); if(read_from != NULL && length > 0) return file_read(read_from, buffer, length); else return -1; } } return length; // Så här många tecken läste jag }