/* Callback function needed for calls to fshelp_fetch_root. See <hurd/fshelp.h> for the interface description. */ static error_t _netfs_translator_callback2_fn (void *cookie1, void *cookie2, int flags, mach_port_t *underlying, mach_msg_type_name_t *underlying_type) { error_t err; struct protid *cred; struct node *node = cookie1; struct iouser *user; err = iohelp_create_simple_iouser (&user, node->nn_stat.st_uid, node->nn_stat.st_gid); if (err) return err; cred = netfs_make_protid (netfs_make_peropen (node, flags, cookie2), user); if (cred) { *underlying = ports_get_right (cred); *underlying_type = MACH_MSG_TYPE_MAKE_SEND; ports_port_deref (cred); return 0; } else { iohelp_free_iouser (user); return errno; } }
error_t netfs_S_dir_mkfile (struct protid *diruser, int flags, mode_t mode, mach_port_t *newfile, mach_msg_type_name_t *newfiletype) { error_t err; struct node *np; struct iouser *user; struct protid *newpi; pthread_mutex_lock (&diruser->po->np->lock); err = netfs_attempt_mkfile (diruser->user, diruser->po->np, mode, &np); if (!err) { /* the dir is now unlocked and NP is locked */ flags &= OPENONLY_STATE_MODES; err = iohelp_dup_iouser (&user, diruser->user); if (! err) { newpi = netfs_make_protid (netfs_make_peropen (np, flags, diruser->po), user); if (newpi) { *newfile = ports_get_right (newpi); *newfiletype = MACH_MSG_TYPE_MAKE_SEND; ports_port_deref (newpi); } else { err = errno; iohelp_free_iouser (user); } } netfs_nput (np); } return err; }
error_t netfs_S_io_restrict_auth (struct protid *user, mach_port_t *newport, mach_msg_type_name_t *newporttype, uid_t *uids, mach_msg_type_number_t nuids, gid_t *gids, mach_msg_type_number_t ngids) { error_t err; struct protid *newpi; struct iouser *new_user; if (!user) return EOPNOTSUPP; err = iohelp_restrict_iouser (&new_user, user->user, uids, nuids, gids, ngids); if (err) return err; refcount_ref (&user->po->refcnt); newpi = netfs_make_protid (user->po, new_user); if (newpi) { *newport = ports_get_right (newpi); *newporttype = MACH_MSG_TYPE_MAKE_SEND; } else { refcount_deref (&user->po->refcnt); iohelp_free_iouser (new_user); err = ENOMEM; } ports_port_deref (newpi); return err; }