diff options
Diffstat (limited to 'src/libs/uio/iointrn.h')
-rw-r--r-- | src/libs/uio/iointrn.h | 197 |
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_ */ + + |