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