summaryrefslogtreecommitdiff
path: root/netfs-sample/lnode.h
diff options
context:
space:
mode:
Diffstat (limited to 'netfs-sample/lnode.h')
-rw-r--r--netfs-sample/lnode.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/netfs-sample/lnode.h b/netfs-sample/lnode.h
new file mode 100644
index 00000000..7c42c8d4
--- /dev/null
+++ b/netfs-sample/lnode.h
@@ -0,0 +1,143 @@
+/*----------------------------------------------------------------------------*/
+/*lnode.h*/
+/*----------------------------------------------------------------------------*/
+/*Management of cheap 'light nodes'*/
+/*----------------------------------------------------------------------------*/
+/*Based on the code of unionfs translator.*/
+/*----------------------------------------------------------------------------*/
+/*Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
+ Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>.
+
+ 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.*/
+/*----------------------------------------------------------------------------*/
+#ifndef __LNODE_H__
+#define __LNODE_H__
+
+/*----------------------------------------------------------------------------*/
+#include <error.h>
+#include <hurd/netfs.h>
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/*A candy synonym for the fundamental libnetfs node*/
+typedef struct node node_t;
+/*----------------------------------------------------------------------------*/
+/*The light node*/
+struct lnode
+ {
+ /*the name of the lnode*/
+ char * name;
+
+ /*the length of the name; `name` does not change, and this value is used
+ quite often, therefore calculate it just once*/
+ size_t name_len;
+
+ /*the full path to the lnode*/
+ char * path;
+
+ /*the associated flags*/
+ int flags;
+
+ /*the number of references to this lnode*/
+ int references;
+
+ /*the reference to the real node*/
+ node_t * node;
+
+ /*the next lnode and the pointer to this lnode from the previous one*/
+ struct lnode * next, **prevp;
+
+ /*the lnode (directory) in which this node is contained*/
+ struct lnode * dir;
+
+ /*the beginning of the list of entries contained in this lnode (directory)*/
+ struct lnode * entries;
+
+ /*a lock*/
+ struct mutex lock;
+ };/*struct lnode*/
+/*----------------------------------------------------------------------------*/
+typedef struct lnode lnode_t;
+/*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*/
+/*--------Functions-----------------------------------------------------------*/
+/*Adds a reference to the `lnode` (which must be locked)*/
+void
+lnode_ref_add
+ (
+ lnode_t * node
+ );
+/*----------------------------------------------------------------------------*/
+/*Removes a reference from `node` (which must be locked). If that was the last
+ reference, destroy the node*/
+void
+lnode_ref_remove
+ (
+ lnode_t * node
+ );
+/*----------------------------------------------------------------------------*/
+/*Creates a new lnode with `name`; the new node is locked and contains
+ a single reference*/
+error_t
+lnode_create
+ (
+ char * name,
+ lnode_t ** node /*put the result here*/
+ );
+/*----------------------------------------------------------------------------*/
+/*Destroys the given lnode*/
+void
+lnode_destroy
+ (
+ lnode_t * node /*destroy this*/
+ );
+/*----------------------------------------------------------------------------*/
+/*Constructs the full path for the given lnode and stores the result both in
+ the parameter and inside the lnode (the same string, actually)*/
+error_t
+lnode_path_construct
+ (
+ lnode_t * node,
+ char ** path /*store the path here*/
+ );
+/*----------------------------------------------------------------------------*/
+/*Gets a light node by its name, locks it and increments its refcount*/
+error_t
+lnode_get
+ (
+ lnode_t * dir, /*search here*/
+ char * name, /*search for this name*/
+ lnode_t ** node /*put the result here*/
+ );
+/*----------------------------------------------------------------------------*/
+/*Install the lnode into the lnode tree: add a reference to `dir` (which must
+ be locked)*/
+void
+lnode_install
+ (
+ lnode_t * dir, /*install here*/
+ lnode_t * node /*install this*/
+ );
+/*----------------------------------------------------------------------------*/
+/*Unistall the node from the node tree; remove a reference from the lnode*/
+void
+lnode_uninstall
+ (
+ lnode_t * node
+ );
+/*----------------------------------------------------------------------------*/
+#endif /*__LNODE_H__*/