Lines Matching refs:file
22 * dss file support
38 noreadf(Dssfile_t* file, Dssrecord_t* record, Dssdisc_t* disc)
41 (*disc->errorf)(NiL, disc, ERROR_SYSTEM|2, "%s: not open for read", file->path);
50 nullreadf(Dssfile_t* file, Dssrecord_t* record, Dssdisc_t* disc)
60 nowritef(Dssfile_t* file, Dssrecord_t* record, Dssdisc_t* disc)
63 (*disc->errorf)(NiL, disc, ERROR_SYSTEM|2, "%s: not open for write", file->path);
68 * file open
74 Dssfile_t* file;
144 if (!(file = vmnewof(vm, 0, Dssfile_t, 1, strlen(path) + 1)))
153 strcpy(file->path = (char*)(file + 1), path);
154 file->dss = dss;
155 file->vm = vm;
156 file->io = io;
157 file->flags = flags;
160 if (!(file->format = format) && !(file->format = dss->format))
168 file->readf = noreadf;
169 file->writef = file->format->writef;
173 if (sfsize(file->io) || !fstat(sffileno(file->io), &st) && (S_ISFIFO(st.st_mode)
179 if (sfdczip(file->io, file->path, NiL, dss->disc->errorf) < 0)
182 (*dss->disc->errorf)(NiL, dss->disc, ERROR_SYSTEM|2, "%s: inflate error", file->path);
183 dssfclose(file);
186 s = sfreserve(file->io, SF_UNBOUND, SF_LOCKR);
187 n = sfvalue(file->io);
191 (*dss->disc->errorf)(NiL, dss->disc, ERROR_SYSTEM|2, "%s: cannot peek", file->path);
192 dssfclose(file);
195 for (file->format = (Dssformat_t*)dtfirst(dss->meth->formats); file->format && !(i = (*file->format->identf)(file, s, n, dss->disc)); file->format = (Dssformat_t*)dtnext(dss->meth->formats, file->format));
196 sfread(file->io, s, 0);
197 if (!file->format)
200 (*dss->disc->errorf)(NiL, dss->disc, 2, "%s: unknown %s format", file->path, dss->meth->name);
201 dssfclose(file);
206 if (format && format != file->format)
209 (*dss->disc->errorf)(NiL, dss->disc, 2, "%s: %s file format %s incompatible with %s", file->path, dss->meth->name, file->format->name, format->name);
210 dssfclose(file);
214 (*dss->disc->errorf)(dss, dss->disc, 1, "%s: %s method %s format", file->path, dss->meth->name, file->format->name);
215 file->readf = file->format->readf;
219 file->format = format ? format : dss->format ? dss->format : (Dssformat_t*)dtfirst(dss->meth->formats);
220 file->readf = nullreadf;
222 file->writef = nowritef;
224 dss->format = file->format;
226 if (!file->format)
229 (*dss->disc->errorf)(NiL, dss->disc, 2, "%s: %s method did not set file format", file->path, dss->meth->name);
230 dssfclose(file);
233 file->record.file = file;
234 if ((*file->format->openf)(file, dss->disc))
236 dssfclose(file);
239 return file;
243 * file close
247 dssfclose(Dssfile_t* file)
252 if (!file)
254 dss = file->dss;
255 if (!file->io)
259 r = file->format ? (*file->format->closef)(file, dss->disc) : 0;
260 if ((file->flags & DSS_FILE_WRITE) && sfsync(file->io))
263 (*dss->disc->errorf)(NiL, dss->disc, ERROR_SYSTEM|2, "%s: write error", file->path);
266 if (!(file->flags & DSS_FILE_KEEP))
267 sfclose(file->io);
268 if (!r && (file->flags & DSS_FILE_ERROR))
271 vmclose(file->vm);
276 * file read
280 dssfread(Dssfile_t* file)
284 file->count++;
285 file->offset += file->length;
286 if ((r = (*file->readf)(file, &file->record, file->dss->disc)) <= 0)
289 file->flags |= DSS_FILE_ERROR;
290 file->count--;
293 file->length = sftell(file->io) - file->offset;
294 return &file->record;
298 * file write
302 dssfwrite(Dssfile_t* file, Dssrecord_t* record)
304 return (*file->writef)(file, record, file->dss->disc);
308 * file tell
312 dssftell(Dssfile_t* file)
314 return file->seekf ? (*file->seekf)(file, DSS_TELL, file->dss->disc) : file->offset;
318 * file seek
322 dssfseek(Dssfile_t* file, Sfoff_t offset)
324 return (file->seekf ? (*file->seekf)(file, offset, file->dss->disc) : sfseek(file->io, offset, SEEK_SET)) == offset ? 0 : -1;
334 return record->file->format->savef ? (*record->file->format->savef)(record->file, record, record->file->dss->disc) : (Dssrecord_t*)0;
344 return record->file->format->dropf ? (*record->file->format->dropf)(record->file, record, record->file->dss->disc) : -1;
352 dss_no_fread(Dssfile_t* file, Dssrecord_t* record, Dssdisc_t* disc)
355 (*disc->errorf)(NiL, disc, 2, "%s: %s file format %s read not implemented", file->path, file->dss->meth->name, file->format->name);
360 dss_no_fwrite(Dssfile_t* file, Dssrecord_t* record, Dssdisc_t* disc)
363 (*disc->errorf)(NiL, disc, 2, "%s: %s file format %s write not implemented", file->path, file->dss->meth->name, file->format->name);
368 dss_no_fseek(Dssfile_t* file, Sfoff_t offset, Dssdisc_t* disc)
371 (*disc->errorf)(NiL, disc, 2, "%s: %s file format %s seek not implemented", file->path, file->dss->meth->name, file->format->name);