#include <gst/gst.h>
#include <glib/gstdio.h>
-#include <gio/gio.h>
#include "gstsparsefile.h"
#define FSEEK_FILE(file,offset) (fseek (file, offset, SEEK_SET) != 0)
#endif
+#define GST_SPARSE_FILE_IO_ERROR \
+ g_quark_from_static_string("gst-sparse-file-io-error-quark")
+
+static GstSparseFileIOErrorEnum
+gst_sparse_file_io_error_from_errno (gint err_no);
typedef struct _GstSparseRange GstSparseRange;
/* ERRORS */
error:
{
- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
- "Error writing file: %s", g_strerror (errno));
+ g_set_error (error, GST_SPARSE_FILE_IO_ERROR,
+ gst_sparse_file_io_error_from_errno (errno), "Error writing file: %s",
+ g_strerror (errno));
return 0;
}
}
* Read @count bytes from @file at @offset into @data.
*
* On error, @error will be set. If there are no @count bytes available
- * at @offset, %G_IO_ERROR_WOULD_BLOCK is returned.
+ * at @offset, %GST_SPARSE_FILE_IO_ERROR_WOULD_BLOCK is returned.
*
* @remaining will be set to the amount of bytes remaining in the read
* range.
/* ERRORS */
no_range:
{
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK,
- "Offset not written to file yet");
+ g_set_error_literal (error, GST_SPARSE_FILE_IO_ERROR,
+ GST_SPARSE_FILE_IO_ERROR_WOULD_BLOCK, "Offset not written to file yet");
return 0;
}
error:
{
if (ferror (file->file)) {
- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
- "Error reading file: %s", g_strerror (errno));
+ g_set_error (error, GST_SPARSE_FILE_IO_ERROR,
+ gst_sparse_file_io_error_from_errno (errno), "Error reading file: %s",
+ g_strerror (errno));
} else if (feof (file->file)) {
return res;
}
}
return result != NULL;
}
+
+/* we don't want to rely on libgio just for g_io_error_from_errno() */
+static GstSparseFileIOErrorEnum
+gst_sparse_file_io_error_from_errno (gint err_no)
+{
+ switch (err_no) {
+#ifdef EEXIST
+ case EEXIST:
+ return GST_SPARSE_FILE_IO_ERROR_EXISTS;
+ break;
+#endif
+
+#ifdef EISDIR
+ case EISDIR:
+ return GST_SPARSE_FILE_IO_ERROR_IS_DIRECTORY;
+ break;
+#endif
+
+#ifdef EACCES
+ case EACCES:
+ return GST_SPARSE_FILE_IO_ERROR_PERMISSION_DENIED;
+ break;
+#endif
+
+#ifdef ENAMETOOLONG
+ case ENAMETOOLONG:
+ return GST_SPARSE_FILE_IO_ERROR_FILENAME_TOO_LONG;
+ break;
+#endif
+
+#ifdef ENOENT
+ case ENOENT:
+ return GST_SPARSE_FILE_IO_ERROR_NOT_FOUND;
+ break;
+#endif
+
+#ifdef ENOTDIR
+ case ENOTDIR:
+ return GST_SPARSE_FILE_IO_ERROR_NOT_DIRECTORY;
+ break;
+#endif
+
+#ifdef EROFS
+ case EROFS:
+ return GST_SPARSE_FILE_IO_ERROR_READ_ONLY;
+ break;
+#endif
+
+#ifdef ELOOP
+ case ELOOP:
+ return GST_SPARSE_FILE_IO_ERROR_TOO_MANY_LINKS;
+ break;
+#endif
+
+#ifdef ENOSPC
+ case ENOSPC:
+ return GST_SPARSE_FILE_IO_ERROR_NO_SPACE;
+ break;
+#endif
+
+#ifdef ENOMEM
+ case ENOMEM:
+ return GST_SPARSE_FILE_IO_ERROR_NO_SPACE;
+ break;
+#endif
+
+#ifdef EINVAL
+ case EINVAL:
+ return GST_SPARSE_FILE_IO_ERROR_INVALID_ARGUMENT;
+ break;
+#endif
+
+#ifdef EPERM
+ case EPERM:
+ return GST_SPARSE_FILE_IO_ERROR_PERMISSION_DENIED;
+ break;
+#endif
+
+#ifdef ECANCELED
+ case ECANCELED:
+ return GST_SPARSE_FILE_IO_ERROR_CANCELLED;
+ break;
+#endif
+
+ /* ENOTEMPTY == EEXIST on AIX for backward compatibility reasons */
+#if defined (ENOTEMPTY) && (!defined (EEXIST) || (ENOTEMPTY != EEXIST))
+ case ENOTEMPTY:
+ return GST_SPARSE_FILE_IO_ERROR_NOT_EMPTY;
+ break;
+#endif
+
+#ifdef ENOTSUP
+ case ENOTSUP:
+ return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
+ break;
+#endif
+
+ /* EOPNOTSUPP == ENOTSUP on Linux, but POSIX considers them distinct */
+#if defined (EOPNOTSUPP) && (!defined (ENOTSUP) || (EOPNOTSUPP != ENOTSUP))
+ case EOPNOTSUPP:
+ return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
+ break;
+#endif
+
+#ifdef EPROTONOSUPPORT
+ case EPROTONOSUPPORT:
+ return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
+ break;
+#endif
+
+#ifdef ESOCKTNOSUPPORT
+ case ESOCKTNOSUPPORT:
+ return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
+ break;
+#endif
+
+#ifdef EPFNOSUPPORT
+ case EPFNOSUPPORT:
+ return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
+ break;
+#endif
+
+#ifdef EAFNOSUPPORT
+ case EAFNOSUPPORT:
+ return GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED;
+ break;
+#endif
+
+#ifdef ETIMEDOUT
+ case ETIMEDOUT:
+ return GST_SPARSE_FILE_IO_ERROR_TIMED_OUT;
+ break;
+#endif
+
+#ifdef EBUSY
+ case EBUSY:
+ return GST_SPARSE_FILE_IO_ERROR_BUSY;
+ break;
+#endif
+
+#ifdef EWOULDBLOCK
+ case EWOULDBLOCK:
+ return GST_SPARSE_FILE_IO_ERROR_WOULD_BLOCK;
+ break;
+#endif
+
+ /* EWOULDBLOCK == EAGAIN on most systems, but POSIX considers them distinct */
+#if defined (EAGAIN) && (!defined (EWOULDBLOCK) || (EWOULDBLOCK != EAGAIN))
+ case EAGAIN:
+ return GST_SPARSE_FILE_IO_ERROR_WOULD_BLOCK;
+ break;
+#endif
+
+#ifdef EMFILE
+ case EMFILE:
+ return GST_SPARSE_FILE_IO_ERROR_TOO_MANY_OPEN_FILES;
+ break;
+#endif
+
+#ifdef EADDRINUSE
+ case EADDRINUSE:
+ return GST_SPARSE_FILE_IO_ERROR_ADDRESS_IN_USE;
+ break;
+#endif
+
+#ifdef EHOSTUNREACH
+ case EHOSTUNREACH:
+ return GST_SPARSE_FILE_IO_ERROR_HOST_UNREACHABLE;
+ break;
+#endif
+
+#ifdef ENETUNREACH
+ case ENETUNREACH:
+ return GST_SPARSE_FILE_IO_ERROR_NETWORK_UNREACHABLE;
+ break;
+#endif
+
+#ifdef ECONNREFUSED
+ case ECONNREFUSED:
+ return GST_SPARSE_FILE_IO_ERROR_CONNECTION_REFUSED;
+ break;
+#endif
+
+#ifdef EPIPE
+ case EPIPE:
+ return GST_SPARSE_FILE_IO_ERROR_BROKEN_PIPE;
+ break;
+#endif
+
+ default:
+ return GST_SPARSE_FILE_IO_ERROR_FAILED;
+ break;
+ }
+}
typedef struct _GstSparseFile GstSparseFile;
+/* NOTE: Remove this before making this public API again! */
+typedef enum {
+ GST_SPARSE_FILE_IO_ERROR_FAILED,
+ GST_SPARSE_FILE_IO_ERROR_NOT_FOUND,
+ GST_SPARSE_FILE_IO_ERROR_EXISTS,
+ GST_SPARSE_FILE_IO_ERROR_IS_DIRECTORY,
+ GST_SPARSE_FILE_IO_ERROR_NOT_DIRECTORY,
+ GST_SPARSE_FILE_IO_ERROR_NOT_EMPTY,
+ GST_SPARSE_FILE_IO_ERROR_NOT_REGULAR_FILE,
+ GST_SPARSE_FILE_IO_ERROR_NOT_SYMBOLIC_LINK,
+ GST_SPARSE_FILE_IO_ERROR_NOT_MOUNTABLE_FILE,
+ GST_SPARSE_FILE_IO_ERROR_FILENAME_TOO_LONG,
+ GST_SPARSE_FILE_IO_ERROR_INVALID_FILENAME,
+ GST_SPARSE_FILE_IO_ERROR_TOO_MANY_LINKS,
+ GST_SPARSE_FILE_IO_ERROR_NO_SPACE,
+ GST_SPARSE_FILE_IO_ERROR_INVALID_ARGUMENT,
+ GST_SPARSE_FILE_IO_ERROR_PERMISSION_DENIED,
+ GST_SPARSE_FILE_IO_ERROR_NOT_SUPPORTED,
+ GST_SPARSE_FILE_IO_ERROR_NOT_MOUNTED,
+ GST_SPARSE_FILE_IO_ERROR_ALREADY_MOUNTED,
+ GST_SPARSE_FILE_IO_ERROR_CLOSED,
+ GST_SPARSE_FILE_IO_ERROR_CANCELLED,
+ GST_SPARSE_FILE_IO_ERROR_PENDING,
+ GST_SPARSE_FILE_IO_ERROR_READ_ONLY,
+ GST_SPARSE_FILE_IO_ERROR_CANT_CREATE_BACKUP,
+ GST_SPARSE_FILE_IO_ERROR_WRONG_ETAG,
+ GST_SPARSE_FILE_IO_ERROR_TIMED_OUT,
+ GST_SPARSE_FILE_IO_ERROR_WOULD_RECURSE,
+ GST_SPARSE_FILE_IO_ERROR_BUSY,
+ GST_SPARSE_FILE_IO_ERROR_WOULD_BLOCK,
+ GST_SPARSE_FILE_IO_ERROR_HOST_NOT_FOUND,
+ GST_SPARSE_FILE_IO_ERROR_WOULD_MERGE,
+ GST_SPARSE_FILE_IO_ERROR_FAILED_HANDLED,
+ GST_SPARSE_FILE_IO_ERROR_TOO_MANY_OPEN_FILES,
+ GST_SPARSE_FILE_IO_ERROR_NOT_INITIALIZED,
+ GST_SPARSE_FILE_IO_ERROR_ADDRESS_IN_USE,
+ GST_SPARSE_FILE_IO_ERROR_PARTIAL_INPUT,
+ GST_SPARSE_FILE_IO_ERROR_INVALID_DATA,
+ GST_SPARSE_FILE_IO_ERROR_DBUS_ERROR,
+ GST_SPARSE_FILE_IO_ERROR_HOST_UNREACHABLE,
+ GST_SPARSE_FILE_IO_ERROR_NETWORK_UNREACHABLE,
+ GST_SPARSE_FILE_IO_ERROR_CONNECTION_REFUSED,
+ GST_SPARSE_FILE_IO_ERROR_PROXY_FAILED,
+ GST_SPARSE_FILE_IO_ERROR_PROXY_AUTH_FAILED,
+ GST_SPARSE_FILE_IO_ERROR_PROXY_NEED_AUTH,
+ GST_SPARSE_FILE_IO_ERROR_PROXY_NOT_ALLOWED,
+ GST_SPARSE_FILE_IO_ERROR_BROKEN_PIPE
+} GstSparseFileIOErrorEnum;
+
GstSparseFile * gst_sparse_file_new (void);
void gst_sparse_file_free (GstSparseFile *file);