diff options
Diffstat (limited to 'unionfs/ulfs.c')
-rw-r--r-- | unionfs/ulfs.c | 321 |
1 files changed, 0 insertions, 321 deletions
diff --git a/unionfs/ulfs.c b/unionfs/ulfs.c deleted file mode 100644 index 3c565a5c..00000000 --- a/unionfs/ulfs.c +++ /dev/null @@ -1,321 +0,0 @@ -/* Hurd unionfs - Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. - Written by Moritz Schulte <moritz@duesseldorf.ccc.de>. - - 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. */ - -/* Underlying filesystem management. */ - -#define _GNU_SOURCE - -#include <hurd/netfs.h> -#include <stdlib.h> -#include <error.h> -#include <string.h> - -#include "unionfs.h" -#include <fcntl.h> - -#include "lib.h" -#include "ulfs.h" - -/* The start of the ulfs chain. */ -ulfs_t *ulfs_chain_start; - -/* The end of the ulfs chain, we need this, to go through the chain in - reversed order. */ -ulfs_t *ulfs_chain_end; - -/* Number of registered underlying filesystems. */ -unsigned int ulfs_num; - -/* The lock protecting the ulfs data structures. */ -struct mutex ulfs_lock = MUTEX_INITIALIZER; - -/* Create a new ulfs element. */ -static error_t -ulfs_create (char *path, ulfs_t **ulfs) -{ - ulfs_t *ulfs_new = malloc (sizeof (ulfs_t)); - error_t err = 0; - - if (! ulfs_new) - err = ENOMEM; - else - { - char *path_cp = path ? strdup (path) : NULL; - - if (path && (! path_cp)) - { - err = ENOMEM; - free (ulfs_new); - } - else - { - ulfs_new->path = path_cp; - ulfs_new->flags = 0; - ulfs_new->next = NULL; - ulfs_new->prev = NULL; - *ulfs = ulfs_new; - } - } - return err; -} - -/* Destroy an ulfs element. */ -static void -ulfs_destroy (ulfs_t *ulfs) -{ - free (ulfs->path); - free (ulfs); -} - -/* Install ULFS into the linked list of registered filesystems in - * priority order. */ -static void -ulfs_install (ulfs_t *ulfs) -{ - ulfs_t *u = ulfs_chain_start; - int insert_at_end = 0; - if (ulfs_num == 0) - { - ulfs_chain_start = ulfs; - return; - } - - /* walk the chain until a filesystem has a priority that's too high. */ - while (u->priority > ulfs->priority) - { - if (u->next == NULL) - { - insert_at_end = 1; - break; - } - u = u->next; - } - - if (insert_at_end) - { - u->next = ulfs; - ulfs->prev = u; - } - else - { - if (u == ulfs_chain_start) - { - ulfs_chain_start = ulfs; - ulfs->next = u; - ulfs->prev = NULL; - u->prev = ulfs; - } - else - { - ulfs->next = u; - ulfs->prev = u->prev; - u->prev->next = ulfs; - u->prev = ulfs; - } - } - - return; -} - -/* Remove ULFS from the linked list of registered filesystems. */ -static void -ulfs_uninstall (ulfs_t *ulfs) -{ - if (ulfs == ulfs_chain_start) - ulfs_chain_start = ulfs->next; - - if (ulfs->next) - ulfs->next->prev = ulfs->prev; - - if (ulfs->prev) - ulfs->prev->next = ulfs->next; -} - -/* Get an ulfs element by it's index. */ -error_t -ulfs_get_num (int num, ulfs_t **ulfs) -{ - error_t err = EINVAL; - ulfs_t *u; - int i; - - for (u = ulfs_chain_start, i = 0; - u && i < num; - u = u->next, i++); - if (u) - { - err = 0; - *ulfs = u; - } - - return err; -} - -/* Get an ulfs element by the associated path. */ -static error_t -ulfs_get_path (char *path, ulfs_t **ulfs) -{ - error_t err = ENOENT; - ulfs_t *u; - - for (u = ulfs_chain_start; - u && (! (((! path) && path == u->path) - || (path && u->path && (! strcmp (path, u->path))))); - u = u->next); - if (u) - { - err = 0; - *ulfs = u; - } - return err; -} - -error_t -ulfs_for_each_under_priv (char *path_under, - error_t (*func) (char *, char *, void *), - void *priv) -{ - error_t err = 0; - ulfs_t *u; - size_t length; - - length = strlen (path_under); - - for (u = ulfs_chain_start; u; u = u->next) - { - if (!u->path) - continue; - - if (memcmp (u->path, path_under, length)) - continue; - - /* This ulfs is under path_under. */ - func ((char *)(u->path + length), path_under, priv); - } - - return err; -} - -/* Register a new underlying filesystem. */ -error_t -ulfs_register (char *path, int flags, int priority) -{ - ulfs_t *ulfs; - error_t err; - - if (path) - { - err = check_dir (path); - if (err) - return err; - } - - mutex_lock (&ulfs_lock); - err = ulfs_create (path, &ulfs); - if (! err) - { - ulfs->flags = flags; - ulfs->priority = priority; - ulfs_install (ulfs); - ulfs_num++; - } - mutex_unlock (&ulfs_lock); - return err; -} - -/* Check for deleted ulfs entries. */ -/* FIXME: Ugly as hell. Rewrite the whole ulfs.c */ -void -ulfs_check () -{ - ulfs_t *u; - file_t p; - - struct ulfs_destroy - { - ulfs_t *ulfs; - - struct ulfs_destroy *next; - } *ulfs_destroy_q = NULL; - - mutex_lock (&ulfs_lock); - - u = ulfs_chain_start; - while (u) - { - - if (u->path) - p = file_name_lookup (u->path, O_READ | O_DIRECTORY, 0); - else - p = underlying_node; - - if (! port_valid (p)) - { - struct ulfs_destroy *ptr; - - /* Add to destroy list. */ - ptr = malloc (sizeof (struct ulfs_destroy)); - assert (ptr); - - ptr->ulfs = u; - - ptr->next = ulfs_destroy_q; - ulfs_destroy_q = ptr; - } - - u = u->next; - } - - while (ulfs_destroy_q) - { - struct ulfs_destroy *ptr; - - ptr = ulfs_destroy_q; - ulfs_destroy_q = ptr->next; - - ulfs_uninstall (ptr->ulfs); - ulfs_destroy (ptr->ulfs); - ulfs_num--; - - free (ptr); - } - - mutex_unlock (&ulfs_lock); - -} - -/* Unregister an underlying filesystem. */ -error_t -ulfs_unregister (char *path) -{ - ulfs_t *ulfs; - error_t err; - - mutex_lock (&ulfs_lock); - err = ulfs_get_path (path, &ulfs); - if (! err) - { - ulfs_uninstall (ulfs); - ulfs_destroy (ulfs); - ulfs_num--; - } - mutex_unlock (&ulfs_lock); - - return err; -} |