summaryrefslogtreecommitdiff
path: root/src/libs/uio/iointrn.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/uio/iointrn.h')
-rw-r--r--src/libs/uio/iointrn.h197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/libs/uio/iointrn.h b/src/libs/uio/iointrn.h
new file mode 100644
index 0000000..522ce18
--- /dev/null
+++ b/src/libs/uio/iointrn.h
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2003 Serge van den Boom
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ * Nota bene: later versions of the GNU General Public License do not apply
+ * to this program.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef LIBS_UIO_IOINTRN_H_
+#define LIBS_UIO_IOINTRN_H_
+
+#define uio_INTERNAL
+
+typedef struct uio_PDirEntryHandle uio_PDirEntryHandle;
+typedef struct uio_PDirHandle uio_PDirHandle;
+typedef struct uio_PFileHandle uio_PFileHandle;
+typedef struct uio_EntriesContext uio_EntriesContext;
+
+#ifndef uio_INTERNAL_PHYSICAL
+typedef void *uio_PDirHandleExtra;
+typedef void *uio_PFileHandleExtra;
+#endif
+
+#include "io.h"
+#include "uioport.h"
+#include "physical.h"
+#include "mount.h"
+#include "mounttree.h"
+#include "match.h"
+#include "mem.h"
+
+struct uio_Handle {
+ int ref;
+ struct uio_PRoot *root;
+ uio_NativeHandle native;
+ int openFlags;
+ // need to know whether the handle is a RO or RW handle.
+};
+
+struct uio_DirHandle {
+ int ref;
+ struct uio_Repository *repository;
+ char *path;
+ // does not contain any '.' or '..'; does not start or end
+ // with a /
+ char *rootEnd;
+ // points to the end of the part of path that is considered
+ // the root dir. (you can't use '..' to get above the root dir)
+};
+
+struct uio_MountHandle {
+ struct uio_Repository *repository;
+ struct uio_MountInfo *mountInfo;
+};
+
+struct uio_DirList {
+ const char **names;
+ int numNames;
+ char *buffer;
+};
+
+
+#define uio_PHandle_COMMON \
+ int flags; \
+ int ref; \
+ uio_PRoot *pRoot;
+
+#define uio_PDirEntryHandle_TYPE_REG 0x0000
+#define uio_PDirEntryHandle_TYPE_DIR 0x0001
+#define uio_PDirEntryHandle_TYPEMASK 0x0001
+
+struct uio_PDirEntryHandle {
+ uio_PHandle_COMMON
+};
+
+struct uio_PDirHandle {
+ uio_PHandle_COMMON
+ uio_PDirHandleExtra extra;
+};
+
+struct uio_PFileHandle {
+ uio_PHandle_COMMON
+ uio_PFileHandleExtra extra;
+};
+
+struct uio_EntriesContext {
+ uio_PRoot *pRoot;
+ uio_NativeEntriesContext native;
+};
+
+
+uio_Handle *uio_Handle_new(uio_PRoot *root, uio_NativeHandle native,
+ int openFlags);
+void uio_Handle_delete(uio_Handle *handle);
+void uio_DirHandle_delete(uio_DirHandle *dirHandle);
+
+uio_PDirEntryHandle *uio_getPDirEntryHandle(
+ const uio_PDirHandle *dirHandle, const char *name);
+void uio_PDirHandle_deletePDirHandleExtra(uio_PDirHandle *pDirHandle);
+void uio_PFileHandle_deletePFileHandleExtra(uio_PFileHandle *pFileHandle);
+
+uio_PDirHandle *uio_PDirHandle_new(uio_PRoot *pRoot,
+ uio_PDirHandleExtra extra);
+uio_PFileHandle *uio_PFileHandle_new(uio_PRoot *pRoot,
+ uio_PFileHandleExtra extra);
+void uio_PDirEntryHandle_delete(uio_PDirEntryHandle *pDirEntryHandle);
+void uio_PDirHandle_delete(uio_PDirHandle *pDirHandle);
+void uio_PFileHandle_delete(uio_PFileHandle *pFileHandle);
+
+
+static inline void
+uio_Handle_ref(uio_Handle *handle) {
+ handle->ref++;
+}
+
+static inline void
+uio_Handle_unref(uio_Handle *handle) {
+ assert(handle->ref > 0);
+ handle->ref--;
+ if (handle->ref == 0)
+ uio_Handle_delete(handle);
+}
+
+static inline void
+uio_DirHandle_ref(uio_DirHandle *dirHandle) {
+ dirHandle->ref++;
+}
+
+static inline void
+uio_DirHandle_unref(uio_DirHandle *dirHandle) {
+ assert(dirHandle->ref > 0);
+ dirHandle->ref--;
+ if (dirHandle->ref == 0)
+ uio_DirHandle_delete(dirHandle);
+}
+
+static inline uio_bool
+uio_PDirEntryHandle_isDir(const uio_PDirEntryHandle *handle) {
+ return (handle->flags & uio_PDirEntryHandle_TYPEMASK) ==
+ uio_PDirEntryHandle_TYPE_DIR;
+}
+
+static inline void
+uio_PDirEntryHandle_ref(uio_PDirEntryHandle *handle) {
+ handle->ref++;
+}
+
+static inline void
+uio_PDirEntryHandle_unref(uio_PDirEntryHandle *handle) {
+ assert(handle->ref > 0);
+ handle->ref--;
+ if (handle->ref == 0)
+ uio_PDirEntryHandle_delete(handle);
+}
+
+static inline void
+uio_PDirHandle_ref(uio_PDirHandle *handle) {
+ handle->ref++;
+}
+
+static inline void
+uio_PDirHandle_unref(uio_PDirHandle *handle) {
+ assert(handle->ref > 0);
+ handle->ref--;
+ if (handle->ref == 0)
+ uio_PDirHandle_delete(handle);
+}
+
+static inline void
+uio_PFileHandle_ref(uio_PFileHandle *handle) {
+ handle->ref++;
+}
+
+static inline void
+uio_PFileHandle_unref(uio_PFileHandle *handle) {
+ assert(handle->ref > 0);
+ handle->ref--;
+ if (handle->ref == 0)
+ uio_PFileHandle_delete(handle);
+}
+
+
+#endif /* LIBS_UIO_IOINTRN_H_ */
+
+