From 37e61e626c771c45e60176d183377ae633c005bf Mon Sep 17 00:00:00 2001 From: Jakub Bogusz Date: Fri, 31 Aug 2018 21:30:02 +0200 Subject: [PATCH] - updated to 0.9.3 - upstream dropped parallel port support; extracted it from 0.9.2 as parport patch --- libinklevel-parport.patch | 345 ++++++++++++++++++++++++++++++++++++++ libinklevel.spec | 27 ++- 2 files changed, 367 insertions(+), 5 deletions(-) create mode 100644 libinklevel-parport.patch diff --git a/libinklevel-parport.patch b/libinklevel-parport.patch new file mode 100644 index 0000000..2cdd8ce --- /dev/null +++ b/libinklevel-parport.patch @@ -0,0 +1,345 @@ +diff -Nur libinklevel-0.9.3.orig/configure.ac libinklevel-0.9.3/configure.ac +--- libinklevel-0.9.3.orig/configure.ac 2018-07-07 22:11:02.000000000 +0200 ++++ libinklevel-0.9.3/configure.ac 2018-08-31 21:00:17.518513013 +0200 +@@ -73,7 +73,7 @@ + esac + + ## Check for optional header files +-AC_CHECK_HEADERS([ifaddrs.h]) ++AC_CHECK_HEADERS([ifaddrs.h ieee1284.h]) + + ## Check for mandatory header files + +@@ -110,6 +110,9 @@ + AC_DEFINE_UNQUOTED(LINUX,1,[Define value for Linux OS]) + case $host in + *-*-linux*) AC_DEFINE_UNQUOTED(HOST_OS,LINUX,[Host OS]) ++ AC_CHECK_HEADERS([ieee1284.h],, ++ AC_MSG_ERROR(( required header file ieee1284.h missing))) ++ AC_CHECK_LIB([ieee1284],ieee1284_open,, AC_MSG_ERROR(Library not found),) + ## check for pkgconfig + PKG_PROG_PKG_CONFIG([0.26]) + +diff -Nur libinklevel-0.9.3.orig/devices.c libinklevel-0.9.3/devices.c +--- libinklevel-0.9.3.orig/devices.c 2018-07-07 21:39:26.000000000 +0200 ++++ libinklevel-0.9.3/devices.c 2018-08-31 21:05:47.711842557 +0200 +@@ -21,11 +21,69 @@ + #include "devices.h" + #include "bjnp.h" + #include "libusb-utils.h" ++#undef HAVE_IEEE1284_H ++#include + + int get_device_id(const int port, const char *device_file, + const int portnumber, char *device_id) { ++ struct parport_list parports; ++ ++ char tmp[BUFLEN]; ++ char device_file1[256]; ++ int size; ++ int fd; + int result = COULD_NOT_GET_DEVICE_ID; + ++ if (port == PARPORT ) { ++ /* check if we have appropriate permissions */ ++ ++#if (HOST_OS == LINUX) ++ ++ sprintf(device_file1, "/dev/parport%d", portnumber); ++ ++ if ((fd = open(device_file1, O_RDWR)) < 0) { ++ return DEV_PARPORT_INACCESSIBLE; ++ } ++ ++ close(fd); ++ ++ sprintf(device_file1, "/dev/lp%d", portnumber); ++ ++ if ((fd = open(device_file1, O_RDWR)) < 0) { ++ return DEV_LP_INACCESSIBLE; ++ } ++ ++ close(fd); ++ ++#elif (HOST_OS == FREEBSD) ++ ++ sprintf(device_file1, "/dev/lpt%d", portnumber); ++ ++ if ((fd = open(device_file1, O_RDWR)) < 0) { ++ return DEV_LP_INACCESSIBLE; ++ } ++ ++ close(fd); ++ ++#endif ++ ++ /* for linux and freebsd use libieee1284 to get the device id from ++ parallel port */ ++ ++ if (ieee1284_find_ports(&parports, 0) == E1284_OK) { ++ if (portnumber < parports.portc) { ++ size = ieee1284_get_deviceid(parports.portv[portnumber], -1, ++ F1284_FRESH, tmp, BUFLEN); ++ if (size >= 2) { ++ strncpy(device_id, tmp + 2, size - 2); ++ return OK; ++ } ++ } ++ } ++ ++ return COULD_NOT_GET_DEVICE_ID; ++ ++ } else + if (port == USB) { + libusb_context *ctx = NULL; + usb_printer *printer = NULL; +@@ -62,3 +120,50 @@ + return UNKNOWN_PORT_SPECIFIED; + } + } ++ ++int open_printer_device(const int port, const char *custom_device_file, ++ const int portnumber) { ++ char device_file[256]; ++ int fd; ++ ++#if (HOST_OS == LINUX) ++ ++ if (port == PARPORT) { ++ sprintf(device_file, "/dev/lp%d", portnumber); ++ } else { ++ return UNKNOWN_PORT_SPECIFIED; ++ } ++ ++#elif (HOST_OS == FREEBSD) ++ ++ if (port == PARPORT) { ++ sprintf(device_file, "/dev/lpt%d", portnumber); ++ } else { ++ return UNKNOWN_PORT_SPECIFIED; ++ } ++ ++#endif ++ ++#ifdef DEBUG ++ printf("Device file: %s\n", device_file); ++#endif ++ ++ fd = open(device_file, O_RDWR); ++ ++ if (fd == -1) { ++ ++#ifdef DEBUG ++ printf("Could not open %s\n", device_file); ++#endif ++ } ++ ++ if (fd == -1) { ++ if (port == USB) { ++ return DEV_USB_LP_INACCESSIBLE; ++ } else { ++ return DEV_LP_INACCESSIBLE; ++ } ++ } else { ++ return fd; ++ } ++} +diff -Nur libinklevel-0.9.3.orig/devices.h libinklevel-0.9.3/devices.h +--- libinklevel-0.9.3.orig/devices.h 2018-07-07 21:19:56.000000000 +0200 ++++ libinklevel-0.9.3/devices.h 2018-08-31 21:06:00.905175737 +0200 +@@ -11,4 +11,7 @@ + + int get_device_id(const int port, const char *device_file, + const int portnumber, char *device_id); ++int open_printer_device(const int port, const char* device_file, ++ const int portnumber); ++ + #endif +diff -Nur libinklevel-0.9.3.orig/inklevel.h libinklevel-0.9.3/inklevel.h +--- libinklevel-0.9.3.orig/inklevel.h 2018-07-07 21:27:08.000000000 +0200 ++++ libinklevel-0.9.3/inklevel.h 2018-08-31 21:06:39.291841881 +0200 +@@ -13,6 +13,7 @@ + + /* Values for port */ + ++#define PARPORT 1 + #define USB 2 + #define BJNP 5 + #define CUSTOM_BJNP 6 +diff -Nur libinklevel-0.9.3.orig/printer-io.c libinklevel-0.9.3/printer-io.c +--- libinklevel-0.9.3.orig/printer-io.c 2018-07-07 21:47:21.000000000 +0200 ++++ libinklevel-0.9.3/printer-io.c 2018-08-31 21:18:21.511833949 +0200 +@@ -55,7 +55,19 @@ + } + } + } +- ++ else { ++ ++ int fd = open_printer_device(desc->port, desc->device_file, ++ desc->portnumber); ++ if (fd < 0) { ++ return PRINTER_FAILURE; ++ } else { ++ desc->fd = fd; ++ return PRINTER_SUCCESS; ++ } ++ ++ } ++ + return PRINTER_FAILURE; + } + +@@ -89,8 +101,24 @@ + return PRINTER_FAILURE; + } + } ++ else { ++ if (desc->fd >= 0) { ++ int result = close(desc->fd); + +- return PRINTER_FAILURE; ++ if (result == 0) { ++ return PRINTER_SUCCESS; ++ } else { ++ return PRINTER_FAILURE; ++ } ++ ++ } else { ++#ifdef DEBUG ++ printf("printer file descriptor is invalid\n"); ++#endif ++ ++ return PRINTER_FAILURE; ++ } ++ } + } + + /* +@@ -105,7 +133,8 @@ + int read_wrapper(printer_descriptor *desc, char *buffer, + size_t bufsize, int *transfered, int nonblocking) { + +- if (desc->mode == PRINTER_MODE_LIBUSB && desc->printer != NULL) { ++ if (desc->mode == PRINTER_MODE_LIBUSB) { ++ if (desc->printer != NULL) { + int result = bulk_transfer(desc->printer->handle, + desc->printer->read_endp, buffer, bufsize, + transfered); +@@ -114,8 +143,22 @@ + return PRINTER_SUCCESS; + } + } +- +- return PRINTER_FAILURE; ++ else ++ return PRINTER_FAILURE; ++ } else { ++ if (desc->fd >= 0) { ++ int result = read_from_printer(desc->fd, buffer, bufsize, nonblocking); ++ ++ if (result > 0) { ++ *transfered = result; ++ return PRINTER_SUCCESS; ++ } else { ++ return PRINTER_FAILURE; ++ } ++ } else { ++ return PRINTER_FAILURE; ++ } ++ } + } + + /* +@@ -127,7 +170,8 @@ + */ + int write_wrapper(printer_descriptor *desc, char *buffer, + size_t bufsize, int *transfered) { +- if (desc->mode == PRINTER_MODE_LIBUSB && desc->printer != NULL) { ++ if (desc->mode == PRINTER_MODE_LIBUSB) { ++ if (desc->printer != NULL) { + int result = bulk_transfer(desc->printer->handle, + desc->printer->write_endp, buffer, bufsize, + transfered); +@@ -136,6 +180,20 @@ + return PRINTER_SUCCESS; + } + } +- +- return PRINTER_FAILURE; ++ } else { ++ if (desc->fd >= 0) { ++ int count = write(desc->fd, buffer, bufsize); ++ ++ if (count >= 0) { ++ *transfered = count; ++ } ++ if (count == bufsize) { ++ return PRINTER_SUCCESS; ++ } else { ++ return PRINTER_FAILURE; ++ } ++ } else { ++ return PRINTER_FAILURE; ++ } ++ } + } +diff -Nur libinklevel-0.9.3.orig/util.c libinklevel-0.9.3/util.c +--- libinklevel-0.9.3.orig/util.c 2018-07-07 21:37:24.000000000 +0200 ++++ libinklevel-0.9.3/util.c 2018-08-31 21:19:11.708500022 +0200 +@@ -19,6 +19,44 @@ + #include "inklevel.h" + #include "util.h" + ++/* This function reads from the printer nonblockingly */ ++int read_from_printer(int fd, void *buf, size_t bufsize, int nonblocking) { ++ int status; ++ int retry = 10; ++ struct pollfd ufds; ++ ++ memset(buf, 0, bufsize); ++ ++ if (nonblocking != 0) { ++ fcntl(fd, F_SETFL, O_NONBLOCK | fcntl(fd, F_GETFL)); ++ } ++ ++ do { ++ ufds.fd = fd; ++ ufds.events = POLLIN; ++ ufds.revents = 0; ++ if ((status = poll(&ufds, 1, 1000)) < 0) { ++ break; ++ } ++ status = read(fd, buf, bufsize - 1); ++ if ((status == 0) || ((status < 0) && (errno == EAGAIN))) { ++ usleep(2000); ++ status = 0; ++ } ++ } while ((status == 0) && (--retry != 0)); ++ ++#ifdef DEBUG ++ if ((status == 0) && (retry == 0)) { ++ printf("Read from printer timed out\n"); ++ } else if (status < 0) { ++ printf("Could not read from printer\n"); ++ } ++#endif ++ ++ return status; ++} ++ ++ + /* This function converts a string containing a two digit hexadecimal number + * to an int + */ +diff -Nur libinklevel-0.9.3.orig/util.h libinklevel-0.9.3/util.h +--- libinklevel-0.9.3.orig/util.h 2018-07-07 22:02:45.000000000 +0200 ++++ libinklevel-0.9.3/util.h 2018-08-31 21:19:21.041833273 +0200 +@@ -12,6 +12,7 @@ + #include "internal.h" + #include "inklevel.h" + ++int read_from_printer(int fd, void *buf, size_t bufsize, int nonblocking); + int my_axtoi(char *t); + int my_atoi(char *t); + void tokenize_device_id(const char *string, char tags[NR_TAGS][BUFLEN]); diff --git a/libinklevel.spec b/libinklevel.spec index 22b5f5a..d7dc896 100644 --- a/libinklevel.spec +++ b/libinklevel.spec @@ -1,16 +1,25 @@ +# +# Conditional build: +%bcond_without parport # parallel port (IEEE 1284) support + Summary: Library for checking ink level of a printer Summary(pl.UTF-8): Biblioteka do sprawdzania poziomu atramentu drukarki Name: libinklevel -Version: 0.9.2 +Version: 0.9.3 Release: 1 License: GPL v2 Group: Libraries Source0: http://downloads.sourceforge.net/libinklevel/%{name}-%{version}.tar.gz -# Source0-md5: d9f61d14afc2025da454a624578b2be8 +# Source0-md5: 572eda08cc561414673fd798b6c7bc2a +Patch0: %{name}-parport.patch URL: http://libinklevel.sourceforge.net/ -BuildRequires: libieee1284-devel -BuildRequires: libusb-devel >= 1.0 +BuildRequires: autoconf >= 2.50 +BuildRequires: automake +%{?with_parport:BuildRequires: libieee1284-devel} +BuildRequires: libtool +BuildRequires: libusb-devel >= 1.0.17 BuildRequires: pkgconfig >= 1:0.26 +Requires: libusb >= 1.0.17 BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n) %description @@ -31,7 +40,7 @@ Summary: Header file for libinklevel Summary(pl.UTF-8): Plik nagłówkowy biblioteki libinklevel Group: Development/Libraries Requires: %{name} = %{version}-%{release} -Requires: libieee1284-devel +%{?with_parport:Requires: libieee1284-devel} Requires: libusb-devel >= 1.0 %description devel @@ -54,8 +63,16 @@ Statyczna biblioteka libinklevel. %prep %setup -q +%if %{with parport} +%patch0 -p1 +%endif %build +%{__libtoolize} +%{__aclocal} -I m4 +%{__autoconf} +%{__autoheader} +%{__automake} %configure %{__make} -- 2.44.0