int fsMount(const char *name) { struct FILESYSTEM_IMAGE *img; FILESYSTEM_IMG_HEADER header; int i = 0; if ((img = malloc(sizeof(struct FILESYSTEM_IMAGE))) == NULL) return -1; if ((img->file = fsFileOpen(name, "rb")) == NULL) { free(img); return -1; } img->offset = 0; read_header: fsFileReadInts((unsigned int *) &header, sizeof(header) >> 2, img->file); if (header.magic != DARNIT_FS_IMG_MAGIC || header.version != DARNIT_FS_IMG_VERSION) { fsFileSeek(img->file, -4, SEEK_END); fsFileReadInts((unsigned int *) &i, 1, img->file); if (i == DARNIT_FS_IMG_MAGIC && !img->offset) { fsFileSeek(img->file, -8, SEEK_END); fsFileReadInts((unsigned int *) &i, 1, img->file); img->offset = fsFileTell(img->file) - i - 4; if (img->offset <= 0) { fsFileClose(img->file); free(img); return -1; } fsFileSeek(img->file, img->offset, SEEK_SET); goto read_header; } fsFileClose(img->file); free(img); return -1; } img->dir_ents = header.files; if ((img->dir = malloc(sizeof(FILESYSTEM_IMAGE_FILE) * img->dir_ents)) == NULL) { fsFileClose(img->file); free(img); return -1; } for (i = 0; i < img->dir_ents; i++) { fsFileRead(img->dir[i].name, 128, img->file); fsFileReadInts(&img->dir[i].pos, 3, img->file); img->dir[i].comp = utilStringSum(img->dir[i].name); img->dir[i].pos += (12 + 140 * img->dir_ents) + img->offset; } img->next = d->fs.mount; d->fs.mount = img; return 0; }
size_t EXPORT_THIS d_file_read_ints(void *buffer, size_t ints, FILESYSTEM_FILE *file) { return fsFileReadInts(buffer, ints, file); }