From 5e3ee224ab284d1329d2b71ef9a3f5cae9859376 Mon Sep 17 00:00:00 2001 From: "Michael I. Bushnell" Date: Sun, 14 Jul 1996 00:09:53 +0000 Subject: (netfs_S_io_reauthenticate): Repeat auth_server_authenticate for as long as we get EINTR. Tolerate other errors without crashing as well. --- libnetfs/io-reauthenticate.c | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) (limited to 'libnetfs/io-reauthenticate.c') diff --git a/libnetfs/io-reauthenticate.c b/libnetfs/io-reauthenticate.c index 3d8db79d..5b33b65c 100644 --- a/libnetfs/io-reauthenticate.c +++ b/libnetfs/io-reauthenticate.c @@ -29,6 +29,7 @@ netfs_S_io_reauthenticate (struct protid *user, mach_port_t rend_port) uid_t *gen_uids, *gen_gids, *aux_uids, *aux_gids; u_int genuidlen, gengidlen, auxuidlen, auxgidlen; error_t err; + mach_port_t newright; if (!user) return EOPNOTSUPP; @@ -41,20 +42,31 @@ netfs_S_io_reauthenticate (struct protid *user, mach_port_t rend_port) mutex_lock (&user->po->np->lock); newpi = netfs_make_protid (user->po, 0); - err = auth_server_authenticate (netfs_auth_server_port, - rend_port, - MACH_MSG_TYPE_COPY_SEND, - ports_get_right (newpi), - MACH_MSG_TYPE_MAKE_SEND, - &gen_uids, &genuidlen, - &aux_uids, &auxuidlen, - &gen_gids, &gengidlen, - &aux_uids, &auxuidlen); - mach_port_deallocate (mach_task_self (), rend_port); + + newright = ports_get_right (newpi); + err = mach_port_insert_right (mach_task_self (), newpi, newpi, + MACH_MSG_TYPE_MAKE_SEND); assert_perror (err); - - newpi->credential = netfs_make_credential (gen_uids, genuidlen, - gen_gids, gengidlen); + do + err = auth_server_authenticate (netfs_auth_server_port, + rend_port, + MACH_MSG_TYPE_COPY_SEND, + newright, + MACH_MSG_TYPE_COPY_SEND, + &gen_uids, &genuidlen, + &aux_uids, &auxuidlen, + &gen_gids, &gengidlen, + &aux_uids, &auxuidlen); + while (err == EINTR); + mach_port_deallocate (mach_task_self (), rend_port); + mach_port_deallocate (mach_task_self (), newright); + + if (err) + newpi->credential = netfs_make_credential (0, 0, 0, 0); + else + newpi->credential = netfs_make_credential (gen_uids, genuidlen, + gen_gids, gengidlen); + mutex_unlock (&user->po->np->lock); ports_port_deref (newpi); -- cgit v1.2.3