/* Multiplexing filesystems by user Copyright (C) 1997, 2000, 2009 Free Software Foundation, Inc. Written by Miles Bader This file is part of the GNU Hurd. The GNU Hurd is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. The GNU Hurd is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ #ifndef __USERMUX_H__ #define __USERMUX_H__ #include #include #include struct passwd; /* Filenos (aka inode numbers) for user nodes are the uid + this. */ #define USERMUX_FILENO_UID_OFFSET 10 /* Handy source of time. */ volatile struct mapped_time_value *usermux_maptime; /* The state associated with a user multiplexer translator. */ struct usermux { /* The user nodes in this mux. */ struct usermux_name *names; struct rwlock names_lock; /* A template argz, which is used to start each user-specific translator with the user name appropriately added. */ char *trans_template; size_t trans_template_len; /* What string to replace in TRANS_TEMPLATE with the name of the various user params; if none occur in the template, the user's home dir is appended as an additional argument. */ char *user_pat; /* User name */ char *home_pat; /* Home directory */ char *uid_pat; /* Numeric user id */ /* Constant fields for user stat entries. */ struct stat stat_template; /* The file that this translator is sitting on top of; we inherit various characteristics from it. */ file_t underlying; }; /* The name of a recently looked up user entry. */ struct usermux_name { const char *name; /* Looked up name. */ /* A filesystem node associated with NAME. */ struct node *node; struct usermux_name *next; }; /* The fs specific storage that libnetfs associates with each filesystem node. */ struct netnode { /* The mux this node belongs to (the node can either be the mux root, or one of the users served by it). */ struct usermux *mux; /* For mux nodes, 0, and for leaf nodes, the name under which the node was looked up. */ struct usermux_name *name; /* The translator associated with node, or if its a symlink, just the link target. */ char *trans; size_t trans_len; }; error_t create_user_node (struct usermux *mux, struct usermux_name *name, struct passwd *pw, struct node **node); #endif /* __USERMUX_H__ */