From fa3f1f47cbee8d8cd572f6986583c8e95f85a562 Mon Sep 17 00:00:00 2001 From: Miles Bader Date: Mon, 26 May 1997 23:19:36 +0000 Subject: Initial checkin --- utils/unsu.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 utils/unsu.c (limited to 'utils/unsu.c') diff --git a/utils/unsu.c b/utils/unsu.c new file mode 100644 index 00000000..4672821b --- /dev/null +++ b/utils/unsu.c @@ -0,0 +1,90 @@ +/* Attempt to undo a previous su + + Copyright (C) 1997 Free Software Foundation, Inc. + + Written by Miles Bader + + This program 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "frobauth.h" +#include "pids.h" + +const char *argp_program_version = STANDARD_HURD_VERSION (rmauth); + +static struct argp_child child_argps[] = {{ &frobauth_no_ugids_argp }, { 0 }}; + +static char doc[] = + "Attempt to undo a previous su" + "\vThis command is convenient, but will only correctly undo a limited" + " subset of possible su commands. It works by simply deleting all" + " current effective ids and the first two available ids, and then" + " making the first remaining available id the current effective id."; + +void +main (int argc, char *argv[]) +{ + struct frobauth frobauth = FROBAUTH_INIT; + + /* Modify UGIDS, to be what PID's new authentication should be, NOISE is + ignored. */ + error_t modify (struct ugids *ugids, const struct ugids *noise, + pid_t pid, void *hook) + { + error_t err = 0; + + idvec_clear (&ugids->eff_uids); + idvec_clear (&ugids->eff_gids); + idvec_clear (&ugids->imp_eff_gids); + + idvec_delete (&ugids->avail_uids, 0); + idvec_delete (&ugids->avail_uids, 0); + + idvec_delete (&ugids->avail_gids, 0); + idvec_delete (&ugids->avail_gids, 0); + idvec_keep (&ugids->imp_avail_gids, &ugids->avail_gids); + + if (ugids->avail_uids.num > 0) + err = ugids_set_posix_user (ugids, ugids->avail_uids.ids[0]); + + return err; + } + void print_info (const struct ugids *new, + const struct ugids *old, + const struct ugids *removed, + pid_t pid, void *hook) + { + char *new_rep = ugids_rep (new, 1, 1, 0, 0, 0); + printf ("%d: Changed auth to %s\n", pid, new_rep); + free (new_rep); + } + struct argp argp = { 0, 0, 0, doc, child_argps }; + + /* Parse our command line. This shouldn't ever return an error. */ + argp_parse (&argp, argc, argv, 0, 0, &frobauth); + + if (frobauth_modify (&frobauth, modify, print_info, 0)) + exit (0); + else + exit (1); +} -- cgit v1.2.3