Fixed various trivial cppcheck 1.80 warnings
[platform/upstream/libusb.git] / examples / dpfp.c
index e5aed9f..77f9476 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * fpusb example program to manipulate U.are.U 4000B fingerprint scanner.
- * Copyright (C) 2007 Daniel Drake <dsd@gentoo.org>
+ * libusb example program to manipulate U.are.U 4000B fingerprint scanner.
+ * Copyright © 2007 Daniel Drake <dsd@gentoo.org>
  *
  * Basic image capture program only, does not consider the powerup quirks or
  * the fact that image encryption may be enabled. Not expected to work
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <errno.h>
 #include <signal.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 
-#include <libfpusb/fpusb.h>
+#include "libusb.h"
 
-#define EP_INTR                        (1 | USB_ENDPOINT_IN)
-#define EP_DATA                        (2 | USB_ENDPOINT_IN)
-#define CTRL_IN                        (USB_TYPE_VENDOR | USB_ENDPOINT_IN)
-#define CTRL_OUT               (USB_TYPE_VENDOR | USB_ENDPOINT_OUT)
+#define EP_INTR                        (1 | LIBUSB_ENDPOINT_IN)
+#define EP_DATA                        (2 | LIBUSB_ENDPOINT_IN)
+#define CTRL_IN                        (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN)
+#define CTRL_OUT               (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT)
 #define USB_RQ                 0x04
 #define INTR_LENGTH            64
 
@@ -45,8 +46,6 @@ enum {
 };
 
 static int next_state(void);
-static int submit_irq_urb(void);
-static int submit_img_urb(void);
 
 enum {
        STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_ON = 1,
@@ -58,56 +57,28 @@ enum {
 };
 
 static int state = 0;
-static struct fpusb_dev_handle *devh = NULL;
+static struct libusb_device_handle *devh = NULL;
 static unsigned char imgbuf[0x1b340];
 static unsigned char irqbuf[INTR_LENGTH];
-static fpusb_urb_handle *img_urbh = NULL;
-static fpusb_urb_handle *irq_urbh = NULL;
+static struct libusb_transfer *img_transfer = NULL;
+static struct libusb_transfer *irq_transfer = NULL;
 static int img_idx = 0;
 static int do_exit = 0;
 
-static struct fpusb_bulk_msg imgmsg = {
-       .endpoint = EP_DATA,
-       .data = imgbuf,
-       .length = sizeof(imgbuf),
-};
-
-static struct fpusb_bulk_msg irqmsg = {
-       .endpoint = EP_INTR,
-       .data = irqbuf,
-       .length = sizeof(irqbuf),
-};
-
-static struct fpusb_dev *find_dpfp_device(void)
+static int find_dpfp_device(void)
 {
-       struct fpusb_dev *dev;
-
-       fpusb_find_devices();
-
-       for (dev = fpusb_get_devices(); dev; dev = fpusb_dev_next(dev)) {
-               struct usb_dev_descriptor *desc = fpusb_dev_get_descriptor(dev);
-               if (desc->idVendor == 0x05ba && desc->idProduct == 0x000a)
-                       return dev;
-       }
-
-       return NULL;
+       devh = libusb_open_device_with_vid_pid(NULL, 0x05ba, 0x000a);
+       return devh ? 0 : -EIO;
 }
 
 static int print_f0_data(void)
 {
        unsigned char data[0x10];
-       struct fpusb_ctrl_msg msg = {
-               .requesttype = CTRL_IN,
-               .request = USB_RQ,
-               .value = 0xf0,
-               .index = 0,
-               .length = sizeof(data),
-               .data = data,
-       };
        int r;
        unsigned int i;
 
-       r = fpusb_ctrl_msg(devh, &msg, 0);
+       r = libusb_control_transfer(devh, CTRL_IN, USB_RQ, 0xf0, 0, data,
+               sizeof(data), 0);
        if (r < 0) {
                fprintf(stderr, "F0 error %d\n", r);
                return r;
@@ -126,17 +97,9 @@ static int print_f0_data(void)
 
 static int get_hwstat(unsigned char *status)
 {
-       struct fpusb_ctrl_msg msg = {
-               .requesttype = CTRL_IN,
-               .request = USB_RQ,
-               .value = 0x07,
-               .index = 0,
-               .length = 1,
-               .data = status,
-       };
        int r;
 
-       r = fpusb_ctrl_msg(devh, &msg, 0);
+       r = libusb_control_transfer(devh, CTRL_IN, USB_RQ, 0x07, 0, status, 1, 0);
        if (r < 0) {
                fprintf(stderr, "read hwstat error %d\n", r);
                return r;
@@ -153,18 +116,9 @@ static int get_hwstat(unsigned char *status)
 static int set_hwstat(unsigned char data)
 {
        int r;
-       struct fpusb_ctrl_msg msg = {
-               .requesttype = CTRL_OUT,
-               .request = USB_RQ,
-               .value = 0x07,
-               .index = 0,
-               .length = 1,
-               .data = &data,
-       };
 
        printf("set hwstat to %02x\n", data);
-
-       r = fpusb_ctrl_msg(devh, &msg, 0);
+       r = libusb_control_transfer(devh, CTRL_OUT, USB_RQ, 0x07, 0, &data, 1, 0);
        if (r < 0) {
                fprintf(stderr, "set hwstat error %d\n", r);
                return r;
@@ -180,18 +134,9 @@ static int set_hwstat(unsigned char data)
 static int set_mode(unsigned char data)
 {
        int r;
-       struct fpusb_ctrl_msg msg = {
-               .requesttype = CTRL_OUT,
-               .request = USB_RQ,
-               .value = 0x4e,
-               .index = 0,
-               .length = 1,
-               .data = &data,
-       };
-
        printf("set mode %02x\n", data);
 
-       r = fpusb_ctrl_msg(devh, &msg, 0);
+       r = libusb_control_transfer(devh, CTRL_OUT, USB_RQ, 0x4e, 0, &data, 1, 0);
        if (r < 0) {
                fprintf(stderr, "set mode error %d\n", r);
                return r;
@@ -204,55 +149,51 @@ static int set_mode(unsigned char data)
        return 0;
 }
 
-static void cb_mode_changed(struct fpusb_dev_handle *_devh,
-       struct fpusb_urb_handle *urbh, struct fpusb_ctrl_msg *msg,
-       enum fp_urb_cb_status status, unsigned char *data, int actual_length,
-       void *user_data)
+static void LIBUSB_CALL cb_mode_changed(struct libusb_transfer *transfer)
 {
-       if (status != FP_URB_COMPLETED) {
-               fprintf(stderr, "mode change URB not completed!\n");
+       if (transfer->status != LIBUSB_TRANSFER_COMPLETED) {
+               fprintf(stderr, "mode change transfer not completed!\n");
                do_exit = 2;
        }
 
-       printf("async cb_mode_changed\n");
+       printf("async cb_mode_changed length=%d actual_length=%d\n",
+               transfer->length, transfer->actual_length);
        if (next_state() < 0)
                do_exit = 2;
 }
 
 static int set_mode_async(unsigned char data)
 {
-       fpusb_urb_handle *urbh;
-       struct fpusb_ctrl_msg msg = {
-               .requesttype = CTRL_OUT,
-               .request = USB_RQ,
-               .value = 0x4e,
-               .index = 0,
-               .length = 1,
-               .data = &data,
-       };
+       unsigned char *buf = (unsigned char*) malloc(LIBUSB_CONTROL_SETUP_SIZE + 1);
+       struct libusb_transfer *transfer;
 
-       printf("async set mode %02x\n", data);
+       if (!buf)
+               return -ENOMEM;
 
-       urbh = fpusb_submit_ctrl_msg(devh, &msg, cb_mode_changed, NULL, 1000);
-       if (!urbh) {
-               fprintf(stderr, "set mode submit error\n");
-               return -1;
+       transfer = libusb_alloc_transfer(0);
+       if (!transfer) {
+               free(buf);
+               return -ENOMEM;
        }
 
-       return 0;
+       printf("async set mode %02x\n", data);
+       libusb_fill_control_setup(buf, CTRL_OUT, USB_RQ, 0x4e, 0, 1);
+       buf[LIBUSB_CONTROL_SETUP_SIZE] = data;
+       libusb_fill_control_transfer(transfer, devh, buf, cb_mode_changed, NULL,
+               1000);
+
+       transfer->flags = LIBUSB_TRANSFER_SHORT_NOT_OK
+               | LIBUSB_TRANSFER_FREE_BUFFER | LIBUSB_TRANSFER_FREE_TRANSFER;
+       return libusb_submit_transfer(transfer);
 }
 
 static int do_sync_intr(unsigned char *data)
 {
-       struct fpusb_bulk_msg msg = {
-               .endpoint = EP_INTR,
-               .data = data,
-               .length = INTR_LENGTH,
-       };
        int r;
        int transferred;
 
-       r = fpusb_intr_msg(devh, &msg, &transferred, 1000);
+       r = libusb_interrupt_transfer(devh, EP_INTR, data, INTR_LENGTH,
+               &transferred, 1000);
        if (r < 0) {
                fprintf(stderr, "intr error %d\n", r);
                return r;
@@ -267,7 +208,7 @@ static int do_sync_intr(unsigned char *data)
 }
 
 static int sync_intr(unsigned char type)
-{      
+{
        int r;
        unsigned char data[INTR_LENGTH];
 
@@ -285,13 +226,13 @@ static int save_to_file(unsigned char *data)
        FILE *fd;
        char filename[64];
 
-       sprintf(filename, "finger%d.pgm", img_idx++);
+       snprintf(filename, sizeof(filename), "finger%d.pgm", img_idx++);
        fd = fopen(filename, "w");
        if (!fd)
                return -1;
 
        fputs("P5 384 289 255 ", fd);
-       fwrite(data + 64, 1, 384*289, fd);
+       (void) fwrite(data + 64, 1, 384*289, fd);
        fclose(fd);
        printf("saved image to %s\n", filename);
        return 0;
@@ -327,7 +268,7 @@ static int next_state(void)
                printf("unrecognised state %d\n", state);
        }
        if (r < 0) {
-               fprintf(stderr, "error detected changing state");
+               fprintf(stderr, "error detected changing state\n");
                return r;
        }
 
@@ -335,15 +276,15 @@ static int next_state(void)
        return 0;
 }
 
-static void cb_irq(fpusb_dev_handle *_devh, fpusb_urb_handle *urbh,
-       struct fpusb_bulk_msg *msg, enum fp_urb_cb_status status,
-       int actual_length, void *user_data)
+static void LIBUSB_CALL cb_irq(struct libusb_transfer *transfer)
 {
-       unsigned char irqtype = msg->data[0];
+       unsigned char irqtype = transfer->buffer[0];
 
-       if (status != FP_URB_COMPLETED) {
-               fprintf(stderr, "irq URB status %d?\n", status);
+       if (transfer->status != LIBUSB_TRANSFER_COMPLETED) {
+               fprintf(stderr, "irq transfer status %d?\n", transfer->status);
                do_exit = 2;
+               libusb_free_transfer(transfer);
+               irq_transfer = NULL;
                return;
        }
 
@@ -370,17 +311,17 @@ static void cb_irq(fpusb_dev_handle *_devh, fpusb_urb_handle *urbh,
                }
                break;
        }
-       if (submit_irq_urb() < 0)
+       if (libusb_submit_transfer(irq_transfer) < 0)
                do_exit = 2;
 }
 
-static void cb_img(fpusb_dev_handle *_devh, fpusb_urb_handle *urbh,
-       struct fpusb_bulk_msg *msg, enum fp_urb_cb_status status,
-       int actual_length, void *user_data)
+static void LIBUSB_CALL cb_img(struct libusb_transfer *transfer)
 {
-       if (status != FP_URB_COMPLETED) {
-               fprintf(stderr, "img URB status %d?\n", status);
+       if (transfer->status != LIBUSB_TRANSFER_COMPLETED) {
+               fprintf(stderr, "img transfer status %d?\n", transfer->status);
                do_exit = 2;
+               libusb_free_transfer(transfer);
+               img_transfer = NULL;
                return;
        }
 
@@ -390,35 +331,24 @@ static void cb_img(fpusb_dev_handle *_devh, fpusb_urb_handle *urbh,
                do_exit = 2;
                return;
        }
-       if (submit_img_urb() < 0)
+       if (libusb_submit_transfer(img_transfer) < 0)
                do_exit = 2;
 }
 
-static int submit_irq_urb(void)
-{
-       fpusb_urb_handle_free(irq_urbh);
-       irq_urbh = fpusb_submit_intr_msg(devh, &irqmsg, cb_irq, NULL, 0);
-       return irq_urbh != NULL;
-}
-
-static int submit_img_urb(void)
-{
-       fpusb_urb_handle_free(img_urbh);
-       img_urbh = fpusb_submit_bulk_msg(devh, &imgmsg, cb_img, NULL, 0);
-       return img_urbh != NULL;
-}
-
 static int init_capture(void)
 {
        int r;
 
-       r = submit_irq_urb();
+       r = libusb_submit_transfer(irq_transfer);
        if (r < 0)
                return r;
 
-       r = submit_img_urb();
+       r = libusb_submit_transfer(img_transfer);
        if (r < 0) {
-               fpusb_urb_handle_cancel_sync(devh, img_urbh);
+               libusb_cancel_transfer(irq_transfer);
+               while (irq_transfer)
+                       if (libusb_handle_events(NULL) < 0)
+                               break;
                return r;
        }
 
@@ -461,40 +391,51 @@ static int do_init(void)
        return 0;
 }
 
+static int alloc_transfers(void)
+{
+       img_transfer = libusb_alloc_transfer(0);
+       if (!img_transfer)
+               return -ENOMEM;
+
+       irq_transfer = libusb_alloc_transfer(0);
+       if (!irq_transfer)
+               return -ENOMEM;
+
+       libusb_fill_bulk_transfer(img_transfer, devh, EP_DATA, imgbuf,
+               sizeof(imgbuf), cb_img, NULL, 0);
+       libusb_fill_interrupt_transfer(irq_transfer, devh, EP_INTR, irqbuf,
+               sizeof(irqbuf), cb_irq, NULL, 0);
+
+       return 0;
+}
+
 static void sighandler(int signum)
 {
-       do_exit = 1;    
+       (void)signum;
+
+       do_exit = 1;
 }
 
 int main(void)
 {
-       struct fpusb_dev *dev;
        struct sigaction sigact;
-       int r = 1;
+       int r;
 
-       r = fpusb_init(0);
+       r = libusb_init(NULL);
        if (r < 0) {
-               fprintf(stderr, "failed to initialise fpusb\n");
+               fprintf(stderr, "failed to initialise libusb\n");
                exit(1);
        }
 
-       dev = find_dpfp_device();
-       if (!dev) {
-               fprintf(stderr, "No device found\n");
-               goto out;
-       }
-       printf("found device\n");
-
-       devh = fpusb_dev_open(dev);
-       if (!devh) {
-               fprintf(stderr, "Could not open device\n");
+       r = find_dpfp_device();
+       if (r < 0) {
+               fprintf(stderr, "Could not find/open device\n");
                goto out;
        }
-       printf("opened device\n");
 
-       r = fpusb_dev_claim_intf(devh, 0);
+       r = libusb_claim_interface(devh, 0);
        if (r < 0) {
-               fprintf(stderr, "usb_claim_interface error %d %s\n", r, strerror(-r));
+               fprintf(stderr, "usb_claim_interface error %d\n", r);
                goto out;
        }
        printf("claimed interface\n");
@@ -509,6 +450,10 @@ int main(void)
 
        /* async from here onwards */
 
+       r = alloc_transfers();
+       if (r < 0)
+               goto out_deinit;
+
        r = init_capture();
        if (r < 0)
                goto out_deinit;
@@ -521,36 +466,43 @@ int main(void)
        sigaction(SIGQUIT, &sigact, NULL);
 
        while (!do_exit) {
-               r = fpusb_poll();
+               r = libusb_handle_events(NULL);
                if (r < 0)
                        goto out_deinit;
        }
 
        printf("shutting down...\n");
 
-       r = fpusb_urb_handle_cancel_sync(devh, irq_urbh);
-       if (r < 0)
-               goto out_deinit;
+       if (irq_transfer) {
+               r = libusb_cancel_transfer(irq_transfer);
+               if (r < 0)
+                       goto out_deinit;
+       }
+
+       if (img_transfer) {
+               r = libusb_cancel_transfer(img_transfer);
+               if (r < 0)
+                       goto out_deinit;
+       }
+
+       while (irq_transfer || img_transfer)
+               if (libusb_handle_events(NULL) < 0)
+                       break;
 
-       r = fpusb_urb_handle_cancel_sync(devh, img_urbh);
-       if (r < 0)
-               goto out_deinit;
-       
        if (do_exit == 1)
                r = 0;
        else
                r = 1;
 
 out_deinit:
-       fpusb_urb_handle_free(img_urbh);
-       fpusb_urb_handle_free(irq_urbh);
+       libusb_free_transfer(img_transfer);
+       libusb_free_transfer(irq_transfer);
        set_mode(0);
        set_hwstat(0x80);
 out_release:
-       fpusb_dev_release_intf(devh, 0);
+       libusb_release_interface(devh, 0);
 out:
-       fpusb_dev_close(devh);
-       fpusb_exit();
+       libusb_close(devh);
+       libusb_exit(NULL);
        return r >= 0 ? r : -r;
 }
-