--- /dev/null
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+/* gnome-vfs-utils.c - Private utility functions for the GNOME Virtual
+ File System.
+ gnome_vfs_read_entire_file() extraction for Captive
+
+ Copyright (C) 1999 Free Software Foundation
+ Copyright (C) 2000, 2001 Eazel, Inc.
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Authors: Ettore Perazzoli <ettore@comm2000.it>
+ John Sullivan <sullivan@eazel.com>
+ Darin Adler <darin@eazel.com>
+*/
+
+
+#include "config.h"
+
+#include <glib/gmem.h>
+#include <libgnomevfs/gnome-vfs-result.h>
+#include <libgnomevfs/gnome-vfs-handle.h>
+#include <libgnomevfs/gnome-vfs-ops.h>
+
+
+#define READ_CHUNK_SIZE 8192
+
+
+/**
+ * gnome_vfs_read_entire_file:
+ * @uri: URI of the file to read
+ * @file_size: after reading the file, contains the size of the file read
+ * @file_contents: contains the file_size bytes, the contents of the file at @uri.
+ *
+ * Reads an entire file into memory for convenience. Beware accidentally
+ * loading large files into memory with this function.
+ *
+ * Return value: An integer representing the result of the operation
+ *
+ * Since: 2.2
+ */
+
+GnomeVFSResult
+gnome_vfs_read_entire_file (const char *uri,
+ int *file_size,
+ char **file_contents)
+{
+ GnomeVFSResult result;
+ GnomeVFSHandle *handle;
+ char *buffer;
+ GnomeVFSFileSize total_bytes_read;
+ GnomeVFSFileSize bytes_read;
+
+ *file_size = 0;
+ *file_contents = NULL;
+
+ /* Open the file. */
+ result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ);
+ if (result != GNOME_VFS_OK) {
+ return result;
+ }
+
+ /* Read the whole thing. */
+ buffer = NULL;
+ total_bytes_read = 0;
+ do {
+ buffer = g_realloc (buffer, total_bytes_read + READ_CHUNK_SIZE);
+ result = gnome_vfs_read (handle,
+ buffer + total_bytes_read,
+ READ_CHUNK_SIZE,
+ &bytes_read);
+ if (result != GNOME_VFS_OK && result != GNOME_VFS_ERROR_EOF) {
+ g_free (buffer);
+ gnome_vfs_close (handle);
+ return result;
+ }
+
+ /* Check for overflow. */
+ if (total_bytes_read + bytes_read < total_bytes_read) {
+ g_free (buffer);
+ gnome_vfs_close (handle);
+ return GNOME_VFS_ERROR_TOO_BIG;
+ }
+
+ total_bytes_read += bytes_read;
+ } while (result == GNOME_VFS_OK);
+
+ /* Close the file. */
+ result = gnome_vfs_close (handle);
+ if (result != GNOME_VFS_OK) {
+ g_free (buffer);
+ return result;
+ }
+
+ /* Return the file. */
+ *file_size = total_bytes_read;
+ *file_contents = g_realloc (buffer, total_bytes_read);
+ return GNOME_VFS_OK;
+}