SNSS_RETURN_CODE SNSS_GetNextBlockType (SNSS_BLOCK_TYPE *blockType, SNSS_FILE *snssFile) { char tagBuffer[TAG_LENGTH + 1]; int pos = vfs_tell(snssFile->fp); if (vfs_read (tagBuffer, TAG_LENGTH, 1, snssFile->fp) != TAG_LENGTH) return SNSS_READ_FAILED; tagBuffer[TAG_LENGTH] = '\0'; /* reset the file pointer to the start of the block */ vfs_seek (snssFile->fp, -TAG_LENGTH, VFS_SEEK_CUR); if (pos != vfs_tell(snssFile->fp)) return SNSS_READ_FAILED; /* figure out which type of block it is */ if (strcmp (tagBuffer, "BASR") == 0) { *blockType = SNSS_BASR; return SNSS_OK; } else if (strcmp (tagBuffer, "VRAM") == 0) { *blockType = SNSS_VRAM; return SNSS_OK; } else if (strcmp (tagBuffer, "SRAM") == 0) { *blockType = SNSS_SRAM; return SNSS_OK; } else if (strcmp (tagBuffer, "MPRD") == 0) { *blockType = SNSS_MPRD; return SNSS_OK; } else if (strcmp (tagBuffer, "CNTR") == 0) { *blockType = SNSS_CNTR; return SNSS_OK; } else if (strcmp (tagBuffer, "SOUN") == 0) { *blockType = SNSS_SOUN; return SNSS_OK; } else { *blockType = SNSS_UNKNOWN_BLOCK; return SNSS_OK; } }
SNSS_RETURN_CODE SNSS_CloseFile (SNSS_FILE **snssFile) { int prevLoc; SNSS_RETURN_CODE code; /* file was never open, so this should indicate success- kinda. */ if (NULL == *snssFile) return SNSS_OK; if (SNSS_OPEN_WRITE == (*snssFile)->mode) { prevLoc = vfs_tell((*snssFile)->fp); vfs_seek((*snssFile)->fp, 0, VFS_SEEK_SET); /* write the header again to get block count correct */ if (SNSS_OK != (code = SNSS_WriteFileHeader(*snssFile))) return SNSS_CLOSE_FAILED; vfs_seek((*snssFile)->fp, prevLoc, VFS_SEEK_SET); } vfs_close ((*snssFile)->fp); NES_FREE(*snssFile); *snssFile = NULL; return SNSS_OK; }
off_t vfsfd_lseek(int fd, off_t offset, int whence) { struct fdtab_entry *e = fdtab_get(fd); switch(e->type) { case FDTAB_TYPE_FILE: { enum vfs_seekpos vfs_whence; errval_t err; size_t retpos; switch(whence) { case SEEK_SET: vfs_whence = VFS_SEEK_SET; break; case SEEK_CUR: vfs_whence = VFS_SEEK_CUR; break; case SEEK_END: vfs_whence = VFS_SEEK_END; break; default: return -1; } err = vfs_seek((vfs_handle_t)e->handle, vfs_whence, offset); if(err_is_fail(err)) { DEBUG_ERR(err, "vfs_seek"); return -1; } err = vfs_tell((vfs_handle_t)e->handle, &retpos); if(err_is_fail(err)) { DEBUG_ERR(err, "vfs_tell"); return -1; } VFSFD_DEBUG("lseek(%d, %lld, %d) = %lu\n", fd, offset, whence, retpos); return retpos; } break; default: return -1; } }
int syscall_tell(openfile_t file) { int result = vfs_tell(file - 2); if (result < 0) { switch(result) { case VFS_UNUSABLE: kprintf("Error telling file's position. File system unusable.\n"); break; case VFS_NOT_OPEN: kprintf("Error telling file's position: File not open\n"); break; default: kprintf("Error writing file: unknown error\n"); break; } } return result; }
int io_tell(openfile_t file) { file -= 3; if (!process_has_open_file(file)) return VFS_NOT_OPEN_IN_PROCESS; return vfs_tell(file); }