1141cc406Sopenharmony_ci/* sane - Scanner Access Now Easy. 2141cc406Sopenharmony_ci Copyright (C) 1997 Andreas Beck 3141cc406Sopenharmony_ci This file is part of the SANE package. 4141cc406Sopenharmony_ci 5141cc406Sopenharmony_ci SANE is free software; you can redistribute it and/or modify it under 6141cc406Sopenharmony_ci the terms of the GNU General Public License as published by the Free 7141cc406Sopenharmony_ci Software Foundation; either version 2 of the License, or (at your 8141cc406Sopenharmony_ci option) any later version. 9141cc406Sopenharmony_ci 10141cc406Sopenharmony_ci SANE is distributed in the hope that it will be useful, but WITHOUT 11141cc406Sopenharmony_ci ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12141cc406Sopenharmony_ci FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13141cc406Sopenharmony_ci for more details. 14141cc406Sopenharmony_ci 15141cc406Sopenharmony_ci You should have received a copy of the GNU General Public License 16141cc406Sopenharmony_ci along with sane; see the file COPYING. 17141cc406Sopenharmony_ci If not, see <https://www.gnu.org/licenses/>. 18141cc406Sopenharmony_ci 19141cc406Sopenharmony_ci This file implements a simple SANE frontend (well it rather is a 20141cc406Sopenharmony_ci transport layer, but seen from libsane it is a frontend) which acts 21141cc406Sopenharmony_ci as a NETSANE server. The NETSANE specifications should have come 22141cc406Sopenharmony_ci with this package. 23141cc406Sopenharmony_ci Feel free to enhance this program ! It needs extension especially 24141cc406Sopenharmony_ci regarding crypto-support and authentication. 25141cc406Sopenharmony_ci */ 26141cc406Sopenharmony_ci 27141cc406Sopenharmony_ci#include <ctype.h> 28141cc406Sopenharmony_ci#include <limits.h> 29141cc406Sopenharmony_ci#include <stdio.h> 30141cc406Sopenharmony_ci#include <stdlib.h> 31141cc406Sopenharmony_ci#include <string.h> 32141cc406Sopenharmony_ci#include <unistd.h> 33141cc406Sopenharmony_ci 34141cc406Sopenharmony_ci#include <sys/socket.h> 35141cc406Sopenharmony_ci#include <sys/types.h> 36141cc406Sopenharmony_ci 37141cc406Sopenharmony_ci#include <netdb.h> 38141cc406Sopenharmony_ci#include <netinet/in.h> 39141cc406Sopenharmony_ci 40141cc406Sopenharmony_ci#include "../include/sane/sane.h" 41141cc406Sopenharmony_ci 42141cc406Sopenharmony_civoid 43141cc406Sopenharmony_ciauth_callback (SANE_String_Const domain, 44141cc406Sopenharmony_ci SANE_Char *username, 45141cc406Sopenharmony_ci SANE_Char *password) 46141cc406Sopenharmony_ci{ 47141cc406Sopenharmony_ci printf ("Client '%s' requested authorization.\nUser:\n", domain); 48141cc406Sopenharmony_ci scanf ("%s", username); 49141cc406Sopenharmony_ci printf ("Password:\n"); 50141cc406Sopenharmony_ci scanf ("%s", password); 51141cc406Sopenharmony_ci return; 52141cc406Sopenharmony_ci} 53141cc406Sopenharmony_ci 54141cc406Sopenharmony_civoid 55141cc406Sopenharmony_citestsane (const char *dev_name) 56141cc406Sopenharmony_ci{ 57141cc406Sopenharmony_ci int hlp, x; 58141cc406Sopenharmony_ci SANE_Status bla; 59141cc406Sopenharmony_ci SANE_Int blubb; 60141cc406Sopenharmony_ci SANE_Handle hand; 61141cc406Sopenharmony_ci SANE_Parameters pars; 62141cc406Sopenharmony_ci const SANE_Option_Descriptor *sod; 63141cc406Sopenharmony_ci const SANE_Device **device_list; 64141cc406Sopenharmony_ci char buffer[2048]; 65141cc406Sopenharmony_ci 66141cc406Sopenharmony_ci bla = sane_init (&blubb, auth_callback); 67141cc406Sopenharmony_ci fprintf (stderr, "Init : stat=%d ver=%x\nPress Enter to continue...", 68141cc406Sopenharmony_ci bla, blubb); 69141cc406Sopenharmony_ci getchar (); 70141cc406Sopenharmony_ci if (bla != SANE_STATUS_GOOD) 71141cc406Sopenharmony_ci return; 72141cc406Sopenharmony_ci 73141cc406Sopenharmony_ci bla = sane_get_devices (&device_list, SANE_FALSE); 74141cc406Sopenharmony_ci fprintf (stderr, "GetDev : stat=%s\n", sane_strstatus (bla)); 75141cc406Sopenharmony_ci if (bla != SANE_STATUS_GOOD) 76141cc406Sopenharmony_ci return; 77141cc406Sopenharmony_ci 78141cc406Sopenharmony_ci bla = sane_open (dev_name, &hand); 79141cc406Sopenharmony_ci fprintf (stderr, "Open : stat=%s hand=%p\n", sane_strstatus (bla), hand); 80141cc406Sopenharmony_ci if (bla != SANE_STATUS_GOOD) 81141cc406Sopenharmony_ci return; 82141cc406Sopenharmony_ci 83141cc406Sopenharmony_ci bla = sane_set_io_mode (hand, 0); 84141cc406Sopenharmony_ci fprintf (stderr, "SetIoMode : stat=%s\n", sane_strstatus (bla)); 85141cc406Sopenharmony_ci 86141cc406Sopenharmony_ci for (hlp = 0; hlp < 9999; hlp++) 87141cc406Sopenharmony_ci { 88141cc406Sopenharmony_ci sod = sane_get_option_descriptor (hand, hlp); 89141cc406Sopenharmony_ci if (sod == NULL) 90141cc406Sopenharmony_ci break; 91141cc406Sopenharmony_ci fprintf (stderr, "Gopt(%d) : stat=%p\n", hlp, sod); 92141cc406Sopenharmony_ci fprintf (stderr, "name : %s\n", sod->name); 93141cc406Sopenharmony_ci fprintf (stderr, "title: %s\n", sod->title); 94141cc406Sopenharmony_ci fprintf (stderr, "desc : %s\n", sod->desc); 95141cc406Sopenharmony_ci 96141cc406Sopenharmony_ci fprintf (stderr, "type : %d\n", sod->type); 97141cc406Sopenharmony_ci fprintf (stderr, "unit : %d\n", sod->unit); 98141cc406Sopenharmony_ci fprintf (stderr, "size : %d\n", sod->size); 99141cc406Sopenharmony_ci fprintf (stderr, "cap : %d\n", sod->cap); 100141cc406Sopenharmony_ci fprintf (stderr, "ctyp : %d\n", sod->constraint_type); 101141cc406Sopenharmony_ci switch (sod->constraint_type) 102141cc406Sopenharmony_ci { 103141cc406Sopenharmony_ci case SANE_CONSTRAINT_NONE: 104141cc406Sopenharmony_ci break; 105141cc406Sopenharmony_ci case SANE_CONSTRAINT_STRING_LIST: 106141cc406Sopenharmony_ci fprintf (stderr, "stringlist:\n"); 107141cc406Sopenharmony_ci break; 108141cc406Sopenharmony_ci case SANE_CONSTRAINT_WORD_LIST: 109141cc406Sopenharmony_ci fprintf (stderr, "wordlist (%d) : ", sod->constraint.word_list[0]); 110141cc406Sopenharmony_ci for (x = 1; x <= sod->constraint.word_list[0]; x++) 111141cc406Sopenharmony_ci fprintf (stderr, " %d ", sod->constraint.word_list[x]); 112141cc406Sopenharmony_ci fprintf (stderr, "\n"); 113141cc406Sopenharmony_ci break; 114141cc406Sopenharmony_ci case SANE_CONSTRAINT_RANGE: 115141cc406Sopenharmony_ci fprintf (stderr, "range: %d-%d %d \n", sod->constraint.range->min, 116141cc406Sopenharmony_ci sod->constraint.range->max, sod->constraint.range->quant); 117141cc406Sopenharmony_ci break; 118141cc406Sopenharmony_ci } 119141cc406Sopenharmony_ci } 120141cc406Sopenharmony_ci 121141cc406Sopenharmony_ci bla = sane_get_parameters (hand, &pars); 122141cc406Sopenharmony_ci fprintf (stderr, 123141cc406Sopenharmony_ci "Parm : stat=%s form=%d,lf=%d,bpl=%d,pixpl=%d,lin=%d,dep=%d\n", 124141cc406Sopenharmony_ci sane_strstatus (bla), 125141cc406Sopenharmony_ci pars.format, pars.last_frame, 126141cc406Sopenharmony_ci pars.bytes_per_line, pars.pixels_per_line, 127141cc406Sopenharmony_ci pars.lines, pars.depth); 128141cc406Sopenharmony_ci if (bla != SANE_STATUS_GOOD) 129141cc406Sopenharmony_ci return; 130141cc406Sopenharmony_ci 131141cc406Sopenharmony_ci bla = sane_start (hand); 132141cc406Sopenharmony_ci fprintf (stderr, "Start : stat=%s\n", sane_strstatus (bla)); 133141cc406Sopenharmony_ci if (bla != SANE_STATUS_GOOD) 134141cc406Sopenharmony_ci return; 135141cc406Sopenharmony_ci 136141cc406Sopenharmony_ci do 137141cc406Sopenharmony_ci { 138141cc406Sopenharmony_ci bla = sane_read (hand, buffer, sizeof (buffer), &blubb); 139141cc406Sopenharmony_ci /*printf("Read : stat=%s len=%d\n",sane_strstatus (bla),blubb); */ 140141cc406Sopenharmony_ci if (bla != SANE_STATUS_GOOD) 141141cc406Sopenharmony_ci { 142141cc406Sopenharmony_ci if (bla == SANE_STATUS_EOF) 143141cc406Sopenharmony_ci break; 144141cc406Sopenharmony_ci return; 145141cc406Sopenharmony_ci } 146141cc406Sopenharmony_ci fwrite (buffer, 1, blubb, stdout); 147141cc406Sopenharmony_ci } 148141cc406Sopenharmony_ci while (1); 149141cc406Sopenharmony_ci 150141cc406Sopenharmony_ci sane_cancel (hand); 151141cc406Sopenharmony_ci fprintf (stderr, "Cancel.\n"); 152141cc406Sopenharmony_ci 153141cc406Sopenharmony_ci sane_close (hand); 154141cc406Sopenharmony_ci fprintf (stderr, "Close\n"); 155141cc406Sopenharmony_ci 156141cc406Sopenharmony_ci for (hlp = 0; hlp < 20; hlp++) 157141cc406Sopenharmony_ci fprintf (stderr, "STRS %d=%s\n", hlp, sane_strstatus (hlp)); 158141cc406Sopenharmony_ci 159141cc406Sopenharmony_ci fprintf (stderr, "Exit.\n"); 160141cc406Sopenharmony_ci} 161141cc406Sopenharmony_ci 162141cc406Sopenharmony_ciint 163141cc406Sopenharmony_cimain (int argc, char *argv[]) 164141cc406Sopenharmony_ci{ 165141cc406Sopenharmony_ci if (argc != 2 && argc != 3) 166141cc406Sopenharmony_ci { 167141cc406Sopenharmony_ci fprintf (stderr, "Usage: %s devicename [hostname]\n", argv[0]); 168141cc406Sopenharmony_ci exit (0); 169141cc406Sopenharmony_ci } 170141cc406Sopenharmony_ci if (argc == 3) 171141cc406Sopenharmony_ci { 172141cc406Sopenharmony_ci char envbuf[1024]; 173141cc406Sopenharmony_ci sprintf (envbuf, "SANE_NET_HOST=%s", argv[2]); 174141cc406Sopenharmony_ci putenv (envbuf); 175141cc406Sopenharmony_ci } 176141cc406Sopenharmony_ci 177141cc406Sopenharmony_ci fprintf (stderr, "This is a SANE test application.\n" 178141cc406Sopenharmony_ci "Now connecting to device %s.\n", argv[1]); 179141cc406Sopenharmony_ci testsane (argv[1]); 180141cc406Sopenharmony_ci sane_exit (); 181141cc406Sopenharmony_ci return 0; 182141cc406Sopenharmony_ci} 183