diff options
author | Michael I. Bushnell <mib@gnu.org> | 1996-04-30 19:09:26 +0000 |
---|---|---|
committer | Michael I. Bushnell <mib@gnu.org> | 1996-04-30 19:09:26 +0000 |
commit | 1943ccd6e5f29b04e0f7059df6f76be8f82c55d9 (patch) | |
tree | 6c7e900a22d03de8abe0fe176a2769c313dfc0a1 /libdiskfs | |
parent | 7d4d2739cc4899f196c037b4352ef94c419cc563 (diff) |
Include <string.h> and <hurd/startup.h>.
(diskfs_startup_diskfs): If not bootstrap filesystem, call
_diskfs_init_completed here.
(diskfs_S_startup_dosync): New function (commented out).
(_diskfs_init_completed): New function.
Diffstat (limited to 'libdiskfs')
-rw-r--r-- | libdiskfs/init-startup.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/libdiskfs/init-startup.c b/libdiskfs/init-startup.c index ca1764e1..b9857c76 100644 --- a/libdiskfs/init-startup.c +++ b/libdiskfs/init-startup.c @@ -21,7 +21,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "priv.h" #include <stdio.h> +#include <string.h> #include <hurd/fsys.h> +#include <hurd/startup.h> mach_port_t diskfs_startup_diskfs (mach_port_t bootstrap, int flags) @@ -50,6 +52,8 @@ diskfs_startup_diskfs (mach_port_t bootstrap, int flags) } mach_port_deallocate (mach_task_self (), bootstrap); _diskfs_ncontrol_ports++; + + _diskfs_init_completed (); } else { @@ -65,3 +69,85 @@ diskfs_startup_diskfs (mach_port_t bootstrap, int flags) return realnode; } + +#if 0 +error_t +diskfs_S_startup_dosync (mach_port_t handle) +{ + struct port_info *pi + = ports_lookup_port (diskfs_port_bucket, + diskfs_shutdown_notification_class); + if (!pi) + return EOPNOTSUPP; + + /* First start a sync so that if something goes wrong + we at least get this much done. */ + diskfs_sync_everything (0); + diskfs_set_hypermetadata (0, 0); + + rwlock_writer_lock (&diskfs_fsys_lock); + + /* Permit all the current RPC's to finish, and then suspend new ones */ + err = ports_inhibit_class_rpcs (diskfs_protid_class); + if (err) + return err; + + diskfs_shutdown_pager (); + diskfs_set_hypermetadata (1, 1); + + return 0; +} +#endif + +/* This is called when we have an ordinary environment, complete + with proc and auth ports. */ +void +_diskfs_init_completed () +{ + startup_t init; + process_t proc; + error_t err; + struct port_info *pi; + mach_port_t notify; + + /* Contact the startup server and register our shutdown request. + If we get an error, print an informational message. */ + + proc = getproc (); + assert (proc); + + err = ports_create_port (diskfs_shutdown_notification_class, + diskfs_port_bucket, sizeof (struct port_info), + &pi); + if (err) + goto errout; + + err = proc_getmsgport (proc, 1, &init); + mach_port_deallocate (mach_task_self (), proc); + if (err) + goto errout; + + notify = ports_get_right (pi); + ports_port_deref (pi); + err = mach_port_insert_right (mach_task_self (), notify, notify, + MACH_MSG_TYPE_MAKE_SEND); + if (err) + { + mach_port_deallocate (mach_task_self (), init); + goto errout; + } + + err = startup_request_notification (init, notify /* , name */); + if (err) + goto errout; + + mach_port_deallocate (mach_task_self (), init); + mach_port_deallocate (mach_task_self (), notify); + return; + + errout: + fprintf (stderr, "Cannot request shutdown notification: %s\n", + strerror (err)); +} + + |