summaryrefslogtreecommitdiff
path: root/backend.h
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2003-01-31 18:41:20 +0000
committerLudovic Courtès <ludo@gnu.org>2003-01-31 18:41:20 +0000
commit823053ec9f580c44aea57ca473a86452e7e332a7 (patch)
treeb26ac31982a993ed21e2021f32d0c9e21f1833b1 /backend.h
Initial commit of a libnetfs-based tarfs including a gzip/bzip2 store.
Diffstat (limited to 'backend.h')
-rw-r--r--backend.h123
1 files changed, 123 insertions, 0 deletions
diff --git a/backend.h b/backend.h
new file mode 100644
index 000000000..ab8f92f9c
--- /dev/null
+++ b/backend.h
@@ -0,0 +1,123 @@
+/* tarfs - A GNU tar filesystem for the Hurd.
+ Copyright (C) 2002, Ludovic Courtès <ludo@type-z.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or * (at your option) any later version.
+
+ 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 */
+
+/*
+ * A general filesystem backend.
+ */
+
+#ifndef __FS_BACKEND__
+#define __FS_BACKEND__
+
+#include <hurd/netfs.h>
+#include <dirent.h>
+#include <argp.h>
+#include <assert.h>
+
+
+/* Generic (fs independent) netnode structure. */
+struct netnode
+{
+ char *name; /* node name */
+ char *symlink; /* link's target path (in the case of a symlink) */
+ struct node *hardlink;/* hard link's target or zero */
+ struct node *entries; /* directory entries (when applies) */
+ struct node *dir; /* parent directory */
+
+ void *info; /* fs defined data (node related info) */
+};
+
+/* Substitute for '/' and chars lower than 32 in node names.
+ If SUBST_LOWER isn't defined, then lower chars won't be filtered. */
+#define SUBST_SLASH '|'
+//#define SUBST_LOWER '.'
+
+
+/* Each filesystem backend should define a struct fs_backend variable with
+ the appropriate functions. */
+struct fs_backend
+{
+ /* Initialize filesystem (create root node *N, etc.) */
+ error_t (* init)(struct node **n, struct iouser *user);
+
+ /* Get filesystem's struct argp. */
+ void (* get_argp)(struct argp *s);
+
+ /* Get arguments (see netfs_append_args()). */
+ error_t (*get_args)(char **argz, unsigned *argz_len);
+
+ /* Set options (see netfs_set_options()). */
+ error_t (*set_options)(char *argz, size_t argz_len);
+
+
+ /*
+ * Directory scan functions (used in netfs_get_dirents ()).
+ */
+
+ /* Set current directory. */
+ int (* set_curr_dir)(struct node *dir);
+
+ /* Skip N entries in current directory, returns non-zero if
+ no more entries are available. */
+ int (* skip_entries)(int n);
+
+ /* Returns a newly-allocated entry in ENTRY. Returns non-zero when
+ no more entries are available. */
+ int (* get_next_entry)(struct dirent **entry);
+
+ /* Reading a node */
+ error_t (* lookup_node)(struct node **np, struct node* dir, const char* name);
+ error_t (* read_node) (struct node *np, off_t offset,
+ size_t *len, void* data);
+
+
+ /* Changing a node */
+ error_t (* write_node) (struct node *np, off_t offset,
+ size_t *len, void* data);
+
+ /* Change NP's stats. */
+ error_t (* change_stat)(struct node *np, const io_statbuf_t *new_stat);
+
+ /* Creates a node named NAME in DIR which is locked. */
+ error_t (* create_node) (struct node **new, struct node *dir,
+ char *name, mode_t m);
+
+ /* Unlinks NODE. NODE can be a directory in which case it is empty. */
+ error_t (* unlink_node) (struct node *node);
+
+ /* Tries to create a hard link named NAME in DIR to file NODE. */
+ error_t (* link_node) (struct node *dir, struct node *target,
+ char *name, int excl); /* Same as netfs semantics */
+
+ /* Makes NODE a symlink to TARGET. */
+ error_t (* symlink_node) (struct node *node, const char *target);
+
+ /* Tries to turn NODE into a device of type TYPE (either S_IFBLK
+ or S_IFCHR). */
+ error_t (* mkdev_node) (struct node *node, mode_t type, dev_t indexes);
+
+ /* Free all resources associated to NODE. */
+ void (* free_node) (struct node *node);
+
+ /* Synchronize filesystem. */
+ error_t (* sync_fs) (int wait);
+
+ /* Filesystem destructor */
+ error_t (* go_away) ();
+};
+
+#endif