cocci: Add spatch/coccinelle patches for driver porting
This is an impartial set of transformations to help port the drivers to the new interfaces.
This commit is contained in:
parent
4640e3f5b0
commit
6ec11a2b26
13 changed files with 1356 additions and 0 deletions
78
cocci/00-misc-cleanups.cocci
Normal file
78
cocci/00-misc-cleanups.cocci
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
// Remove USB device reset, lets hope that we do not need this.
|
||||||
|
// If we do, maybe do it elsewhere?
|
||||||
|
@@
|
||||||
|
identifier r;
|
||||||
|
@@
|
||||||
|
- r = libusb_reset_device(...);
|
||||||
|
- if (r != 0) { ... }
|
||||||
|
|
||||||
|
// Functions that have uneccessary returns (i.e. error cannot happen after refactoring)
|
||||||
|
// NOTE: Make sure that these function are fine to modify in *all* drivers!
|
||||||
|
@ prior_int_func @
|
||||||
|
identifier func =~ "capture_chunk_async|alksdjflkajsfd";
|
||||||
|
expression res, res2;
|
||||||
|
@@
|
||||||
|
-int func
|
||||||
|
+void func
|
||||||
|
(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- return res2;
|
||||||
|
+ res2;
|
||||||
|
...>
|
||||||
|
- return res;
|
||||||
|
+ res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@
|
||||||
|
identifier prior_int_func.func;
|
||||||
|
identifier res;
|
||||||
|
@@
|
||||||
|
-res = func
|
||||||
|
+func
|
||||||
|
(...);
|
||||||
|
(
|
||||||
|
-if (res < 0) { ... }
|
||||||
|
|
|
||||||
|
-if (res != 0) { ... }
|
||||||
|
)
|
||||||
|
|
||||||
|
// Remove useless checks of fpi_timeout_add return values
|
||||||
|
@@
|
||||||
|
expression a1, a2, a3, a4;
|
||||||
|
@@
|
||||||
|
-if (fpi_timeout_add(a1, a2, a3, a4) == NULL) { ... }
|
||||||
|
+fpi_timeout_add(a1, a2, a3, a4);
|
||||||
|
|
||||||
|
@@
|
||||||
|
identifier timeout;
|
||||||
|
expression a1, a2, a3, a4;
|
||||||
|
@@
|
||||||
|
timeout = fpi_timeout_add(a1, a2, a3, a4);
|
||||||
|
-if (timeout == NULL) { ... }
|
||||||
|
|
||||||
|
|
||||||
|
// The VFS5011 driver has some stupid "radiation detected" logic, that should be asserts
|
||||||
|
@@
|
||||||
|
expression expr;
|
||||||
|
@@
|
||||||
|
-if ((expr)) {
|
||||||
|
- ...
|
||||||
|
- fp_err("Radiation detected!");
|
||||||
|
- ...
|
||||||
|
-}
|
||||||
|
+g_assert(!expr);
|
||||||
|
|
||||||
|
|
||||||
|
// A number of drivers call both fpi_imgdev_session_error *and* fpi_ssm_mark_failed.
|
||||||
|
// While this worked fine, it is plain wrong and considerably complicates memory
|
||||||
|
// management of the errors.
|
||||||
|
// Remove this duplication
|
||||||
|
@@
|
||||||
|
expression dev;
|
||||||
|
expression ssm;
|
||||||
|
expression error;
|
||||||
|
@@
|
||||||
|
- fpi_imgdev_session_error(dev, error);
|
||||||
|
fpi_ssm_mark_failed(ssm, error);
|
||||||
|
|
8
cocci/01-endpoint.cocci
Normal file
8
cocci/01-endpoint.cocci
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
@@
|
||||||
|
@@
|
||||||
|
- LIBUSB_ENDPOINT_IN
|
||||||
|
+ FP_USB_ENDPOINT_IN
|
||||||
|
@@
|
||||||
|
@@
|
||||||
|
- LIBUSB_ENDPOINT_OUT
|
||||||
|
+ FP_USB_ENDPOINT_OUT
|
64
cocci/02-type-renames.cocci
Normal file
64
cocci/02-type-renames.cocci
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
@ fp_img_dev @
|
||||||
|
typedef FpImageDevice;
|
||||||
|
@@
|
||||||
|
-struct fp_img_dev
|
||||||
|
+FpImageDevice
|
||||||
|
|
||||||
|
@ FpImageDevice_cast @
|
||||||
|
typedef FpImageDevice;
|
||||||
|
expression dev;
|
||||||
|
@@
|
||||||
|
-(FpImageDevice*) dev
|
||||||
|
+FP_IMAGE_DEVICE (dev)
|
||||||
|
|
||||||
|
@ fp_dev @
|
||||||
|
typedef FpDevice;
|
||||||
|
@@
|
||||||
|
-struct fp_dev
|
||||||
|
+FpDevice
|
||||||
|
|
||||||
|
@ FpDevice_cast @
|
||||||
|
typedef FpDevice;
|
||||||
|
expression dev;
|
||||||
|
@@
|
||||||
|
-(FpDevice*) dev
|
||||||
|
+FP_DEVICE (dev)
|
||||||
|
|
||||||
|
@ FP_DEV_cast @
|
||||||
|
expression dev;
|
||||||
|
@@
|
||||||
|
- FP_DEV (dev)
|
||||||
|
+ FP_DEVICE (dev)
|
||||||
|
|
||||||
|
@ FP_IMG_DEV_cast @
|
||||||
|
expression dev;
|
||||||
|
@@
|
||||||
|
- FP_IMG_DEV (dev)
|
||||||
|
+ FP_IMAGE_DEVICE (dev)
|
||||||
|
|
||||||
|
@ fpi_ssm @
|
||||||
|
typedef fpi_ssm;
|
||||||
|
typedef FpSsm;
|
||||||
|
@@
|
||||||
|
-fpi_ssm
|
||||||
|
+FpSsm
|
||||||
|
|
||||||
|
@ fp_img @
|
||||||
|
typedef FpImage;
|
||||||
|
@@
|
||||||
|
-struct fp_img
|
||||||
|
+FpImage
|
||||||
|
|
||||||
|
@ libusb_transfer @
|
||||||
|
typedef FpUsbTransfer;
|
||||||
|
@@
|
||||||
|
-struct libusb_transfer
|
||||||
|
+FpUsbTransfer
|
||||||
|
|
||||||
|
@ libusb_device_handle @
|
||||||
|
typedef libusb_device_handle;
|
||||||
|
typedef GUsbDevice;
|
||||||
|
@@
|
||||||
|
-libusb_device_handle
|
||||||
|
+GUsbDevice
|
||||||
|
|
80
cocci/03-function-renames.cocci
Normal file
80
cocci/03-function-renames.cocci
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
@@
|
||||||
|
expression w;
|
||||||
|
expression h;
|
||||||
|
expression status;
|
||||||
|
expression dev;
|
||||||
|
expression a1, a2, a3;
|
||||||
|
@@
|
||||||
|
(
|
||||||
|
-fpi_img_new(w * h)
|
||||||
|
+fp_image_new(w, h)
|
||||||
|
|
|
||||||
|
-fpi_ssm_new
|
||||||
|
+fp_ssm_new
|
||||||
|
|
|
||||||
|
-fpi_ssm_free
|
||||||
|
+fp_ssm_free
|
||||||
|
|
|
||||||
|
-fpi_ssm_start
|
||||||
|
+fp_ssm_start
|
||||||
|
|
|
||||||
|
-fpi_ssm_start_subsm
|
||||||
|
+fp_ssm_start_subsm
|
||||||
|
|
|
||||||
|
-fpi_ssm_next_state
|
||||||
|
+fp_ssm_next_state
|
||||||
|
|
|
||||||
|
-fpi_ssm_jump_to_state
|
||||||
|
+fp_ssm_jump_to_state
|
||||||
|
|
|
||||||
|
-fpi_ssm_mark_completed
|
||||||
|
+fp_ssm_mark_completed
|
||||||
|
|
|
||||||
|
-fpi_ssm_get_user_data
|
||||||
|
+fp_ssm_get_user_data
|
||||||
|
|
|
||||||
|
-fpi_ssm_get_cur_state
|
||||||
|
+fp_ssm_get_cur_state
|
||||||
|
|
|
||||||
|
-fpi_dev_get_usb_dev
|
||||||
|
+_fp_device_get_usb_device
|
||||||
|
|
|
||||||
|
// HACK: We just insert an error return here!
|
||||||
|
-fpi_imgdev_close_complete(dev)
|
||||||
|
+_fp_image_device_close_complete(dev, error)
|
||||||
|
|
|
||||||
|
-fpi_imgdev_open_complete(dev, 0)
|
||||||
|
+_fp_image_device_open_complete(dev, NULL)
|
||||||
|
|
|
||||||
|
-fpi_imgdev_activate_complete(dev, 0)
|
||||||
|
+_fp_image_device_activate_complete(dev, NULL)
|
||||||
|
|
|
||||||
|
-fpi_imgdev_deactivate_complete(dev)
|
||||||
|
+_fp_image_device_deactivate_complete(dev, NULL)
|
||||||
|
|
|
||||||
|
-fpi_imgdev_report_finger_status(dev, status)
|
||||||
|
+_fp_image_device_report_finger_status(dev, status)
|
||||||
|
|
|
||||||
|
-fpi_imgdev_image_captured(dev, a1)
|
||||||
|
+_fp_image_device_image_captured(dev, a1)
|
||||||
|
|
|
||||||
|
-fpi_imgdev_abort_scan
|
||||||
|
+_fp_image_device_retry_scan
|
||||||
|
|
|
||||||
|
-fpi_std_sq_dev
|
||||||
|
+_fp_std_sq_dev
|
||||||
|
|
|
||||||
|
-fpi_mean_sq_diff_norm
|
||||||
|
+_fp_mean_sq_diff_norm
|
||||||
|
|
|
||||||
|
-fpi_timeout_add(a1, a2, dev, a3)
|
||||||
|
+_fp_device_add_timeout(dev, a1, a2, a3)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Some can be nested
|
||||||
|
@@
|
||||||
|
@@
|
||||||
|
(
|
||||||
|
-fpi_ssm_next_state_timeout_cb
|
||||||
|
+fp_ssm_next_state_timeout_cb
|
||||||
|
)
|
29
cocci/04-misc-renames.cocci
Normal file
29
cocci/04-misc-renames.cocci
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
@@
|
||||||
|
typedef FpImageDeviceState;
|
||||||
|
@@
|
||||||
|
(
|
||||||
|
-FP_IMG_COLORS_INVERTED
|
||||||
|
+FP_IMAGE_COLORS_INVERTED
|
||||||
|
|
|
||||||
|
-FP_IMG_H_FLIPPED
|
||||||
|
+FP_IMAGE_H_FLIPPED
|
||||||
|
|
|
||||||
|
-FP_IMG_V_FLIPPED
|
||||||
|
+FP_IMAGE_V_FLIPPED
|
||||||
|
|
|
||||||
|
-FP_VERIFY_RETRY_TOO_SHORT
|
||||||
|
+FP_DEVICE_RETRY_TOO_SHORT
|
||||||
|
|
|
||||||
|
-FP_VERIFY_RETRY_CENTER_FINGER
|
||||||
|
+FP_DEVICE_RETRY_CENTER_FINGER
|
||||||
|
|
|
||||||
|
-FP_VERIFY_RETRY
|
||||||
|
+FP_DEVICE_RETRY
|
||||||
|
)
|
||||||
|
|
||||||
|
@@
|
||||||
|
@@
|
||||||
|
(
|
||||||
|
-enum fp_imgdev_state
|
||||||
|
+FpImageDeviceState
|
||||||
|
)
|
118
cocci/05-libusb-1.cocci
Normal file
118
cocci/05-libusb-1.cocci
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
|
||||||
|
@ dev_func @
|
||||||
|
identifier dev;
|
||||||
|
identifier func;
|
||||||
|
@@
|
||||||
|
func(..., FpDevice *dev, ...)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
@ imgdev_func @
|
||||||
|
identifier dev;
|
||||||
|
identifier func;
|
||||||
|
@@
|
||||||
|
func(..., FpImageDevice *dev, ...)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
@ self_func extends driver @
|
||||||
|
identifier self;
|
||||||
|
identifier func;
|
||||||
|
@@
|
||||||
|
func(..., driver_cls *self, ...)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
@ transfer_func_imgdev @
|
||||||
|
typedef FpUsbTransfer;
|
||||||
|
identifier imgdev_func.func;
|
||||||
|
identifier imgdev_func.dev;
|
||||||
|
identifier transfer;
|
||||||
|
@@
|
||||||
|
func (...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
(
|
||||||
|
-transfer = fpi_usb_alloc();
|
||||||
|
+transfer = fp_usb_transfer_new(FP_DEVICE (dev));
|
||||||
|
|
|
||||||
|
-FpUsbTransfer *transfer = fpi_usb_alloc();
|
||||||
|
+FpUsbTransfer *transfer = fp_usb_transfer_new(FP_DEVICE (dev));
|
||||||
|
)
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ transfer_func_dev @
|
||||||
|
typedef FpUsbTransfer;
|
||||||
|
identifier dev_func.func;
|
||||||
|
identifier dev_func.dev;
|
||||||
|
identifier transfer;
|
||||||
|
@@
|
||||||
|
func (...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
(
|
||||||
|
-transfer = fpi_usb_alloc();
|
||||||
|
+transfer = fp_usb_transfer_new(dev);
|
||||||
|
|
|
||||||
|
-FpUsbTransfer *transfer = fpi_usb_alloc();
|
||||||
|
+FpUsbTransfer *transfer = fp_usb_transfer_new(dev);
|
||||||
|
)
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@ transfer_func_self @
|
||||||
|
typedef FpUsbTransfer;
|
||||||
|
identifier self_func.func;
|
||||||
|
identifier self_func.self;
|
||||||
|
expression transfer;
|
||||||
|
@@
|
||||||
|
func (...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
-transfer = fpi_usb_alloc();
|
||||||
|
+transfer = fp_usb_transfer_new(FP_DEVICE (self));
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
// None of the release interface calls had error handling ...
|
||||||
|
@ extends driver @
|
||||||
|
expression usb_dev;
|
||||||
|
expression interface;
|
||||||
|
@@
|
||||||
|
dev_close(...)
|
||||||
|
{
|
||||||
|
+ GError *error = NULL;
|
||||||
|
...
|
||||||
|
-libusb_release_interface(usb_dev, interface);
|
||||||
|
+g_usb_device_release_interface(usb_dev, interface, 0, &error);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
@ extends driver @
|
||||||
|
expression usb_dev;
|
||||||
|
expression interface;
|
||||||
|
identifier imgdev;
|
||||||
|
identifier r;
|
||||||
|
@@
|
||||||
|
dev_open (..., FpImageDevice *imgdev, ...)
|
||||||
|
{
|
||||||
|
+ GError *error = NULL;
|
||||||
|
...
|
||||||
|
-r = libusb_claim_interface(usb_dev, interface);
|
||||||
|
+if (!g_usb_device_claim_interface(usb_dev, interface, 0, &error)) {
|
||||||
|
+ _fp_image_device_open_complete (imgdev, error);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
(
|
||||||
|
-if (r != 0) { ... }
|
||||||
|
|
|
||||||
|
-if (r < 0) { ... }
|
||||||
|
)
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
344
cocci/06-libusb-callback-1.cocci
Normal file
344
cocci/06-libusb-callback-1.cocci
Normal file
|
@ -0,0 +1,344 @@
|
||||||
|
@ usb_transfer_cb @
|
||||||
|
typedef FpUsbTransfer;
|
||||||
|
typedef FpSsm;
|
||||||
|
identifier func;
|
||||||
|
identifier transfer;
|
||||||
|
identifier dev;
|
||||||
|
identifier ssm;
|
||||||
|
@@
|
||||||
|
(
|
||||||
|
-void func(FpUsbTransfer *transfer)
|
||||||
|
+void func(FpUsbTransfer *transfer,
|
||||||
|
+ FpDevice *device,
|
||||||
|
+ gpointer user_data,
|
||||||
|
+ GError *error)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
|
||||||
|
// this is weird, one function in uru4000 didn't get the types
|
||||||
|
// converted by earlier rules. But, this does not seem to work either.
|
||||||
|
-void func(\(FpUsbTransfer*\|struct libusb_transfer*\) transfer,
|
||||||
|
- \(FpDevice*\|struct fp_dev*\) dev,
|
||||||
|
- \(FpSsm*\|fpi_ssm*\) ssm,
|
||||||
|
- void* user_data)
|
||||||
|
+void func(FpUsbTransfer *transfer,
|
||||||
|
+ FpDevice *dev,
|
||||||
|
+ gpointer user_data,
|
||||||
|
+ GError *error)
|
||||||
|
{
|
||||||
|
+ FpSsm *ssm = transfer->ssm;
|
||||||
|
...
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ errors_generic_1 @
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
(
|
||||||
|
- (transfer->status != LIBUSB_TRANSFER_COMPLETED)
|
||||||
|
+ error
|
||||||
|
|
|
||||||
|
- (transfer->status == LIBUSB_TRANSFER_COMPLETED)
|
||||||
|
+ !error
|
||||||
|
|
|
||||||
|
- (transfer->status == LIBUSB_TRANSFER_TIMED_OUT)
|
||||||
|
+ g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT)
|
||||||
|
)
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ errors_1 @
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
expression ssm;
|
||||||
|
statement S;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
if (error) {
|
||||||
|
(
|
||||||
|
...
|
||||||
|
- fpi_ssm_mark_failed (ssm, ...)
|
||||||
|
+ fp_ssm_mark_failed (ssm, error)
|
||||||
|
...
|
||||||
|
|
|
||||||
|
...
|
||||||
|
- fpi_imgdev_session_error (...)
|
||||||
|
+ _fp_image_device_session_error (FP_IMAGE_DEVICE (device), error)
|
||||||
|
...
|
||||||
|
)
|
||||||
|
}
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@ errors_1_alt @
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
expression ssm;
|
||||||
|
statement S;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
if (!error) { ... }
|
||||||
|
else {
|
||||||
|
(
|
||||||
|
...
|
||||||
|
- fpi_ssm_mark_failed (ssm, ...)
|
||||||
|
+ fp_ssm_mark_failed (ssm, error)
|
||||||
|
...
|
||||||
|
|
|
||||||
|
...
|
||||||
|
- fpi_imgdev_session_error (...)
|
||||||
|
+ _fp_image_device_session_error (FP_IMAGE_DEVICE (device), error)
|
||||||
|
...
|
||||||
|
)
|
||||||
|
}
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@ errors_2 @
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
expression ssm;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
if (transfer->length != transfer->actual_length) {
|
||||||
|
+ _Pragma("GCC warning \"Driver should probably set short_is_error instead!\"");
|
||||||
|
...
|
||||||
|
(
|
||||||
|
- fpi_ssm_mark_failed (ssm, ...);
|
||||||
|
+ fp_ssm_mark_failed (ssm, g_error_new (G_USB_DEVICE_ERROR,
|
||||||
|
+ G_USB_DEVICE_ERROR_IO,
|
||||||
|
+ "Short USB transfer!"));
|
||||||
|
|
|
||||||
|
- fpi_imgdev_session_error (...);
|
||||||
|
+ _fp_image_device_session_error (FP_IMAGE_DEVICE (device),
|
||||||
|
+ g_error_new (G_USB_DEVICE_ERROR,
|
||||||
|
+ G_USB_DEVICE_ERROR_IO,
|
||||||
|
+ "Short USB transfer!"));
|
||||||
|
)
|
||||||
|
...
|
||||||
|
}
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@ not_useful_error_prints @
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- fp_err (...);
|
||||||
|
...
|
||||||
|
(
|
||||||
|
fp_ssm_mark_failed (...);
|
||||||
|
|
|
||||||
|
_fp_image_device_session_error (...);
|
||||||
|
)
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@ error_or_wrong_length @
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
expression ssm;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- if (error || (transfer->length != transfer->actual_length))
|
||||||
|
+ if (error)
|
||||||
|
{
|
||||||
|
+ _Pragma("GCC warning \"Driver needs to set short_is_error for this branch to be taken!\"");
|
||||||
|
<...
|
||||||
|
(
|
||||||
|
- fpi_ssm_mark_failed (ssm, ...);
|
||||||
|
+ fp_ssm_mark_failed (ssm, error);
|
||||||
|
|
|
||||||
|
- fpi_imgdev_session_error (...);
|
||||||
|
+ _fp_image_device_session_error (FP_IMAGE_DEVICE (device), error);
|
||||||
|
)
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@ error_or_wrong_length_2 @
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
expression ssm;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- if (!error && (transfer->length == transfer->actual_length))
|
||||||
|
+ if (!error)
|
||||||
|
{ ... }
|
||||||
|
else {
|
||||||
|
+ _Pragma("GCC warning \"Driver needs to set short_is_error for this branch to be taken!\"");
|
||||||
|
<...
|
||||||
|
(
|
||||||
|
- fpi_ssm_mark_failed (ssm, ...);
|
||||||
|
+ fp_ssm_mark_failed (ssm, error);
|
||||||
|
|
|
||||||
|
- fpi_imgdev_session_error (...);
|
||||||
|
+ _fp_image_device_session_error (FP_IMAGE_DEVICE (device), error);
|
||||||
|
)
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
identifier out;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- goto out;
|
||||||
|
+ return;
|
||||||
|
...>
|
||||||
|
-out:
|
||||||
|
(
|
||||||
|
- g_free(transfer->buffer);
|
||||||
|
|
|
||||||
|
)
|
||||||
|
- libusb_free_transfer (transfer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
(
|
||||||
|
- g_free(transfer->buffer);
|
||||||
|
|
|
||||||
|
)
|
||||||
|
- libusb_free_transfer (transfer);
|
||||||
|
...
|
||||||
|
return;
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- transfer->user_data
|
||||||
|
+ user_data
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@@
|
||||||
|
typedef gint;
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
(
|
||||||
|
fp_dbg
|
||||||
|
|
|
||||||
|
fp_warn
|
||||||
|
|
|
||||||
|
fp_err
|
||||||
|
)
|
||||||
|
(...,
|
||||||
|
- transfer->length
|
||||||
|
+ (gint) transfer->length
|
||||||
|
, ...);
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@@
|
||||||
|
typedef gint;
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
(
|
||||||
|
fp_dbg
|
||||||
|
|
|
||||||
|
fp_warn
|
||||||
|
|
|
||||||
|
fp_err
|
||||||
|
)
|
||||||
|
(...,
|
||||||
|
- transfer->actual_length
|
||||||
|
+ (gint) transfer->actual_length
|
||||||
|
, ...);
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@@
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier usb_transfer_cb.transfer;
|
||||||
|
identifier ssm_var;
|
||||||
|
gpointer user_data;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
(
|
||||||
|
- FpSsm *ssm_var = (FpSsm*) user_data;
|
||||||
|
|
|
||||||
|
- FpSsm *ssm_var = user_data;
|
||||||
|
)
|
||||||
|
<...
|
||||||
|
- ssm_var
|
||||||
|
+ transfer->ssm
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
// A lot of drivers abuse the SSM user_data for the driver
|
||||||
|
// Convert FpImageDevice usage to simple cast
|
||||||
|
@@
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier dev;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
-FpImageDevice *dev = ...;
|
||||||
|
+FpImageDevice *dev = FP_IMAGE_DEVICE (device);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
// A lot of drivers abuse the SSM user_data for the driver
|
||||||
|
// Remove FpDevice getter and use argument
|
||||||
|
@@
|
||||||
|
identifier usb_transfer_cb.func;
|
||||||
|
identifier arg;
|
||||||
|
identifier dev;
|
||||||
|
@@
|
||||||
|
func(..., FpDevice *arg, ...)
|
||||||
|
{
|
||||||
|
-FpDevice *dev = ...;
|
||||||
|
<...
|
||||||
|
-dev
|
||||||
|
+arg
|
||||||
|
...>
|
||||||
|
}
|
163
cocci/07-libusb-fill.cocci
Normal file
163
cocci/07-libusb-fill.cocci
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// bulk transfers
|
||||||
|
@@
|
||||||
|
typedef FpUsbTransfer;
|
||||||
|
expression transfer;
|
||||||
|
expression usb_dev;
|
||||||
|
expression endpoint;
|
||||||
|
expression data;
|
||||||
|
expression size;
|
||||||
|
expression cb;
|
||||||
|
expression user_data;
|
||||||
|
expression timeout;
|
||||||
|
identifier ret;
|
||||||
|
@@
|
||||||
|
- libusb_fill_bulk_transfer(transfer, usb_dev, endpoint, data, size, cb, user_data, timeout);
|
||||||
|
+ fp_usb_transfer_fill_bulk_full(transfer, endpoint, data, size, NULL);
|
||||||
|
+ fp_usb_transfer_submit(transfer, timeout, NULL, cb, user_data);
|
||||||
|
+ fp_usb_transfer_unref(transfer);
|
||||||
|
(
|
||||||
|
- ret = libusb_submit_transfer(transfer);
|
||||||
|
...
|
||||||
|
(
|
||||||
|
- if (ret < 0) { ... }
|
||||||
|
|
|
||||||
|
- if (ret != 0) { ... }
|
||||||
|
|
|
||||||
|
)
|
||||||
|
|
|
||||||
|
- if (libusb_submit_transfer(transfer)) { ... }
|
||||||
|
|
|
||||||
|
- if (libusb_submit_transfer(transfer) < 0) { ... }
|
||||||
|
|
|
||||||
|
- libusb_submit_transfer(transfer);
|
||||||
|
)
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// bulk transfers
|
||||||
|
@@
|
||||||
|
typedef FpUsbTransfer;
|
||||||
|
expression transfer;
|
||||||
|
expression dev;
|
||||||
|
expression transfer_ssm;
|
||||||
|
expression endpoint;
|
||||||
|
expression data;
|
||||||
|
expression size;
|
||||||
|
expression cb;
|
||||||
|
expression user_data;
|
||||||
|
expression timeout;
|
||||||
|
expression storage;
|
||||||
|
identifier ret;
|
||||||
|
@@
|
||||||
|
- transfer = fpi_usb_fill_bulk_transfer(dev, transfer_ssm, endpoint, data, size, cb, user_data, timeout);
|
||||||
|
+ transfer = fp_usb_transfer_new (dev);
|
||||||
|
+ transfer->ssm = transfer_ssm;
|
||||||
|
+ fp_usb_transfer_fill_bulk_full(transfer, endpoint, data, size, NULL);
|
||||||
|
+ fp_usb_transfer_submit(transfer, timeout, NULL, cb, user_data);
|
||||||
|
+ fp_usb_transfer_unref(transfer);
|
||||||
|
(
|
||||||
|
storage = transfer;
|
||||||
|
|
|
||||||
|
)
|
||||||
|
(
|
||||||
|
- ret = fpi_usb_submit_transfer(transfer);
|
||||||
|
...
|
||||||
|
(
|
||||||
|
- if (ret < 0) { ... }
|
||||||
|
|
|
||||||
|
- if (ret != 0) { ... }
|
||||||
|
|
|
||||||
|
)
|
||||||
|
|
|
||||||
|
- if (fpi_usb_submit_transfer(transfer)) { ... }
|
||||||
|
|
|
||||||
|
- if (fpi_usb_submit_transfer(transfer) < 0) { ... }
|
||||||
|
|
|
||||||
|
- fpi_usb_submit_transfer(transfer);
|
||||||
|
)
|
||||||
|
|
||||||
|
// The following only happens due to some prior simplifications we did
|
||||||
|
@@
|
||||||
|
typedef FpUsbTransfer;
|
||||||
|
expression transfer;
|
||||||
|
expression usb_dev;
|
||||||
|
expression endpoint;
|
||||||
|
expression data;
|
||||||
|
expression size;
|
||||||
|
expression cb;
|
||||||
|
expression user_data;
|
||||||
|
expression timeout;
|
||||||
|
identifier ret;
|
||||||
|
@@
|
||||||
|
- libusb_fill_bulk_transfer(transfer, usb_dev, endpoint, data, size, cb, user_data, timeout);
|
||||||
|
- libusb_submit_transfer(transfer);
|
||||||
|
+ fp_usb_transfer_fill_bulk_full(transfer, endpoint, data, size, NULL);
|
||||||
|
+ fp_usb_transfer_submit(transfer, timeout, NULL, cb, user_data);
|
||||||
|
+ fp_usb_transfer_unref(transfer);
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// control transfers
|
||||||
|
@@
|
||||||
|
typedef FpUsbTransfer;
|
||||||
|
expression timeout;
|
||||||
|
expression direction;
|
||||||
|
expression request_type;
|
||||||
|
expression recipient;
|
||||||
|
expression request;
|
||||||
|
expression value;
|
||||||
|
expression index;
|
||||||
|
expression length;
|
||||||
|
expression callback;
|
||||||
|
expression user_data;
|
||||||
|
expression usb_dev;
|
||||||
|
identifier ret;
|
||||||
|
@@
|
||||||
|
(
|
||||||
|
- data = g_malloc(LIBUSB_CONTROL_SETUP_SIZE)
|
||||||
|
|
|
||||||
|
- data = g_malloc(LIBUSB_CONTROL_SETUP_SIZE + ...)
|
||||||
|
|
|
||||||
|
- data = g_malloc0(LIBUSB_CONTROL_SETUP_SIZE)
|
||||||
|
|
|
||||||
|
- data = g_malloc0(LIBUSB_CONTROL_SETUP_SIZE + ...)
|
||||||
|
)
|
||||||
|
- ;
|
||||||
|
+ _Pragma("GCC warning \"control transfer filling is a mess due to automatic translation\"");
|
||||||
|
+ fp_usb_transfer_fill_control(transfer, !((request_type) & 0x80), ((request_type) >> 5) & 0x3, (request_type) & 0x1f, request, value, index, length);
|
||||||
|
+ data = transfer->buffer;
|
||||||
|
+ fp_usb_transfer_submit(transfer, timeout, NULL, callback, user_data);
|
||||||
|
+ fp_usb_transfer_unref(transfer);
|
||||||
|
...
|
||||||
|
- libusb_fill_control_setup(data, request_type, request, value, index, length);
|
||||||
|
- libusb_fill_control_transfer(transfer, usb_dev, data, callback, user_data, timeout);
|
||||||
|
<...
|
||||||
|
- LIBUSB_CONTROL_SETUP_SIZE
|
||||||
|
...>
|
||||||
|
- ret = libusb_submit_transfer(transfer);
|
||||||
|
(
|
||||||
|
- if (ret < 0) { ... }
|
||||||
|
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// We have a field in the transfer just for a state machine, use that
|
||||||
|
// We also later modify all similar code on the callback side to use that field
|
||||||
|
// instead.
|
||||||
|
@@
|
||||||
|
expression transfer;
|
||||||
|
expression timeout;
|
||||||
|
expression cb;
|
||||||
|
@@
|
||||||
|
+ transfer->ssm = ssm;
|
||||||
|
- fp_usb_transfer_submit(transfer, timeout, NULL, cb, ssm);
|
||||||
|
+ fp_usb_transfer_submit(transfer, timeout, NULL, cb, NULL);
|
||||||
|
@@
|
||||||
|
expression transfer;
|
||||||
|
expression timeout;
|
||||||
|
expression cb;
|
||||||
|
@@
|
||||||
|
- fp_usb_transfer_submit(transfer, timeout, NULL, cb, dev);
|
||||||
|
+ fp_usb_transfer_submit(transfer, timeout, NULL, cb, NULL);
|
||||||
|
|
20
cocci/08-ssm.cocci
Normal file
20
cocci/08-ssm.cocci
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
@ ssm_callbacks @
|
||||||
|
identifier ssm;
|
||||||
|
identifier cb;
|
||||||
|
@@
|
||||||
|
fp_ssm_start(ssm, cb)
|
||||||
|
|
||||||
|
@@
|
||||||
|
identifier ssm_callbacks.cb;
|
||||||
|
identifier ssm;
|
||||||
|
identifier dev;
|
||||||
|
identifier user_data;
|
||||||
|
@@
|
||||||
|
void cb(FpSsm *ssm, FpDevice *dev, void* user_data
|
||||||
|
+ , GError *error
|
||||||
|
)
|
||||||
|
{
|
||||||
|
+ _Pragma("GCC warning \"Check that error is returned/free'ed properly!\"");
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
386
cocci/10-driver.cocci
Normal file
386
cocci/10-driver.cocci
Normal file
|
@ -0,0 +1,386 @@
|
||||||
|
@ orig_driver_struct @
|
||||||
|
identifier driver_struct;
|
||||||
|
@@
|
||||||
|
struct fp_img_driver driver_struct = {
|
||||||
|
...,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Grab the type of the main device struct using a rather blind fashion,
|
||||||
|
// and remove it from the init function.
|
||||||
|
// This assume that only device init calls fp_dev_set_instance_data, which
|
||||||
|
// is a fair assumption after all
|
||||||
|
@ orig_device_struct @
|
||||||
|
type device_struct;
|
||||||
|
expression dev;
|
||||||
|
identifier dev_init;
|
||||||
|
identifier data;
|
||||||
|
@@
|
||||||
|
dev_init(...)
|
||||||
|
{
|
||||||
|
// Note: We redefine it to an instance access for now, which will be
|
||||||
|
// made to work correctly with a later transform/cast.
|
||||||
|
...
|
||||||
|
device_struct *data;
|
||||||
|
...
|
||||||
|
(
|
||||||
|
- data = g_malloc0(sizeof(*data));
|
||||||
|
+ data = FP_INSTANCE_DATA(dev);
|
||||||
|
|
|
||||||
|
- data = (device_struct*) g_malloc0(sizeof(*data));
|
||||||
|
+ data = FP_INSTANCE_DATA(dev);
|
||||||
|
|
|
||||||
|
- data = g_malloc0(sizeof(device_struct));
|
||||||
|
+ data = FP_INSTANCE_DATA(dev);
|
||||||
|
)
|
||||||
|
...
|
||||||
|
- fp_dev_set_instance_data(dev, data);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
@ driver_ids @
|
||||||
|
typedef FpIdEntry;
|
||||||
|
identifier driver_id_table;
|
||||||
|
@@
|
||||||
|
-const struct usb_id driver_id_table[] = {
|
||||||
|
+const FpIdEntry driver_id_table[] = {
|
||||||
|
...
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ @
|
||||||
|
identifier driver_ids.driver_id_table;
|
||||||
|
expression entry_vid;
|
||||||
|
expression entry_pid;
|
||||||
|
@@
|
||||||
|
const FpIdEntry driver_id_table[] = {
|
||||||
|
..., {
|
||||||
|
- .vendor = entry_vid, .product = entry_pid,
|
||||||
|
+ .vid = entry_vid, .pid = entry_pid,
|
||||||
|
}, ...
|
||||||
|
};
|
||||||
|
|
||||||
|
@ @
|
||||||
|
identifier driver_ids.driver_id_table;
|
||||||
|
expression entry_vid;
|
||||||
|
expression entry_pid;
|
||||||
|
expression entry_data;
|
||||||
|
@@
|
||||||
|
const FpIdEntry driver_id_table[] = {
|
||||||
|
..., {
|
||||||
|
- .vendor = entry_vid, .product = entry_pid, .device_data = entry_data
|
||||||
|
+ .vid = entry_vid, .pid = entry_pid, .driver_data = entry_data
|
||||||
|
}, ...
|
||||||
|
};
|
||||||
|
|
||||||
|
@ @
|
||||||
|
identifier driver_ids.driver_id_table;
|
||||||
|
expression entry_vid;
|
||||||
|
expression entry_pid;
|
||||||
|
expression entry_data;
|
||||||
|
@@
|
||||||
|
const FpIdEntry driver_id_table[] = {
|
||||||
|
..., {
|
||||||
|
- entry_vid, entry_pid, entry_data
|
||||||
|
+ .vid = entry_vid, .pid = entry_pid, .driver_data = entry_data
|
||||||
|
}, ...
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ driver_info extends orig_driver_struct @
|
||||||
|
expression driver_full_name;
|
||||||
|
identifier driver_id_table;
|
||||||
|
identifier dev_open;
|
||||||
|
identifier dev_close;
|
||||||
|
identifier dev_scan_type;
|
||||||
|
@@
|
||||||
|
struct fp_img_driver driver_struct = {
|
||||||
|
.driver = {
|
||||||
|
.full_name = driver_full_name,
|
||||||
|
.id_table = driver_id_table,
|
||||||
|
.scan_type = dev_scan_type,
|
||||||
|
},
|
||||||
|
|
||||||
|
.open = dev_open,
|
||||||
|
.close = dev_close,
|
||||||
|
};
|
||||||
|
|
||||||
|
@ script:python driver_gobj @
|
||||||
|
driver_struct << orig_driver_struct.driver_struct;
|
||||||
|
|
||||||
|
driver_id;
|
||||||
|
driver_init;
|
||||||
|
driver_cls;
|
||||||
|
_driver_cls;
|
||||||
|
driver_klass;
|
||||||
|
driver_class_init;
|
||||||
|
driver_ns;
|
||||||
|
driver_cast;
|
||||||
|
driver_cast_no_prefix;
|
||||||
|
@@
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
driver_id = driver_struct.split('_')[:-1]
|
||||||
|
|
||||||
|
driver_cls = "FpDevice" + "".join(d[0].upper() + d[1:] for d in driver_id)
|
||||||
|
driver_id = '_'.join(driver_id)
|
||||||
|
|
||||||
|
driver_ns = "fp_device_" + driver_id
|
||||||
|
driver_cast = driver_ns.upper()
|
||||||
|
driver_cast_no_prefix = driver_ns.upper()[3:]
|
||||||
|
|
||||||
|
coccinelle.driver_id = cocci.make_expr('"%s"' % driver_id)
|
||||||
|
coccinelle.driver_cls = cocci.make_type(driver_cls)
|
||||||
|
coccinelle._driver_cls = cocci.make_type('struct _' + driver_cls)
|
||||||
|
coccinelle.driver_klass = cocci.make_type(driver_cls + 'Class')
|
||||||
|
coccinelle.driver_ns = cocci.make_ident(driver_ns)
|
||||||
|
coccinelle.driver_init = cocci.make_ident(driver_ns + '_init')
|
||||||
|
coccinelle.driver_class_init = cocci.make_ident(driver_ns + '_class_init')
|
||||||
|
coccinelle.driver_cast = cocci.make_ident(driver_cast)
|
||||||
|
coccinelle.driver_cast_no_prefix = cocci.make_ident(driver_cast_no_prefix)
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
@ driver @
|
||||||
|
typedef FpDeviceClass;
|
||||||
|
typedef FpImageDeviceClass;
|
||||||
|
|
||||||
|
type orig_device_struct.device_struct;
|
||||||
|
|
||||||
|
identifier orig_driver_struct.driver_struct;
|
||||||
|
|
||||||
|
expression driver_gobj.driver_id;
|
||||||
|
identifier driver_gobj.driver_ns;
|
||||||
|
identifier driver_gobj.driver_init;
|
||||||
|
identifier driver_gobj.driver_class_init;
|
||||||
|
identifier driver_gobj.driver_cast;
|
||||||
|
identifier driver_gobj.driver_cast_no_prefix;
|
||||||
|
type driver_gobj.driver_cls;
|
||||||
|
type driver_gobj._driver_cls;
|
||||||
|
type driver_gobj.driver_klass;
|
||||||
|
|
||||||
|
expression driver_info.driver_full_name;
|
||||||
|
identifier driver_info.driver_id_table;
|
||||||
|
identifier driver_info.dev_open;
|
||||||
|
identifier driver_info.dev_close;
|
||||||
|
identifier driver_info.dev_scan_type;
|
||||||
|
@@
|
||||||
|
struct fp_img_driver driver_struct = {
|
||||||
|
...
|
||||||
|
};
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+driver_init(driver_cls *self)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+driver_class_init(driver_klass *klass)
|
||||||
|
+{
|
||||||
|
+ FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass);
|
||||||
|
+ FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass);
|
||||||
|
+
|
||||||
|
+ dev_class->id = driver_id;
|
||||||
|
+ dev_class->full_name = driver_full_name;
|
||||||
|
+ dev_class->type = FP_DEVICE_TYPE_USB;
|
||||||
|
+ dev_class->id_table = driver_id_table;
|
||||||
|
+ dev_class->scan_type = dev_scan_type;
|
||||||
|
+
|
||||||
|
+ img_class->img_open = dev_open;
|
||||||
|
+ img_class->img_close = dev_close;
|
||||||
|
+ IMG_CLASS_FUNCS;
|
||||||
|
+}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
@ optional_activate extends driver @
|
||||||
|
identifier dev_activate;
|
||||||
|
@@
|
||||||
|
struct fp_img_driver driver_struct = {
|
||||||
|
- .activate = dev_activate,
|
||||||
|
};
|
||||||
|
@@
|
||||||
|
identifier optional_activate.dev_activate;
|
||||||
|
@@
|
||||||
|
+ img_class->activate = dev_activate;
|
||||||
|
IMG_CLASS_FUNCS;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
@ optional_deactivate extends driver @
|
||||||
|
identifier dev_deactivate;
|
||||||
|
@@
|
||||||
|
struct fp_img_driver driver_struct = {
|
||||||
|
- .deactivate = dev_deactivate,
|
||||||
|
};
|
||||||
|
@@
|
||||||
|
identifier optional_deactivate.dev_deactivate;
|
||||||
|
@@
|
||||||
|
+ img_class->deactivate = dev_deactivate;
|
||||||
|
IMG_CLASS_FUNCS;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
@ optional_change_state extends driver @
|
||||||
|
identifier dev_change_state;
|
||||||
|
@@
|
||||||
|
struct fp_img_driver driver_struct = {
|
||||||
|
- .change_state = dev_change_state,
|
||||||
|
};
|
||||||
|
@@
|
||||||
|
identifier optional_change_state.dev_change_state;
|
||||||
|
@@
|
||||||
|
+ img_class->change_state = dev_change_state;
|
||||||
|
IMG_CLASS_FUNCS;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
@ optional_bz3 extends driver @
|
||||||
|
expression dev_bz3_threshold;
|
||||||
|
@@
|
||||||
|
struct fp_img_driver driver_struct = {
|
||||||
|
- .bz3_threshold = dev_bz3_threshold,
|
||||||
|
};
|
||||||
|
@@
|
||||||
|
expression optional_bz3.dev_bz3_threshold;
|
||||||
|
@@
|
||||||
|
+
|
||||||
|
+ img_class->bz3_threshold = dev_bz3_threshold;
|
||||||
|
IMG_CLASS_FUNCS;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
@ optional_img_size extends driver @
|
||||||
|
expression dev_img_width;
|
||||||
|
expression dev_img_height;
|
||||||
|
@@
|
||||||
|
struct fp_img_driver driver_struct = {
|
||||||
|
- .img_width = dev_img_width,
|
||||||
|
- .img_height = dev_img_height,
|
||||||
|
};
|
||||||
|
@@
|
||||||
|
expression optional_img_size.dev_img_width;
|
||||||
|
expression optional_img_size.dev_img_height;
|
||||||
|
@@
|
||||||
|
+
|
||||||
|
+ img_class->img_width = dev_img_width;
|
||||||
|
+ img_class->img_height = dev_img_height;
|
||||||
|
IMG_CLASS_FUNCS;
|
||||||
|
|
||||||
|
@ remove_placeholder extends driver @
|
||||||
|
@@
|
||||||
|
- IMG_CLASS_FUNCS;
|
||||||
|
|
||||||
|
@ remove_orig extends driver @
|
||||||
|
@@
|
||||||
|
-struct fp_img_driver driver_struct = {
|
||||||
|
- ...
|
||||||
|
-};
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
@ type_declaration extends driver @
|
||||||
|
@@
|
||||||
|
-device_struct {
|
||||||
|
+_driver_cls {
|
||||||
|
+ FpImageDevice parent;
|
||||||
|
+
|
||||||
|
...
|
||||||
|
};
|
||||||
|
+#include "TYPE_DECLARATION"
|
||||||
|
|
||||||
|
@ extends driver @
|
||||||
|
@@
|
||||||
|
-#include "TYPE_DECLARATION"
|
||||||
|
|
||||||
|
+G_DECLARE_FINAL_TYPE (driver_cls, driver_ns, FP, driver_cast_no_prefix, FpImageDevice);
|
||||||
|
+G_DEFINE_TYPE (driver_cls, driver_ns, FP_TYPE_IMAGE_DEVICE);
|
||||||
|
|
||||||
|
|
||||||
|
///////////////
|
||||||
|
// Change some function declarations
|
||||||
|
@ extends driver @
|
||||||
|
identifier a_driver_data;
|
||||||
|
@@
|
||||||
|
-int
|
||||||
|
+void
|
||||||
|
dev_open(...
|
||||||
|
- ,unsigned long a_driver_data
|
||||||
|
) { ... }
|
||||||
|
|
||||||
|
@ extends driver @
|
||||||
|
@@
|
||||||
|
-int
|
||||||
|
+void
|
||||||
|
dev_activate(...) { ... }
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// Replace all old data with a cast to the new class
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
@ rewrite_dev_struct extends driver @
|
||||||
|
identifier func;
|
||||||
|
identifier data;
|
||||||
|
identifier dev;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
(
|
||||||
|
- device_struct *data;
|
||||||
|
+ driver_cls *self;
|
||||||
|
...
|
||||||
|
(
|
||||||
|
- data = FP_INSTANCE_DATA(FP_DEVICE(dev));
|
||||||
|
+ data = driver_cast(dev);
|
||||||
|
|
|
||||||
|
- data = FP_INSTANCE_DATA(dev);
|
||||||
|
+ data = driver_cast(dev);
|
||||||
|
)
|
||||||
|
|
|
||||||
|
- device_struct *data = FP_INSTANCE_DATA(FP_DEVICE(dev));
|
||||||
|
+ driver_cls *self = driver_cast(dev);
|
||||||
|
|
|
||||||
|
- device_struct *data = FP_INSTANCE_DATA(dev);
|
||||||
|
+ driver_cls *self = driver_cast(dev);
|
||||||
|
)
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
@@
|
||||||
|
identifier rewrite_dev_struct.func;
|
||||||
|
identifier rewrite_dev_struct.data;
|
||||||
|
@@
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- data
|
||||||
|
+ self
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@ extends driver @
|
||||||
|
identifier func;
|
||||||
|
identifier data;
|
||||||
|
@@
|
||||||
|
func(...,
|
||||||
|
- device_struct *data,
|
||||||
|
+ driver_cls *self,
|
||||||
|
...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- data
|
||||||
|
+ self
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove unneccessary self check
|
||||||
|
@@
|
||||||
|
@@
|
||||||
|
-if (self != NULL) {
|
||||||
|
...
|
||||||
|
-}
|
||||||
|
|
||||||
|
// Remove g_free(self)
|
||||||
|
@@
|
||||||
|
@@
|
||||||
|
-g_free(self);
|
||||||
|
|
||||||
|
|
||||||
|
|
38
cocci/99-insert-checking-code.cocci
Normal file
38
cocci/99-insert-checking-code.cocci
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
// If we have matches on error conditions, the we likely have a memory
|
||||||
|
// mangement error.
|
||||||
|
@ forall @
|
||||||
|
identifier error;
|
||||||
|
statement S;
|
||||||
|
@@
|
||||||
|
if (<+... g_error_matches(error, ...) ...+>) {
|
||||||
|
+ _Pragma ("GCC error \"Inserted possibly wrong g_error_free!\"");
|
||||||
|
+ if (error)
|
||||||
|
+ g_error_free (error);
|
||||||
|
...
|
||||||
|
} else S
|
||||||
|
|
||||||
|
@ forall @
|
||||||
|
identifier error;
|
||||||
|
@@
|
||||||
|
if (<+... g_error_matches(error, ...) ...+>) {
|
||||||
|
+ _Pragma ("GCC error \"Inserted possibly wrong g_error_free!\"");
|
||||||
|
+ if (error)
|
||||||
|
+ g_error_free (error);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
@@
|
||||||
|
expression transfer;
|
||||||
|
identifier r;
|
||||||
|
statement S;
|
||||||
|
@@
|
||||||
|
(
|
||||||
|
- r = libusb_cancel_transfer(transfer);
|
||||||
|
- if (r < 0) S
|
||||||
|
+ _Pragma("GCC warning \"Removed libusb_cancel_transfer call!\"");
|
||||||
|
+ g_warning("USB transfer %p should be cancelled but was not due to a lack of code migration!", transfer);
|
||||||
|
|
|
||||||
|
- libusb_cancel_transfer(transfer);
|
||||||
|
+ _Pragma("GCC warning \"Removed libusb_cancel_transfer call!\"");
|
||||||
|
+ g_warning("USB transfer %p should be cancelled but was not due to a lack of code migration!", transfer);
|
||||||
|
)
|
19
cocci/all.cocci
Normal file
19
cocci/all.cocci
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# First some cleanups; some of these are required for the later stuff to work
|
||||||
|
00-misc-cleanups.cocci
|
||||||
|
01-endpoint.cocci
|
||||||
|
04-misc-renames.cocci
|
||||||
|
03-function-renames.cocci
|
||||||
|
02-type-renames.cocci
|
||||||
|
|
||||||
|
|
||||||
|
# GObject and "driver" defintion
|
||||||
|
10-driver.cocci
|
||||||
|
|
||||||
|
#
|
||||||
|
07-libusb-fill.cocci
|
||||||
|
05-libusb-1.cocci
|
||||||
|
06-libusb-callback-1.cocci
|
||||||
|
|
||||||
|
08-ssm.cocci
|
||||||
|
|
||||||
|
99-insert-checking-code.cocci
|
9
cocci/apply-all
Executable file
9
cocci/apply-all
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
pushd $( dirname "$0" )
|
||||||
|
all="all.cocci"
|
||||||
|
real="/tmp/real.cocci"
|
||||||
|
cat "$all" | grep -P '^(?!#).+' | xargs cat >$real || exit 1
|
||||||
|
popd
|
||||||
|
|
||||||
|
spatch --sp-file $real "$@"
|
Loading…
Reference in a new issue