Changes in / [26bc0fd1:5759975a] in mainline


Ignore:
Location:
uspace
Files:
5 edited

Legend:

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

    r26bc0fd1 r5759975a  
    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;
    4850
    4951static const char *drv_state_str(driver_state_t state)
     
    7375        devman_handle_t *cfuns;
    7476        size_t count, i;
     77        unsigned int score;
    7578        int rc;
    7679        int j;
     
    9497        else
    9598                printf("%s : %s\n", name, drv_name);
     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        }
    96113
    97114        rc = devman_fun_get_child(funh, &devh);
     
    226243        driver_state_t state;
    227244        const char *sstate;
     245        unsigned int score;
    228246        size_t ndevs;
    229247        size_t i;
     
    252270        printf("Driver: %s\n", drv_name);
    253271        printf("State: %s\n", sstate);
     272
    254273        printf("Attached devices:\n");
    255274
     
    263282                        goto error;
    264283                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);
    265295        }
    266296
     
    306336        int rc;
    307337
    308         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                }
    309348                rc = fun_tree_print();
    310349                if (rc != EOK)
  • uspace/lib/c/generic/devman.c

    r26bc0fd1 r5759975a  
    11/*
    22 * Copyright (c) 2007 Josef Cejka
    3  * Copyright (c) 2011 Jiri Svoboda
     3 * Copyright (c) 2013 Jiri Svoboda
    44 * Copyright (c) 2010 Lenka Trochtova
    55 * All rights reserved.
     
    401401}
    402402
    403 static int devman_get_str_internal(sysarg_t method, sysarg_t arg1, char *buf,
    404     size_t buf_size)
     403static int devman_get_str_internal(sysarg_t method, sysarg_t arg1,
     404    sysarg_t arg2, sysarg_t *r1, char *buf, size_t buf_size)
    405405{
    406406        async_exch_t *exch;
     
    412412       
    413413        ipc_call_t answer;
    414         aid_t req = async_send_1(exch, method, arg1, &answer);
     414        aid_t req = async_send_2(exch, method, arg1, arg2, &answer);
    415415        aid_t dreq = async_data_read(exch, buf, buf_size - 1, &dreply);
    416416        async_wait_for(dreq, &dretval);
     
    430430        }
    431431       
     432        if (r1 != NULL)
     433                *r1 = IPC_GET_ARG1(answer);
    432434        act_size = IPC_GET_ARG2(dreply);
    433435        assert(act_size <= buf_size - 1);
     
    439441int devman_fun_get_path(devman_handle_t handle, char *buf, size_t buf_size)
    440442{
    441         return devman_get_str_internal(DEVMAN_FUN_GET_PATH, handle, buf,
    442             buf_size);
     443        return devman_get_str_internal(DEVMAN_FUN_GET_PATH, handle, 0, NULL,
     444            buf, buf_size);
     445}
     446
     447int devman_fun_get_match_id(devman_handle_t handle, size_t index, char *buf,
     448    size_t buf_size, unsigned int *rscore)
     449{
     450        int rc;
     451        sysarg_t score = 0;
     452
     453        rc = devman_get_str_internal(DEVMAN_FUN_GET_MATCH_ID, handle, index,
     454            &score, buf, buf_size);
     455        if (rc != EOK)
     456                return rc;
     457
     458        *rscore = score;
     459        return rc;
    443460}
    444461
    445462int devman_fun_get_name(devman_handle_t handle, char *buf, size_t buf_size)
    446463{
    447         return devman_get_str_internal(DEVMAN_FUN_GET_NAME, handle, buf,
    448             buf_size);
     464        return devman_get_str_internal(DEVMAN_FUN_GET_NAME, handle, 0, NULL,
     465            buf, buf_size);
    449466}
    450467
    451468int devman_fun_get_driver_name(devman_handle_t handle, char *buf, size_t buf_size)
    452469{
    453         return devman_get_str_internal(DEVMAN_FUN_GET_DRIVER_NAME, handle, buf,
    454             buf_size);
     470        return devman_get_str_internal(DEVMAN_FUN_GET_DRIVER_NAME, handle, 0,
     471            NULL, buf, buf_size);
    455472}
    456473
     
    653670}
    654671
     672int devman_driver_get_match_id(devman_handle_t handle, size_t index, char *buf,
     673    size_t buf_size, unsigned int *rscore)
     674{
     675        int rc;
     676        sysarg_t score = 0;
     677
     678        rc = devman_get_str_internal(DEVMAN_DRIVER_GET_MATCH_ID, handle, index,
     679            &score, buf, buf_size);
     680        if (rc != EOK)
     681                return rc;
     682
     683        *rscore = score;
     684        return rc;
     685}
     686
    655687int devman_driver_get_name(devman_handle_t handle, char *buf, size_t buf_size)
    656688{
    657         return devman_get_str_internal(DEVMAN_DRIVER_GET_NAME, handle, buf,
    658             buf_size);
     689        return devman_get_str_internal(DEVMAN_DRIVER_GET_NAME, handle, 0, NULL,
     690            buf, buf_size);
    659691}
    660692
  • uspace/lib/c/include/devman.h

    r26bc0fd1 r5759975a  
    6464extern int devman_dev_get_functions(devman_handle_t, devman_handle_t **,
    6565    size_t *);
     66extern int devman_fun_get_match_id(devman_handle_t, size_t, char *, size_t,
     67    unsigned int *);
    6668extern int devman_fun_get_name(devman_handle_t, char *, size_t);
    6769extern int devman_fun_get_driver_name(devman_handle_t, char *, size_t);
     
    7678    size_t *);
    7779extern int devman_driver_get_handle(const char *, devman_handle_t *);
     80extern int devman_driver_get_match_id(devman_handle_t, size_t, char *, size_t,
     81    unsigned int *);
    7882extern int devman_driver_get_name(devman_handle_t, char *, size_t);
    7983extern int devman_driver_get_state(devman_handle_t, driver_state_t *);
  • uspace/lib/c/include/ipc/devman.h

    r26bc0fd1 r5759975a  
    171171        DEVMAN_DEV_GET_PARENT,
    172172        DEVMAN_FUN_GET_CHILD,
     173        DEVMAN_FUN_GET_MATCH_ID,
    173174        DEVMAN_FUN_GET_NAME,
    174175        DEVMAN_FUN_GET_DRIVER_NAME,
     
    180181        DEVMAN_DRIVER_GET_DEVICES,
    181182        DEVMAN_DRIVER_GET_HANDLE,
     183        DEVMAN_DRIVER_GET_MATCH_ID,
    182184        DEVMAN_DRIVER_GET_NAME,
    183185        DEVMAN_DRIVER_GET_STATE,
  • uspace/srv/devman/client_conn.c

    r26bc0fd1 r5759975a  
    9999}
    100100
     101/** Get device match ID. */
     102static void devman_fun_get_match_id(ipc_callid_t iid, ipc_call_t *icall)
     103{
     104        devman_handle_t handle = IPC_GET_ARG1(*icall);
     105        size_t index = IPC_GET_ARG2(*icall);
     106        void *buffer = NULL;
     107
     108        fun_node_t *fun = find_fun_node(&device_tree, handle);
     109        if (fun == NULL) {
     110                async_answer_0(iid, ENOMEM);
     111                return;
     112        }
     113
     114        ipc_callid_t data_callid;
     115        size_t data_len;
     116        if (!async_data_read_receive(&data_callid, &data_len)) {
     117                async_answer_0(iid, EINVAL);
     118                fun_del_ref(fun);
     119                return;
     120        }
     121
     122        buffer = malloc(data_len);
     123        if (buffer == NULL) {
     124                async_answer_0(data_callid, ENOMEM);
     125                async_answer_0(iid, ENOMEM);
     126                fun_del_ref(fun);
     127                return;
     128        }
     129
     130        fibril_rwlock_read_lock(&device_tree.rwlock);
     131
     132        /* Check function state */
     133        if (fun->state == FUN_REMOVED)
     134                goto error;
     135
     136        link_t *link = list_nth(&fun->match_ids.ids, index);
     137        if (link == NULL)
     138                goto error;
     139
     140        match_id_t *mid = list_get_instance(link, match_id_t, link);
     141
     142        size_t sent_length = str_size(mid->id);
     143        if (sent_length > data_len) {
     144                sent_length = data_len;
     145        }
     146
     147        async_data_read_finalize(data_callid, mid->id, sent_length);
     148        async_answer_1(iid, EOK, mid->score);
     149
     150        fibril_rwlock_read_unlock(&device_tree.rwlock);
     151        fun_del_ref(fun);
     152        free(buffer);
     153
     154        return;
     155error:
     156        fibril_rwlock_read_unlock(&device_tree.rwlock);
     157        free(buffer);
     158
     159        async_answer_0(data_callid, ENOENT);
     160        async_answer_0(iid, ENOENT);
     161        fun_del_ref(fun);
     162}
     163
    101164/** Get device name. */
    102165static void devman_fun_get_name(ipc_callid_t iid, ipc_call_t *icall)
     
    539602}
    540603
     604/** Get driver match ID. */
     605static void devman_driver_get_match_id(ipc_callid_t iid, ipc_call_t *icall)
     606{
     607        devman_handle_t handle = IPC_GET_ARG1(*icall);
     608        size_t index = IPC_GET_ARG2(*icall);
     609
     610        driver_t *drv = driver_find(&drivers_list, handle);
     611        if (drv == NULL) {
     612                async_answer_0(iid, ENOMEM);
     613                return;
     614        }
     615
     616        ipc_callid_t data_callid;
     617        size_t data_len;
     618        if (!async_data_read_receive(&data_callid, &data_len)) {
     619                async_answer_0(iid, EINVAL);
     620                return;
     621        }
     622
     623        void *buffer = malloc(data_len);
     624        if (buffer == NULL) {
     625                async_answer_0(data_callid, ENOMEM);
     626                async_answer_0(iid, ENOMEM);
     627                return;
     628        }
     629
     630        fibril_mutex_lock(&drv->driver_mutex);
     631        link_t *link = list_nth(&drv->match_ids.ids, index);
     632        if (link == NULL) {
     633                fibril_mutex_unlock(&drv->driver_mutex);
     634                async_answer_0(data_callid, ENOMEM);
     635                async_answer_0(iid, ENOMEM);
     636                return;
     637        }
     638
     639        match_id_t *mid = list_get_instance(link, match_id_t, link);
     640
     641        size_t sent_length = str_size(mid->id);
     642        if (sent_length > data_len) {
     643                sent_length = data_len;
     644        }
     645
     646        async_data_read_finalize(data_callid, mid->id, sent_length);
     647        async_answer_1(iid, EOK, mid->score);
     648
     649        fibril_mutex_unlock(&drv->driver_mutex);
     650
     651        free(buffer);
     652}
     653
    541654/** Get driver name. */
    542655static void devman_driver_get_name(ipc_callid_t iid, ipc_call_t *icall)
     
    638751                        devman_fun_get_child(callid, &call);
    639752                        break;
     753                case DEVMAN_FUN_GET_MATCH_ID:
     754                        devman_fun_get_match_id(callid, &call);
     755                        break;
    640756                case DEVMAN_FUN_GET_NAME:
    641757                        devman_fun_get_name(callid, &call);
     
    664780                case DEVMAN_DRIVER_GET_HANDLE:
    665781                        devman_driver_get_handle(callid, &call);
     782                        break;
     783                case DEVMAN_DRIVER_GET_MATCH_ID:
     784                        devman_driver_get_match_id(callid, &call);
    666785                        break;
    667786                case DEVMAN_DRIVER_GET_NAME:
Note: See TracChangeset for help on using the changeset viewer.