summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergiu Ivanov <unlimitedscolobb@gmail.com>2008-11-22 00:25:17 +0200
committerSergiu Ivanov <unlimitedscolobb@gmail.com>2008-11-22 00:25:17 +0200
commit9401ed47c6d00cca32b581e096502f9534998bcd (patch)
tree5e601b6d3c6dd10c71c579e6c89b609b3e4f292d
parent4e81430d26eef24f5bb8464c8c54a11b042f1842 (diff)
Moved the code to GCS
The code now complies (hopefully) with GNU Coding Standards.
-rw-r--r--debug.h50
-rw-r--r--filter.c1192
-rw-r--r--filter.h364
-rw-r--r--node.c244
-rw-r--r--node.h104
-rw-r--r--options.c276
-rw-r--r--options.h28
-rw-r--r--trace.c373
-rw-r--r--trace.h34
9 files changed, 1186 insertions, 1479 deletions
diff --git a/debug.h b/debug.h
index 254226737..84e6de7c9 100644
--- a/debug.h
+++ b/debug.h
@@ -1,10 +1,10 @@
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*debug.h*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Simple facilities for debugging messages*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Based on the code of unionfs translator.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Copyright (C) 2001, 2002, 2005, 2008 Free Software Foundation, Inc.
Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>.
@@ -22,38 +22,38 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#ifndef __DEBUG_H__
#define __DEBUG_H__
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include <stdio.h>
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Macros--------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Macros-------------------------------------------------------------*/
/*Print debug messages here*/
#define DEBUG_OUTPUT "/var/log/filter.dbg"
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#ifdef DEBUG
- /*Initializes the log*/
-# define INIT_LOG() filter_dbg = fopen(DEBUG_OUTPUT, "wt")
- /*Closes the log*/
+/*Initializes the log */
+# define INIT_LOG() filter_dbg = fopen(DEBUG_OUTPUT, "wt")
+/*Closes the log */
# define CLOSE_LOG() fclose(filter_dbg)
- /*Prints a debug message and flushes the debug output*/
-# define LOG_MSG(fmt, args...) {fprintf(filter_dbg, fmt"\n", ##args);\
- fflush(filter_dbg);}
+/*Prints a debug message and flushes the debug output */
+# define LOG_MSG(fmt, args...) {fprintf(filter_dbg, fmt"\n", ##args);\
+ fflush(filter_dbg);}
#else
- /*Remove requests for debugging output*/
-# define INIT_LOG()
-# define CLOSE_LOG()
-# define LOG_MSG(fmt, args...)
+/*Remove requests for debugging output */
+# define INIT_LOG()
+# define CLOSE_LOG()
+# define LOG_MSG(fmt, args...)
#endif /*DEBUG*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Global Variables----------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Global Variables---------------------------------------------------*/
/*The file to write debugging info to*/
-extern FILE * filter_dbg;
-/*----------------------------------------------------------------------------*/
+extern FILE *filter_dbg;
+/*---------------------------------------------------------------------------*/
#endif /*__DEBUG_H__*/
diff --git a/filter.c b/filter.c
index b78c16ba9..2108f728a 100644
--- a/filter.c
+++ b/filter.c
@@ -1,10 +1,10 @@
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*filter.c*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*The filtering translator*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Based on the code of unionfs translator.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Copyright (C) 2001, 2002, 2005, 2008 Free Software Foundation, Inc.
Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>.
@@ -22,734 +22,622 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#define _GNU_SOURCE 1
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include "filter.h"
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include <error.h>
#include <argp.h>
#include <argz.h>
#include <hurd/netfs.h>
#include <fcntl.h>
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include "debug.h"
#include "options.h"
#include "trace.h"
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Global Variables----------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Global Variables---------------------------------------------------*/
/*The name of the server*/
-char * netfs_server_name = "filter";
-/*----------------------------------------------------------------------------*/
+char *netfs_server_name = "filter";
+/*---------------------------------------------------------------------------*/
/*The version of the server*/
-char * netfs_server_version = "0.0";
-/*----------------------------------------------------------------------------*/
+char *netfs_server_version = "0.0";
+/*---------------------------------------------------------------------------*/
/*The maximal length of a chain of symbolic links*/
int netfs_maxsymlinks = 12;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*A port to the underlying node*/
mach_port_t underlying_node;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Status information for the underlying node*/
io_statbuf_t underlying_node_stat;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Mapped time used for updating node information*/
-volatile struct mapped_time_value * maptime;
-/*----------------------------------------------------------------------------*/
+volatile struct mapped_time_value *maptime;
+/*---------------------------------------------------------------------------*/
/*The filesystem ID*/
pid_t fsid;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*The port from which we will read (TODO: and write) the data*/
mach_port_t target;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*The file to print debug messages to*/
-FILE * filter_dbg;
-/*----------------------------------------------------------------------------*/
+FILE *filter_dbg;
+/*---------------------------------------------------------------------------*/
/*The name of the translator to filter out*/
-char * target_name = NULL;
-/*----------------------------------------------------------------------------*/
+char *target_name = NULL;
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Functions-----------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Functions----------------------------------------------------------*/
/*Attempts to create a file named `name` in `dir` for `user` with mode `mode`*/
error_t
-netfs_attempt_create_file
- (
- struct iouser * user,
- struct node * dir,
- char * name,
- mode_t mode,
- struct node ** node
- )
- {
- LOG_MSG("netfs_attempt_create_file");
-
- /*Unlock `dir` and say that we can do nothing else here*/
- mutex_unlock(&dir->lock);
- return EOPNOTSUPP;
- }/*netfs_attempt_create_file*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_create_file
+ (struct iouser *user,
+ struct node *dir, char *name, mode_t mode, struct node **node)
+{
+ LOG_MSG ("netfs_attempt_create_file");
+
+ /*Unlock `dir` and say that we can do nothing else here */
+ mutex_unlock (&dir->lock);
+ return EOPNOTSUPP;
+} /*netfs_attempt_create_file */
+
+/*---------------------------------------------------------------------------*/
/*Return an error if the process of opening a file should not be allowed
- to complete because of insufficient permissions*/
+ to complete because of insufficient permissions*/
error_t
-netfs_check_open_permissions
- (
- struct iouser * user,
- struct node * np,
- int flags,
- int newnode
- )
- {
- LOG_MSG("netfs_check_open_permissions");
-
- error_t err = 0;
-
- /*Cheks user's permissions*/
- if(flags & O_READ)
- err = fshelp_access(&np->nn_stat, S_IREAD, user);
- if(!err && (flags & O_WRITE))
- err = fshelp_access(&np->nn_stat, S_IWRITE, user);
- if(!err && (flags & O_EXEC))
- err = fshelp_access(&np->nn_stat, S_IEXEC, user);
-
- /*Return the result of the check*/
- return err;
- }/*netfs_check_open_permissions*/
-/*----------------------------------------------------------------------------*/
+ netfs_check_open_permissions
+ (struct iouser * user, struct node * np, int flags, int newnode)
+{
+ LOG_MSG ("netfs_check_open_permissions");
+
+ error_t err = 0;
+
+ /*Cheks user's permissions */
+ if (flags & O_READ)
+ err = fshelp_access (&np->nn_stat, S_IREAD, user);
+ if (!err && (flags & O_WRITE))
+ err = fshelp_access (&np->nn_stat, S_IWRITE, user);
+ if (!err && (flags & O_EXEC))
+ err = fshelp_access (&np->nn_stat, S_IEXEC, user);
+
+ /*Return the result of the check */
+ return err;
+} /*netfs_check_open_permissions */
+
+/*---------------------------------------------------------------------------*/
/*Attempts an utimes call for the user `cred` on node `node`*/
error_t
-netfs_attempt_utimes
- (
- struct iouser * cred,
- struct node * node,
- struct timespec * atime,
- struct timespec * mtime
- )
- {
- LOG_MSG("netfs_attempt_utimes");
-
- error_t err = 0;
-
- /*See what information is to be updated*/
- int flags = TOUCH_CTIME;
-
- /*Check if the user is indeed the owner of the node*/
- err = fshelp_isowner(&node->nn_stat, cred);
-
- /*If the user is allowed to do utimes*/
- if(!err)
- {
- /*If atime is to be updated*/
- if(atime)
- /*update the atime*/
- node->nn_stat.st_atim = *atime;
- else
- /*the current time will be set as the atime*/
- flags |= TOUCH_ATIME;
-
- /*If mtime is to be updated*/
- if(mtime)
- /*update the mtime*/
- node->nn_stat.st_mtim = *mtime;
- else
- /*the current time will be set as mtime*/
- flags |= TOUCH_MTIME;
-
- /*touch the file*/
- fshelp_touch(&node->nn_stat, flags, maptime);
- }
-
- /*Return the result of operations*/
- return err;
- }/*netfs_attempt_utimes*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_utimes
+ (struct iouser * cred,
+ struct node * node, struct timespec * atime, struct timespec * mtime)
+{
+ LOG_MSG ("netfs_attempt_utimes");
+
+ error_t err = 0;
+
+ /*See what information is to be updated */
+ int flags = TOUCH_CTIME;
+
+ /*Check if the user is indeed the owner of the node */
+ err = fshelp_isowner (&node->nn_stat, cred);
+
+ /*If the user is allowed to do utimes */
+ if (!err)
+ {
+ /*If atime is to be updated */
+ if (atime)
+ /*update the atime */
+ node->nn_stat.st_atim = *atime;
+ else
+ /*the current time will be set as the atime */
+ flags |= TOUCH_ATIME;
+
+ /*If mtime is to be updated */
+ if (mtime)
+ /*update the mtime */
+ node->nn_stat.st_mtim = *mtime;
+ else
+ /*the current time will be set as mtime */
+ flags |= TOUCH_MTIME;
+
+ /*touch the file */
+ fshelp_touch (&node->nn_stat, flags, maptime);
+ }
+
+ /*Return the result of operations */
+ return err;
+} /*netfs_attempt_utimes */
+
+/*---------------------------------------------------------------------------*/
/*Returns the valid access types for file `node` and user `cred`*/
error_t
-netfs_report_access
- (
- struct iouser * cred,
- struct node * np,
- int * types
- )
- {
- LOG_MSG("netfs_report_access");
-
- /*No access at first*/
- *types = 0;
-
- /*Check the access and set the required bits*/
- if(fshelp_access(&np->nn_stat, S_IREAD, cred) == 0)
- *types |= O_READ;
- if(fshelp_access(&np->nn_stat, S_IWRITE, cred) == 0)
- *types |= O_WRITE;
- if(fshelp_access(&np->nn_stat, S_IEXEC, cred) == 0)
- *types |= O_EXEC;
-
- /*Everything OK*/
- return 0;
- }/*netfs_report_access*/
-/*----------------------------------------------------------------------------*/
+ netfs_report_access (struct iouser * cred, struct node * np, int *types)
+{
+ LOG_MSG ("netfs_report_access");
+
+ /*No access at first */
+ *types = 0;
+
+ /*Check the access and set the required bits */
+ if (fshelp_access (&np->nn_stat, S_IREAD, cred) == 0)
+ *types |= O_READ;
+ if (fshelp_access (&np->nn_stat, S_IWRITE, cred) == 0)
+ *types |= O_WRITE;
+ if (fshelp_access (&np->nn_stat, S_IEXEC, cred) == 0)
+ *types |= O_EXEC;
+
+ /*Everything OK */
+ return 0;
+} /*netfs_report_access */
+
+/*---------------------------------------------------------------------------*/
/*Validates the stat data for the node*/
-error_t
-netfs_validate_stat
- (
- struct node * np,
- struct iouser * cred
- )
- {
- LOG_MSG("netfs_validate_stat");
-
- error_t err = 0;
-
- /*Validate the stat information about the node*/
- err = io_stat(np->nn->port, &np->nn_stat);
-
- /*Return the result of operations*/
- return err;
- }/*netfs_validate_stat*/
-/*----------------------------------------------------------------------------*/
+error_t netfs_validate_stat (struct node * np, struct iouser * cred)
+{
+ LOG_MSG ("netfs_validate_stat");
+
+ error_t err = 0;
+
+ /*Validate the stat information about the node */
+ err = io_stat (np->nn->port, &np->nn_stat);
+
+ /*Return the result of operations */
+ return err;
+} /*netfs_validate_stat */
+
+/*---------------------------------------------------------------------------*/
/*Syncs `node` completely to disk*/
error_t
-netfs_attempt_sync
- (
- struct iouser * cred,
- struct node * node,
- int wait
- )
- {
- LOG_MSG("netfs_attempt_sync");
-
- /*Operation is not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_sync*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_sync (struct iouser * cred, struct node * node, int wait)
+{
+ LOG_MSG ("netfs_attempt_sync");
+
+ /*Operation is not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_sync */
+
+/*---------------------------------------------------------------------------*/
/*Fetches a directory*/
error_t
-netfs_get_dirents
- (
- struct iouser * cred,
- struct node * dir,
- int first_entry,
- int num_entries,
- char ** data,
- mach_msg_type_number_t * data_len,
- vm_size_t max_data_len,
- int * data_entries
- )
- {
- LOG_MSG("netfs_get_dirents");
-
- /*This node is not a directory*/
- return ENOTDIR;
- }/*netfs_get_dirents*/
-/*----------------------------------------------------------------------------*/
+ netfs_get_dirents
+ (struct iouser * cred,
+ struct node * dir,
+ int first_entry,
+ int num_entries,
+ char **data,
+ mach_msg_type_number_t * data_len,
+ vm_size_t max_data_len, int *data_entries)
+{
+ LOG_MSG ("netfs_get_dirents");
+
+ /*This node is not a directory */
+ return ENOTDIR;
+} /*netfs_get_dirents */
+
+/*---------------------------------------------------------------------------*/
/*Looks up `name` under `dir` for `user`*/
error_t
-netfs_attempt_lookup
- (
- struct iouser * user,
- struct node * dir,
- char * name,
- struct node ** node
- )
- {
- LOG_MSG("netfs_attempt_lookup: '%s'", name);
-
- /*Unlock the mutexes in `dir`*/
- mutex_unlock(&dir->lock);
- return EOPNOTSUPP;
- }/*netfs_attempt_lookup*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_lookup
+ (struct iouser * user, struct node * dir, char *name, struct node ** node)
+{
+ LOG_MSG ("netfs_attempt_lookup: '%s'", name);
+
+ /*Unlock the mutexes in `dir` */
+ mutex_unlock (&dir->lock);
+ return EOPNOTSUPP;
+} /*netfs_attempt_lookup */
+
+/*---------------------------------------------------------------------------*/
/*Deletes `name` in `dir` for `user`*/
error_t
-netfs_attempt_unlink
- (
- struct iouser * user,
- struct node * dir,
- char * name
- )
- {
- LOG_MSG("netfs_attempt_unlink");
-
- return 0;
- }/*netfs_attempt_unlink*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_unlink (struct iouser * user, struct node * dir, char *name)
+{
+ LOG_MSG ("netfs_attempt_unlink");
+
+ return 0;
+} /*netfs_attempt_unlink */
+
+/*---------------------------------------------------------------------------*/
/*Attempts to rename `fromdir`/`fromname` to `todir`/`toname`*/
error_t
-netfs_attempt_rename
- (
- struct iouser * user,
- struct node * fromdir,
- char * fromname,
- struct node * todir,
- char * toname,
- int excl
- )
- {
- LOG_MSG("netfs_attempt_rename");
-
- /*Operation not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_rename*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_rename
+ (struct iouser * user,
+ struct node * fromdir,
+ char *fromname, struct node * todir, char *toname, int excl)
+{
+ LOG_MSG ("netfs_attempt_rename");
+
+ /*Operation not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_rename */
+
+/*---------------------------------------------------------------------------*/
/*Attempts to create a new directory*/
error_t
-netfs_attempt_mkdir
- (
- struct iouser * user,
- struct node * dir,
- char * name,
- mode_t mode
- )
- {
- LOG_MSG("netfs_attempt_mkdir");
-
- return 0;
- }/*netfs_attempt_mkdir*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_mkdir
+ (struct iouser * user, struct node * dir, char *name, mode_t mode)
+{
+ LOG_MSG ("netfs_attempt_mkdir");
+
+ return 0;
+} /*netfs_attempt_mkdir */
+
+/*---------------------------------------------------------------------------*/
/*Attempts to remove directory `name` in `dir` for `user`*/
error_t
-netfs_attempt_rmdir
- (
- struct iouser * user,
- struct node * dir,
- char * name
- )
- {
- LOG_MSG("netfs_attempt_rmdir");
-
- return 0;
- }/*netfs_attempt_rmdir*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_rmdir (struct iouser * user, struct node * dir, char *name)
+{
+ LOG_MSG ("netfs_attempt_rmdir");
+
+ return 0;
+} /*netfs_attempt_rmdir */
+
+/*---------------------------------------------------------------------------*/
/*Attempts to change the mode of `node` for user `cred` to `uid`:`gid`*/
error_t
-netfs_attempt_chown
- (
- struct iouser * cred,
- struct node * node,
- uid_t uid,
- uid_t gid
- )
- {
- LOG_MSG("netfs_attempt_chown");
-
- /*Operation is not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_chown*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_chown
+ (struct iouser * cred, struct node * node, uid_t uid, uid_t gid)
+{
+ LOG_MSG ("netfs_attempt_chown");
+
+ /*Operation is not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_chown */
+
+/*---------------------------------------------------------------------------*/
/*Attempts to change the author of `node` to `author`*/
error_t
-netfs_attempt_chauthor
- (
- struct iouser * cred,
- struct node * node,
- uid_t author
- )
- {
- LOG_MSG("netfs_attempt_chauthor");
-
- /*Operation is not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_chauthor*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_chauthor
+ (struct iouser * cred, struct node * node, uid_t author)
+{
+ LOG_MSG ("netfs_attempt_chauthor");
+
+ /*Operation is not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_chauthor */
+
+/*---------------------------------------------------------------------------*/
/*Attempts to change the mode of `node` to `mode` for `cred`*/
error_t
-netfs_attempt_chmod
- (
- struct iouser * user,
- struct node * node,
- mode_t mode
- )
- {
- LOG_MSG("netfs_attempt_chmod");
-
- /*Operation is not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_chmod*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_chmod (struct iouser * user, struct node * node, mode_t mode)
+{
+ LOG_MSG ("netfs_attempt_chmod");
+
+ /*Operation is not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_chmod */
+
+/*---------------------------------------------------------------------------*/
/*Attempts to turn `node` into a symlink targetting `name`*/
error_t
-netfs_attempt_mksymlink
- (
- struct iouser * cred,
- struct node * node,
- char * name
- )
- {
- LOG_MSG("netfs_attempt_mksymlink");
-
- /*Operation is not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_mksymlink*/
-/*----------------------------------------------------------------------------*/
-/*Attempts to turn `node` into a device; type can be either S_IFBLK or S_IFCHR*/
+ netfs_attempt_mksymlink
+ (struct iouser * cred, struct node * node, char *name)
+{
+ LOG_MSG ("netfs_attempt_mksymlink");
+
+ /*Operation is not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_mksymlink */
+
+/*---------------------------------------------------------------------------*/
+/*Attempts to turn `node` into a device; type can be either S_IFBLK or
+ S_IFCHR*/
error_t
-netfs_attempt_mkdev
- (
- struct iouser * cred,
- struct node * node,
- mode_t type,
- dev_t indexes
- )
- {
- LOG_MSG("netfs_attempt_mkdev");
-
- /*Operation is not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_mkdev*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_mkdev
+ (struct iouser * cred, struct node * node, mode_t type, dev_t indexes)
+{
+ LOG_MSG ("netfs_attempt_mkdev");
+
+ /*Operation is not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_mkdev */
+
+/*---------------------------------------------------------------------------*/
/*Attempts to set the passive translator record for `file` passing `argz`*/
error_t
-netfs_set_translator
- (
- struct iouser * cred,
- struct node * node,
- char * argz,
- size_t arglen
- )
- {
- LOG_MSG("netfs_set_translator");
-
- /*Operation is not supported*/
- return EOPNOTSUPP;
- }/*netfs_set_translator */
-/*----------------------------------------------------------------------------*/
+ netfs_set_translator
+ (struct iouser * cred, struct node * node, char *argz, size_t arglen)
+{
+ LOG_MSG ("netfs_set_translator");
+
+ /*Operation is not supported */
+ return EOPNOTSUPP;
+} /*netfs_set_translator */
+
+/*---------------------------------------------------------------------------*/
/*Attempts to call chflags for `node`*/
error_t
-netfs_attempt_chflags
- (
- struct iouser * cred,
- struct node * node,
- int flags
- )
- {
- LOG_MSG("netfs_attempt_chflags");
-
- /*Operation is not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_chflags*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_chflags (struct iouser * cred, struct node * node, int flags)
+{
+ LOG_MSG ("netfs_attempt_chflags");
+
+ /*Operation is not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_chflags */
+
+/*---------------------------------------------------------------------------*/
/*Attempts to set the size of file `node`*/
error_t
-netfs_attempt_set_size
- (
- struct iouser * cred,
- struct node * node,
- loff_t size
- )
- {
- LOG_MSG("netfs_attempt_set_size");
-
- /*Operation is not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_set_size*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_set_size
+ (struct iouser * cred, struct node * node, loff_t size)
+{
+ LOG_MSG ("netfs_attempt_set_size");
+
+ /*Operation is not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_set_size */
+
+/*---------------------------------------------------------------------------*/
/*Fetches the filesystem status information*/
error_t
-netfs_attempt_statfs
- (
- struct iouser * cred,
- struct node * node,
- fsys_statfsbuf_t * st
- )
- {
- LOG_MSG("netfs_attempt_statfs");
-
- /*Operation is not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_statfs*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_statfs
+ (struct iouser * cred, struct node * node, fsys_statfsbuf_t * st)
+{
+ LOG_MSG ("netfs_attempt_statfs");
+
+ /*Operation is not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_statfs */
+
+/*---------------------------------------------------------------------------*/
/*Syncs the filesystem*/
-error_t
-netfs_attempt_syncfs
- (
- struct iouser * cred,
- int wait
- )
- {
- LOG_MSG("netfs_attempt_syncfs");
-
- /*Everythin OK*/
- return 0;
- }/*netfs_attempt_syncfs*/
-/*----------------------------------------------------------------------------*/
+error_t netfs_attempt_syncfs (struct iouser * cred, int wait)
+{
+ LOG_MSG ("netfs_attempt_syncfs");
+
+ /*Everythin OK */
+ return 0;
+} /*netfs_attempt_syncfs */
+
+/*---------------------------------------------------------------------------*/
/*Creates a link in `dir` with `name` to `file`*/
error_t
-netfs_attempt_link
- (
- struct iouser * user,
- struct node * dir,
- struct node * file,
- char * name,
- int excl
- )
- {
- LOG_MSG("netfs_attempt_link");
-
- /*Operation not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_link*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_link
+ (struct iouser * user,
+ struct node * dir, struct node * file, char *name, int excl)
+{
+ LOG_MSG ("netfs_attempt_link");
+
+ /*Operation not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_link */
+
+/*---------------------------------------------------------------------------*/
/*Attempts to create an anonymous file related to `dir` with `mode`*/
error_t
-netfs_attempt_mkfile
- (
- struct iouser * user,
- struct node * dir,
- mode_t mode,
- struct node ** node
- )
- {
- LOG_MSG("netfs_attempt_mkfile");
-
- /*Unlock the directory*/
- mutex_unlock(&dir->lock);
-
- /*Operation not supported*/
- return EOPNOTSUPP;
- }/*netfs_attempt_mkfile*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_mkfile
+ (struct iouser * user, struct node * dir, mode_t mode, struct node ** node)
+{
+ LOG_MSG ("netfs_attempt_mkfile");
+
+ /*Unlock the directory */
+ mutex_unlock (&dir->lock);
+
+ /*Operation not supported */
+ return EOPNOTSUPP;
+} /*netfs_attempt_mkfile */
+
+/*---------------------------------------------------------------------------*/
/*Reads the contents of symlink `node` into `buf`*/
error_t
-netfs_attempt_readlink
- (
- struct iouser * user,
- struct node * node,
- char * buf
- )
- {
- LOG_MSG("netfs_attempt_readlink");
-
- /*Operation not supported (why?..)*/
- return EOPNOTSUPP;
- }/*netfs_attempt_readlink*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_readlink (struct iouser * user, struct node * node, char *buf)
+{
+ LOG_MSG ("netfs_attempt_readlink");
+
+ /*Operation not supported (why?..) */
+ return EOPNOTSUPP;
+} /*netfs_attempt_readlink */
+
+/*---------------------------------------------------------------------------*/
/*Reads from file `node` up to `len` bytes from `offset` into `data`*/
error_t
-netfs_attempt_read
- (
- struct iouser * cred,
- struct node * np,
- loff_t offset,
- size_t * len,
- void * data
- )
- {
- LOG_MSG("netfs_attempt_read");
-
- error_t err = 0;
-
- /*Obtain a pointer to the first byte of the supplied buffer*/
- char * buf = data;
-
- /*Try to read the requested information from the file*/
- err = io_read(np->nn->port, &buf, len, offset, *len);
-
- /*If some data has been read successfully*/
- if(!err && (buf != data))
- {
- /*copy the data from the buffer into which it has just been read into
- the supplied receiver*/
- memcpy(data, buf, *len);
-
- /*unmap the new buffer*/
- munmap(buf, *len);
- }
-
- /*Return the result of reading*/
- return err;
- }/*netfs_attempt_read*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_read
+ (struct iouser * cred,
+ struct node * np, loff_t offset, size_t * len, void *data)
+{
+ LOG_MSG ("netfs_attempt_read");
+
+ error_t err = 0;
+
+ /*Obtain a pointer to the first byte of the supplied buffer */
+ char *buf = data;
+
+ /*Try to read the requested information from the file */
+ err = io_read (np->nn->port, &buf, len, offset, *len);
+
+ /*If some data has been read successfully */
+ if (!err && (buf != data))
+ {
+ /*copy the data from the buffer into which it has just been read into
+ the supplied receiver */
+ memcpy (data, buf, *len);
+
+ /*unmap the new buffer */
+ munmap (buf, *len);
+ }
+
+ /*Return the result of reading */
+ return err;
+} /*netfs_attempt_read */
+
+/*---------------------------------------------------------------------------*/
/*Writes to file `node` up to `len` bytes from offset from `data`*/
error_t
-netfs_attempt_write
- (
- struct iouser * cred,
- struct node * node,
- loff_t offset,
- size_t * len,
- void * data
- )
- {
- LOG_MSG("netfs_attempt_write");
-
- return 0;
- }/*netfs_attempt_write*/
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_write
+ (struct iouser * cred,
+ struct node * node, loff_t offset, size_t * len, void *data)
+{
+ LOG_MSG ("netfs_attempt_write");
+
+ return 0;
+} /*netfs_attempt_write */
+
+/*---------------------------------------------------------------------------*/
/*Frees all storage associated with the node*/
-void
-netfs_node_norefs
- (
- struct node * np
- )
- {
- /*Destroy the node*/
- node_destroy(np);
- }/*netfs_node_norefs*/
-/*----------------------------------------------------------------------------*/
+void netfs_node_norefs (struct node *np)
+{
+ /*Destroy the node */
+ node_destroy (np);
+} /*netfs_node_norefs */
+
+/*---------------------------------------------------------------------------*/
/*Implements file_get_translator_cntl as described in <hurd/fs.defs>
- (according to diskfs_S_file_get_translator_cntl)*/
+ (according to diskfs_S_file_get_translator_cntl)*/
kern_return_t
-netfs_S_file_get_translator_cntl
- (
- struct protid * user,
- mach_port_t * cntl,
- mach_msg_type_name_t * cntltype
- )
- {
- /*If the information about the user is missing*/
- if(!user)
- return EOPNOTSUPP;
-
- error_t err = 0;
-
- /*Obtain the node for which we are called*/
- node_t * np = user->po->np;
-
- /*Lock the node*/
- mutex_lock(&np->lock);
-
- /*Check if the user is the owner of this node*/
- err = fshelp_isowner(&np->nn_stat, user->user);
-
- /*If no errors have happened*/
- if(!err)
- /*try to fetch the control port*/
- err = fshelp_fetch_control(&np->transbox, cntl);
-
- /*If no errors have occurred, but no port has been returned*/
- if(!err && (cntl == MACH_PORT_NULL))
- /*set the error accordingly*/
- err = ENXIO;
-
- /*If no errors have occurred so far*/
- if(!err)
- /*set the control port type*/
- *cntltype = MACH_MSG_TYPE_MOVE_SEND;
-
- /*Unlock the node*/
- mutex_unlock(&np->lock);
-
- /*Return the result of operations*/
- return err;
- }/*netfs_S_file_get_translator_cntl*/
-/*----------------------------------------------------------------------------*/
+ netfs_S_file_get_translator_cntl
+ (struct protid *user, mach_port_t * cntl, mach_msg_type_name_t * cntltype)
+{
+ /*If the information about the user is missing */
+ if (!user)
+ return EOPNOTSUPP;
+
+ error_t err = 0;
+
+ /*Obtain the node for which we are called */
+ node_t *np = user->po->np;
+
+ /*Lock the node */
+ mutex_lock (&np->lock);
+
+ /*Check if the user is the owner of this node */
+ err = fshelp_isowner (&np->nn_stat, user->user);
+
+ /*If no errors have happened */
+ if (!err)
+ /*try to fetch the control port */
+ err = fshelp_fetch_control (&np->transbox, cntl);
+
+ /*If no errors have occurred, but no port has been returned */
+ if (!err && (cntl == MACH_PORT_NULL))
+ /*set the error accordingly */
+ err = ENXIO;
+
+ /*If no errors have occurred so far */
+ if (!err)
+ /*set the control port type */
+ *cntltype = MACH_MSG_TYPE_MOVE_SEND;
+
+ /*Unlock the node */
+ mutex_unlock (&np->lock);
+
+ /*Return the result of operations */
+ return err;
+} /*netfs_S_file_get_translator_cntl */
+
+/*---------------------------------------------------------------------------*/
/*Entry point*/
-int
-main
- (
- int argc,
- char ** argv
- )
- {
- /*Start logging*/
- INIT_LOG();
- LOG_MSG(">> Starting initialization...");
-
- /*The port on which this translator will be set upon*/
- mach_port_t bootstrap_port;
-
- error_t err = 0;
-
- /*Parse the command line arguments*/
- argp_parse(&argp_startup, argc, argv, ARGP_IN_ORDER, 0, 0);
- if(target_name == NULL)
- {
- char * p = *argv + strlen(*argv);
-
- /*find where the name of this executable starts (it should match \-.*)*/
- for(; p >= *argv; --p)
- if(*p == '/')
- {
- if((p > *argv) && (p[-1] == '\\'))
- continue; /*this is an escaped '/'*/
- /*we've reached the beginning of the name*/
- break;
- }
-
- if(*p == '/')
- ++p;
-
- if(*p == '-') /*actually, any filter translator must have a name starting
- with '-'*/
- ++p;
-
- target_name = p;
- }
- LOG_MSG("Command line arguments parsed. Target name: '%s'.", target_name);
-
- /*Try to create the root node*/
- err = node_create_root(&netfs_root_node);
- if(err)
- error(EXIT_FAILURE, err, "Failed to create the root node");
- LOG_MSG("Root node created.");
-
- /*Obtain the bootstrap port*/
- task_get_bootstrap_port(mach_task_self(), &bootstrap_port);
-
- /*Initialize the translator*/
- netfs_init();
-
- /*Obtain a port to the underlying node opened as O_NOTRANS*/
- underlying_node = netfs_startup(bootstrap_port, O_READ | O_NOTRANS);
- LOG_MSG("netfs initialization complete.");
-
- /*Initialize the root node*/
- err = node_init_root(underlying_node, netfs_root_node);
- if(err)
- error(EXIT_FAILURE, err, "Failed to initialize the root node");
- LOG_MSG("Root node initialized.");
- LOG_MSG("\tRoot node address: 0x%lX", (unsigned long)netfs_root_node);
-
- /*Map the time for updating node information*/
- err = maptime_map(0, 0, &maptime);
- if(err)
- error(EXIT_FAILURE, err, "Failed to map the time");
- LOG_MSG("Time mapped.");
-
- /*Obtain stat information about the underlying node*/
- err = io_stat(underlying_node, &underlying_node_stat);
- if(err)
- error(EXIT_FAILURE, err,
- "Cannot obtain stat information about the underlying node");
- LOG_MSG("Stat information for undelying node obtained.");
-
- /*Obtain the ID of the current process*/
- fsid = getpid();
-
- /*Setup the stat information for the root node*/
- netfs_root_node->nn_stat = underlying_node_stat;
-
- netfs_root_node->nn_stat.st_ino = FILTER_ROOT_INODE;
- netfs_root_node->nn_stat.st_fsid = fsid;
- netfs_root_node->nn_stat.st_mode = underlying_node_stat.st_mode;
-
- netfs_root_node->nn_translated = netfs_root_node->nn_stat.st_mode;
-
- /*Filter the translator stack under ourselves*/
- err = trace_find(underlying_node, "/hurd/m", O_READ, &target);
- if(err)
- error
- (
- EXIT_FAILURE, err,
- "Could not trace the translator stack on the underlying node"
- );
-
- netfs_root_node->nn->port = target;
-
- /*Update the timestamps of the root node*/
- fshelp_touch
- (&netfs_root_node->nn_stat, TOUCH_ATIME | TOUCH_MTIME | TOUCH_CTIME,
- maptime);
-
- LOG_MSG(">> Initialization complete. Entering netfs server loop...");
-
- /*Start serving clients*/
- for(;;)
- netfs_server_loop();
- }/*main*/
-/*----------------------------------------------------------------------------*/
+int main (int argc, char **argv)
+{
+ /*Start logging */
+ INIT_LOG ();
+ LOG_MSG (">> Starting initialization...");
+
+ /*The port on which this translator will be set upon */
+ mach_port_t bootstrap_port;
+
+ error_t err = 0;
+
+ /*Parse the command line arguments */
+ argp_parse (&argp_startup, argc, argv, ARGP_IN_ORDER, 0, 0);
+ if (target_name == NULL)
+ {
+ char *p = *argv + strlen (*argv);
+
+ /*find where the name of this executable starts (it should match \-.*) */
+ for (; p >= *argv; --p)
+ if (*p == '/')
+ {
+ if ((p > *argv) && (p[-1] == '\\'))
+ continue; /*this is an escaped '/' */
+ /*we've reached the beginning of the name */
+ break;
+ }
+
+ if (*p == '/')
+ ++p;
+
+ if (*p == '-') /*actually, any filter translator must have a
+ name starting with '-' */
+ ++p;
+
+ target_name = p;
+ }
+ LOG_MSG ("Command line arguments parsed. Target name: '%s'.", target_name);
+
+ /*Try to create the root node */
+ err = node_create_root (&netfs_root_node);
+ if (err)
+ error (EXIT_FAILURE, err, "Failed to create the root node");
+ LOG_MSG ("Root node created.");
+
+ /*Obtain the bootstrap port */
+ task_get_bootstrap_port (mach_task_self (), &bootstrap_port);
+
+ /*Initialize the translator */
+ netfs_init ();
+
+ /*Obtain a port to the underlying node opened as O_NOTRANS */
+ underlying_node = netfs_startup (bootstrap_port, O_READ | O_NOTRANS);
+ LOG_MSG ("netfs initialization complete.");
+
+ /*Initialize the root node */
+ err = node_init_root (underlying_node, netfs_root_node);
+ if (err)
+ error (EXIT_FAILURE, err, "Failed to initialize the root node");
+ LOG_MSG ("Root node initialized.");
+ LOG_MSG ("\tRoot node address: 0x%lX", (unsigned long) netfs_root_node);
+
+ /*Map the time for updating node information */
+ err = maptime_map (0, 0, &maptime);
+ if (err)
+ error (EXIT_FAILURE, err, "Failed to map the time");
+ LOG_MSG ("Time mapped.");
+
+ /*Obtain stat information about the underlying node */
+ err = io_stat (underlying_node, &underlying_node_stat);
+ if (err)
+ error (EXIT_FAILURE, err,
+ "Cannot obtain stat information about the underlying node");
+ LOG_MSG ("Stat information for undelying node obtained.");
+
+ /*Obtain the ID of the current process */
+ fsid = getpid ();
+
+ /*Setup the stat information for the root node */
+ netfs_root_node->nn_stat = underlying_node_stat;
+
+ netfs_root_node->nn_stat.st_ino = FILTER_ROOT_INODE;
+ netfs_root_node->nn_stat.st_fsid = fsid;
+ netfs_root_node->nn_stat.st_mode = underlying_node_stat.st_mode;
+
+ netfs_root_node->nn_translated = netfs_root_node->nn_stat.st_mode;
+
+ /*Filter the translator stack under ourselves */
+ err = trace_find (underlying_node, "/hurd/m", O_READ, &target);
+ if (err)
+ error
+ (EXIT_FAILURE, err,
+ "Could not trace the translator stack on the underlying node");
+
+ netfs_root_node->nn->port = target;
+
+ /*Update the timestamps of the root node */
+ fshelp_touch
+ (&netfs_root_node->nn_stat, TOUCH_ATIME | TOUCH_MTIME | TOUCH_CTIME,
+ maptime);
+
+ LOG_MSG (">> Initialization complete. Entering netfs server loop...");
+
+ /*Start serving clients */
+ for (;;)
+ netfs_server_loop ();
+} /*main */
+
+/*---------------------------------------------------------------------------*/
diff --git a/filter.h b/filter.h
index 6dc9a69dc..6be032246 100644
--- a/filter.h
+++ b/filter.h
@@ -1,10 +1,10 @@
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*filter.h*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*The definitions for the filtering translator*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Based on the code of unionfs translator.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Copyright (C) 2001, 2002, 2005, 2008 Free Software Foundation, Inc.
Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>.
@@ -22,10 +22,10 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#ifndef __FILTER_H__
#define __FILTER_H__
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include <stddef.h>
#include <stdlib.h>
#include <cthreads.h>
@@ -37,312 +37,176 @@
#include <sys/time.h>
#include <hurd/ihash.h>
#include <hurd/iohelp.h>
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include "node.h"
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Macros--------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Macros-------------------------------------------------------------*/
/*The inode for the root node*/
#define FILTER_ROOT_INODE 1
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Global Variables----------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Global Variables---------------------------------------------------*/
/*A mapped time value*/
/*Required for a very fast access to time*/
-extern volatile struct mapped_time_value * maptime;
-/*----------------------------------------------------------------------------*/
+extern volatile struct mapped_time_value *maptime;
+/*---------------------------------------------------------------------------*/
/*A port to the underlying node*/
extern mach_port_t underlying_node;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*The stat information about the underlying node*/
extern io_statbuf_t underlying_node_stat;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Functions-----------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Functions----------------------------------------------------------*/
/*Attempts to create a file named `name` in `dir` for `user` with mode `mode`*/
error_t
-netfs_attempt_create_file
- (
- struct iouser * user,
- struct node * dir,
- char * name,
- mode_t mode,
- struct node ** node
- );
-/*----------------------------------------------------------------------------*/
-/*Returns an error if the process of opening a file should not be allowed
- to complete because of insufficient permissions*/
+ netfs_attempt_create_file
+ (struct iouser *user,
+ struct node *dir, char *name, mode_t mode, struct node **node);
+/*---------------------------------------------------------------------------*/
+/*Returns an error if the process of opening a file should not be
+ allowed to complete because of insufficient permissions*/
error_t
-netfs_check_open_permissions
- (
- struct iouser * user,
- struct node * np,
- int flags,
- int newnode
- );
-/*----------------------------------------------------------------------------*/
+ netfs_check_open_permissions
+ (struct iouser *user, struct node *np, int flags, int newnode);
+/*---------------------------------------------------------------------------*/
/*Attempts an utimes call for the user `cred` on node `node`*/
error_t
-netfs_attempt_utimes
- (
- struct iouser * cred,
- struct node * node,
- struct timespec * atime,
- struct timespec * mtime
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_utimes
+ (struct iouser *cred,
+ struct node *node, struct timespec *atime, struct timespec *mtime);
+/*---------------------------------------------------------------------------*/
/*Returns the valid access types for file `node` and user `cred`*/
error_t
-netfs_report_access
- (
- struct iouser * cred,
- struct node * np,
- int * types
- );
-/*----------------------------------------------------------------------------*/
+ netfs_report_access (struct iouser *cred, struct node *np, int *types);
+/*---------------------------------------------------------------------------*/
/*Validates the stat data for the node*/
-error_t
-netfs_validate_stat
- (
- struct node * np,
- struct iouser * cred
- );
-/*----------------------------------------------------------------------------*/
+error_t netfs_validate_stat (struct node *np, struct iouser *cred);
+/*---------------------------------------------------------------------------*/
/*Syncs `node` completely to disk*/
-error_t
-netfs_attempt_sync
- (
- struct iouser * cred,
- struct node * node,
- int wait
- );
-/*----------------------------------------------------------------------------*/
+error_t netfs_attempt_sync (struct iouser *cred, struct node *node, int wait);
+/*---------------------------------------------------------------------------*/
/*Fetches a directory*/
error_t
-netfs_get_dirents
- (
- struct iouser * cred,
- struct node * dir,
- int first_entry,
- int num_entries,
- char ** data,
- mach_msg_type_number_t * data_len,
- vm_size_t max_data_len,
- int * data_entries
- );
-/*----------------------------------------------------------------------------*/
+ netfs_get_dirents
+ (struct iouser *cred,
+ struct node *dir,
+ int first_entry,
+ int num_entries,
+ char **data,
+ mach_msg_type_number_t * data_len,
+ vm_size_t max_data_len, int *data_entries);
+/*---------------------------------------------------------------------------*/
/*Looks up `name` under `dir` for `user`*/
error_t
-netfs_attempt_lookup
- (
- struct iouser * user,
- struct node * dir,
- char * name,
- struct node ** node
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_lookup
+ (struct iouser *user, struct node *dir, char *name, struct node **node);
+/*---------------------------------------------------------------------------*/
/*Deletes `name` in `dir` for `user`*/
error_t
-netfs_attempt_unlink
- (
- struct iouser * user,
- struct node * dir,
- char * name
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_unlink (struct iouser *user, struct node *dir, char *name);
+/*---------------------------------------------------------------------------*/
/*Attempts to rename `fromdir`/`fromname` to `todir`/`toname`*/
error_t
-netfs_attempt_rename
- (
- struct iouser * user,
- struct node * fromdir,
- char * fromname,
- struct node * todir,
- char * toname,
- int excl
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_rename
+ (struct iouser *user,
+ struct node *fromdir,
+ char *fromname, struct node *todir, char *toname, int excl);
+/*---------------------------------------------------------------------------*/
/*Attempts to create a new directory*/
error_t
-netfs_attempt_mkdir
- (
- struct iouser * user,
- struct node * dir,
- char * name,
- mode_t mode
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_mkdir
+ (struct iouser *user, struct node *dir, char *name, mode_t mode);
+/*---------------------------------------------------------------------------*/
/*Attempts to remove directory `name` in `dir` for `user`*/
error_t
-netfs_attempt_rmdir
- (
- struct iouser * user,
- struct node * dir,
- char * name
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_rmdir (struct iouser *user, struct node *dir, char *name);
+/*---------------------------------------------------------------------------*/
/*Attempts to change the owner of `node` for user `cred` to `uid`:`gid`*/
error_t
-netfs_attempt_chown
- (
- struct iouser * cred,
- struct node * node,
- uid_t uid,
- uid_t gid
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_chown
+ (struct iouser *cred, struct node *node, uid_t uid, uid_t gid);
+/*---------------------------------------------------------------------------*/
/*Attempts to change the author of `node` to `author`*/
error_t
-netfs_attempt_chauthor
- (
- struct iouser * cred,
- struct node * node,
- uid_t author
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_chauthor
+ (struct iouser *cred, struct node *node, uid_t author);
+/*---------------------------------------------------------------------------*/
/*Attempts to change the mode of `node` to `mode` for `cred`*/
error_t
-netfs_attempt_chmod
- (
- struct iouser * user,
- struct node * node,
- mode_t mode
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_chmod (struct iouser *user, struct node *node, mode_t mode);
+/*---------------------------------------------------------------------------*/
/*Attempts to turn `node` into a symlink targetting `name`*/
error_t
-netfs_attempt_mksymlink
- (
- struct iouser * cred,
- struct node * node,
- char * name
- );
-/*----------------------------------------------------------------------------*/
-/*Attempts to turn `node` into a device; type can be either S_IFBLK or S_IFCHR*/
+ netfs_attempt_mksymlink
+ (struct iouser *cred, struct node *node, char *name);
+/*---------------------------------------------------------------------------*/
+/*Attempts to turn `node` into a device; type can be either S_IFBLK or
+ S_IFCHR*/
error_t
-netfs_attempt_mkdev
- (
- struct iouser * cred,
- struct node * node,
- mode_t type,
- dev_t indexes
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_mkdev
+ (struct iouser *cred, struct node *node, mode_t type, dev_t indexes);
+/*---------------------------------------------------------------------------*/
/*Attempts to set the passive translator record for `file` passing `argz`*/
error_t
-netfs_set_translator
- (
- struct iouser * cred,
- struct node * node,
- char * argz,
- size_t arglen
- );
-/*----------------------------------------------------------------------------*/
+ netfs_set_translator
+ (struct iouser *cred, struct node *node, char *argz, size_t arglen);
+/*---------------------------------------------------------------------------*/
/*Attempts to call chflags for `node`*/
error_t
-netfs_attempt_chflags
- (
- struct iouser * cred,
- struct node * node,
- int flags
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_chflags (struct iouser *cred, struct node *node, int flags);
+/*---------------------------------------------------------------------------*/
/*Attempts to set the size of file `node`*/
error_t
-netfs_attempt_set_size
- (
- struct iouser * cred,
- struct node * node,
- loff_t size
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_set_size
+ (struct iouser *cred, struct node *node, loff_t size);
+/*---------------------------------------------------------------------------*/
/*Fetches the filesystem status information*/
error_t
-netfs_attempt_statfs
- (
- struct iouser * cred,
- struct node * node,
- fsys_statfsbuf_t * st
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_statfs
+ (struct iouser *cred, struct node *node, fsys_statfsbuf_t * st);
+/*---------------------------------------------------------------------------*/
/*Syncs the filesystem*/
-error_t
-netfs_attempt_syncfs
- (
- struct iouser * cred,
- int wait
- );
-/*----------------------------------------------------------------------------*/
+error_t netfs_attempt_syncfs (struct iouser *cred, int wait);
+/*---------------------------------------------------------------------------*/
/*Creates a link in `dir` with `name` to `file`*/
error_t
-netfs_attempt_link
- (
- struct iouser * user,
- struct node * dir,
- struct node * file,
- char * name,
- int excl
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_link
+ (struct iouser *user,
+ struct node *dir, struct node *file, char *name, int excl);
+/*---------------------------------------------------------------------------*/
/*Attempts to create an anonymous file related to `dir` with `mode`*/
error_t
-netfs_attempt_mkfile
- (
- struct iouser * user,
- struct node * dir,
- mode_t mode,
- struct node ** node
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_mkfile
+ (struct iouser *user, struct node *dir, mode_t mode, struct node **node);
+/*---------------------------------------------------------------------------*/
/*Reads the contents of symlink `node` into `buf`*/
error_t
-netfs_attempt_readlink
- (
- struct iouser * user,
- struct node * node,
- char * buf
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_readlink (struct iouser *user, struct node *node, char *buf);
+/*---------------------------------------------------------------------------*/
/*Reads from file `node` up to `len` bytes from `offset` into `data`*/
error_t
-netfs_attempt_read
- (
- struct iouser * cred,
- struct node * np,
- loff_t offset,
- size_t * len,
- void * data
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_read
+ (struct iouser *cred,
+ struct node *np, loff_t offset, size_t * len, void *data);
+/*---------------------------------------------------------------------------*/
/*Writes to file `node` up to `len` bytes from offset from `data`*/
error_t
-netfs_attempt_write
- (
- struct iouser * cred,
- struct node * node,
- loff_t offset,
- size_t * len,
- void * data
- );
-/*----------------------------------------------------------------------------*/
+ netfs_attempt_write
+ (struct iouser *cred,
+ struct node *node, loff_t offset, size_t * len, void *data);
+/*---------------------------------------------------------------------------*/
/*Frees all storage associated with the node*/
-void
-netfs_node_norefs
- (
- struct node * np
- );
-/*----------------------------------------------------------------------------*/
+void netfs_node_norefs (struct node *np);
+/*---------------------------------------------------------------------------*/
/*Implements file_get_translator_cntl as described in <hurd/fs.defs>
- (according to diskfs_S_file_get_translator_cntl)*/
+ (according to diskfs_S_file_get_translator_cntl)*/
kern_return_t
-netfs_S_file_get_translator_cntl
- (
- struct protid * user,
- mach_port_t * cntl,
- mach_msg_type_name_t * cntltype
- );
-/*----------------------------------------------------------------------------*/
+ netfs_S_file_get_translator_cntl
+ (struct protid *user, mach_port_t * cntl, mach_msg_type_name_t * cntltype);
+/*---------------------------------------------------------------------------*/
#endif /*__FILTER_H__*/
diff --git a/node.c b/node.c
index 33ff2777e..3c1e37518 100644
--- a/node.c
+++ b/node.c
@@ -1,10 +1,10 @@
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*node.c*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Implementation of node management strategies*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Based on the code of unionfs translator.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Copyright (C) 2001, 2002, 2005, 2008 Free Software Foundation, Inc.
Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>.
@@ -22,145 +22,135 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#define _GNU_SOURCE 1
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdio.h>
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include "debug.h"
#include "node.h"
#include "filter.h"
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Global Variables----------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Global Variables---------------------------------------------------*/
/*The lock protecting the underlying filesystem*/
struct mutex ulfs_lock = MUTEX_INITIALIZER;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Functions-----------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Functions----------------------------------------------------------*/
/*Derives a new node from `lnode` and adds a reference to `lnode`*/
-error_t
-node_create
- (
- node_t ** node /*store the result here*/
- )
+error_t node_create (node_t ** node)
+{
+ error_t err = 0;
+
+ /*Create a new netnode */
+ netnode_t *netnode_new = malloc (sizeof (netnode_t));
+
+ /*If the memory could not be allocated */
+ if (netnode_new == NULL)
+ err = ENOMEM;
+ else
+ {
+ /*create a new node from the netnode */
+ node_t *node_new = netfs_make_node (netnode_new);
+
+ /*If the creation failed */
+ if (node_new == NULL)
{
- error_t err = 0;
-
- /*Create a new netnode*/
- netnode_t * netnode_new = malloc(sizeof(netnode_t));
-
- /*If the memory could not be allocated*/
- if(netnode_new == NULL)
- err = ENOMEM;
- else
- {
- /*create a new node from the netnode*/
- node_t * node_new = netfs_make_node(netnode_new);
-
- /*If the creation failed*/
- if(node_new == NULL)
- {
- /*set the error code*/
- err = ENOMEM;
-
- /*destroy the netnode created above*/
- free(netnode_new);
-
- /*stop*/
- return err;
- }
-
- /*store the result of creation in the second parameter*/
- *node = node_new;
- }
-
- /*Return the result of operations*/
- return err;
- }/*node_create*/
-/*----------------------------------------------------------------------------*/
+ /*set the error code */
+ err = ENOMEM;
+
+ /*destroy the netnode created above */
+ free (netnode_new);
+
+ /*stop */
+ return err;
+ }
+
+ /*store the result of creation in the second parameter */
+ *node = node_new;
+ }
+
+ /*Return the result of operations */
+ return err;
+} /*node_create */
+
+/*---------------------------------------------------------------------------*/
/*Destroys the specified node and removes a light reference from the
- associated light node*/
-void
-node_destroy
- (
- node_t * np
- )
- {
- /*Destroy the port to the underlying filesystem allocated to the node*/
- PORT_DEALLOC(np->nn->port);
-
- /*Free the netnode and the node itself*/
- free(np->nn);
- free(np);
- }/*node_destroy*/
-/*----------------------------------------------------------------------------*/
+ associated light node*/
+void node_destroy (node_t * np)
+{
+ /*Destroy the port to the underlying filesystem allocated to the node */
+ PORT_DEALLOC (np->nn->port);
+
+ /*Free the netnode and the node itself */
+ free (np->nn);
+ free (np);
+} /*node_destroy */
+
+/*---------------------------------------------------------------------------*/
/*Creates the root node and the corresponding lnode*/
-error_t
-node_create_root
- (
- node_t ** root_node /*store the result here*/
- )
- {
- error_t err;
-
- /*Try to create a node*/
- node_t * node;
- err = node_create(&node);
- if(err)
- return err;
-
- /*Store the result in the parameter*/
- *root_node = node;
-
- /*Return the result*/
- return err;
- }/*node_create_root*/
-/*----------------------------------------------------------------------------*/
+error_t node_create_root (node_t ** root_node)
+{
+ error_t err;
+
+ /*Try to create a node */
+ node_t *node;
+ err = node_create (&node);
+ if (err)
+ return err;
+
+ /*Store the result in the parameter */
+ *root_node = node;
+
+ /*Return the result */
+ return err;
+} /*node_create_root */
+
+/*---------------------------------------------------------------------------*/
/*Initializes the port to the underlying filesystem for the root node*/
-error_t
-node_init_root
- (
- mach_port_t underlying, /*the port to the underlying node*/
- node_t * node /*the root node*/
- )
- {
- error_t err = 0;
-
- /*Acquire a lock for operations on the underlying filesystem*/
- mutex_lock(&ulfs_lock);
-
- /*Store the specified port in the node*/
- node->nn->port = underlying;
-
- LOG_MSG("node_init_root: Port: 0x%ld", (unsigned long)node->nn->port);
-
- /*Stat the root node*/
- err = io_stat(node->nn->port, &node->nn_stat);
- if(err)
- {
- /*deallocate the port*/
- PORT_DEALLOC(node->nn->port);
-
- LOG_MSG("node_init_root: Could not stat the root node.");
-
- /*unlock the mutex and exit*/
- mutex_unlock(&ulfs_lock);
- return err;
- }
-
- /*Release the lock for operations on the undelying filesystem*/
- mutex_unlock(&ulfs_lock);
-
- /*Return the result of operations*/
- return err;
- }/*node_init_root*/
-/*----------------------------------------------------------------------------*/
+error_t node_init_root (mach_port_t underlying, /*the port to the
+ underlying node */
+ node_t * node /*the root node */
+ )
+{
+ error_t err = 0;
+
+ /*Acquire a lock for operations on the underlying filesystem */
+ mutex_lock (&ulfs_lock);
+
+ /*Store the specified port in the node */
+ node->nn->port = underlying;
+
+ LOG_MSG ("node_init_root: Port: 0x%ld", (unsigned long) node->nn->port);
+
+ /*Stat the root node */
+ err = io_stat (node->nn->port, &node->nn_stat);
+ if (err)
+ {
+ /*deallocate the port */
+ PORT_DEALLOC (node->nn->port);
+
+ LOG_MSG ("node_init_root: Could not stat the root node.");
+
+ /*unlock the mutex and exit */
+ mutex_unlock (&ulfs_lock);
+ return err;
+ }
+
+ /*Release the lock for operations on the undelying filesystem */
+ mutex_unlock (&ulfs_lock);
+
+ /*Return the result of operations */
+ return err;
+} /*node_init_root */
+
+/*---------------------------------------------------------------------------*/
diff --git a/node.h b/node.h
index c8c8945c7..f8e1f3c99 100644
--- a/node.h
+++ b/node.h
@@ -1,10 +1,10 @@
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*node.h*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Node management. Also see lnode.h*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Based on the code of unionfs translator.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Copyright (C) 2001, 2002, 2005, 2008 Free Software Foundation, Inc.
Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>.
@@ -22,93 +22,75 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#ifndef __NODE_H__
#define __NODE_H__
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include <error.h>
#include <sys/stat.h>
#include <hurd/netfs.h>
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Macros--------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Macros-------------------------------------------------------------*/
/*Checks whether the give node is the root of the filterfs filesystem*/
#define NODE_IS_ROOT(n) (((n)->nn->lnode->dir) ? (0) : (1))
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Node flags*/
-#define FLAG_NODE_ULFS_FIXED 0x00000001 /*this node should not be updated*/
-#define FLAG_NODE_INVALIDATE 0x00000002 /*this node must be updated*/
-#define FLAG_NODE_ULFS_UPTODATE 0x00000004 /*this node has just been updated*/
-/*----------------------------------------------------------------------------*/
+#define FLAG_NODE_ULFS_FIXED 0x00000001 /*this node should not be updated */
+#define FLAG_NODE_INVALIDATE 0x00000002 /*this node must be updated */
+#define FLAG_NODE_ULFS_UPTODATE 0x00000004 /*this node has just been updated */
+/*---------------------------------------------------------------------------*/
/*The type of offset corresponding to the current platform*/
#ifdef __USE_FILE_OFFSET64
# define OFFSET_T __off64_t
#else
# define OFFSET_T __off_t
#endif /*__USE_FILE_OFFSET64*/
-/*----------------------------------------------------------------------------*/
-/*The size of a chunk of a string (for a small optimization in checking
- the property)*/
-#define STRING_CHUNK 256
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Deallocates the specified port*/
#define PORT_DEALLOC(p) (mach_port_deallocate(mach_task_self(), (p)))
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*The user-defined node for libnetfs*/
struct netnode
- {
- /*the flags associated with this node (might be not required)*/
- int flags;
+{
+ /*the flags associated with this node (might be not required) */
+ int flags;
- /*a port to the underlying filesystem*/
- file_t port;
- };/*struct netnode*/
-/*----------------------------------------------------------------------------*/
+ /*a port to the underlying filesystem */
+ file_t port;
+}; /*struct netnode */
+/*---------------------------------------------------------------------------*/
typedef struct netnode netnode_t;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
typedef struct node node_t;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Global Variables----------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Global Variables---------------------------------------------------*/
/*The lock protecting the underlying filesystem*/
extern struct mutex ulfs_lock;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Functions-----------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Functions----------------------------------------------------------*/
/*Derives a new node from `lnode` and adds a reference to `lnode`*/
-error_t
-node_create
- (
- node_t ** node /*store the result here*/
- );
-/*----------------------------------------------------------------------------*/
+error_t node_create (node_t ** node);
+/*---------------------------------------------------------------------------*/
/*Destroys the specified node and removes a light reference from the
- associated light node*/
-void
-node_destroy
- (
- node_t * np
- );
-/*----------------------------------------------------------------------------*/
+ associated light node*/
+void node_destroy (node_t * np);
+/*---------------------------------------------------------------------------*/
/*Creates the root node and the corresponding lnode*/
-error_t
-node_create_root
- (
- node_t ** root_node /*store the result here*/
- );
-/*----------------------------------------------------------------------------*/
+error_t node_create_root (node_t ** root_node);
+/*---------------------------------------------------------------------------*/
/*Initializes the port to the underlying filesystem for the root node*/
-error_t
-node_init_root
- (
- mach_port_t underlying, /*the port to the underlying node*/
- node_t * node /*the root node*/
- );
-/*----------------------------------------------------------------------------*/
+error_t node_init_root (mach_port_t underlying, /*the port to the
+ underlying node */
+ node_t * node /*the root node */
+ );
+/*---------------------------------------------------------------------------*/
#endif /*__NODE_H__*/
diff --git a/options.c b/options.c
index e5fea4d61..fc7d9712c 100644
--- a/options.c
+++ b/options.c
@@ -1,10 +1,10 @@
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*options.h*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Definitions for parsing the command line switches*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Based on the code of unionfs translator.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Copyright (C) 2001, 2002, 2005, 2008 Free Software Foundation, Inc.
Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>.
@@ -22,180 +22,162 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#define _GNU_SOURCE 1
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include <argp.h>
#include <error.h>
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include "debug.h"
#include "options.h"
#include "node.h"
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Macros--------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Macros-------------------------------------------------------------*/
/*Short documentation for argp*/
#define ARGS_DOC "TARGET-NAME"
#define DOC "Finds the bottommost translator called TARGET-NAME in the \
static stack of translators and reads and write to it."
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Forward Declarations------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Forward Declarations-----------------------------------------------*/
/*Argp parser function for the common options*/
static
-error_t
-argp_parse_common_options
- (
- int key,
- char * arg,
- struct argp_state * state
- );
-/*----------------------------------------------------------------------------*/
+ error_t
+ argp_parse_common_options (int key, char *arg, struct argp_state *state);
+/*---------------------------------------------------------------------------*/
/*Argp parser function for the startup options*/
static
-error_t
-argp_parse_startup_options
- (
- int key,
- char * arg,
- struct argp_state * state
- );
-/*----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------*/
-/*--------Global Variables----------------------------------------------------*/
-/*This variable is set to a non-zero value after the parsing of starup options
- is finished*/
+ error_t
+ argp_parse_startup_options (int key, char *arg, struct argp_state *state);
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------*/
+/*--------Global Variables---------------------------------------------------*/
+/*This variable is set to a non-zero value after the parsing of starup
+ options is finished*/
static int parsing_startup_options_finished;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Argp options common to both the runtime and the startup parser*/
-static const struct argp_option argp_common_options[] =
- {
- {0}
- };
-/*----------------------------------------------------------------------------*/
+static const struct argp_option argp_common_options[] = {
+ {0}
+};
+
+/*---------------------------------------------------------------------------*/
/*Argp options only meaningful for startupp parsing*/
-static const struct argp_option argp_startup_options[] =
- {
- {0}
- };
-/*----------------------------------------------------------------------------*/
+static const struct argp_option argp_startup_options[] = {
+ {0}
+};
+
+/*---------------------------------------------------------------------------*/
/*Argp parser for only the common options*/
static const struct argp argp_parser_common_options =
- {argp_common_options, argp_parse_common_options, 0, 0, 0};
-/*----------------------------------------------------------------------------*/
+ { argp_common_options, argp_parse_common_options, 0, 0, 0 };
+/*---------------------------------------------------------------------------*/
/*Argp parser for only the startup options*/
static const struct argp argp_parser_startup_options =
- {argp_startup_options, argp_parse_startup_options, 0, 0, 0};
-/*----------------------------------------------------------------------------*/
+ { argp_startup_options, argp_parse_startup_options, 0, 0, 0 };
+/*---------------------------------------------------------------------------*/
/*The list of children parsers for runtime arguments*/
-static const struct argp_child argp_children_runtime[] =
- {
- {&argp_parser_common_options},
- {&netfs_std_runtime_argp},
- {0}
- };
-/*----------------------------------------------------------------------------*/
+static const struct argp_child argp_children_runtime[] = {
+ {&argp_parser_common_options},
+ {&netfs_std_runtime_argp},
+ {0}
+};
+
+/*---------------------------------------------------------------------------*/
/*The list of children parsers for startup arguments*/
-static const struct argp_child argp_children_startup[] =
- {
- {&argp_parser_startup_options},
- {&argp_parser_common_options},
- {&netfs_std_startup_argp},
- {0}
- };
-/*----------------------------------------------------------------------------*/
+static const struct argp_child argp_children_startup[] = {
+ {&argp_parser_startup_options},
+ {&argp_parser_common_options},
+ {&netfs_std_startup_argp},
+ {0}
+};
+
+/*---------------------------------------------------------------------------*/
/*The version of the server for argp*/
-const char * argp_program_version = "0.0";
-/*----------------------------------------------------------------------------*/
+const char *argp_program_version = "0.0";
+/*---------------------------------------------------------------------------*/
/*The arpg parser for runtime arguments*/
-struct argp argp_runtime =
- {0, 0, 0, 0, argp_children_runtime};
-/*----------------------------------------------------------------------------*/
+struct argp argp_runtime = { 0, 0, 0, 0, argp_children_runtime };
+
+/*---------------------------------------------------------------------------*/
/*The argp parser for startup arguments*/
-struct argp argp_startup =
- {0, 0, ARGS_DOC, DOC, argp_children_startup};
-/*----------------------------------------------------------------------------*/
+struct argp argp_startup = { 0, 0, ARGS_DOC, DOC, argp_children_startup };
-/*----------------------------------------------------------------------------*/
-/*--------Functions-----------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------*/
+/*--------Functions----------------------------------------------------------*/
/*Argp parser function for the common options*/
static
-error_t
-argp_parse_common_options
- (
- int key,
- char * arg,
- struct argp_state * state
- )
- {
- error_t err = 0;
-
- /*Go through the possible options*/
- switch(key)
- {
- case ARGP_KEY_END:
- {
- /*If parsing of startup options has not finished*/
- if(!parsing_startup_options_finished)
- {
- /*set the flag that the startup options have already been parsed*/
- parsing_startup_options_finished = 1;
- }
- else
- {
- }
-
- break;
- }
- case ARGP_KEY_ARG: // the translator to filter out;
- {
- target_name = strdup(arg);
- if(!target_name)
- error(EXIT_FAILURE, ENOMEM, "argp_parse_common_options: "
- "Could not strdup the translator name");
-
- break;
- }
- /*If the option could not be recognized*/
- default:
- {
- /*set the error code*/
- err = ARGP_ERR_UNKNOWN;
- }
- }
-
- /*Return the result*/
- return err;
- }/*argp_parse_common_options*/
-/*----------------------------------------------------------------------------*/
+ error_t
+ argp_parse_common_options (int key, char *arg, struct argp_state *state)
+{
+ error_t err = 0;
+
+ /*Go through the possible options */
+ switch (key)
+ {
+ case ARGP_KEY_END:
+ {
+ /*If parsing of startup options has not finished */
+ if (!parsing_startup_options_finished)
+ {
+ /*set the flag that the startup options have already been parsed */
+ parsing_startup_options_finished = 1;
+ }
+ else
+ {
+ }
+
+ break;
+ }
+ case ARGP_KEY_ARG: // the translator to filter out;
+ {
+ target_name = strdup (arg);
+ if (!target_name)
+ error (EXIT_FAILURE, ENOMEM, "argp_parse_common_options: "
+ "Could not strdup the translator name");
+
+ break;
+ }
+ /*If the option could not be recognized */
+ default:
+ {
+ /*set the error code */
+ err = ARGP_ERR_UNKNOWN;
+ }
+ }
+
+ /*Return the result */
+ return err;
+} /*argp_parse_common_options */
+
+/*---------------------------------------------------------------------------*/
/*Argp parser function for the startup options*/
static
-error_t
-argp_parse_startup_options
- (
- int key,
- char * arg,
- struct argp_state * state
- )
- {
- /*Do nothing in a beautiful way*/
- error_t err = 0;
-
- switch(key)
- {
- default:
- {
- err = ARGP_ERR_UNKNOWN;
-
- break;
- }
- }
-
- return err;
- }/*argp_parse_startup_options*/
-/*----------------------------------------------------------------------------*/
+ error_t
+ argp_parse_startup_options (int key, char *arg, struct argp_state *state)
+{
+ /*Do nothing in a beautiful way */
+ error_t err = 0;
+
+ switch (key)
+ {
+ default:
+ {
+ err = ARGP_ERR_UNKNOWN;
+
+ break;
+ }
+ }
+
+ return err;
+} /*argp_parse_startup_options */
+
+/*---------------------------------------------------------------------------*/
diff --git a/options.h b/options.h
index 6be60dd58..cdebc687c 100644
--- a/options.h
+++ b/options.h
@@ -1,10 +1,10 @@
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*options.h*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Declarations for parsing the command line switches*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Based on the code of unionfs translator.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Copyright (C) 2001, 2002, 2005, 2008 Free Software Foundation, Inc.
Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>.
@@ -22,25 +22,25 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#ifndef __OPTIONS_H__
#define __OPTIONS_H__
-/*----------------------------------------------------------------------------*/
-/*--------Macros--------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Macros-------------------------------------------------------------*/
/*Makes a long option out of option name*/
#define OPT_LONG(o) "--"o
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Global Variables----------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*--------Global Variables---------------------------------------------------*/
/*The argp parser for startup arguments*/
extern struct argp argp_startup;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*The argp parser for rutime arguments*/
extern struct argp argp_runtime;
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*The name of the translator to filter out*/
-extern char * target_name;
-/*----------------------------------------------------------------------------*/
+extern char *target_name;
+/*---------------------------------------------------------------------------*/
#endif /*__OPTIONS_H__*/
diff --git a/trace.c b/trace.c
index 125751bfa..4f72d81f1 100644
--- a/trace.c
+++ b/trace.c
@@ -1,8 +1,8 @@
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*trace.h*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*The definitions for tracing the translator stack under ourselves.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Copyright (C) 2001, 2002, 2005, 2008 Free Software Foundation, Inc.
Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>.
@@ -20,195 +20,200 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#define _GNU_SOURCE 1
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include <unistd.h>
#include <fcntl.h>
#include <hurd/fsys.h>
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include "debug.h"
#include "trace.h"
#include "node.h"
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Functions-----------------------------------------------------------*/
-/*Traces the translator stack on the given underlying node until it finds the
- first translator called `name` and returns the port pointing to the
- translator sitting under this one.*/
+/*---------------------------------------------------------------------------*/
+/*--------Functions----------------------------------------------------------*/
+/*Traces the translator stack on the given underlying node until it
+ finds the first translator called `name` and returns the port
+ pointing to the translator sitting under this one.*/
error_t
-trace_find
- (
- mach_port_t underlying,
- const char * name,
- int flags,
- mach_port_t * port
- )
+ trace_find
+ (mach_port_t underlying, const char *name, int flags, mach_port_t * port)
+{
+ error_t err = 0;
+
+ /*Identity information about the current process */
+ uid_t *uids;
+ size_t nuids;
+
+ gid_t *gids;
+ size_t ngids;
+
+ /*The name and arguments of the translator being passed now */
+ char *argz = NULL;
+ size_t argz_len = 0;
+
+ /*The current working directory */
+ char *cwd = NULL;
+
+ /*The port to the directory containing the file pointed to by `underlying` */
+ file_t dir;
+
+ /*The unauthenticated version of `dir` */
+ file_t unauth_dir;
+
+ /*The control port of the current translator */
+ fsys_t fsys;
+
+ /*The port to the translator we are currently looking at */
+ mach_port_t node = underlying;
+
+ /*The port to the previous translator */
+ mach_port_t prev_node = MACH_PORT_NULL;
+
+ /*The retry name and retry type returned by fsys_getroot */
+ string_t retry_name;
+ retry_type retry;
+
+ /*Finalizes the execution of this function */
+ void finalize (void)
+ {
+ /*If there is a working directory, free it */
+ if (cwd)
+ free (cwd);
+
+ /*If the ports to the directory exist */
+ if (dir)
+ PORT_DEALLOC (dir);
+ } /*finalize */
+
+ /*Obtain the current working directory */
+ cwd = getcwd (NULL, 0);
+ if (!cwd)
+ {
+ LOG_MSG ("trace_find: Could not obtain cwd.");
+ return EINVAL;
+ }
+ LOG_MSG ("trace_find: cwd: '%s'", cwd);
+
+ /*Open a port to this directory */
+ dir = file_name_lookup (cwd, 0, 0);
+ if (!dir)
+ {
+ finalize ();
+ return ENOENT;
+ }
+
+ /*Try to get the number of effective UIDs */
+ nuids = geteuids (0, 0);
+ if (nuids < 0)
+ {
+ finalize ();
+ return EINVAL;
+ }
+
+ /*Allocate some memory for the UIDs on the stack */
+ uids = alloca (nuids * sizeof (uid_t));
+
+ /*Fetch the UIDs themselves */
+ nuids = geteuids (nuids, uids);
+ if (nuids < 0)
+ {
+ finalize ();
+ return EINVAL;
+ }
+
+ /*Try to get the number of effective GIDs */
+ ngids = getgroups (0, 0);
+ if (ngids < 0)
+ {
+ finalize ();
+ return EINVAL;
+ }
+
+ /*Allocate some memory for the GIDs on the stack */
+ gids = alloca (ngids * sizeof (gid_t));
+
+ /*Fetch the GIDs themselves */
+ ngids = getgroups (ngids, gids);
+ if (ngids < 0)
+ {
+ finalize ();
+ return EINVAL;
+ }
+
+ /*Obtain the unauthenticated version of `dir` */
+ err = io_restrict_auth (dir, &unauth_dir, 0, 0, 0, 0);
+ if (err)
+ {
+ finalize ();
+ return err;
+ }
+
+ char buf[256];
+ char *_buf = buf;
+ size_t len = 256;
+ io_read (node, &_buf, &len, 0, len);
+ LOG_MSG ("trace_find: Read from underlying: '%s'", buf);
+
+ /*Go up the translator stack */
+ for (; !err;)
+ {
+ /*retreive the name and options of the current translator */
+ err = file_get_fs_options (node, &argz, &argz_len);
+ if (err)
+ break;
+
+ LOG_MSG ("trace_find: Obtained translator '%s'", argz);
+ if (strcmp (argz, name) == 0)
{
- error_t err = 0;
-
- /*Identity information about the current process*/
- uid_t * uids;
- size_t nuids;
-
- gid_t * gids;
- size_t ngids;
-
- /*The name and arguments of the translator being passed now*/
- char * argz = NULL;
- size_t argz_len = 0;
-
- /*The current working directory*/
- char * cwd = NULL;
-
- /*The port to the directory containing the file pointed to by `underlying`*/
- file_t dir;
-
- /*The unauthenticated version of `dir`*/
- file_t unauth_dir;
-
- /*The control port of the current translator*/
- fsys_t fsys;
-
- /*The port to the translator we are currently looking at*/
- mach_port_t node = underlying;
-
- /*The retry name and retry type returned by fsys_getroot*/
- string_t retry_name;
- retry_type retry;
-
- /*Finalizes the execution of this function*/
- void
- finalize(void)
- {
- /*If there is a working directory, free it*/
- if(cwd)
- free(cwd);
-
- /*If the ports to the directory exist*/
- if(dir)
- PORT_DEALLOC(dir);
- }/*finalize*/
-
- /*Obtain the current working directory*/
- cwd = getcwd(NULL, 0);
- if(!cwd)
- {
- LOG_MSG("trace_find: Could not obtain cwd.");
- return EINVAL;
- }
- LOG_MSG("trace_find: cwd: '%s'", cwd);
-
- /*Open a port to this directory*/
- dir = file_name_lookup(cwd, 0, 0);
- if(!dir)
- {
- finalize();
- return ENOENT;
- }
-
- /*Try to get the number of effective UIDs*/
- nuids = geteuids(0, 0);
- if(nuids < 0)
- {
- finalize();
- return EINVAL;
- }
-
- /*Allocate some memory for the UIDs on the stack*/
- uids = alloca(nuids * sizeof(uid_t));
-
- /*Fetch the UIDs themselves*/
- nuids = geteuids(nuids, uids);
- if(nuids < 0)
- {
- finalize();
- return EINVAL;
- }
-
- /*Try to get the number of effective GIDs*/
- ngids = getgroups(0, 0);
- if(ngids < 0)
- {
- finalize();
- return EINVAL;
- }
-
- /*Allocate some memory for the GIDs on the stack*/
- gids = alloca(ngids * sizeof(gid_t));
-
- /*Fetch the GIDs themselves*/
- ngids = getgroups(ngids, gids);
- if(ngids < 0)
- {
- finalize();
- return EINVAL;
- }
-
- /*Obtain the unauthenticated version of `dir`*/
- err = io_restrict_auth(dir, &unauth_dir, 0, 0, 0, 0);
- if(err)
- {
- finalize();
- return err;
- }
-
- /*Go up the translator stack*/
- for(; !err;)
- {
- /*retreive the name and options of the current translator*/
- err = file_get_fs_options(node, &argz, &argz_len);
- if(err)
- break;
-
- LOG_MSG("trace_find: Obtained translator '%s'", argz);
- if(strcmp(argz, name) == 0)
- {
- LOG_MSG("trace_find: Match. Stopping here.");
- break;
- }
-
- /*try to fetch the control port for this translator*/
- err = file_get_translator_cntl(node, &fsys);
- LOG_MSG("trace_find: err = %d", (int)err);
- if(err)
- break;
-
- LOG_MSG("trace_find: Translator control port: %lu", (unsigned long)fsys);
-
- /*fetch the root of the translator*/
- err = fsys_getroot
- (
- fsys, unauth_dir, MACH_MSG_TYPE_COPY_SEND,
- uids, nuids, gids, ngids,
- flags | O_NOTRANS, &retry, retry_name, &node
- );
-
- LOG_MSG("trace_find: fsys_getroot returned %d", (int)err);
- LOG_MSG("trace_find: Translator root: %lu", (unsigned long)node);
-
- /*TODO: Remove this debug output.*/
- char buf[256];
- char * _buf = buf;
- size_t len = 256;
- io_read(node, &_buf, &len, 0, len);
- LOG_MSG("trace_find: Read: '%s'", buf);
- }
-
- /*If the error occurred (most probably) because of the fact that we
- have reached the top of the translator stack*/
- if((err == EMACH_SEND_INVALID_DEST) || (err == ENXIO))
- /*this is OK*/
- err = 0;
-
- /*Return the port to read from*/
- *port = node;
-
- /*Return the result of operations*/
- finalize();
- return err;
- }/*trace_find*/
-/*----------------------------------------------------------------------------*/
+ LOG_MSG ("trace_find: Match. Stopping here.");
+ break;
+ }
+
+ /*try to fetch the control port for this translator */
+ err = file_get_translator_cntl (node, &fsys);
+ LOG_MSG ("trace_find: err = %d", (int) err);
+ if (err)
+ break;
+
+ LOG_MSG ("trace_find: Translator control port: %lu",
+ (unsigned long) fsys);
+
+ prev_node = node;
+
+ /*fetch the root of the translator */
+ err = fsys_getroot
+ (fsys, unauth_dir, MACH_MSG_TYPE_COPY_SEND,
+ uids, nuids, gids, ngids,
+ flags | O_NOTRANS, &retry, retry_name, &node);
+
+ LOG_MSG ("trace_find: fsys_getroot returned %d", (int) err);
+ LOG_MSG ("trace_find: Translator root: %lu", (unsigned long) node);
+
+ /*TODO: Remove this debug output. */
+ /*char buf[256];
+ char * _buf = buf;
+ size_t len = 256;
+ io_read(node, &_buf, &len, 0, len);
+ LOG_MSG("trace_find: Read: '%s'", buf); */
+ }
+
+ /*If the error occurred (most probably) because of the fact that we
+ have reached the top of the translator stack */
+ if ((err == EMACH_SEND_INVALID_DEST) || (err == ENXIO))
+ /*this is OK */
+ err = 0;
+
+ /*Return the port to read from */
+ *port = prev_node;
+
+ /*Return the result of operations */
+ finalize ();
+ return err;
+} /*trace_find */
+
+/*---------------------------------------------------------------------------*/
diff --git a/trace.h b/trace.h
index 511cc369d..397235176 100644
--- a/trace.h
+++ b/trace.h
@@ -1,8 +1,8 @@
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*trace.h*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*The definitions for tracing the translator stack under ourselves.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
/*Copyright (C) 2001, 2002, 2005, 2008 Free Software Foundation, Inc.
Written by Sergiu Ivanov <unlimitedscolobb@gmail.com>.
@@ -20,29 +20,25 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#ifndef __TRACE_H__
#define __TRACE_H__
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
#include <error.h>
#include <sys/types.h>
#include <hurd/iohelp.h>
-/*----------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--------Functions-----------------------------------------------------------*/
-/*Traces the translator stack on the given underlying node until it finds the
- first translator called `name` and returns the port pointing to the
- translator sitting under this one, opened as specified in `flags`.*/
+/*---------------------------------------------------------------------------*/
+/*--------Functions----------------------------------------------------------*/
+/*Traces the translator stack on the given underlying node until it
+ finds the first translator called `name` and returns the port
+ pointing to the translator sitting under this one, opened as
+ specified in `flags`.*/
error_t
-trace_find
- (
- mach_port_t underlying,
- const char * name,
- int flags,
- mach_port_t * port
- );
+ trace_find
+ (mach_port_t underlying, const char *name, int flags, mach_port_t * port);
/*----------------------------------------------------------------------------*/
#endif /*__TRACE_H__*/