aboutsummaryrefslogtreecommitdiff
path: root/libdiskfs/init-init.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdiskfs/init-init.c')
-rw-r--r--libdiskfs/init-init.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/libdiskfs/init-init.c b/libdiskfs/init-init.c
new file mode 100644
index 00000000..11624763
--- /dev/null
+++ b/libdiskfs/init-init.c
@@ -0,0 +1,105 @@
+/*
+ Copyright (C) 1994, 95, 96, 97, 98, 99 Free Software Foundation, Inc.
+
+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 the GNU Hurd; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* Written by Michael I. Bushnell. */
+
+#include "priv.h"
+#include <device/device.h>
+#include <hurd/fsys.h>
+#include <stdio.h>
+#include <maptime.h>
+
+mach_port_t diskfs_default_pager;
+mach_port_t diskfs_auth_server_port;
+volatile struct mapped_time_value *diskfs_mtime;
+mach_port_t diskfs_fsys_identity;
+
+int _diskfs_nosuid, _diskfs_noexec;
+int _diskfs_noatime;
+
+struct hurd_port _diskfs_exec_portcell;
+
+spin_lock_t diskfs_node_refcnt_lock = SPIN_LOCK_INITIALIZER;
+
+spin_lock_t _diskfs_control_lock = SPIN_LOCK_INITIALIZER;
+int _diskfs_ncontrol_ports = 0;
+
+struct port_class *diskfs_protid_class;
+struct port_class *diskfs_control_class;
+struct port_class *diskfs_initboot_class;
+struct port_class *diskfs_execboot_class;
+struct port_class *diskfs_shutdown_notification_class;
+
+struct port_bucket *diskfs_port_bucket;
+
+/* Call this after arguments have been parsed to initialize the
+ library. */
+error_t
+diskfs_init_diskfs (void)
+{
+ error_t err;
+
+ if (diskfs_boot_flags)
+ /* This is a boot filesystem, we have to do some things specially. */
+ {
+ mach_port_t host;
+ err = get_privileged_ports (&host, 0);
+ if (! err)
+ {
+ diskfs_default_pager = MACH_PORT_NULL;
+ err = vm_set_default_memory_manager (host, &diskfs_default_pager);
+ mach_port_deallocate (mach_task_self (), host);
+
+ if (!err)
+ err = maptime_map (1, 0, &diskfs_mtime);
+ }
+ }
+ else
+ err = maptime_map (0, 0, &diskfs_mtime);
+
+ if (err)
+ return err;
+
+ err = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE,
+ &diskfs_fsys_identity);
+ if (err)
+ return err;
+
+ diskfs_auth_server_port = getauth ();
+
+ diskfs_protid_class = ports_create_class (diskfs_protid_rele, 0);
+ diskfs_control_class = ports_create_class (_diskfs_control_clean, 0);
+ diskfs_initboot_class = ports_create_class (0, 0);
+ diskfs_execboot_class = ports_create_class (0, 0);
+ diskfs_shutdown_notification_class = ports_create_class (0, 0);
+
+ diskfs_port_bucket = ports_create_bucket ();
+
+ _hurd_port_init (&_diskfs_exec_portcell, MACH_PORT_NULL);
+
+ return 0;
+}
+
+void
+_diskfs_control_clean (void *arg __attribute__ ((unused)))
+{
+ spin_lock (&_diskfs_control_lock);
+ _diskfs_ncontrol_ports--;
+ spin_unlock (&_diskfs_control_lock);
+}