Deleted Added
full compact
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}