1 #define _FILE_OFFSET_BITS 64
2 #define _LARGEFILE_SOURCE
3 #define _LARGEFILE64_SOURCE
26 static struct file *file_list;
29 file_create(char *name)
32 struct file *file= g_new0(struct file,1);
36 file->fd=open(name, O_RDONLY|O_LARGEFILE | O_BINARY);
41 fstat(file->fd, &stat);
42 file->size=stat.st_size;
43 file->name = g_strdup(name);
44 g_assert(file != NULL);
51 file_mmap(struct file *file)
54 file->begin = (char*)mmap_readonly_win32( file->name, &file->map_handle, &file->map_file );
56 file->begin=mmap(NULL, file->size, PROT_READ|PROT_WRITE, MAP_PRIVATE, file->fd, 0);
57 g_assert(file->begin != NULL);
58 if (file->begin == (void *)0xffffffff) {
63 g_assert(file->begin != (void *)0xffffffff);
64 file->end=file->begin+file->size;
70 file_data_read(struct file *file, long long offset, int size)
74 return file->begin+offset;
76 lseek(file->fd, offset, SEEK_SET);
77 if (read(file->fd, ret, size) != size) {
86 uncompress_int(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
91 stream.next_in = (Bytef*)source;
92 stream.avail_in = (uInt)sourceLen;
93 stream.next_out = dest;
94 stream.avail_out = (uInt)*destLen;
96 stream.zalloc = (alloc_func)0;
97 stream.zfree = (free_func)0;
99 err = inflateInit2(&stream, -MAX_WBITS);
100 if (err != Z_OK) return err;
102 err = inflate(&stream, Z_FINISH);
103 if (err != Z_STREAM_END) {
105 if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
109 *destLen = stream.total_out;
111 err = inflateEnd(&stream);
116 file_data_read_compressed(struct file *file, long long offset, int size, int size_uncomp)
120 uLongf destLen=size_uncomp;
122 ret=g_malloc(size_uncomp);
123 lseek(file->fd, offset, SEEK_SET);
124 if (read(file->fd, buffer, size) != size) {
128 if (uncompress_int(ret, &destLen, (Bytef *)buffer, size) != Z_OK) {
129 dbg(0,"uncompress failed\n");
138 file_data_free(struct file *file, unsigned char *data)
140 if (file->begin && data >= file->begin && data < file->end)
146 file_exists(char *name)
149 if (! stat(name, &buf))
155 file_remap_readonly(struct file *f)
160 munmap(f->begin, f->size);
161 begin=mmap(f->begin, f->size, PROT_READ, MAP_PRIVATE, f->fd, 0);
162 if (f->begin != begin)
163 printf("remap failed\n");
168 file_remap_readonly_all(void)
170 struct file *f=file_list;
173 while (f && limit-- > 0) {
174 file_remap_readonly(f);
180 file_unmap(struct file *f)
183 mmap_unmap_win32( f->begin, f->map_handle , f->map_file );
185 munmap(f->begin, f->size);
192 struct file *f=file_list;
195 while (f && limit-- > 0) {
204 file_opendir(char *dir)
210 file_readdir(void *hnd)
221 file_closedir(void *hnd)
227 file_create_caseinsensitive(char *name)
229 char dirname[strlen(name)+1];
235 ret=file_create(name);
239 strcpy(dirname, name);
240 p=dirname+strlen(name);
241 while (p > dirname) {
247 d=file_opendir(dirname);
250 while ((filename=file_readdir(d))) {
251 if (!strcasecmp(filename, p)) {
253 ret=file_create(dirname);
264 file_destroy(struct file *f)
268 if ( f->begin != NULL )
277 struct file_wordexp {
281 struct file_wordexp *
282 file_wordexp_new(const char *pattern)
284 struct file_wordexp *ret=g_new(struct file_wordexp, 1);
285 wordexp(pattern, &ret->we, 0);
290 file_wordexp_get_count(struct file_wordexp *wexp)
292 return wexp->we.we_wordc;
296 file_wordexp_get_array(struct file_wordexp *wexp)
298 return wexp->we.we_wordv;
302 file_wordexp_destroy(struct file_wordexp *wexp)
310 file_get_param(struct file *file, struct param_list *param, int count)
313 param_add_string("Filename", file->name, ¶m, &count);
314 param_add_hex("Size", file->size, ¶m, &count);