Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/devctl/devctl.c

    rcb500a2 rce1df04  
    3535#include <devman.h>
    3636#include <errno.h>
    37 #include <stdbool.h>
    3837#include <stdio.h>
    3938#include <stdlib.h>
     
    4544#define MAX_NAME_LENGTH 1024
    4645
    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 }
     46char name[MAX_NAME_LENGTH];
     47char drv_name[MAX_NAME_LENGTH];
    7148
    7249static int fun_subtree_print(devman_handle_t funh, int lvl)
     
    7552        devman_handle_t *cfuns;
    7653        size_t count, i;
    77         unsigned int score;
    7854        int rc;
    7955        int j;
     
    9874                printf("%s : %s\n", name, drv_name);
    9975
    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 
    11476        rc = devman_fun_get_child(funh, &devh);
    11577        if (rc == ENOENT)
     
    197159}
    198160
    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 
    323161static void print_syntax(void)
    324162{
    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");
    332164}
    333165
     
    336168        int rc;
    337169
    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) {
    348171                rc = fun_tree_print();
    349172                if (rc != EOK)
     
    371194                        return 2;
    372195                }
    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;
    398196        } else {
    399197                printf(NAME ": Invalid argument '%s'.\n", argv[1]);
Note: See TracChangeset for help on using the changeset viewer.