Changeset 0773396 in mainline for uspace/app/devctl/devctl.c


Ignore:
Timestamp:
2013-12-25T13:05:25Z (10 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bc54126c
Parents:
f4a47e52 (diff), 6946f23 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge mainline changes

File:
1 edited

Legend:

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

    rf4a47e52 r0773396  
    3535#include <devman.h>
    3636#include <errno.h>
     37#include <stdbool.h>
    3738#include <stdio.h>
    3839#include <stdlib.h>
     
    4445#define MAX_NAME_LENGTH 1024
    4546
    46 char name[MAX_NAME_LENGTH];
    47 char drv_name[MAX_NAME_LENGTH];
     47static char name[MAX_NAME_LENGTH];
     48static char drv_name[MAX_NAME_LENGTH];
     49static bool verbose = false;
     50
     51static 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}
    4871
    4972static int fun_subtree_print(devman_handle_t funh, int lvl)
     
    5275        devman_handle_t *cfuns;
    5376        size_t count, i;
     77        unsigned int score;
    5478        int rc;
    5579        int j;
     
    7498                printf("%s : %s\n", name, drv_name);
    7599
     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
    76114        rc = devman_fun_get_child(funh, &devh);
    77115        if (rc == ENOENT)
     
    159197}
    160198
     199static 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);
     230skip:
     231                free(devs);
     232        }
     233        free(drvs);
     234
     235        return EOK;
     236}
     237
     238static 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
     297error:
     298        free(devs);
     299
     300        return EOK;
     301}
     302
     303static 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
    161323static void print_syntax(void)
    162324{
    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");
    164332}
    165333
     
    168336        int rc;
    169337
    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                }
    171348                rc = fun_tree_print();
    172349                if (rc != EOK)
     
    194371                        return 2;
    195372                }
     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;
    196398        } else {
    197399                printf(NAME ": Invalid argument '%s'.\n", argv[1]);
Note: See TracChangeset for help on using the changeset viewer.