xref: /minix3/minix/commands/svrctl/svrctl.c (revision f737eea6368426d3302d0075f13f73c4bc646e24)
1 #define _MINIX_SYSTEM 1
2 
3 #include <sys/svrctl.h>
4 #include <sys/types.h>
5 #include <ctype.h>
6 #include <lib.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <unistd.h>
11 
12 static void usage(void);
13 
14 #define VFS			"vfs"
15 #define PM			"pm"
16 #define SET			"set"
17 #define GET			"get"
18 
19 static char *bin_name;
20 
main(int argc,char * argv[])21 int main (int argc, char *argv[])
22 {
23   unsigned long param;
24   endpoint_t proc_e = NONE;
25   struct sysgetenv sysgetenv;
26   char *to_whom, *operation, *what, *value;
27   unsigned i;
28 
29   bin_name = argv[0];
30   if (argc < 4 || argc > 5) usage();
31   if (geteuid() != 0) {
32 	fprintf(stderr, "You have to be root to run this utility\n");
33 	exit(EXIT_FAILURE);
34   }
35 
36   /* Make some parameters lower case to ease comparing */
37   to_whom = argv[1];
38   operation = argv[2];
39   what = argv[3];
40   for (i = 0; i < strlen(to_whom); ++i)   to_whom[i] = tolower(to_whom[i]);
41   for (i = 0; i < strlen(operation); ++i) operation[i] = tolower(operation[i]);
42   for (i = 0; i < strlen(what); ++i)      what[i] = tolower(what[i]);
43 
44   if (!strncmp(to_whom, VFS, strlen(VFS)+1)) proc_e = VFS_PROC_NR;
45   else if (!strncmp(to_whom, PM, strlen(PM)+1)) proc_e = PM_PROC_NR;
46   else usage();
47 
48   sysgetenv.key = what;
49   sysgetenv.keylen = strlen(what) + 1;
50 
51   if (!strncmp(operation, SET, strlen(SET)+1)) {
52 	if (argc != 5) usage();
53 	value = argv[4];
54 	sysgetenv.val = value;
55 	sysgetenv.vallen = strlen(value) + 1;
56 
57 	if (proc_e == VFS_PROC_NR)
58 		param = VFSSETPARAM;
59 	else if (proc_e == PM_PROC_NR)
60 		param = PMSETPARAM;
61 	else
62 		usage();
63 
64 	if (svrctl(param, &sysgetenv) != 0) {
65 		if (errno == ESRCH)
66 			fprintf(stderr, "invalid parameter: %s\n", what);
67 		else if (errno == EINVAL)
68 			fprintf(stderr, "invalid value: %s\n", value);
69 		else
70 			perror("");
71 		exit(EXIT_FAILURE);
72 	}
73 	return(EXIT_SUCCESS);
74   } else if (!strncmp(operation, GET, strlen(GET)+1)) {
75 	char get_param_buffer[4096];
76 
77 	memset(get_param_buffer, '\0', sizeof(get_param_buffer));
78 	sysgetenv.val = get_param_buffer;
79 	sysgetenv.vallen = sizeof(get_param_buffer) - 1;
80 
81 	if (proc_e == VFS_PROC_NR)
82 		param = VFSGETPARAM;
83 	else if (proc_e == PM_PROC_NR)
84 		param = PMGETPARAM;
85 	else
86 		usage();
87 
88 	if (svrctl(param, &sysgetenv) != 0) {
89 		if (errno == ESRCH)
90 			fprintf(stderr, "invalid parameter: %s\n", what);
91 		else
92 			perror("");
93 		return(EXIT_FAILURE);
94 	} else {
95 		if (sysgetenv.vallen > 0) {
96 			get_param_buffer[sysgetenv.vallen] = '\0';
97 			printf("%s\n", get_param_buffer);
98 		}
99 	}
100 	return(EXIT_SUCCESS);
101   } else
102 	usage();
103 
104   return(EXIT_FAILURE);
105 }
106 
usage()107 static void usage()
108 {
109   fprintf(stderr, "Usage:\n");
110   fprintf(stderr, "  %s <vfs|pm> set <request> <value>\n", bin_name);
111   fprintf(stderr, "  %s <vfs|pm> get <request>\n", bin_name);
112   exit(EXIT_FAILURE);
113 }
114