libusb20_ugen20.c (188987) | libusb20_ugen20.c (189110) |
---|---|
1/* $FreeBSD: head/lib/libusb20/libusb20_ugen20.c 188987 2009-02-24 03:43:05Z thompsa $ */ | 1/* $FreeBSD: head/lib/libusb20/libusb20_ugen20.c 189110 2009-02-27 17:27:16Z thompsa $ */ |
2/*- 3 * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. --- 35 unchanged lines hidden (view full) --- 45#include <dev/usb/usb_error.h> 46#include <dev/usb/usb_revision.h> 47 48static libusb20_init_backend_t ugen20_init_backend; 49static libusb20_open_device_t ugen20_open_device; 50static libusb20_close_device_t ugen20_close_device; 51static libusb20_get_backend_name_t ugen20_get_backend_name; 52static libusb20_exit_backend_t ugen20_exit_backend; | 2/*- 3 * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. --- 35 unchanged lines hidden (view full) --- 45#include <dev/usb/usb_error.h> 46#include <dev/usb/usb_revision.h> 47 48static libusb20_init_backend_t ugen20_init_backend; 49static libusb20_open_device_t ugen20_open_device; 50static libusb20_close_device_t ugen20_close_device; 51static libusb20_get_backend_name_t ugen20_get_backend_name; 52static libusb20_exit_backend_t ugen20_exit_backend; |
53static libusb20_bus_set_owner_t ugen20_bus_set_owner; 54static libusb20_bus_get_owner_t ugen20_bus_get_owner; 55static libusb20_bus_set_perm_t ugen20_bus_set_perm; 56static libusb20_bus_get_perm_t ugen20_bus_get_perm; 57static libusb20_dev_get_iface_owner_t ugen20_dev_get_iface_owner; 58static libusb20_dev_get_iface_perm_t ugen20_dev_get_iface_perm; 59static libusb20_dev_get_owner_t ugen20_dev_get_owner; 60static libusb20_dev_get_perm_t ugen20_dev_get_perm; | |
61static libusb20_dev_get_iface_desc_t ugen20_dev_get_iface_desc; 62static libusb20_dev_get_info_t ugen20_dev_get_info; | 53static libusb20_dev_get_iface_desc_t ugen20_dev_get_iface_desc; 54static libusb20_dev_get_info_t ugen20_dev_get_info; |
63static libusb20_dev_set_iface_owner_t ugen20_dev_set_iface_owner; 64static libusb20_dev_set_iface_perm_t ugen20_dev_set_iface_perm; 65static libusb20_dev_set_owner_t ugen20_dev_set_owner; 66static libusb20_dev_set_perm_t ugen20_dev_set_perm; | |
67static libusb20_root_get_dev_quirk_t ugen20_root_get_dev_quirk; 68static libusb20_root_get_quirk_name_t ugen20_root_get_quirk_name; 69static libusb20_root_add_dev_quirk_t ugen20_root_add_dev_quirk; 70static libusb20_root_remove_dev_quirk_t ugen20_root_remove_dev_quirk; | 55static libusb20_root_get_dev_quirk_t ugen20_root_get_dev_quirk; 56static libusb20_root_get_quirk_name_t ugen20_root_get_quirk_name; 57static libusb20_root_add_dev_quirk_t ugen20_root_add_dev_quirk; 58static libusb20_root_remove_dev_quirk_t ugen20_root_remove_dev_quirk; |
71static libusb20_root_set_owner_t ugen20_root_set_owner; 72static libusb20_root_get_owner_t ugen20_root_get_owner; 73static libusb20_root_set_perm_t ugen20_root_set_perm; 74static libusb20_root_get_perm_t ugen20_root_get_perm; | |
75static libusb20_root_set_template_t ugen20_root_set_template; 76static libusb20_root_get_template_t ugen20_root_get_template; 77 78const struct libusb20_backend_methods libusb20_ugen20_backend = { 79 LIBUSB20_BACKEND(LIBUSB20_DECLARE, ugen20) 80}; 81 82/* USB device specific */ --- 64 unchanged lines hidden (view full) --- 147 uint32_t plugtime; 148 char buf[64]; 149 int f; 150 int error; 151 152 pdev->bus_number = ugen20_path_convert_one(&tmp); 153 pdev->device_address = ugen20_path_convert_one(&tmp); 154 | 59static libusb20_root_set_template_t ugen20_root_set_template; 60static libusb20_root_get_template_t ugen20_root_get_template; 61 62const struct libusb20_backend_methods libusb20_ugen20_backend = { 63 LIBUSB20_BACKEND(LIBUSB20_DECLARE, ugen20) 64}; 65 66/* USB device specific */ --- 64 unchanged lines hidden (view full) --- 131 uint32_t plugtime; 132 char buf[64]; 133 int f; 134 int error; 135 136 pdev->bus_number = ugen20_path_convert_one(&tmp); 137 pdev->device_address = ugen20_path_convert_one(&tmp); 138 |
155 snprintf(buf, sizeof(buf), "/dev/ugen%u.%u", | 139 snprintf(buf, sizeof(buf), "/dev/" USB_GENERIC_NAME "%u.%u", |
156 pdev->bus_number, pdev->device_address); 157 158 f = open(buf, O_RDWR); 159 if (f < 0) { 160 return (LIBUSB20_ERROR_OTHER); 161 } 162 if (ioctl(f, USB_GET_PLUGTIME, &plugtime)) { 163 error = LIBUSB20_ERROR_OTHER; --- 49 unchanged lines hidden (view full) --- 213 default: 214 pdev->usb_speed = LIBUSB20_SPEED_UNKNOWN; 215 break; 216 } 217 218 /* generate a nice description for printout */ 219 220 snprintf(pdev->usb_desc, sizeof(pdev->usb_desc), | 140 pdev->bus_number, pdev->device_address); 141 142 f = open(buf, O_RDWR); 143 if (f < 0) { 144 return (LIBUSB20_ERROR_OTHER); 145 } 146 if (ioctl(f, USB_GET_PLUGTIME, &plugtime)) { 147 error = LIBUSB20_ERROR_OTHER; --- 49 unchanged lines hidden (view full) --- 197 default: 198 pdev->usb_speed = LIBUSB20_SPEED_UNKNOWN; 199 break; 200 } 201 202 /* generate a nice description for printout */ 203 204 snprintf(pdev->usb_desc, sizeof(pdev->usb_desc), |
221 "ugen%u.%u: <%s %s> at usbus%u", pdev->bus_number, | 205 USB_GENERIC_NAME "%u.%u: <%s %s> at usbus%u", pdev->bus_number, |
222 pdev->device_address, devinfo.udi_product, 223 devinfo.udi_vendor, pdev->bus_number); 224 225 error = 0; 226done: 227 close(f); 228 return (error); 229} --- 49 unchanged lines hidden (view full) --- 279static int 280ugen20_init_backend(struct libusb20_backend *pbe) 281{ 282 struct ugen20_urd_state state; 283 struct libusb20_device *pdev; 284 285 memset(&state, 0, sizeof(state)); 286 | 206 pdev->device_address, devinfo.udi_product, 207 devinfo.udi_vendor, pdev->bus_number); 208 209 error = 0; 210done: 211 close(f); 212 return (error); 213} --- 49 unchanged lines hidden (view full) --- 263static int 264ugen20_init_backend(struct libusb20_backend *pbe) 265{ 266 struct ugen20_urd_state state; 267 struct libusb20_device *pdev; 268 269 memset(&state, 0, sizeof(state)); 270 |
287 state.f = open("/dev/usb", O_RDONLY); | 271 state.f = open("/dev/" USB_DEVICE_NAME, O_RDONLY); |
288 if (state.f < 0) 289 return (LIBUSB20_ERROR_OTHER); 290 291 while (ugen20_readdir(&state) == 0) { 292 293 if ((state.src[0] != 'u') || 294 (state.src[1] != 'g') || 295 (state.src[2] != 'e') || --- 78 unchanged lines hidden (view full) --- 374ugen20_open_device(struct libusb20_device *pdev, uint16_t nMaxTransfer) 375{ 376 uint32_t plugtime; 377 char buf[64]; 378 int f; 379 int g; 380 int error; 381 | 272 if (state.f < 0) 273 return (LIBUSB20_ERROR_OTHER); 274 275 while (ugen20_readdir(&state) == 0) { 276 277 if ((state.src[0] != 'u') || 278 (state.src[1] != 'g') || 279 (state.src[2] != 'e') || --- 78 unchanged lines hidden (view full) --- 358ugen20_open_device(struct libusb20_device *pdev, uint16_t nMaxTransfer) 359{ 360 uint32_t plugtime; 361 char buf[64]; 362 int f; 363 int g; 364 int error; 365 |
382 snprintf(buf, sizeof(buf), "/dev/ugen%u.%u", | 366 snprintf(buf, sizeof(buf), "/dev/" USB_GENERIC_NAME "%u.%u", |
383 pdev->bus_number, pdev->device_address); 384 385 /* 386 * We need two file handles, one for the control endpoint and one 387 * for BULK, INTERRUPT and ISOCHRONOUS transactions due to optimised 388 * kernel locking. 389 */ 390 g = open(buf, O_RDWR); --- 477 unchanged lines hidden (view full) --- 868} 869 870static int 871ugen20_be_ioctl(uint32_t cmd, void *data) 872{ 873 int f; 874 int error; 875 | 367 pdev->bus_number, pdev->device_address); 368 369 /* 370 * We need two file handles, one for the control endpoint and one 371 * for BULK, INTERRUPT and ISOCHRONOUS transactions due to optimised 372 * kernel locking. 373 */ 374 g = open(buf, O_RDWR); --- 477 unchanged lines hidden (view full) --- 852} 853 854static int 855ugen20_be_ioctl(uint32_t cmd, void *data) 856{ 857 int f; 858 int error; 859 |
876 f = open("/dev/usb", O_RDONLY); | 860 f = open("/dev/" USB_DEVICE_NAME, O_RDONLY); |
877 if (f < 0) 878 return (LIBUSB20_ERROR_OTHER); 879 error = ioctl(f, cmd, data); 880 if (error == -1) { 881 if (errno == EPERM) { 882 error = LIBUSB20_ERROR_ACCESS; 883 } else { 884 error = LIBUSB20_ERROR_OTHER; 885 } 886 } 887 close(f); 888 return (error); 889} 890 891static int | 861 if (f < 0) 862 return (LIBUSB20_ERROR_OTHER); 863 error = ioctl(f, cmd, data); 864 if (error == -1) { 865 if (errno == EPERM) { 866 error = LIBUSB20_ERROR_ACCESS; 867 } else { 868 error = LIBUSB20_ERROR_OTHER; 869 } 870 } 871 close(f); 872 return (error); 873} 874 875static int |
892ugen20_be_do_perm(uint32_t get_cmd, uint32_t set_cmd, uint8_t bus, 893 uint8_t dev, uint8_t iface, uid_t *uid, 894 gid_t *gid, mode_t *mode) 895{ 896 struct usb2_dev_perm perm; 897 int error; 898 899 memset(&perm, 0, sizeof(perm)); 900 901 perm.bus_index = bus; 902 perm.dev_index = dev; 903 perm.iface_index = iface; 904 905 error = ugen20_be_ioctl(get_cmd, &perm); 906 if (error) 907 return (error); 908 909 if (set_cmd == 0) { 910 if (uid) 911 *uid = perm.user_id; 912 if (gid) 913 *gid = perm.group_id; 914 if (mode) 915 *mode = perm.mode; 916 return (0); 917 } 918 if (uid) 919 perm.user_id = *uid; 920 if (gid) 921 perm.group_id = *gid; 922 if (mode) 923 perm.mode = *mode; 924 925 return (ugen20_be_ioctl(set_cmd, &perm)); 926} 927 928static int 929ugen20_bus_set_owner(struct libusb20_backend *pbe, 930 uint8_t bus, uid_t user, gid_t group) 931{ 932 return (ugen20_be_do_perm(USB_GET_BUS_PERM, USB_SET_BUS_PERM, 933 bus, 0, 0, &user, &group, NULL)); 934} 935 936static int 937ugen20_bus_get_owner(struct libusb20_backend *pbe, uint8_t bus, 938 uid_t *user, gid_t *group) 939{ 940 return (ugen20_be_do_perm(USB_GET_BUS_PERM, 0, 941 bus, 0, 0, user, group, NULL)); 942} 943 944static int 945ugen20_bus_set_perm(struct libusb20_backend *pbe, 946 uint8_t bus, mode_t mode) 947{ 948 return (ugen20_be_do_perm(USB_GET_BUS_PERM, USB_SET_BUS_PERM, 949 bus, 0, 0, NULL, NULL, &mode)); 950} 951 952static int 953ugen20_bus_get_perm(struct libusb20_backend *pbe, 954 uint8_t bus, mode_t *mode) 955{ 956 return (ugen20_be_do_perm(USB_GET_BUS_PERM, 0, 957 bus, 0, 0, NULL, NULL, mode)); 958} 959 960static int | |
961ugen20_dev_get_iface_desc(struct libusb20_device *pdev, 962 uint8_t iface_index, char *buf, uint8_t len) 963{ 964 struct usb2_gen_descriptor ugd; 965 966 memset(&ugd, 0, sizeof(ugd)); 967 968 ugd.ugd_data = buf; --- 12 unchanged lines hidden (view full) --- 981{ 982 if (ioctl(pdev->file, USB_GET_DEVICEINFO, pinfo)) { 983 return (LIBUSB20_ERROR_INVALID_PARAM); 984 } 985 return (0); 986} 987 988static int | 876ugen20_dev_get_iface_desc(struct libusb20_device *pdev, 877 uint8_t iface_index, char *buf, uint8_t len) 878{ 879 struct usb2_gen_descriptor ugd; 880 881 memset(&ugd, 0, sizeof(ugd)); 882 883 ugd.ugd_data = buf; --- 12 unchanged lines hidden (view full) --- 896{ 897 if (ioctl(pdev->file, USB_GET_DEVICEINFO, pinfo)) { 898 return (LIBUSB20_ERROR_INVALID_PARAM); 899 } 900 return (0); 901} 902 903static int |
989ugen20_dev_get_iface_owner(struct libusb20_device *pdev, 990 uint8_t iface_index, uid_t *user, gid_t *group) 991{ 992 return (ugen20_be_do_perm(USB_GET_IFACE_PERM, 0, 993 pdev->bus_number, pdev->device_address, iface_index, 994 user, group, NULL)); 995} 996 997static int 998ugen20_dev_get_iface_perm(struct libusb20_device *pdev, 999 uint8_t iface_index, mode_t *mode) 1000{ 1001 return (ugen20_be_do_perm(USB_GET_IFACE_PERM, 0, 1002 pdev->bus_number, pdev->device_address, iface_index, 1003 NULL, NULL, mode)); 1004} 1005 1006static int 1007ugen20_dev_get_owner(struct libusb20_device *pdev, 1008 uid_t *user, gid_t *group) 1009{ 1010 return (ugen20_be_do_perm(USB_GET_DEVICE_PERM, 0, 1011 pdev->bus_number, pdev->device_address, 0, 1012 user, group, NULL)); 1013} 1014 1015static int 1016ugen20_dev_get_perm(struct libusb20_device *pdev, mode_t *mode) 1017{ 1018 return (ugen20_be_do_perm(USB_GET_DEVICE_PERM, 0, 1019 pdev->bus_number, pdev->device_address, 0, 1020 NULL, NULL, mode)); 1021} 1022 1023static int 1024ugen20_dev_set_iface_owner(struct libusb20_device *pdev, 1025 uint8_t iface_index, uid_t user, gid_t group) 1026{ 1027 return (ugen20_be_do_perm(USB_GET_IFACE_PERM, USB_SET_IFACE_PERM, 1028 pdev->bus_number, pdev->device_address, iface_index, 1029 &user, &group, NULL)); 1030} 1031 1032static int 1033ugen20_dev_set_iface_perm(struct libusb20_device *pdev, 1034 uint8_t iface_index, mode_t mode) 1035{ 1036 return (ugen20_be_do_perm(USB_GET_IFACE_PERM, USB_SET_IFACE_PERM, 1037 pdev->bus_number, pdev->device_address, iface_index, 1038 NULL, NULL, &mode)); 1039} 1040 1041static int | |
1042ugen20_root_get_dev_quirk(struct libusb20_backend *pbe, 1043 uint16_t quirk_index, struct libusb20_quirk *pq) 1044{ 1045 struct usb2_gen_quirk q; 1046 int error; 1047 1048 memset(&q, 0, sizeof(q)); 1049 --- 82 unchanged lines hidden (view full) --- 1132 if (errno == EINVAL) { 1133 return (LIBUSB20_ERROR_NOT_FOUND); 1134 } 1135 } 1136 return (error); 1137} 1138 1139static int | 904ugen20_root_get_dev_quirk(struct libusb20_backend *pbe, 905 uint16_t quirk_index, struct libusb20_quirk *pq) 906{ 907 struct usb2_gen_quirk q; 908 int error; 909 910 memset(&q, 0, sizeof(q)); 911 --- 82 unchanged lines hidden (view full) --- 994 if (errno == EINVAL) { 995 return (LIBUSB20_ERROR_NOT_FOUND); 996 } 997 } 998 return (error); 999} 1000 1001static int |
1140ugen20_dev_set_owner(struct libusb20_device *pdev, 1141 uid_t user, gid_t group) 1142{ 1143 return (ugen20_be_do_perm(USB_GET_DEVICE_PERM, USB_SET_DEVICE_PERM, 1144 pdev->bus_number, pdev->device_address, 0, 1145 &user, &group, NULL)); 1146} 1147 1148static int 1149ugen20_dev_set_perm(struct libusb20_device *pdev, mode_t mode) 1150{ 1151 return (ugen20_be_do_perm(USB_GET_DEVICE_PERM, USB_SET_DEVICE_PERM, 1152 pdev->bus_number, pdev->device_address, 0, 1153 NULL, NULL, &mode)); 1154} 1155 1156static int 1157ugen20_root_set_owner(struct libusb20_backend *pbe, 1158 uid_t user, gid_t group) 1159{ 1160 return (ugen20_be_do_perm(USB_GET_ROOT_PERM, USB_SET_ROOT_PERM, 0, 0, 0, 1161 &user, &group, NULL)); 1162} 1163 1164static int 1165ugen20_root_get_owner(struct libusb20_backend *pbe, uid_t *user, gid_t *group) 1166{ 1167 return (ugen20_be_do_perm(USB_GET_ROOT_PERM, 0, 0, 0, 0, 1168 user, group, NULL)); 1169} 1170 1171static int 1172ugen20_root_set_perm(struct libusb20_backend *pbe, mode_t mode) 1173{ 1174 return (ugen20_be_do_perm(USB_GET_ROOT_PERM, USB_SET_ROOT_PERM, 0, 0, 0, 1175 NULL, NULL, &mode)); 1176} 1177 1178static int 1179ugen20_root_get_perm(struct libusb20_backend *pbe, mode_t *mode) 1180{ 1181 return (ugen20_be_do_perm(USB_GET_ROOT_PERM, 0, 0, 0, 0, 1182 NULL, NULL, mode)); 1183} 1184 1185static int | |
1186ugen20_root_set_template(struct libusb20_backend *pbe, int temp) 1187{ 1188 return (ugen20_be_ioctl(USB_SET_TEMPLATE, &temp)); 1189} 1190 1191static int 1192ugen20_root_get_template(struct libusb20_backend *pbe, int *ptemp) 1193{ 1194 return (ugen20_be_ioctl(USB_GET_TEMPLATE, ptemp)); 1195} | 1002ugen20_root_set_template(struct libusb20_backend *pbe, int temp) 1003{ 1004 return (ugen20_be_ioctl(USB_SET_TEMPLATE, &temp)); 1005} 1006 1007static int 1008ugen20_root_get_template(struct libusb20_backend *pbe, int *ptemp) 1009{ 1010 return (ugen20_be_ioctl(USB_GET_TEMPLATE, ptemp)); 1011} |