From cf040539342d513ca9ae534efd0e21116440cc86 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Thu, 7 Jul 2016 23:24:37 +0200 Subject: sutils: New utility 'bless'. * sutils/Makefile (progs): Add 'bless'. * sutils/bless.c: New file. --- sutils/bless.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 sutils/bless.c (limited to 'sutils/bless.c') diff --git a/sutils/bless.c b/sutils/bless.c new file mode 100644 index 00000000..039320ab --- /dev/null +++ b/sutils/bless.c @@ -0,0 +1,96 @@ +/* Bless processes. + + Copyright (C) 2016 Free Software Foundation, Inc. + + 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. If not, see . */ + +#include +#include +#include +#include +#include +#include + +const char *argp_program_version = STANDARD_HURD_VERSION (bless); + +pid_t pid; + +static const struct argp_option options[] = +{ + {0} +}; + +static const char args_doc[] = "PID"; +static const char doc[] = "Bless the given process. Such a process is " + "considered an essential part of the operating system and is not " + "terminated when switching runlevels."; + +/* Parse our options... */ +error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + char *end; + + switch (key) + { + case ARGP_KEY_ARG: + if (state->arg_num > 0) + argp_error (state, "Too many non option arguments"); + + pid = strtol (arg, &end, 10); + if (arg == end || *end != '\0') + argp_error (state, "Malformed pid '%s'", arg); + break; + + case ARGP_KEY_NO_ARGS: + argp_usage (state); + + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +const struct argp argp = + { + options: options, + parser: parse_opt, + args_doc: args_doc, + doc: doc, + }; + +int +main (int argc, char **argv) +{ + error_t err; + process_t proc; + + /* Parse our arguments. */ + argp_parse (&argp, argc, argv, 0, 0, 0); + + err = proc_pid2proc (getproc (), pid, &proc); + if (err) + error (1, err, "Could not get process for pid %d", pid); + + err = proc_mark_important (proc); + if (err) + error (1, err, "Could not mark process as important"); + + err = mach_port_deallocate (mach_task_self (), proc); + assert_perror (err); + + return EXIT_SUCCESS; +} -- cgit v1.2.3