/** * gsf_input_stdio_new_FILE : * @filename : The filename corresponding to @file. * @file : an existing stdio <type>FILE</type> * * @keep_open : Should @file be closed when the wrapper is closed * * Assumes ownership of @file when succeeding. If @keep_open is true, * ownership reverts to caller when the GsfObject is closed. * * Returns: a new GsfInput wrapper for @file. Note that if the file is not * seekable, this function will make a local copy of the entire file. **/ GsfInput * gsf_input_stdio_new_FILE (char const *filename, FILE *file, gboolean keep_open) { GsfInputStdio *stdio; struct stat st; gsf_off_t size; g_return_val_if_fail (filename != NULL, NULL); g_return_val_if_fail (file != NULL, NULL); if (fstat (fileno (file), &st) < 0 || !S_ISREG (st.st_mode)) { return make_local_copy (file, filename, NULL); } size = st.st_size; stdio = g_object_new (GSF_INPUT_STDIO_TYPE, NULL); if (G_UNLIKELY (NULL == stdio)) return NULL; stdio->file = file; stdio->keep_open = keep_open; stdio->filename = g_strdup (filename); gsf_input_set_size (GSF_INPUT (stdio), size); gsf_input_set_name_from_filename (GSF_INPUT (stdio), filename); return GSF_INPUT (stdio); }
static GsfInput * make_local_copy (FILE *stream, const char *filename, GError **err) { GsfOutput *out; GsfInput *copy = NULL; out = gsf_output_memory_new (); while (1) { guint8 buf[4096]; gssize nread; nread = fread (buf, 1, sizeof(buf), stream); if (nread > 0) { if (!gsf_output_write (out, nread, buf)) goto error; } else if (nread == 0) break; else goto error; } copy = gsf_input_memory_new_clone (gsf_output_memory_get_bytes (GSF_OUTPUT_MEMORY (out)), gsf_output_size (out)); gsf_output_close (out); g_object_unref (out); if (filename) gsf_input_set_name_from_filename (GSF_INPUT (copy), filename); return copy; error: if (err) { char *utf8name = filename ? g_filename_display_name (filename) : g_strdup ("?"); g_set_error (err, gsf_input_error_id (), 0, "%s: not a regular file", utf8name); g_free (utf8name); } gsf_output_close (out); g_object_unref (out); return NULL; }
/* coverity[ -tainted_string_sink_content : arg-0 ] */ GsfInput * gsf_input_stdio_new (char const *filename, GError **err) { GsfInputStdio *input; struct stat st; FILE *file; gsf_off_t size; g_return_val_if_fail (filename != NULL, NULL); file = g_fopen (filename, "rb"); if (file == NULL) { if (err) { int save_errno = errno; char *utf8name = g_filename_display_name (filename); g_set_error (err, G_FILE_ERROR, g_file_error_from_errno (save_errno), "%s: %s", utf8name, g_strerror (save_errno)); g_free (utf8name); } return NULL; } if (fstat (fileno (file), &st) < 0 || !S_ISREG (st.st_mode)) { GsfInput *res = make_local_copy (file, filename, err); fclose (file); return res; } size = st.st_size; input = (GsfInputStdio *)g_object_new (GSF_INPUT_STDIO_TYPE, NULL); if (G_UNLIKELY (NULL == input)) { fclose (file); return NULL; } input->file = file; input->filename = g_strdup (filename); input->buf = NULL; input->buf_size = 0; input->keep_open = FALSE; gsf_input_set_size (GSF_INPUT (input), size); gsf_input_set_name_from_filename (GSF_INPUT (input), filename); return GSF_INPUT (input); }
/** * gsf_infile_stdio_new: * @root: in locale dependent encoding * @err: optionally %NULL. * * Returns: a new file or %NULL. **/ GsfInfile * gsf_infile_stdio_new (char const *root, GError **err) { GsfInfileStdio *ifs; GDir *dir; char const *child; dir = g_dir_open (root, 0, err); if (dir == NULL) return NULL; ifs = g_object_new (GSF_INFILE_STDIO_TYPE, NULL); ifs->root = g_strdup (root); while ((child = g_dir_read_name (dir))) g_ptr_array_add (ifs->children, g_strdup (child)); g_dir_close (dir); gsf_input_set_name_from_filename (GSF_INPUT (ifs), root); return GSF_INFILE (ifs); }