Changeset 1db5669 in mainline for uspace/app/devctl/devctl.c


Ignore:
Timestamp:
2013-09-11T12:35:55Z (11 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
48bd6f4, 4c9b28a
Parents:
cd3b380
Message:

devctl show-drv lists attached devices, add device count to list-drv.

File:
1 edited

Legend:

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

    rcd3b380 r1db5669  
    4747char drv_name[MAX_NAME_LENGTH];
    4848
     49static const char *drv_state_str(driver_state_t state)
     50{
     51        const char *sstate;
     52
     53        switch (state) {
     54        case DRIVER_NOT_STARTED:
     55                sstate = "not started";
     56                break;
     57        case DRIVER_STARTING:
     58                sstate = "starting";
     59                break;
     60        case DRIVER_RUNNING:
     61                sstate = "running";
     62                break;
     63        default:
     64                sstate = "unknown";
     65        }
     66
     67        return sstate;
     68}
     69
    4970static int fun_subtree_print(devman_handle_t funh, int lvl)
    5071{
     
    161182static int drv_list(void)
    162183{
     184        devman_handle_t *devs;
    163185        devman_handle_t *drvs;
    164186        driver_state_t state;
    165187        const char *sstate;
    166188        size_t ndrvs;
     189        size_t ndevs;
    167190        size_t i;
    168191        int rc;
     
    173196
    174197        for (i = 0; i < ndrvs; i++) {
     198                devs = NULL;
     199
    175200                rc = devman_driver_get_name(drvs[i], drv_name, MAX_NAME_LENGTH);
    176201                if (rc != EOK)
    177                         continue;
     202                        goto skip;
    178203                rc = devman_driver_get_state(drvs[i], &state);
    179204                if (rc != EOK)
    180                         continue;
    181                 switch (state) {
    182                 case DRIVER_NOT_STARTED:
    183                         sstate = "not started";
    184                         break;
    185                 case DRIVER_STARTING:
    186                         sstate = "starting";
    187                         break;
    188                 case DRIVER_RUNNING:
    189                         sstate = "running";
    190                         break;
    191                 default:
    192                         sstate = "unknown";
    193                 }
    194                 printf("%3d %-10s %s\n", (int)drvs[i], drv_name, sstate);
     205                        goto skip;
     206                rc = devman_driver_get_devices(drvs[i], &devs, &ndevs);
     207                if (rc != EOK)
     208                        goto skip;
     209
     210                sstate = drv_state_str(state);
     211
     212                printf("%-11s %3d %s\n", sstate, ndevs, drv_name);
     213skip:
     214                free(devs);
    195215        }
    196216        free(drvs);
     217
     218        return EOK;
     219}
     220
     221static int drv_show(char *drvname)
     222{
     223        devman_handle_t *devs;
     224        devman_handle_t drvh;
     225        devman_handle_t funh;
     226        driver_state_t state;
     227        const char *sstate;
     228        size_t ndevs;
     229        size_t i;
     230        int rc;
     231
     232        rc = devman_driver_get_handle(drvname, &drvh);
     233        if (rc != EOK)
     234                return rc;
     235
     236        devs = NULL;
     237
     238        rc = devman_driver_get_name(drvh, drv_name, MAX_NAME_LENGTH);
     239        if (rc != EOK)
     240                return rc;
     241
     242        rc = devman_driver_get_state(drvh, &state);
     243        if (rc != EOK)
     244                return rc;
     245
     246        rc = devman_driver_get_devices(drvh, &devs, &ndevs);
     247        if (rc != EOK)
     248                return rc;
     249
     250        sstate = drv_state_str(state);
     251
     252        printf("Driver: %s\n", drv_name);
     253        printf("State: %s\n", sstate);
     254        printf("Attached devices:\n");
     255
     256        for (i = 0; i < ndevs; i++) {
     257                rc = devman_dev_get_parent(devs[i], &funh);
     258                if (rc != EOK)
     259                        goto error;
     260
     261                rc = devman_fun_get_path(funh, name, MAX_NAME_LENGTH);
     262                if (rc != EOK)
     263                        goto error;
     264                printf("\t%s\n", name);
     265        }
     266
     267error:
     268        free(devs);
    197269
    198270        return EOK;
     
    226298        printf("\tdevctl offline <function>]\n");
    227299        printf("\tdevctl list-drv\n");
     300        printf("\tdevctl show-drv <driver-name>\n");
    228301        printf("\tdevctl load-drv <driver-name>\n");
    229302}
     
    263336                if (rc != EOK)
    264337                        return 2;
     338        } else if (str_cmp(argv[1], "show-drv") == 0) {
     339                if (argc < 3) {
     340                        printf(NAME ": Argument missing.\n");
     341                        print_syntax();
     342                        return 1;
     343                }
     344
     345                rc = drv_show(argv[2]);
     346                if (rc != EOK) {
     347                        return 2;
     348                }
    265349        } else if (str_cmp(argv[1], "load-drv") == 0) {
    266350                if (argc < 3) {
Note: See TracChangeset for help on using the changeset viewer.