From 351b7328520c16730ceb46e5acae16038c42185e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Tue, 16 Feb 2021 18:24:19 +0100 Subject: New upstream version 1.0.32 --- frontend/Makefile.am | 13 ++++ frontend/saned.c | 45 ++++++++++-- frontend/scanimage.c | 184 +++++++++++++++++++++++++++++--------------------- frontend/sicc.c | 4 +- frontend/sicc.h | 4 +- frontend/stiff.c | 4 +- frontend/stiff.h | 4 +- frontend/test.c | 4 +- frontend/tstbackend.c | 4 +- 9 files changed, 170 insertions(+), 96 deletions(-) (limited to 'frontend') diff --git a/frontend/Makefile.am b/frontend/Makefile.am index d27acf2..47c50f3 100644 --- a/frontend/Makefile.am +++ b/frontend/Makefile.am @@ -31,5 +31,18 @@ test_LDADD = ../lib/liblib.la ../backend/libsane.la tstbackend_SOURCES = tstbackend.c tstbackend_LDADD = ../lib/liblib.la ../backend/libsane.la +if preloadable_backends_enabled +if WITH_GENESYS_TESTS +## Because the genesys backend is implemented in C++, programs need +## to link against the standard C++ library. The work-around below +## will work for the GNU C++ compiler with the GNU standard library +## for C++. Other build scenarios may need work. +scanimage_LDADD += -lstdc++ +saned_LDADD += -lstdc++ +test_LDADD += -lstdc++ +tstbackend_LDADD += -lstdc++ +endif +endif + clean-local: rm -f test tstbackend diff --git a/frontend/saned.c b/frontend/saned.c index 0317542..5b16980 100644 --- a/frontend/saned.c +++ b/frontend/saned.c @@ -17,8 +17,8 @@ for more details. You should have received a copy of the GNU General Public License - along with sane; see the file COPYING. If not, write to the Free - Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with sane; see the file COPYING. + If not, see . The SANE network daemon. This is the counterpart to the NET backend. @@ -256,6 +256,7 @@ static int run_once; static int data_connect_timeout = 4000; static Handle *handle; static char *bind_addr; +static short bind_port = -1; static union { int w; @@ -2841,6 +2842,7 @@ do_bindings_family (int family, int *nfds, struct pollfd **fds, struct addrinfo int on = 1; int i; + sane_port = bind_port; fdp = *fds; for (resp = res, i = 0; resp != NULL; resp = resp->ai_next, i++) @@ -2851,12 +2853,18 @@ do_bindings_family (int family, int *nfds, struct pollfd **fds, struct addrinfo if (resp->ai_family == AF_INET) { - sane_port = ntohs (((struct sockaddr_in *) resp->ai_addr)->sin_port); + if (sane_port != -1) + ((struct sockaddr_in *) resp->ai_addr)->sin_port = htons(sane_port); + else + sane_port = ntohs(((struct sockaddr_in *) resp->ai_addr)->sin_port); } #ifdef ENABLE_IPV6 else if (resp->ai_family == AF_INET6) { - sane_port = ntohs (((struct sockaddr_in6 *) resp->ai_addr)->sin6_port); + if (sane_port != -1) + ((struct sockaddr_in6 *) resp->ai_addr)->sin6_port = htons(sane_port); + else + sane_port = ntohs (((struct sockaddr_in6 *) resp->ai_addr)->sin6_port); } #endif /* ENABLE_IPV6 */ else @@ -2903,6 +2911,28 @@ do_bindings_family (int family, int *nfds, struct pollfd **fds, struct addrinfo continue; } + if (sane_port == 0) + { + /* sane was asked to bind to an ephemeral port, log it */ + socklen_t len = sizeof (*resp->ai_addr); + if (getsockname(fd, resp->ai_addr, &len) != -1) + { + if (resp->ai_family == AF_INET) + { + DBG (DBG_INFO, "do_bindings: [%d] selected ephemeral port: %d\n", i, ntohs(((struct sockaddr_in *) resp->ai_addr)->sin_port)); + } + +#ifdef ENABLE_IPV6 + if (resp->ai_family == AF_INET6) + { + DBG (DBG_INFO, "do_bindings: [%d] selected ephemeral port: %d\n", i, ntohs(((struct sockaddr_in6 *) resp->ai_addr)->sin6_port)); + } + +#endif /* ENABLE_IPV6 */ + + } + } + fdp->fd = fd; fdp->events = POLLIN; @@ -3391,6 +3421,7 @@ static void usage(char *me, int err) " -d, --debug=level set debug level `level' (default is 2)\n" " -e, --stderr output to stderr\n" " -b, --bind=addr bind address `addr' (default all interfaces)\n" + " -p, --port=port bind port `port` (default sane-port or 6566)\n" " -h, --help show this help message and exit\n", me); exit(err); @@ -3410,6 +3441,7 @@ static struct option long_options[] = {"debug", required_argument, 0, 'd'}, {"stderr", no_argument, 0, 'e'}, {"bind", required_argument, 0, 'b'}, + {"port", required_argument, 0, 'p'}, {0, 0, 0, 0 } }; @@ -3435,7 +3467,7 @@ main (int argc, char *argv[]) run_foreground = SANE_TRUE; run_once = SANE_FALSE; - while((c = getopt_long(argc, argv,"ha::lu:Dod:eb:", long_options, &long_index )) != -1) + while((c = getopt_long(argc, argv,"ha::lu:Dod:eb:p:", long_options, &long_index )) != -1) { switch(c) { case 'a': @@ -3465,6 +3497,9 @@ main (int argc, char *argv[]) case 'b': bind_addr = optarg; break; + case 'p': + bind_port = atoi(optarg); + break; case 'h': usage(argv[0], EXIT_SUCCESS); break; diff --git a/frontend/scanimage.c b/frontend/scanimage.c index 3902092..901a7c8 100644 --- a/frontend/scanimage.c +++ b/frontend/scanimage.c @@ -20,8 +20,8 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + along with this program. If not, see . +*/ #ifdef _AIX # include "../include/lalloca.h" /* MUST come first for AIX! */ @@ -73,6 +73,7 @@ typedef struct int height; int x; int y; + int num_channels; } Image; @@ -440,88 +441,108 @@ print_option (SANE_Device * device, int opt_num, const SANE_Option_Descriptor *o break; case SANE_CONSTRAINT_RANGE: - if (opt->type == SANE_TYPE_INT) - { - if (!strcmp (opt->name, "x")) - { - printf ("%d..%d", - opt->constraint.range->min, - opt->constraint.range->max - tl_x); - } - else if (!strcmp (opt->name, "y")) - { - printf ("%d..%d", - opt->constraint.range->min, - opt->constraint.range->max - tl_y); - } - else - { - printf ("%d..%d", - opt->constraint.range->min, - opt->constraint.range->max); - } - print_unit (opt->unit); - if (opt->size > (SANE_Int) sizeof (SANE_Word)) - fputs (",...", stdout); - if (opt->constraint.range->quant) - printf (" (in steps of %d)", opt->constraint.range->quant); - } - else - { - if (!strcmp (opt->name, "x")) - { - printf ("%g..%g", - SANE_UNFIX (opt->constraint.range->min), - SANE_UNFIX (opt->constraint.range->max - tl_x)); - } - else if (!strcmp (opt->name, "y")) - { - printf ("%g..%g", - SANE_UNFIX (opt->constraint.range->min), - SANE_UNFIX (opt->constraint.range->max - tl_y)); - } - else - { - printf ("%g..%g", - SANE_UNFIX (opt->constraint.range->min), - SANE_UNFIX (opt->constraint.range->max)); - } - print_unit (opt->unit); - if (opt->size > (SANE_Int) sizeof (SANE_Word)) - fputs (",...", stdout); - if (opt->constraint.range->quant) - printf (" (in steps of %g)", - SANE_UNFIX (opt->constraint.range->quant)); - } - break; + // Check for no range - some buggy backends can miss this out. + if (!opt->constraint.range) + { + fputs ("{no_range}", stdout); + } + else + { + if (opt->type == SANE_TYPE_INT) + { + if (!strcmp (opt->name, "x")) + { + printf ("%d..%d", opt->constraint.range->min, + opt->constraint.range->max - tl_x); + } + else if (!strcmp (opt->name, "y")) + { + printf ("%d..%d", opt->constraint.range->min, + opt->constraint.range->max - tl_y); + } + else + { + printf ("%d..%d", opt->constraint.range->min, + opt->constraint.range->max); + } + print_unit (opt->unit); + if (opt->size > (SANE_Int) sizeof(SANE_Word)) + fputs (",...", stdout); + if (opt->constraint.range->quant) + printf (" (in steps of %d)", opt->constraint.range->quant); + } + else + { + if (!strcmp (opt->name, "x")) + { + printf ("%g..%g", SANE_UNFIX(opt->constraint.range->min), + SANE_UNFIX(opt->constraint.range->max - tl_x)); + } + else if (!strcmp (opt->name, "y")) + { + printf ("%g..%g", SANE_UNFIX(opt->constraint.range->min), + SANE_UNFIX(opt->constraint.range->max - tl_y)); + } + else + { + printf ("%g..%g", SANE_UNFIX(opt->constraint.range->min), + SANE_UNFIX(opt->constraint.range->max)); + } + print_unit (opt->unit); + if (opt->size > (SANE_Int) sizeof(SANE_Word)) + fputs (",...", stdout); + if (opt->constraint.range->quant) + printf (" (in steps of %g)", + SANE_UNFIX(opt->constraint.range->quant)); + } + } + break; case SANE_CONSTRAINT_WORD_LIST: - for (i = 0; i < opt->constraint.word_list[0]; ++i) - { - if (not_first) - fputc ('|', stdout); + // Check no words in list or no list - - some buggy backends can miss this out. + // Note the check on < 1 as SANE_Int is signed. + if (!opt->constraint.word_list || (opt->constraint.word_list[0] < 1)) + { + fputs ("{no_wordlist}", stdout); + } + else + { + for (i = 0; i < opt->constraint.word_list[0]; ++i) + { + if (not_first) + fputc ('|', stdout); - not_first = SANE_TRUE; + not_first = SANE_TRUE; + + if (opt->type == SANE_TYPE_INT) + printf ("%d", opt->constraint.word_list[i + 1]); + else + printf ("%g", SANE_UNFIX(opt->constraint.word_list[i + 1])); + } + } - if (opt->type == SANE_TYPE_INT) - printf ("%d", opt->constraint.word_list[i + 1]); - else - printf ("%g", SANE_UNFIX (opt->constraint.word_list[i + 1])); - } print_unit (opt->unit); if (opt->size > (SANE_Int) sizeof (SANE_Word)) fputs (",...", stdout); break; case SANE_CONSTRAINT_STRING_LIST: - for (i = 0; opt->constraint.string_list[i]; ++i) - { - if (i > 0) - fputc ('|', stdout); + // Check for missing strings - some buggy backends can miss this out. + if (!opt->constraint.string_list || !opt->constraint.string_list[0]) + { + fputs ("{no_stringlist}", stdout); + } + else + { + for (i = 0; opt->constraint.string_list[i]; ++i) + { + if (i > 0) + fputc ('|', stdout); - fputs (opt->constraint.string_list[i], stdout); - } - break; + fputs (opt->constraint.string_list[i], stdout); + } + } + break; } } @@ -1124,6 +1145,8 @@ process_backend_option (SANE_Handle device, int optnum, const char *optarg) return; } set_option (device, optnum, valuep); + if (opt->type == SANE_TYPE_STRING && valuep) + free(valuep); } static void @@ -1285,10 +1308,10 @@ advance (Image * image) size_t old_size = 0, new_size; if (image->data) - old_size = image->height * image->width; + old_size = image->height * image->width * image->num_channels; image->height += STRIP_HEIGHT; - new_size = image->height * image->width; + new_size = image->height * image->width * image->num_channels; if (image->data) image->data = realloc (image->data, new_size); @@ -1312,7 +1335,7 @@ scan_it (FILE *ofp) SANE_Byte min = 0xff, max = 0; SANE_Parameters parm; SANE_Status status; - Image image = { 0, 0, 0, 0, 0 }; + Image image = { 0, 0, 0, 0, 0, 0 }; static const char *format_name[] = { "gray", "RGB", "red", "green", "blue" }; @@ -1382,6 +1405,7 @@ scan_it (FILE *ofp) if (first_frame) { + image.num_channels = 1; switch (parm.format) { case SANE_FRAME_RED: @@ -1390,6 +1414,7 @@ scan_it (FILE *ofp) assert (parm.depth == 8); must_buffer = 1; offset = parm.format - SANE_FRAME_RED; + image.num_channels = 3; break; case SANE_FRAME_RGB: @@ -1517,6 +1542,7 @@ scan_it (FILE *ofp) case SANE_FRAME_RED: case SANE_FRAME_GREEN: case SANE_FRAME_BLUE: + image.num_channels = 3; for (i = 0; i < len; ++i) { image.data[offset + 3 * i] = buffer[i]; @@ -1530,6 +1556,7 @@ scan_it (FILE *ofp) break; case SANE_FRAME_RGB: + image.num_channels = 1; for (i = 0; i < len; ++i) { image.data[offset + i] = buffer[i]; @@ -1543,6 +1570,7 @@ scan_it (FILE *ofp) break; case SANE_FRAME_GRAY: + image.num_channels = 1; for (i = 0; i < len; ++i) { image.data[offset + i] = buffer[i]; @@ -1725,7 +1753,7 @@ scan_it (FILE *ofp) } #endif - fwrite (image.data, 1, image.height * image.width, ofp); + fwrite (image.data, 1, image.height * image.width * image.num_channels, ofp); } #ifdef HAVE_LIBPNG if(output_format == OUTPUT_PNG) @@ -1800,7 +1828,7 @@ test_it (void) int i, len; SANE_Parameters parm; SANE_Status status; - Image image = { 0, 0, 0, 0, 0 }; + Image image = { 0, 0, 0, 0, 0, 0 }; static const char *format_name[] = { "gray", "RGB", "red", "green", "blue" }; diff --git a/frontend/sicc.c b/frontend/sicc.c index c93e5c3..e6826f0 100644 --- a/frontend/sicc.c +++ b/frontend/sicc.c @@ -12,8 +12,8 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + along with this program. If not, see . +*/ #include "../include/sane/config.h" diff --git a/frontend/sicc.h b/frontend/sicc.h index 5c225da..9251a37 100644 --- a/frontend/sicc.h +++ b/frontend/sicc.h @@ -12,8 +12,8 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + along with this program. If not, see . +*/ void * sanei_load_icc_profile (const char *path, size_t *size); diff --git a/frontend/stiff.c b/frontend/stiff.c index c9153e5..3f86c79 100644 --- a/frontend/stiff.c +++ b/frontend/stiff.c @@ -14,8 +14,8 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + along with this program. If not, see . +*/ /* Changes: 2000-11-19, PK: Color TIFF-header: write 3 values for bits per sample diff --git a/frontend/stiff.h b/frontend/stiff.h index 6560ef6..f6f8df5 100644 --- a/frontend/stiff.h +++ b/frontend/stiff.h @@ -12,8 +12,8 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + along with this program. If not, see . +*/ void sanei_write_tiff_header (SANE_Frame format, int width, int height, int depth, diff --git a/frontend/test.c b/frontend/test.c index 3b1c4ae..9ad3a66 100644 --- a/frontend/test.c +++ b/frontend/test.c @@ -13,8 +13,8 @@ for more details. You should have received a copy of the GNU General Public License - along with sane; see the file COPYING. If not, write to the Free - Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with sane; see the file COPYING. + If not, see . This file implements a simple SANE frontend (well it rather is a transport layer, but seen from libsane it is a frontend) which acts diff --git a/frontend/tstbackend.c b/frontend/tstbackend.c index 985684d..b41ff61 100644 --- a/frontend/tstbackend.c +++ b/frontend/tstbackend.c @@ -18,9 +18,7 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + along with this program. If not, see . */ #define BUILD 19 /* 2013-03-29 */ -- cgit v1.2.3