Changes in uspace/app/devctl/devctl.c [cb500a2:ce1df04] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/devctl/devctl.c
rcb500a2 rce1df04 35 35 #include <devman.h> 36 36 #include <errno.h> 37 #include <stdbool.h>38 37 #include <stdio.h> 39 38 #include <stdlib.h> … … 45 44 #define MAX_NAME_LENGTH 1024 46 45 47 static char name[MAX_NAME_LENGTH]; 48 static char drv_name[MAX_NAME_LENGTH]; 49 static bool verbose = false; 50 51 static const char *drv_state_str(driver_state_t state) 52 { 53 const char *sstate; 54 55 switch (state) { 56 case DRIVER_NOT_STARTED: 57 sstate = "not started"; 58 break; 59 case DRIVER_STARTING: 60 sstate = "starting"; 61 break; 62 case DRIVER_RUNNING: 63 sstate = "running"; 64 break; 65 default: 66 sstate = "unknown"; 67 } 68 69 return sstate; 70 } 46 char name[MAX_NAME_LENGTH]; 47 char drv_name[MAX_NAME_LENGTH]; 71 48 72 49 static int fun_subtree_print(devman_handle_t funh, int lvl) … … 75 52 devman_handle_t *cfuns; 76 53 size_t count, i; 77 unsigned int score;78 54 int rc; 79 55 int j; … … 98 74 printf("%s : %s\n", name, drv_name); 99 75 100 if (verbose) {101 for (i = 0; true; i++) {102 rc = devman_fun_get_match_id(funh, i, name, MAX_NAME_LENGTH,103 &score);104 if (rc != EOK)105 break;106 107 for (j = 0; j < lvl; j++)108 printf(" ");109 110 printf(" %u %s\n", score, name);111 }112 }113 114 76 rc = devman_fun_get_child(funh, &devh); 115 77 if (rc == ENOENT) … … 197 159 } 198 160 199 static int drv_list(void)200 {201 devman_handle_t *devs;202 devman_handle_t *drvs;203 driver_state_t state;204 const char *sstate;205 size_t ndrvs;206 size_t ndevs;207 size_t i;208 int rc;209 210 rc = devman_get_drivers(&drvs, &ndrvs);211 if (rc != EOK)212 return rc;213 214 for (i = 0; i < ndrvs; i++) {215 devs = NULL;216 217 rc = devman_driver_get_name(drvs[i], drv_name, MAX_NAME_LENGTH);218 if (rc != EOK)219 goto skip;220 rc = devman_driver_get_state(drvs[i], &state);221 if (rc != EOK)222 goto skip;223 rc = devman_driver_get_devices(drvs[i], &devs, &ndevs);224 if (rc != EOK)225 goto skip;226 227 sstate = drv_state_str(state);228 229 printf("%-11s %3zu %s\n", sstate, ndevs, drv_name);230 skip:231 free(devs);232 }233 free(drvs);234 235 return EOK;236 }237 238 static int drv_show(char *drvname)239 {240 devman_handle_t *devs;241 devman_handle_t drvh;242 devman_handle_t funh;243 driver_state_t state;244 const char *sstate;245 unsigned int score;246 size_t ndevs;247 size_t i;248 int rc;249 250 rc = devman_driver_get_handle(drvname, &drvh);251 if (rc != EOK)252 return rc;253 254 devs = NULL;255 256 rc = devman_driver_get_name(drvh, drv_name, MAX_NAME_LENGTH);257 if (rc != EOK)258 return rc;259 260 rc = devman_driver_get_state(drvh, &state);261 if (rc != EOK)262 return rc;263 264 rc = devman_driver_get_devices(drvh, &devs, &ndevs);265 if (rc != EOK)266 return rc;267 268 sstate = drv_state_str(state);269 270 printf("Driver: %s\n", drv_name);271 printf("State: %s\n", sstate);272 273 printf("Attached devices:\n");274 275 for (i = 0; i < ndevs; i++) {276 rc = devman_dev_get_parent(devs[i], &funh);277 if (rc != EOK)278 goto error;279 280 rc = devman_fun_get_path(funh, name, MAX_NAME_LENGTH);281 if (rc != EOK)282 goto error;283 printf("\t%s\n", name);284 }285 286 printf("Match IDs:\n");287 288 for (i = 0; true; i++) {289 rc = devman_driver_get_match_id(drvh, i, name, MAX_NAME_LENGTH,290 &score);291 if (rc != EOK)292 break;293 294 printf("\t%u %s\n", score, name);295 }296 297 error:298 free(devs);299 300 return EOK;301 }302 303 static int drv_load(const char *drvname)304 {305 int rc;306 devman_handle_t drvh;307 308 rc = devman_driver_get_handle(drvname, &drvh);309 if (rc != EOK) {310 printf("Failed resolving driver '%s' (%d).\n", drvname, rc);311 return rc;312 }313 314 rc = devman_driver_load(drvh);315 if (rc != EOK) {316 printf("Failed loading driver '%s' (%d).\n", drvname, rc);317 return rc;318 }319 320 return EOK;321 }322 323 161 static void print_syntax(void) 324 162 { 325 printf("syntax:\n"); 326 printf("\tdevctl\n"); 327 printf("\tdevctl online <function>]\n"); 328 printf("\tdevctl offline <function>]\n"); 329 printf("\tdevctl list-drv\n"); 330 printf("\tdevctl show-drv <driver-name>\n"); 331 printf("\tdevctl load-drv <driver-name>\n"); 163 printf("syntax: devctl [(online|offline) <function>]\n"); 332 164 } 333 165 … … 336 168 int rc; 337 169 338 if (argc == 1 || argv[1][0] == '-') { 339 if (argc > 1) { 340 if (str_cmp(argv[1], "-v") == 0) { 341 verbose = true; 342 } else { 343 printf(NAME ": Invalid argument '%s'\n", argv[1]); 344 print_syntax(); 345 return 1; 346 } 347 } 170 if (argc == 1) { 348 171 rc = fun_tree_print(); 349 172 if (rc != EOK) … … 371 194 return 2; 372 195 } 373 } else if (str_cmp(argv[1], "list-drv") == 0) {374 rc = drv_list();375 if (rc != EOK)376 return 2;377 } else if (str_cmp(argv[1], "show-drv") == 0) {378 if (argc < 3) {379 printf(NAME ": Argument missing.\n");380 print_syntax();381 return 1;382 }383 384 rc = drv_show(argv[2]);385 if (rc != EOK) {386 return 2;387 }388 } else if (str_cmp(argv[1], "load-drv") == 0) {389 if (argc < 3) {390 printf(NAME ": Argument missing.\n");391 print_syntax();392 return 1;393 }394 395 rc = drv_load(argv[2]);396 if (rc != EOK)397 return 2;398 196 } else { 399 197 printf(NAME ": Invalid argument '%s'.\n", argv[1]);
Note:
See TracChangeset
for help on using the changeset viewer.