Lines Matching refs:file
1 /* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
22 struct fs_file file;
90 /* we don't have a quick stat() to see the file's size,
101 struct metawrap_fs_file *file = i_new(struct metawrap_fs_file, 1);
102 return &file->file;
109 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
112 file->file.path = i_strdup(path);
113 file->fs = fs;
114 file->open_mode = mode;
119 file->file.parent = fs_file_init_parent(_file, path, mode | flags);
120 if (file->fs->wrap_metadata && mode == FS_OPEN_MODE_READONLY &&
124 file->super_read = fs_file_init_parent(_file, path,
127 file->super_read = file->file.parent;
129 fs_metadata_init(&file->file);
134 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
136 if (file->super_read != _file->parent && file->super_read != NULL)
137 fs_file_deinit(&file->super_read);
138 str_free(&file->metadata_header);
140 i_free(file->file.path);
141 i_free(file);
146 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
148 i_stream_unref(&file->input);
149 if (file->super_read != NULL)
150 fs_file_close(file->super_read);
159 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
161 if (!file->fs->wrap_metadata)
165 file->metadata_changed_since_write = TRUE;
173 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
177 if (!file->fs->wrap_metadata)
180 if (file->metadata_read) {
182 } else if (file->input == NULL) {
187 while ((ret = i_stream_read(file->input)) == 0) {
188 if (file->metadata_read)
191 i_assert(!file->input->blocking);
194 if (ret == -1 && file->input->stream_errno != 0) {
196 i_stream_get_name(file->input),
197 i_stream_get_error(file->input));
200 i_assert(file->metadata_read);
208 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
210 if (!file->fs->wrap_metadata)
213 return fs_prefetch(file->super_read, length);
218 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
220 if (!file->fs->wrap_metadata)
228 struct metawrap_fs_file *file = context;
231 file->metadata_read = TRUE;
238 fs_default_set_metadata(&file->file, key, value);
245 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
248 if (!file->fs->wrap_metadata)
251 if (file->input != NULL) {
252 i_stream_ref(file->input);
253 i_stream_seek(file->input, 0);
254 return file->input;
257 input = fs_read_stream(file->super_read, max_buffer_size);
258 file->input = i_stream_create_metawrap(input, fs_metawrap_callback, file);
260 i_stream_ref(file->input);
261 return file->input;
266 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
268 if (!file->fs->wrap_metadata)
274 fs_metawrap_append_metadata(struct metawrap_fs_file *file, string_t *str)
278 array_foreach(&file->file.metadata, metadata) {
292 fs_metawrap_write_metadata_to(struct metawrap_fs_file *file,
298 fs_metawrap_append_metadata(file, str);
299 file->metadata_write_size = str_len(str);
306 file->metadata_changed_since_write = FALSE;
311 struct metawrap_fs_file *file = context;
313 fs_metawrap_write_metadata_to(file, file->file.output);
318 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
322 if (!file->fs->wrap_metadata) {
323 file->super_output = fs_write_stream(_file->parent);
324 _file->output = file->super_output;
326 file->temp_output =
330 _file->output = o_stream_create_metawrap(file->temp_output,
331 fs_metawrap_write_metadata, file);
336 fs_metawrap_create_updated_istream(struct metawrap_fs_file *file,
341 if (file->metadata_header != NULL)
342 str_truncate(file->metadata_header, 0);
344 file->metadata_header = str_new(default_pool, 1024);
345 fs_metawrap_append_metadata(file, file->metadata_header);
346 inputs[0] = i_stream_create_from_data(str_data(file->metadata_header),
347 str_len(file->metadata_header));
349 i_stream_seek(input, file->metadata_write_size);
356 file->metadata_write_size = str_len(file->metadata_header);
362 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
367 if (_file->output == file->super_output)
373 if (file->super_output != NULL) {
375 i_assert(file->temp_output == NULL);
376 fs_write_stream_abort_parent(_file, &file->super_output);
378 i_assert(file->temp_output != NULL);
379 o_stream_destroy(&file->temp_output);
384 if (file->super_output != NULL) {
386 i_assert(file->temp_output == NULL);
387 return fs_write_stream_finish(_file->parent, &file->super_output);
389 if (file->temp_output == NULL) {
391 i_assert(file->super_output == NULL);
394 /* finish writing the temporary file */
395 if (file->temp_output->offset == 0) {
396 /* empty file - temp_output is already finished,
400 o_stream_destroy(&file->temp_output);
401 fs_metawrap_append_metadata(file, str);
404 input = iostream_temp_finish(&file->temp_output, IO_BLOCK_SIZE);
406 if (file->metadata_changed_since_write) {
412 input = fs_metawrap_create_updated_istream(file, input);
415 file->super_output = fs_write_stream(_file->parent);
416 o_stream_nsend_istream(file->super_output, input);
419 i_assert(file->super_output->offset > 0 ||
420 file->super_output->stream_errno != 0);
421 ret = fs_write_stream_finish(_file->parent, &file->super_output);
428 struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
433 if (!file->fs->wrap_metadata)
436 if (file->metadata_write_size != 0) {
440 if ((uoff_t)st_r->st_size < file->metadata_write_size) {
445 file->metadata_write_size);
448 st_r->st_size -= file->metadata_write_size;
452 if (file->input == NULL)
455 input = file->input;