Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/usbinfo/main.c

    ra12917e r632ed68  
    7777}
    7878
    79 static int get_host_controller_handle(const char *path,
    80     devman_handle_t *hc_handle)
     79static int set_new_host_controller(int *phone, const char *path)
    8180{
    8281        int rc;
    83 
    84         devman_handle_t handle;
    85         rc = devman_device_get_handle(path, &handle, 0);
    86         if (rc != EOK) {
    87                 fprintf(stderr,
    88                     NAME ": failed getting handle of `devman::/%s'.\n",
    89                     path);
    90                 return rc;
    91         }
    92         *hc_handle = handle;
     82        int tmp_phone;
     83
     84        if (path[0] != '/') {
     85                int hc_class_index = (int) strtol(path, NULL, 10);
     86                char *dev_path;
     87                rc = asprintf(&dev_path, "class/usbhc\\%d", hc_class_index);
     88                if (rc < 0) {
     89                        internal_error(rc);
     90                        return rc;
     91                }
     92                devmap_handle_t handle;
     93                rc = devmap_device_get_handle(dev_path, &handle, 0);
     94                if (rc < 0) {
     95                        fprintf(stderr,
     96                            NAME ": failed getting handle of `devman://%s'.\n",
     97                            dev_path);
     98                        free(dev_path);
     99                        return rc;
     100                }
     101                tmp_phone = devmap_device_connect(handle, 0);
     102                if (tmp_phone < 0) {
     103                        fprintf(stderr,
     104                            NAME ": could not connect to `%s'.\n",
     105                            dev_path);
     106                        free(dev_path);
     107                        return tmp_phone;
     108                }
     109                free(dev_path);
     110        } else {
     111                devman_handle_t handle;
     112                rc = devman_device_get_handle(path, &handle, 0);
     113                if (rc != EOK) {
     114                        fprintf(stderr,
     115                            NAME ": failed getting handle of `devmap::/%s'.\n",
     116                            path);
     117                        return rc;
     118                }
     119                tmp_phone = devman_device_connect(handle, 0);
     120                if (tmp_phone < 0) {
     121                        fprintf(stderr,
     122                            NAME ": could not connect to `%s'.\n",
     123                            path);
     124                        return tmp_phone;
     125                }
     126        }
     127
     128        *phone = tmp_phone;
    93129
    94130        return EOK;
    95131}
    96132
    97 static int get_device_address(const char *str_address, usb_address_t *address)
    98 {
    99         usb_address_t addr = (usb_address_t) strtol(str_address, NULL, 0);
    100         if ((addr < 0) || (addr >= USB11_ADDRESS_MAX)) {
     133static int connect_with_address(int hc_phone, const char *str_address)
     134{
     135        usb_address_t address = (usb_address_t) strtol(str_address, NULL, 0);
     136        if ((address < 0) || (address >= USB11_ADDRESS_MAX)) {
    101137                fprintf(stderr, NAME ": USB address out of range.\n");
    102138                return ERANGE;
    103139        }
    104140
    105         *address = addr;
    106         return EOK;
     141        if (hc_phone < 0) {
     142                fprintf(stderr, NAME ": no active host controller.\n");
     143                return ENOENT;
     144        }
     145
     146        return dump_device(hc_phone, address);
    107147}
    108148
     
    110150int main(int argc, char *argv[])
    111151{
    112         devman_handle_t hc_handle = (devman_handle_t) -1;
    113         usb_address_t device_address = (usb_address_t) -1;
     152        int hc_phone = -1;
    114153
    115154        if (argc <= 1) {
     
    136175                        case 'a':
    137176                        case ACTION_DEVICE_ADDRESS: {
    138                                 int rc = get_device_address(optarg,
    139                                     &device_address);
     177                                int rc = connect_with_address(hc_phone, optarg);
    140178                                if (rc != EOK) {
    141179                                        return rc;
     
    146184                        case 't':
    147185                        case ACTION_HOST_CONTROLLER: {
    148                                 int rc = get_host_controller_handle(optarg,
    149                                    &hc_handle);
     186                                int rc = set_new_host_controller(&hc_phone,
     187                                    optarg);
    150188                                if (rc != EOK) {
    151189                                        return rc;
     
    164202        } while (i != -1);
    165203
    166         if ((hc_handle == (devman_handle_t) -1)
    167             || (device_address == (usb_address_t) -1)) {
    168                 fprintf(stderr, NAME ": no target specified.\n");
    169                 return EINVAL;
    170         }
    171 
    172         dump_device(hc_handle, device_address);
    173 
    174204        return 0;
    175205}
Note: See TracChangeset for help on using the changeset viewer.