libusb 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.travis.yml +1 -0
  5. data/History.md +8 -0
  6. data/README.md +5 -15
  7. data/Rakefile +8 -1
  8. data/ext/extconf.rb +49 -12
  9. data/ext/{libusb-1.0.19 → libusb-1.0.20}/AUTHORS +12 -1
  10. data/ext/{libusb-1.0.19 → libusb-1.0.20}/COPYING +0 -0
  11. data/ext/{libusb-1.0.19 → libusb-1.0.20}/ChangeLog +18 -2
  12. data/ext/{libusb-1.0.19 → libusb-1.0.20}/INSTALL +0 -0
  13. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Makefile.am +0 -0
  14. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Makefile.in +31 -18
  15. data/ext/{libusb-1.0.19 → libusb-1.0.20}/NEWS +0 -0
  16. data/ext/{libusb-1.0.19 → libusb-1.0.20}/PORTING +0 -0
  17. data/ext/{libusb-1.0.19 → libusb-1.0.20}/README +5 -3
  18. data/ext/{libusb-1.0.19 → libusb-1.0.20}/TODO +0 -0
  19. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/common.xcconfig +0 -0
  20. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/config.h +0 -0
  21. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/debug.xcconfig +0 -0
  22. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb.xcconfig +0 -0
  23. data/ext/libusb-1.0.20/Xcode/libusb.xcodeproj/project.pbxproj +865 -0
  24. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb_debug.xcconfig +0 -0
  25. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb_release.xcconfig +0 -0
  26. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/release.xcconfig +0 -0
  27. data/ext/{libusb-1.0.19 → libusb-1.0.20}/aclocal.m4 +35 -32
  28. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/README +0 -0
  29. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/config.h +0 -0
  30. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/Android.mk +0 -0
  31. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/Application.mk +0 -0
  32. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/examples.mk +0 -0
  33. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/libusb.mk +0 -0
  34. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/tests.mk +0 -0
  35. data/ext/{libusb-1.0.19 → libusb-1.0.20}/compile +1 -1
  36. data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.guess +13 -160
  37. data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.h.in +6 -0
  38. data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.sub +26 -12
  39. data/ext/{libusb-1.0.19 → libusb-1.0.20}/configure +244 -20
  40. data/ext/{libusb-1.0.19 → libusb-1.0.20}/configure.ac +27 -4
  41. data/ext/{libusb-1.0.19 → libusb-1.0.20}/depcomp +1 -1
  42. data/ext/{libusb-1.0.19 → libusb-1.0.20}/doc/Makefile.am +0 -0
  43. data/ext/{libusb-1.0.19 → libusb-1.0.20}/doc/Makefile.in +19 -6
  44. data/ext/libusb-1.0.20/doc/doxygen.cfg.in +2334 -0
  45. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/Makefile.am +0 -0
  46. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/Makefile.in +19 -6
  47. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/dpfp.c +0 -0
  48. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/dpfp_threaded.c +15 -10
  49. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/ezusb.c +0 -0
  50. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/ezusb.h +0 -0
  51. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/fxload.c +28 -7
  52. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt.c +0 -0
  53. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt.h +0 -0
  54. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt1.c +0 -0
  55. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/hotplugtest.c +21 -3
  56. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/listdevs.c +0 -0
  57. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/sam3u_benchmark.c +0 -0
  58. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/xusb.c +2 -1
  59. data/ext/{libusb-1.0.19 → libusb-1.0.20}/install-sh +170 -196
  60. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb-1.0.pc.in +0 -0
  61. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/Makefile.am +15 -0
  62. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/Makefile.in +192 -53
  63. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/core.c +218 -100
  64. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/descriptor.c +3 -1
  65. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/hotplug.c +26 -9
  66. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/hotplug.h +8 -0
  67. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/io.c +432 -290
  68. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb-1.0.def +2 -0
  69. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb-1.0.rc +0 -0
  70. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb.h +11 -10
  71. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusbi.h +106 -29
  72. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/darwin_usb.c +27 -67
  73. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/darwin_usb.h +3 -7
  74. data/ext/libusb-1.0.20/libusb/os/haiku/Makefile.am +5 -0
  75. data/ext/libusb-1.0.20/libusb/os/haiku/Makefile.in +810 -0
  76. data/ext/libusb-1.0.20/libusb/os/haiku/aclocal.m4 +1193 -0
  77. data/ext/libusb-1.0.20/libusb/os/haiku/compile +347 -0
  78. data/ext/libusb-1.0.20/libusb/os/haiku/config.guess +1421 -0
  79. data/ext/libusb-1.0.20/libusb/os/haiku/config.sub +1807 -0
  80. data/ext/libusb-1.0.20/libusb/os/haiku/configure +17579 -0
  81. data/ext/libusb-1.0.20/libusb/os/haiku/configure.ac +8 -0
  82. data/ext/libusb-1.0.20/libusb/os/haiku/depcomp +791 -0
  83. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_pollfs.cpp +378 -0
  84. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb.h +112 -0
  85. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_backend.cpp +550 -0
  86. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_raw.cpp +255 -0
  87. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_raw.h +180 -0
  88. data/ext/libusb-1.0.20/libusb/os/haiku/install-sh +501 -0
  89. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/ltmain.sh +0 -0
  90. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/libtool.m4 +0 -0
  91. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltoptions.m4 +0 -0
  92. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltsugar.m4 +0 -0
  93. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltversion.m4 +0 -0
  94. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/lt~obsolete.m4 +0 -0
  95. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/missing +1 -1
  96. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_netlink.c +4 -4
  97. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_udev.c +1 -2
  98. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_usbfs.c +46 -49
  99. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_usbfs.h +1 -1
  100. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/netbsd_usb.c +9 -73
  101. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/openbsd_usb.c +9 -73
  102. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_posix.c +2 -0
  103. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_posix.h +0 -0
  104. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_windows.c +3 -1
  105. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_windows.h +0 -0
  106. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_posix.c +3 -3
  107. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_posix.h +0 -0
  108. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_windows.c +3 -1
  109. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_windows.h +0 -0
  110. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/wince_usb.c +87 -250
  111. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/wince_usb.h +0 -0
  112. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_common.h +1 -1
  113. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_usb.c +267 -181
  114. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_usb.h +22 -7
  115. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/strerror.c +5 -2
  116. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/sync.c +2 -1
  117. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/version.h +1 -1
  118. data/ext/libusb-1.0.20/libusb/version_nano.h +1 -0
  119. data/ext/libusb-1.0.20/ltmain.sh +9655 -0
  120. data/ext/libusb-1.0.20/m4/libtool.m4 +7992 -0
  121. data/ext/libusb-1.0.20/m4/ltoptions.m4 +384 -0
  122. data/ext/libusb-1.0.20/m4/ltsugar.m4 +123 -0
  123. data/ext/libusb-1.0.20/m4/ltversion.m4 +23 -0
  124. data/ext/libusb-1.0.20/m4/lt~obsolete.m4 +98 -0
  125. data/ext/libusb-1.0.20/missing +215 -0
  126. data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/Makefile.am +0 -0
  127. data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/Makefile.in +19 -6
  128. data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/libusb_testlib.h +0 -0
  129. data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/stress.c +0 -0
  130. data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/testlib.c +0 -0
  131. data/lib/libusb.rb +1 -0
  132. data/lib/libusb/call.rb +1 -0
  133. data/lib/libusb/context.rb +5 -2
  134. data/lib/libusb/stdio.rb +25 -0
  135. data/lib/libusb/version_gem.rb +1 -1
  136. data/libusb.gemspec +2 -1
  137. metadata +152 -115
  138. metadata.gz.sig +0 -0
  139. data/ext/libusb-1.0.19/Xcode/libusb.xcodeproj/project.pbxproj +0 -1
  140. data/ext/libusb-1.0.19/doc/doxygen.cfg.in +0 -1288
  141. data/ext/libusb-1.0.19/libusb/version_nano.h +0 -1
@@ -0,0 +1,255 @@
1
+ /*
2
+ * Haiku Backend for libusb
3
+ * Copyright © 2014 Akshay Jaggi <akshay1994.leo@gmail.com>
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with this library; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ */
19
+
20
+
21
+ #include <unistd.h>
22
+ #include <string.h>
23
+ #include <stdlib.h>
24
+ #include <new>
25
+ #include <vector>
26
+
27
+ #include "haiku_usb.h"
28
+
29
+ USBRoster gUsbRoster;
30
+ int32 gInitCount = 0;
31
+
32
+ static int
33
+ haiku_init(struct libusb_context* ctx)
34
+ {
35
+ if (atomic_add(&gInitCount, 1) == 0)
36
+ {
37
+ return gUsbRoster.Start();
38
+ }
39
+ return LIBUSB_SUCCESS;
40
+ }
41
+
42
+ static void
43
+ haiku_exit(void)
44
+ {
45
+ if (atomic_add(&gInitCount, -1) == 1)
46
+ gUsbRoster.Stop();
47
+ }
48
+
49
+ static int
50
+ haiku_open(struct libusb_device_handle *dev_handle)
51
+ {
52
+ USBDevice* dev=*((USBDevice**)dev_handle->dev->os_priv);
53
+ USBDeviceHandle *handle=new(std::nothrow) USBDeviceHandle(dev);
54
+ if (handle == NULL)
55
+ return LIBUSB_ERROR_NO_MEM;
56
+ if (handle->InitCheck() == false)
57
+ {
58
+ delete handle;
59
+ return LIBUSB_ERROR_NO_DEVICE;
60
+ }
61
+ *((USBDeviceHandle**)dev_handle->os_priv)=handle;
62
+ return LIBUSB_SUCCESS;
63
+ }
64
+
65
+ static void
66
+ haiku_close(struct libusb_device_handle *dev_handle)
67
+ {
68
+ USBDeviceHandle * handle=*((USBDeviceHandle**)dev_handle->os_priv);
69
+ if(handle==NULL)
70
+ return;
71
+ delete handle;
72
+ *((USBDeviceHandle**)dev_handle->os_priv)=NULL;
73
+ }
74
+
75
+ static int
76
+ haiku_get_device_descriptor(struct libusb_device *device, unsigned char* buffer, int *host_endian)
77
+ {
78
+ USBDevice *dev = *((USBDevice**)(device->os_priv));
79
+ memcpy(buffer,dev->Descriptor(),DEVICE_DESC_LENGTH);
80
+ *host_endian=0;
81
+ return LIBUSB_SUCCESS;
82
+ }
83
+
84
+ static int
85
+ haiku_get_active_config_descriptor(struct libusb_device *device, unsigned char *buffer, size_t len, int *host_endian)
86
+ {
87
+ USBDevice *dev = *((USBDevice**)(device->os_priv));
88
+ const usb_configuration_descriptor* act_config = dev->ActiveConfiguration();
89
+ if(len>act_config->total_length)
90
+ {
91
+ return LIBUSB_ERROR_OVERFLOW;
92
+ }
93
+ memcpy(buffer,act_config,len);
94
+ *host_endian=0;
95
+ return LIBUSB_SUCCESS;
96
+ }
97
+
98
+ static int
99
+ haiku_get_config_descriptor(struct libusb_device *device, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian)
100
+ {
101
+ USBDevice *dev = *((USBDevice**)(device->os_priv));
102
+ const usb_configuration_descriptor* config = dev->ConfigurationDescriptor(config_index);
103
+ if(config==NULL)
104
+ {
105
+ usbi_err(DEVICE_CTX(device),"failed getting configuration descriptor");
106
+ return LIBUSB_ERROR_INVALID_PARAM;
107
+ }
108
+ if(len>config->total_length)
109
+ len=config->total_length;
110
+ memcpy(buffer,(unsigned char*)config,len);
111
+ *host_endian=0;
112
+ return len;
113
+ }
114
+
115
+ static int
116
+ haiku_set_configuration(struct libusb_device_handle *dev_handle, int config)
117
+ {
118
+ USBDeviceHandle * handle= *((USBDeviceHandle**)dev_handle->os_priv);
119
+ return handle->SetConfiguration(config);
120
+ }
121
+
122
+ static int
123
+ haiku_claim_interface(struct libusb_device_handle *dev_handle, int interface_number)
124
+ {
125
+ USBDeviceHandle * handle=*((USBDeviceHandle**)dev_handle->os_priv);
126
+ return handle->ClaimInterface(interface_number);
127
+ }
128
+
129
+ static int
130
+ haiku_set_altsetting(struct libusb_device_handle* dev_handle, int interface_number, int altsetting)
131
+ {
132
+ USBDeviceHandle* handle = *((USBDeviceHandle**)dev_handle->os_priv);
133
+ return handle->SetAltSetting(interface_number, altsetting);
134
+ }
135
+
136
+ static int
137
+ haiku_release_interface(struct libusb_device_handle *dev_handle, int interface_number)
138
+ {
139
+ USBDeviceHandle * handle=*((USBDeviceHandle**)dev_handle->os_priv);
140
+ haiku_set_altsetting(dev_handle,interface_number,0);
141
+ return handle->ReleaseInterface(interface_number);
142
+ }
143
+
144
+ static int
145
+ haiku_submit_transfer(struct usbi_transfer * itransfer)
146
+ {
147
+ struct libusb_transfer* fLibusbTransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
148
+ USBDeviceHandle * fDeviceHandle = *((USBDeviceHandle**)fLibusbTransfer->dev_handle->os_priv);
149
+ return fDeviceHandle->SubmitTransfer(itransfer);
150
+ }
151
+
152
+ static int
153
+ haiku_cancel_transfer(struct usbi_transfer * itransfer)
154
+ {
155
+ struct libusb_transfer* fLibusbTransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
156
+ USBDeviceHandle * fDeviceHandle = *((USBDeviceHandle**)fLibusbTransfer->dev_handle->os_priv);
157
+ return fDeviceHandle->CancelTransfer(*((USBTransfer**)usbi_transfer_get_os_priv(itransfer)));
158
+ }
159
+
160
+ static void
161
+ haiku_clear_transfer_priv(struct usbi_transfer * itransfer)
162
+ {
163
+ USBTransfer* transfer=*((USBTransfer**)usbi_transfer_get_os_priv(itransfer));
164
+ delete transfer;
165
+ *((USBTransfer**)usbi_transfer_get_os_priv(itransfer))=NULL;
166
+ }
167
+
168
+ static int
169
+ haiku_handle_transfer_completion(struct usbi_transfer * itransfer)
170
+ {
171
+ USBTransfer* transfer=*((USBTransfer**)usbi_transfer_get_os_priv(itransfer));
172
+
173
+ usbi_mutex_lock(&itransfer->lock);
174
+ if(transfer->IsCancelled())
175
+ {
176
+ delete transfer;
177
+ *((USBTransfer**)usbi_transfer_get_os_priv(itransfer))=NULL;
178
+ usbi_mutex_unlock(&itransfer->lock);
179
+ if (itransfer->transferred < 0)
180
+ itransfer->transferred = 0;
181
+ return usbi_handle_transfer_cancellation(itransfer);
182
+ }
183
+ libusb_transfer_status status = LIBUSB_TRANSFER_COMPLETED;
184
+ if(itransfer->transferred < 0)
185
+ {
186
+ usbi_err(ITRANSFER_CTX(itransfer), "error in transfer");
187
+ status = LIBUSB_TRANSFER_ERROR;
188
+ itransfer->transferred=0;
189
+ }
190
+ delete transfer;
191
+ *((USBTransfer**)usbi_transfer_get_os_priv(itransfer))=NULL;
192
+ usbi_mutex_unlock(&itransfer->lock);
193
+ return usbi_handle_transfer_completion(itransfer, status);
194
+ }
195
+
196
+ static int
197
+ haiku_clock_gettime(int clkid, struct timespec *tp)
198
+ {
199
+ if(clkid == USBI_CLOCK_REALTIME)
200
+ return clock_gettime(CLOCK_REALTIME, tp);
201
+ if(clkid == USBI_CLOCK_MONOTONIC)
202
+ return clock_gettime(CLOCK_MONOTONIC, tp);
203
+ return LIBUSB_ERROR_INVALID_PARAM;
204
+ }
205
+
206
+ const struct usbi_os_backend haiku_usb_raw_backend = {
207
+ /*.name =*/ "Haiku usbfs",
208
+ /*.caps =*/ 0,
209
+ /*.init =*/ haiku_init,
210
+ /*.exit =*/ haiku_exit,
211
+ /*.get_device_list =*/ NULL,
212
+ /*.hotplug_poll =*/ NULL,
213
+ /*.open =*/ haiku_open,
214
+ /*.close =*/ haiku_close,
215
+ /*.get_device_descriptor =*/ haiku_get_device_descriptor,
216
+ /*.get_active_config_descriptor =*/ haiku_get_active_config_descriptor,
217
+ /*.get_config_descriptor =*/ haiku_get_config_descriptor,
218
+ /*.get_config_descriptor_by_value =*/ NULL,
219
+
220
+
221
+ /*.get_configuration =*/ NULL,
222
+ /*.set_configuration =*/ haiku_set_configuration,
223
+ /*.claim_interface =*/ haiku_claim_interface,
224
+ /*.release_interface =*/ haiku_release_interface,
225
+
226
+ /*.set_interface_altsetting =*/ haiku_set_altsetting,
227
+ /*.clear_halt =*/ NULL,
228
+ /*.reset_device =*/ NULL,
229
+
230
+ /*.alloc_streams =*/ NULL,
231
+ /*.free_streams =*/ NULL,
232
+
233
+ /*.kernel_driver_active =*/ NULL,
234
+ /*.detach_kernel_driver =*/ NULL,
235
+ /*.attach_kernel_driver =*/ NULL,
236
+
237
+ /*.destroy_device =*/ NULL,
238
+
239
+ /*.submit_transfer =*/ haiku_submit_transfer,
240
+ /*.cancel_transfer =*/ haiku_cancel_transfer,
241
+ /*.clear_transfer_priv =*/ haiku_clear_transfer_priv,
242
+
243
+ /*.handle_events =*/ NULL,
244
+ /*.handle_transfer_completion =*/ haiku_handle_transfer_completion,
245
+
246
+ /*.clock_gettime =*/ haiku_clock_gettime,
247
+
248
+ #ifdef USBI_TIMERFD_AVAILABLE
249
+ /*.get_timerfd_clockid =*/ NULL,
250
+ #endif
251
+
252
+ /*.device_priv_size =*/ sizeof(USBDevice*),
253
+ /*.device_handle_priv_size =*/ sizeof(USBDeviceHandle*),
254
+ /*.transfer_priv_size =*/ sizeof(USBTransfer*),
255
+ };
@@ -0,0 +1,180 @@
1
+ /*
2
+ * Copyright 2006-2008, Haiku Inc. All rights reserved.
3
+ * Distributed under the terms of the MIT License.
4
+ */
5
+
6
+ #ifndef _USB_RAW_H_
7
+ #define _USB_RAW_H_
8
+
9
+ #include <USB3.h>
10
+
11
+ #define B_USB_RAW_PROTOCOL_VERSION 0x0015
12
+ #define B_USB_RAW_ACTIVE_ALTERNATE 0xffffffff
13
+
14
+ typedef enum {
15
+ B_USB_RAW_COMMAND_GET_VERSION = 0x1000,
16
+
17
+ B_USB_RAW_COMMAND_GET_DEVICE_DESCRIPTOR = 0x2000,
18
+ B_USB_RAW_COMMAND_GET_CONFIGURATION_DESCRIPTOR,
19
+ B_USB_RAW_COMMAND_GET_INTERFACE_DESCRIPTOR,
20
+ B_USB_RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR,
21
+ B_USB_RAW_COMMAND_GET_STRING_DESCRIPTOR,
22
+ B_USB_RAW_COMMAND_GET_GENERIC_DESCRIPTOR,
23
+ B_USB_RAW_COMMAND_GET_ALT_INTERFACE_COUNT,
24
+ B_USB_RAW_COMMAND_GET_ACTIVE_ALT_INTERFACE_INDEX,
25
+ B_USB_RAW_COMMAND_GET_INTERFACE_DESCRIPTOR_ETC,
26
+ B_USB_RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR_ETC,
27
+ B_USB_RAW_COMMAND_GET_GENERIC_DESCRIPTOR_ETC,
28
+
29
+ B_USB_RAW_COMMAND_SET_CONFIGURATION = 0x3000,
30
+ B_USB_RAW_COMMAND_SET_FEATURE,
31
+ B_USB_RAW_COMMAND_CLEAR_FEATURE,
32
+ B_USB_RAW_COMMAND_GET_STATUS,
33
+ B_USB_RAW_COMMAND_GET_DESCRIPTOR,
34
+ B_USB_RAW_COMMAND_SET_ALT_INTERFACE,
35
+
36
+ B_USB_RAW_COMMAND_CONTROL_TRANSFER = 0x4000,
37
+ B_USB_RAW_COMMAND_INTERRUPT_TRANSFER,
38
+ B_USB_RAW_COMMAND_BULK_TRANSFER,
39
+ B_USB_RAW_COMMAND_ISOCHRONOUS_TRANSFER
40
+ } usb_raw_command_id;
41
+
42
+
43
+ typedef enum {
44
+ B_USB_RAW_STATUS_SUCCESS = 0,
45
+
46
+ B_USB_RAW_STATUS_FAILED,
47
+ B_USB_RAW_STATUS_ABORTED,
48
+ B_USB_RAW_STATUS_STALLED,
49
+ B_USB_RAW_STATUS_CRC_ERROR,
50
+ B_USB_RAW_STATUS_TIMEOUT,
51
+
52
+ B_USB_RAW_STATUS_INVALID_CONFIGURATION,
53
+ B_USB_RAW_STATUS_INVALID_INTERFACE,
54
+ B_USB_RAW_STATUS_INVALID_ENDPOINT,
55
+ B_USB_RAW_STATUS_INVALID_STRING,
56
+
57
+ B_USB_RAW_STATUS_NO_MEMORY
58
+ } usb_raw_command_status;
59
+
60
+
61
+ typedef union {
62
+ struct {
63
+ status_t status;
64
+ } version;
65
+
66
+ struct {
67
+ status_t status;
68
+ usb_device_descriptor *descriptor;
69
+ } device;
70
+
71
+ struct {
72
+ status_t status;
73
+ usb_configuration_descriptor *descriptor;
74
+ uint32 config_index;
75
+ } config;
76
+
77
+ struct {
78
+ status_t status;
79
+ uint32 alternate_info;
80
+ uint32 config_index;
81
+ uint32 interface_index;
82
+ } alternate;
83
+
84
+ struct {
85
+ status_t status;
86
+ usb_interface_descriptor *descriptor;
87
+ uint32 config_index;
88
+ uint32 interface_index;
89
+ } interface;
90
+
91
+ struct {
92
+ status_t status;
93
+ usb_interface_descriptor *descriptor;
94
+ uint32 config_index;
95
+ uint32 interface_index;
96
+ uint32 alternate_index;
97
+ } interface_etc;
98
+
99
+ struct {
100
+ status_t status;
101
+ usb_endpoint_descriptor *descriptor;
102
+ uint32 config_index;
103
+ uint32 interface_index;
104
+ uint32 endpoint_index;
105
+ } endpoint;
106
+
107
+ struct {
108
+ status_t status;
109
+ usb_endpoint_descriptor *descriptor;
110
+ uint32 config_index;
111
+ uint32 interface_index;
112
+ uint32 alternate_index;
113
+ uint32 endpoint_index;
114
+ } endpoint_etc;
115
+
116
+ struct {
117
+ status_t status;
118
+ usb_descriptor *descriptor;
119
+ uint32 config_index;
120
+ uint32 interface_index;
121
+ uint32 generic_index;
122
+ size_t length;
123
+ } generic;
124
+
125
+ struct {
126
+ status_t status;
127
+ usb_descriptor *descriptor;
128
+ uint32 config_index;
129
+ uint32 interface_index;
130
+ uint32 alternate_index;
131
+ uint32 generic_index;
132
+ size_t length;
133
+ } generic_etc;
134
+
135
+ struct {
136
+ status_t status;
137
+ usb_string_descriptor *descriptor;
138
+ uint32 string_index;
139
+ size_t length;
140
+ } string;
141
+
142
+ struct {
143
+ status_t status;
144
+ uint8 type;
145
+ uint8 index;
146
+ uint16 language_id;
147
+ void *data;
148
+ size_t length;
149
+ } descriptor;
150
+
151
+ struct {
152
+ status_t status;
153
+ uint8 request_type;
154
+ uint8 request;
155
+ uint16 value;
156
+ uint16 index;
157
+ uint16 length;
158
+ void *data;
159
+ } control;
160
+
161
+ struct {
162
+ status_t status;
163
+ uint32 interface;
164
+ uint32 endpoint;
165
+ void *data;
166
+ size_t length;
167
+ } transfer;
168
+
169
+ struct {
170
+ status_t status;
171
+ uint32 interface;
172
+ uint32 endpoint;
173
+ void *data;
174
+ size_t length;
175
+ usb_iso_packet_descriptor *packet_descriptors;
176
+ uint32 packet_count;
177
+ } isochronous;
178
+ } usb_raw_command;
179
+
180
+ #endif // _USB_RAW_H_
@@ -0,0 +1,501 @@
1
+ #!/bin/sh
2
+ # install - install a program, script, or datafile
3
+
4
+ scriptversion=2013-12-25.23; # UTC
5
+
6
+ # This originates from X11R5 (mit/util/scripts/install.sh), which was
7
+ # later released in X11R6 (xc/config/util/install.sh) with the
8
+ # following copyright and license.
9
+ #
10
+ # Copyright (C) 1994 X Consortium
11
+ #
12
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
13
+ # of this software and associated documentation files (the "Software"), to
14
+ # deal in the Software without restriction, including without limitation the
15
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16
+ # sell copies of the Software, and to permit persons to whom the Software is
17
+ # furnished to do so, subject to the following conditions:
18
+ #
19
+ # The above copyright notice and this permission notice shall be included in
20
+ # all copies or substantial portions of the Software.
21
+ #
22
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+ # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26
+ # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27
+ # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
+ #
29
+ # Except as contained in this notice, the name of the X Consortium shall not
30
+ # be used in advertising or otherwise to promote the sale, use or other deal-
31
+ # ings in this Software without prior written authorization from the X Consor-
32
+ # tium.
33
+ #
34
+ #
35
+ # FSF changes to this file are in the public domain.
36
+ #
37
+ # Calling this script install-sh is preferred over install.sh, to prevent
38
+ # 'make' implicit rules from creating a file called install from it
39
+ # when there is no Makefile.
40
+ #
41
+ # This script is compatible with the BSD install script, but was written
42
+ # from scratch.
43
+
44
+ tab=' '
45
+ nl='
46
+ '
47
+ IFS=" $tab$nl"
48
+
49
+ # Set DOITPROG to "echo" to test this script.
50
+
51
+ doit=${DOITPROG-}
52
+ doit_exec=${doit:-exec}
53
+
54
+ # Put in absolute file names if you don't have them in your path;
55
+ # or use environment vars.
56
+
57
+ chgrpprog=${CHGRPPROG-chgrp}
58
+ chmodprog=${CHMODPROG-chmod}
59
+ chownprog=${CHOWNPROG-chown}
60
+ cmpprog=${CMPPROG-cmp}
61
+ cpprog=${CPPROG-cp}
62
+ mkdirprog=${MKDIRPROG-mkdir}
63
+ mvprog=${MVPROG-mv}
64
+ rmprog=${RMPROG-rm}
65
+ stripprog=${STRIPPROG-strip}
66
+
67
+ posix_mkdir=
68
+
69
+ # Desired mode of installed file.
70
+ mode=0755
71
+
72
+ chgrpcmd=
73
+ chmodcmd=$chmodprog
74
+ chowncmd=
75
+ mvcmd=$mvprog
76
+ rmcmd="$rmprog -f"
77
+ stripcmd=
78
+
79
+ src=
80
+ dst=
81
+ dir_arg=
82
+ dst_arg=
83
+
84
+ copy_on_change=false
85
+ is_target_a_directory=possibly
86
+
87
+ usage="\
88
+ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
89
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
90
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
91
+ or: $0 [OPTION]... -d DIRECTORIES...
92
+
93
+ In the 1st form, copy SRCFILE to DSTFILE.
94
+ In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
95
+ In the 4th, create DIRECTORIES.
96
+
97
+ Options:
98
+ --help display this help and exit.
99
+ --version display version info and exit.
100
+
101
+ -c (ignored)
102
+ -C install only if different (preserve the last data modification time)
103
+ -d create directories instead of installing files.
104
+ -g GROUP $chgrpprog installed files to GROUP.
105
+ -m MODE $chmodprog installed files to MODE.
106
+ -o USER $chownprog installed files to USER.
107
+ -s $stripprog installed files.
108
+ -t DIRECTORY install into DIRECTORY.
109
+ -T report an error if DSTFILE is a directory.
110
+
111
+ Environment variables override the default commands:
112
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
113
+ RMPROG STRIPPROG
114
+ "
115
+
116
+ while test $# -ne 0; do
117
+ case $1 in
118
+ -c) ;;
119
+
120
+ -C) copy_on_change=true;;
121
+
122
+ -d) dir_arg=true;;
123
+
124
+ -g) chgrpcmd="$chgrpprog $2"
125
+ shift;;
126
+
127
+ --help) echo "$usage"; exit $?;;
128
+
129
+ -m) mode=$2
130
+ case $mode in
131
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
132
+ echo "$0: invalid mode: $mode" >&2
133
+ exit 1;;
134
+ esac
135
+ shift;;
136
+
137
+ -o) chowncmd="$chownprog $2"
138
+ shift;;
139
+
140
+ -s) stripcmd=$stripprog;;
141
+
142
+ -t)
143
+ is_target_a_directory=always
144
+ dst_arg=$2
145
+ # Protect names problematic for 'test' and other utilities.
146
+ case $dst_arg in
147
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
148
+ esac
149
+ shift;;
150
+
151
+ -T) is_target_a_directory=never;;
152
+
153
+ --version) echo "$0 $scriptversion"; exit $?;;
154
+
155
+ --) shift
156
+ break;;
157
+
158
+ -*) echo "$0: invalid option: $1" >&2
159
+ exit 1;;
160
+
161
+ *) break;;
162
+ esac
163
+ shift
164
+ done
165
+
166
+ # We allow the use of options -d and -T together, by making -d
167
+ # take the precedence; this is for compatibility with GNU install.
168
+
169
+ if test -n "$dir_arg"; then
170
+ if test -n "$dst_arg"; then
171
+ echo "$0: target directory not allowed when installing a directory." >&2
172
+ exit 1
173
+ fi
174
+ fi
175
+
176
+ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
177
+ # When -d is used, all remaining arguments are directories to create.
178
+ # When -t is used, the destination is already specified.
179
+ # Otherwise, the last argument is the destination. Remove it from $@.
180
+ for arg
181
+ do
182
+ if test -n "$dst_arg"; then
183
+ # $@ is not empty: it contains at least $arg.
184
+ set fnord "$@" "$dst_arg"
185
+ shift # fnord
186
+ fi
187
+ shift # arg
188
+ dst_arg=$arg
189
+ # Protect names problematic for 'test' and other utilities.
190
+ case $dst_arg in
191
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
192
+ esac
193
+ done
194
+ fi
195
+
196
+ if test $# -eq 0; then
197
+ if test -z "$dir_arg"; then
198
+ echo "$0: no input file specified." >&2
199
+ exit 1
200
+ fi
201
+ # It's OK to call 'install-sh -d' without argument.
202
+ # This can happen when creating conditional directories.
203
+ exit 0
204
+ fi
205
+
206
+ if test -z "$dir_arg"; then
207
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
208
+ if test ! -d "$dst_arg"; then
209
+ echo "$0: $dst_arg: Is not a directory." >&2
210
+ exit 1
211
+ fi
212
+ fi
213
+ fi
214
+
215
+ if test -z "$dir_arg"; then
216
+ do_exit='(exit $ret); exit $ret'
217
+ trap "ret=129; $do_exit" 1
218
+ trap "ret=130; $do_exit" 2
219
+ trap "ret=141; $do_exit" 13
220
+ trap "ret=143; $do_exit" 15
221
+
222
+ # Set umask so as not to create temps with too-generous modes.
223
+ # However, 'strip' requires both read and write access to temps.
224
+ case $mode in
225
+ # Optimize common cases.
226
+ *644) cp_umask=133;;
227
+ *755) cp_umask=22;;
228
+
229
+ *[0-7])
230
+ if test -z "$stripcmd"; then
231
+ u_plus_rw=
232
+ else
233
+ u_plus_rw='% 200'
234
+ fi
235
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
236
+ *)
237
+ if test -z "$stripcmd"; then
238
+ u_plus_rw=
239
+ else
240
+ u_plus_rw=,u+rw
241
+ fi
242
+ cp_umask=$mode$u_plus_rw;;
243
+ esac
244
+ fi
245
+
246
+ for src
247
+ do
248
+ # Protect names problematic for 'test' and other utilities.
249
+ case $src in
250
+ -* | [=\(\)!]) src=./$src;;
251
+ esac
252
+
253
+ if test -n "$dir_arg"; then
254
+ dst=$src
255
+ dstdir=$dst
256
+ test -d "$dstdir"
257
+ dstdir_status=$?
258
+ else
259
+
260
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
261
+ # might cause directories to be created, which would be especially bad
262
+ # if $src (and thus $dsttmp) contains '*'.
263
+ if test ! -f "$src" && test ! -d "$src"; then
264
+ echo "$0: $src does not exist." >&2
265
+ exit 1
266
+ fi
267
+
268
+ if test -z "$dst_arg"; then
269
+ echo "$0: no destination specified." >&2
270
+ exit 1
271
+ fi
272
+ dst=$dst_arg
273
+
274
+ # If destination is a directory, append the input filename; won't work
275
+ # if double slashes aren't ignored.
276
+ if test -d "$dst"; then
277
+ if test "$is_target_a_directory" = never; then
278
+ echo "$0: $dst_arg: Is a directory" >&2
279
+ exit 1
280
+ fi
281
+ dstdir=$dst
282
+ dst=$dstdir/`basename "$src"`
283
+ dstdir_status=0
284
+ else
285
+ dstdir=`dirname "$dst"`
286
+ test -d "$dstdir"
287
+ dstdir_status=$?
288
+ fi
289
+ fi
290
+
291
+ obsolete_mkdir_used=false
292
+
293
+ if test $dstdir_status != 0; then
294
+ case $posix_mkdir in
295
+ '')
296
+ # Create intermediate dirs using mode 755 as modified by the umask.
297
+ # This is like FreeBSD 'install' as of 1997-10-28.
298
+ umask=`umask`
299
+ case $stripcmd.$umask in
300
+ # Optimize common cases.
301
+ *[2367][2367]) mkdir_umask=$umask;;
302
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
303
+
304
+ *[0-7])
305
+ mkdir_umask=`expr $umask + 22 \
306
+ - $umask % 100 % 40 + $umask % 20 \
307
+ - $umask % 10 % 4 + $umask % 2
308
+ `;;
309
+ *) mkdir_umask=$umask,go-w;;
310
+ esac
311
+
312
+ # With -d, create the new directory with the user-specified mode.
313
+ # Otherwise, rely on $mkdir_umask.
314
+ if test -n "$dir_arg"; then
315
+ mkdir_mode=-m$mode
316
+ else
317
+ mkdir_mode=
318
+ fi
319
+
320
+ posix_mkdir=false
321
+ case $umask in
322
+ *[123567][0-7][0-7])
323
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
324
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
325
+ ;;
326
+ *)
327
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
328
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
329
+
330
+ if (umask $mkdir_umask &&
331
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
332
+ then
333
+ if test -z "$dir_arg" || {
334
+ # Check for POSIX incompatibilities with -m.
335
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
336
+ # other-writable bit of parent directory when it shouldn't.
337
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
338
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
339
+ case $ls_ld_tmpdir in
340
+ d????-?r-*) different_mode=700;;
341
+ d????-?--*) different_mode=755;;
342
+ *) false;;
343
+ esac &&
344
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
345
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
346
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
347
+ }
348
+ }
349
+ then posix_mkdir=:
350
+ fi
351
+ rmdir "$tmpdir/d" "$tmpdir"
352
+ else
353
+ # Remove any dirs left behind by ancient mkdir implementations.
354
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
355
+ fi
356
+ trap '' 0;;
357
+ esac;;
358
+ esac
359
+
360
+ if
361
+ $posix_mkdir && (
362
+ umask $mkdir_umask &&
363
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
364
+ )
365
+ then :
366
+ else
367
+
368
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
369
+ # or it failed possibly due to a race condition. Create the
370
+ # directory the slow way, step by step, checking for races as we go.
371
+
372
+ case $dstdir in
373
+ /*) prefix='/';;
374
+ [-=\(\)!]*) prefix='./';;
375
+ *) prefix='';;
376
+ esac
377
+
378
+ oIFS=$IFS
379
+ IFS=/
380
+ set -f
381
+ set fnord $dstdir
382
+ shift
383
+ set +f
384
+ IFS=$oIFS
385
+
386
+ prefixes=
387
+
388
+ for d
389
+ do
390
+ test X"$d" = X && continue
391
+
392
+ prefix=$prefix$d
393
+ if test -d "$prefix"; then
394
+ prefixes=
395
+ else
396
+ if $posix_mkdir; then
397
+ (umask=$mkdir_umask &&
398
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
399
+ # Don't fail if two instances are running concurrently.
400
+ test -d "$prefix" || exit 1
401
+ else
402
+ case $prefix in
403
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
404
+ *) qprefix=$prefix;;
405
+ esac
406
+ prefixes="$prefixes '$qprefix'"
407
+ fi
408
+ fi
409
+ prefix=$prefix/
410
+ done
411
+
412
+ if test -n "$prefixes"; then
413
+ # Don't fail if two instances are running concurrently.
414
+ (umask $mkdir_umask &&
415
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
416
+ test -d "$dstdir" || exit 1
417
+ obsolete_mkdir_used=true
418
+ fi
419
+ fi
420
+ fi
421
+
422
+ if test -n "$dir_arg"; then
423
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
424
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
425
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
426
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
427
+ else
428
+
429
+ # Make a couple of temp file names in the proper directory.
430
+ dsttmp=$dstdir/_inst.$$_
431
+ rmtmp=$dstdir/_rm.$$_
432
+
433
+ # Trap to clean up those temp files at exit.
434
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
435
+
436
+ # Copy the file name to the temp name.
437
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
438
+
439
+ # and set any options; do chmod last to preserve setuid bits.
440
+ #
441
+ # If any of these fail, we abort the whole thing. If we want to
442
+ # ignore errors from any of these, just make sure not to ignore
443
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
444
+ #
445
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
446
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
447
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
448
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
449
+
450
+ # If -C, don't bother to copy if it wouldn't change the file.
451
+ if $copy_on_change &&
452
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
453
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
454
+ set -f &&
455
+ set X $old && old=:$2:$4:$5:$6 &&
456
+ set X $new && new=:$2:$4:$5:$6 &&
457
+ set +f &&
458
+ test "$old" = "$new" &&
459
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
460
+ then
461
+ rm -f "$dsttmp"
462
+ else
463
+ # Rename the file to the real destination.
464
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
465
+
466
+ # The rename failed, perhaps because mv can't rename something else
467
+ # to itself, or perhaps because mv is so ancient that it does not
468
+ # support -f.
469
+ {
470
+ # Now remove or move aside any old file at destination location.
471
+ # We try this two ways since rm can't unlink itself on some
472
+ # systems and the destination file might be busy for other
473
+ # reasons. In this case, the final cleanup might fail but the new
474
+ # file should still install successfully.
475
+ {
476
+ test ! -f "$dst" ||
477
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
478
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
479
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
480
+ } ||
481
+ { echo "$0: cannot unlink or rename $dst" >&2
482
+ (exit 1); exit 1
483
+ }
484
+ } &&
485
+
486
+ # Now rename the file to the real destination.
487
+ $doit $mvcmd "$dsttmp" "$dst"
488
+ }
489
+ fi || exit 1
490
+
491
+ trap '' 0
492
+ fi
493
+ done
494
+
495
+ # Local variables:
496
+ # eval: (add-hook 'write-file-hooks 'time-stamp)
497
+ # time-stamp-start: "scriptversion="
498
+ # time-stamp-format: "%:y-%02m-%02d.%02H"
499
+ # time-stamp-time-zone: "UTC"
500
+ # time-stamp-end: "; # UTC"
501
+ # End: