1 /*
2  *  Author:  Daniel De Graaf <dgdegra@tycho.nsa.gov>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License version 2,
6  *  as published by the Free Software Foundation.
7  */
8 
9 #include <stdlib.h>
10 #include <errno.h>
11 #include <stdio.h>
12 #include <xenctrl.h>
13 #include <fcntl.h>
14 #include <sys/mman.h>
15 #include <sys/stat.h>
16 #include <string.h>
17 #include <unistd.h>
18 #include <inttypes.h>
19 
usage(char ** argv)20 static void usage(char **argv)
21 {
22 	fprintf(stderr, "Usage: %s {name|-a}\n", argv[0]);
23 	exit(1);
24 }
25 
all_bools(xc_interface * xch)26 static int all_bools(xc_interface *xch)
27 {
28 	int err = 0, i = 0, curr, pend;
29 	char name[256];
30 	while (1) {
31 		err = xc_flask_getbool_byid(xch, i, name, sizeof name, &curr, &pend);
32 		if (err < 0) {
33 			if (errno == ENOENT)
34 				return 0;
35 			fprintf(stderr, "xc_flask_getbool: Unable to get boolean #%d: %s (%d)",
36 				i, strerror(errno), err);
37 			return 2;
38 		}
39 		if (curr == pend)
40 			printf("%s: %d\n", name, curr);
41 		else
42 			printf("%s: %d (pending %d)\n", name, curr, pend);
43 		i++;
44 	}
45 }
46 
main(int argc,char ** argv)47 int main(int argc, char **argv)
48 {
49 	int err = 0;
50 	xc_interface *xch;
51 	int curr, pend;
52 
53 	if (argc != 2)
54 		usage(argv);
55 
56 	xch = xc_interface_open(0,0,0);
57 	if ( !xch )
58 	{
59 		fprintf(stderr, "Unable to create interface to xenctrl: %s\n",
60 				strerror(errno));
61 		err = 1;
62 		goto done;
63 	}
64 
65 	if (!strcmp(argv[1], "-a"))
66 	{
67 		err = all_bools(xch);
68 		goto done;
69 	}
70 
71 	err = xc_flask_getbool_byname(xch, argv[1], &curr, &pend);
72 	if (err) {
73 		fprintf(stderr, "xc_flask_getbool: Unable to get boolean %s: %s (%d)",
74 			argv[1], strerror(errno), err);
75 		err = 2;
76 		goto done;
77 	}
78 
79 	if (curr == pend)
80 		printf("%s: %d\n", argv[1], curr);
81 	else
82 		printf("%s: %d (pending %d)\n", argv[1], curr, pend);
83 
84  done:
85 	if ( xch )
86 		xc_interface_close(xch);
87 
88 	return err;
89 }
90