4 gcc -c -fPIC preload_open.c
5 ld -shared -o preload_open.so preload_open.o -ldl
11 #include <sys/types.h>
22 #include <sys/ioctl.h>
23 #include <linux/usbdevice_fs.h>
25 static int usb_fd = -1;
26 static const char *usb_path = "/dev/vboxusb";
28 #define LOG_NAME "/tmp/usb.log"
30 static int (*real_open)(const char *, int, mode_t );
32 static void logit(const char *fmt, ...)
34 static int logfd = -1;
38 real_open = dlsym(RTLD_NEXT, "open");
42 logfd = real_open(LOG_NAME, O_WRONLY|O_APPEND|O_CREAT, 0666);
45 vdprintf(logfd, fmt, ap);
49 int open(const char *pathname, int flags, ...)
56 mode = va_arg(ap, mode_t);
59 if (usb_path == NULL) {
60 usb_path = getenv("USB_PATH");
64 real_open = dlsym(RTLD_NEXT, "open");
67 ret = real_open(pathname, flags, mode);
68 if (ret != -1 && usb_path && strncmp(pathname, usb_path, strlen(usb_path)) == 0) {
69 logit("(%4u) opening %s as fd=%d\n", getpid(), pathname, ret);
75 int open64(const char *pathname, int flags, ...)
82 mode = va_arg(ap, mode_t);
85 if (usb_path == NULL) {
86 usb_path = getenv("USB_PATH");
90 real_open = dlsym(RTLD_NEXT, "open64");
93 ret = real_open(pathname, flags, mode);
94 if (ret != -1 && usb_path && strncmp(pathname, usb_path, strlen(usb_path)) == 0) {
95 logit("(%4u) opening %s as fd=%d\n", getpid(), pathname, ret);
103 static int (*real_close)(int fd);
107 real_close = dlsym(RTLD_NEXT, "close");
110 ret = real_close(fd);
111 if (ret == 0 && fd == usb_fd) {
112 logit("(%4u) closing fd=%d\n", getpid(), fd);
119 int ioctl(int fd, unsigned long int cmd, ...)
123 static int (*real_ioctl)(int fd, int cmd, void *arg);
127 real_ioctl = dlsym(RTLD_NEXT, "ioctl");
131 arg = va_arg(ap, void *);
134 ret = real_ioctl(fd, cmd, arg);
136 if (ret == 0 && fd == usb_fd &&
137 (cmd == USBDEVFS_REAPURBNDELAY) && arg != NULL) {
138 struct usbdevfs_urb *urb = *(struct usbdevfs_urb **)arg;
139 uint8_t *data = urb->buffer;
143 if (urb->actual_length != sizeof(newdata)) {
144 logit("actual_length=%u\n", urb->actual_length);
147 for (i=0;i<urb->actual_length;i++) {
148 logit("%02X ", data[i]);
151 df = fopen("/tmp/usb.data", "r");
155 for (i=0;i<sizeof(newdata);i++) {
157 if (fscanf(df, "%02X", &v) != 1) {
164 memcpy(urb->buffer, newdata, sizeof(newdata));
165 logit("(%4u) replaced actual_length=%u\n", getpid(), urb->actual_length);