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 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 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