void sigterm_handler (int signo) { ports_class_iterate (socketport_class, ports_destroy_right); sleep (10); signal (SIGTERM, SIG_DFL); raise (SIGTERM); }
/* The system is going down; destroy all the extant port rights. That will cause net channels and such to close promptly. */ error_t S_startup_dosync (mach_port_t handle) { struct port_info *inpi = ports_lookup_port (pfinet_bucket, handle, shutdown_notify_class); if (!inpi) return EOPNOTSUPP; ports_class_iterate (socketport_class, ports_destroy_right); return 0; }
error_t fshelp_get_identity (struct port_bucket *bucket, ino_t fileno, mach_port_t *pt) { struct idspec *i; error_t err = 0; error_t check_port (void *arg) { struct idspec *i = arg; if (i->fileno == fileno) { *pt = ports_get_right (i); return 1; } else return 0; } mutex_lock (&idlock); if (!idclass) id_initialize (); *pt = MACH_PORT_NULL; ports_class_iterate (idclass, check_port); if (*pt != MACH_PORT_NULL) { mutex_unlock (&idlock); return 0; } err = ports_create_port (idclass, bucket, sizeof (struct idspec), &i); if (err) { mutex_unlock (&idlock); return err; } i->fileno = fileno; *pt = ports_get_right (i); ports_port_deref (i); mutex_unlock (&idlock); return 0; }
/* Implement io_revoke as described in <hurd/io.defs>. */ kern_return_t diskfs_S_io_revoke (struct protid *cred) { error_t err; struct node *np; error_t iterator_function (void *port) { struct protid *user = port; if ((user != cred) && (user->po->np == np)) ports_destroy_right (user); return 0; } if (!cred) return EOPNOTSUPP; np = cred->po->np; mutex_lock (&np->lock); err = fshelp_isowner (&np->dn_stat, cred->user); mutex_unlock (&np->lock); if (err) return err; ports_inhibit_bucket_rpcs (diskfs_port_bucket); ports_class_iterate (diskfs_protid_class, iterator_function); ports_resume_bucket_rpcs (diskfs_port_bucket); return 0; }