Changes in uspace/app/devctl/devctl.c [ce1df04:cb500a2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/devctl/devctl.c
rce1df04 rcb500a2 35 35 #include <devman.h> 36 36 #include <errno.h> 37 #include <stdbool.h> 37 38 #include <stdio.h> 38 39 #include <stdlib.h> … … 44 45 #define MAX_NAME_LENGTH 1024 45 46 46 char name[MAX_NAME_LENGTH]; 47 char drv_name[MAX_NAME_LENGTH]; 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 } 48 71 49 72 static int fun_subtree_print(devman_handle_t funh, int lvl) … … 52 75 devman_handle_t *cfuns; 53 76 size_t count, i; 77 unsigned int score; 54 78 int rc; 55 79 int j; … … 74 98 printf("%s : %s\n", name, drv_name); 75 99 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 76 114 rc = devman_fun_get_child(funh, &devh); 77 115 if (rc == ENOENT) … … 159 197 } 160 198 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 161 323 static void print_syntax(void) 162 324 { 163 printf("syntax: devctl [(online|offline) <function>]\n"); 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"); 164 332 } 165 333 … … 168 336 int rc; 169 337 170 if (argc == 1) { 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 } 171 348 rc = fun_tree_print(); 172 349 if (rc != EOK) … … 194 371 return 2; 195 372 } 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; 196 398 } else { 197 399 printf(NAME ": Invalid argument '%s'.\n", argv[1]);
Note:
See TracChangeset
for help on using the changeset viewer.