summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael I. Bushnell <mib@gnu.org>1994-02-18 19:27:27 +0000
committerMichael I. Bushnell <mib@gnu.org>1994-02-18 19:27:27 +0000
commitd0115ef6335480777c54c34b9070306ee9d4e8e2 (patch)
treec49888f762c0079f1b4454dcca0041daf22ccac9
parent0080e3042c8956a7a65d623bbfbd83c603e2cf74 (diff)
Initial revision
-rw-r--r--libtrivfs/io-reauthenticate.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/libtrivfs/io-reauthenticate.c b/libtrivfs/io-reauthenticate.c
new file mode 100644
index 00000000..82ab77bc
--- /dev/null
+++ b/libtrivfs/io-reauthenticate.c
@@ -0,0 +1,71 @@
+/*
+ Copyright (C) 1993, 1994 Free Software Foundation
+
+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. */
+
+error_t
+trivfs_S_io_reauthenticate (struct protid *cred,
+ int rendint)
+{
+ struct protid *newcred;
+ uid_t *gen_uids = alloca (sizeof (uid_t) * 20);
+ uid_t *gen_gids = alloca (sizeof (uid_t) * 20);
+ uid_t *aux_uids = alloca (sizeof (uid_t) * 20);
+ uid_t *aux_gids = alloca (sizeof (uid_t) * 20);
+ u_int genuidlen, gengidlen, auxuidlen, auxgidlen;
+ uid_t *gubuf, *ggbuf, *aubuf, *agbuf;
+ error_t err;
+
+ if (cred == 0)
+ return EOPNOTSUPP;
+
+ genuidlen = gengidlen = auxuidlen = auxgidlen = 20;
+ gubuf = gen_uids; ggbuf = gen_gids;
+ aubuf = aux_uids; agbuf = aux_gids;
+
+ mutex_lock (&cred->po->np->lock);
+ newcred = diskfs_start_protid (cred->po);
+ err = auth_server_authenticate (diskfs_auth_server_port,
+ ports_get_right (cred),
+ MACH_MSG_TYPE_MAKE_SEND,
+ rend_int,
+ ports_get_right (newcred),
+ MACH_MSG_TYPE_MAKE_SEND,
+ &gen_uids, &genuidlen,
+ &aux_uids, &auxuidlen,
+ &gen_gids, &gengidlen,
+ &aux_gids, &auxgidlen);
+ assert (!err); /* XXX */
+
+ diskfs_finish_protid (newcred, gen_uids, genuidlen, gen_gids, gengidlen);
+
+ if (gubuf != gen_uids)
+ vm_deallocate (mach_task_self (), (u_int) gen_uids,
+ genuidlen * sizeof (uid_t));
+ if (ggbuf != gen_gids)
+ vm_deallocate (mach_task_self (), (u_int) gen_gids,
+ gengidlen * sizeof (uid_t));
+ if (aubuf != aux_uids)
+ vm_deallocate (mach_task_self (), (u_int) aux_uids,
+ auxuidlen * sizeof (uid_t));
+ if (agbuf != aux_gids)
+ vm_deallocate (mach_task_self (), (u_int) aux_gids,
+ auxgidlen * sizeof (uid_t));
+
+ return 0;