summaryrefslogtreecommitdiff
path: root/libtreefs/rights.c
diff options
context:
space:
mode:
Diffstat (limited to 'libtreefs/rights.c')
-rw-r--r--libtreefs/rights.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/libtreefs/rights.c b/libtreefs/rights.c
new file mode 100644
index 00000000..f803b029
--- /dev/null
+++ b/libtreefs/rights.c
@@ -0,0 +1,96 @@
+/* Functions for making send rights in various ways
+
+ Copyright (C) 1995 Free Software Foundation, Inc.
+
+ Written by Miles Bader <miles@gnu.ai.mit.edu>
+
+ 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* Return in PORT a send right for a new protid, pointing at the peropen PO,
+ with rights initialized from AUTH. */
+error_t
+treefs_peropen_create_right (struct treefs_peropen *po,
+ struct treefs_auth *auth,
+ mach_port_t *port)
+{
+ struct treefs_node *node = po->node;
+ struct treefs_fsys *fsys = node->fsys;
+ struct treefs_handle *handle =
+ ports_allocate_port (fsys->port_bucket,
+ sizeof (struct treefs_handle),
+ fsys->handle_port_class);
+
+ if (handle == NULL)
+ return MACH_PORT_NULL;
+
+ handle->po = po;
+ po->refs++;
+ handle->auth = auth;
+ auth->refs++;
+
+ err = treefs_node_init_handle (node, handle);
+ if (err)
+ {
+ po->refs--;
+ auth->refs--;
+ }
+
+ *port = ports_get_right (handle);
+
+ return 0;
+}
+
+/* Return in PORT a send right for a new handle and a new peropen, pointing
+ at NODE, with rights initialized from AUTH. FLAGS and PARENT_PORT are used
+ to initialize the corresponding fields in the new peropen. */
+error_t
+treefs_node_create_right (struct treefs_node *node, int flags,
+ mach_port_t parent_port, struct treefs_auth *auth,
+ mach_port_t *port)
+{
+ struct treefs_peropen *po = malloc (sizeof (struct treefs_peropen));
+
+ if (po == NULL)
+ return ENOMEM;
+
+ /* Initialize the peropen structure. */
+ po->refs = 0;
+ po->node = node;
+ po->open_flags = flags;
+ po->user_lock_state = LOCK_UN;
+ po->parent_port = parent_port;
+ if (parent_port != MACH_PORT_NULL)
+ mach_port_mod_refs (mach_task_self (),
+ parent_port, MACH_PORT_RIGHT_SEND, 1);
+
+ treefs_node_ref (node);
+
+ err = treefs_node_init_peropen (node, po, flags, auth);
+ if (err)
+ goto puke;
+
+ err = treefs_peropen_create_right (po, auth, port);
+ if (err)
+ goto puke;
+
+ return 0;
+
+ puke:
+ treefs_node_unref (node);
+ free (po);
+ return err;
+}