Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
size_t EXPORT_THIS d_file_read_ints(void *buffer, size_t ints, FILESYSTEM_FILE *file) {
    return fsFileReadInts(buffer, ints, file);
}