(root)/
util-linux-2.39/
sys-utils/
ctrlaltdel.c
       1  /*
       2   * ctrlaltdel.c - Set the function of the Ctrl-Alt-Del combination
       3   * Created 4-Jul-92 by Peter Orbaek <poe@daimi.aau.dk>
       4   * 1999-02-22 Arkadiusz Miƛkiewicz <misiek@pld.ORG.PL>
       5   * - added Native Language Support
       6   */
       7  
       8  #include <getopt.h>
       9  #include <stdio.h>
      10  #include <stdlib.h>
      11  #include <string.h>
      12  #include <errno.h>
      13  #include <unistd.h>
      14  #include <sys/reboot.h>
      15  #include "nls.h"
      16  #include "c.h"
      17  #include "closestream.h"
      18  #include "pathnames.h"
      19  #include "path.h"
      20  
      21  #define LINUX_REBOOT_CMD_CAD_ON 0x89ABCDEF
      22  #define LINUX_REBOOT_CMD_CAD_OFF 0x00000000
      23  
      24  static void __attribute__((__noreturn__)) usage(void)
      25  {
      26  	FILE *out = stdout;
      27  	fputs(USAGE_HEADER, out);
      28  	fprintf(out, _(" %s hard|soft\n"), program_invocation_short_name);
      29  
      30  	fputs(USAGE_SEPARATOR, out);
      31  	fprintf(out, _("Set the function of the Ctrl-Alt-Del combination.\n"));
      32  
      33  	fputs(USAGE_OPTIONS, out);
      34  	printf(USAGE_HELP_OPTIONS(16));
      35  	printf(USAGE_MAN_TAIL("ctrlaltdel(8)"));
      36  	exit(EXIT_SUCCESS);
      37  }
      38  
      39  static int get_cad(void)
      40  {
      41  	uint64_t val;
      42  
      43  	if (ul_path_read_u64(NULL, &val, _PATH_PROC_CTRL_ALT_DEL) != 0)
      44  		err(EXIT_FAILURE, _("cannot read %s"), _PATH_PROC_CTRL_ALT_DEL);
      45  
      46  	switch (val) {
      47  	case 0:
      48  		fputs("soft\n", stdout);
      49  		break;
      50  	case 1:
      51  		fputs("hard\n", stdout);
      52  		break;
      53  	default:
      54  		printf("%s hard\n", _("implicit"));
      55  		warnx(_("unexpected value in %s: %ju"), _PATH_PROC_CTRL_ALT_DEL, val);
      56  		return EXIT_FAILURE;
      57  	}
      58  	return EXIT_SUCCESS;
      59  }
      60  
      61  static int set_cad(const char *arg)
      62  {
      63  	unsigned int cmd;
      64  
      65  	if (geteuid()) {
      66  		warnx(_("You must be root to set the Ctrl-Alt-Del behavior"));
      67  		return EXIT_FAILURE;
      68  	}
      69  	if (!strcmp("hard", arg))
      70  		cmd = LINUX_REBOOT_CMD_CAD_ON;
      71  	else if (!strcmp("soft", arg))
      72  		cmd = LINUX_REBOOT_CMD_CAD_OFF;
      73  	else {
      74  		warnx(_("unknown argument: %s"), arg);
      75  		return EXIT_FAILURE;
      76  	}
      77  	if (reboot(cmd) < 0) {
      78  		warn("reboot");
      79  		return EXIT_FAILURE;
      80  	}
      81  	return EXIT_SUCCESS;
      82  }
      83  
      84  int main(int argc, char **argv)
      85  {
      86  	int ch, ret;
      87  	static const struct option longopts[] = {
      88  		{"version", no_argument, NULL, 'V'},
      89  		{"help", no_argument, NULL, 'h'},
      90  		{NULL, 0, NULL, 0}
      91  	};
      92  
      93  	setlocale(LC_ALL, "");
      94  	bindtextdomain(PACKAGE, LOCALEDIR);
      95  	textdomain(PACKAGE);
      96  	close_stdout_atexit();
      97  
      98  	while ((ch = getopt_long(argc, argv, "Vh", longopts, NULL)) != -1)
      99  		switch (ch) {
     100  		case 'V':
     101  			print_version(EXIT_SUCCESS);
     102  		case 'h':
     103  			usage();
     104  		default:
     105  			errtryhelp(EXIT_FAILURE);
     106  		}
     107  
     108  	if (argc < 2)
     109  		ret = get_cad();
     110  	else
     111  		ret = set_cad(argv[1]);
     112  	return ret;
     113  }