]> git.ipfire.org Git - thirdparty/util-linux.git/blob - sys-utils/ctrlaltdel.c
Merge branch 'usage-part2' of https://github.com/rudimeier/util-linux
[thirdparty/util-linux.git] / 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 fputs(USAGE_HELP, out);
35 fputs(USAGE_VERSION,out);
36 fprintf(out, USAGE_MAN_TAIL("ctrlaltdel(8)"));
37 exit(EXIT_SUCCESS);
38 }
39
40 static int get_cad(void)
41 {
42 uint64_t val = path_read_u64(_PATH_PROC_CTRL_ALT_DEL);
43
44 switch (val) {
45 case 0:
46 fputs("soft\n", stdout);
47 break;
48 case 1:
49 fputs("hard\n", stdout);
50 break;
51 default:
52 printf("%s hard\n", _("implicit"));
53 warnx(_("unexpected value in %s: %ju"), _PATH_PROC_CTRL_ALT_DEL, val);
54 return EXIT_FAILURE;
55 }
56 return EXIT_SUCCESS;
57 }
58
59 static int set_cad(const char *arg)
60 {
61 unsigned int cmd;
62
63 if (geteuid()) {
64 warnx(_("You must be root to set the Ctrl-Alt-Del behavior"));
65 return EXIT_FAILURE;
66 }
67 if (!strcmp("hard", arg))
68 cmd = LINUX_REBOOT_CMD_CAD_ON;
69 else if (!strcmp("soft", arg))
70 cmd = LINUX_REBOOT_CMD_CAD_OFF;
71 else {
72 warnx(_("unknown argument: %s"), arg);
73 return EXIT_FAILURE;
74 }
75 if (reboot(cmd) < 0) {
76 warnx("reboot");
77 return EXIT_FAILURE;
78 }
79 return EXIT_SUCCESS;
80 }
81
82 int main(int argc, char **argv)
83 {
84 int ch, ret;
85 static const struct option longopts[] = {
86 {"version", no_argument, NULL, 'V'},
87 {"help", no_argument, NULL, 'h'},
88 {NULL, 0, NULL, 0}
89 };
90
91 setlocale(LC_ALL, "");
92 bindtextdomain(PACKAGE, LOCALEDIR);
93 textdomain(PACKAGE);
94 atexit(close_stdout);
95
96 while ((ch = getopt_long(argc, argv, "Vh", longopts, NULL)) != -1)
97 switch (ch) {
98 case 'V':
99 printf(UTIL_LINUX_VERSION);
100 return EXIT_SUCCESS;
101 case 'h':
102 usage();
103 default:
104 errtryhelp(EXIT_FAILURE);
105 }
106
107 if (argc < 2)
108 ret = get_cad();
109 else
110 ret = set_cad(argv[1]);
111 return ret;
112 }