2009-03-06 Louis Lagendijk <llagendijk-guest at users.alioth.debian.org>

* backend/pixma_bjnp.c
        - silenced some debug statements during scanner detections
        - increased timeouts to 20 seconds as 10 seconds is apparently
        - not enough for the combination of a Mac and an MX850.
merge-requests/1/head
Louis Lagendijk 2009-03-31 19:07:26 +00:00
rodzic ba825f1050
commit d214d08f1b
2 zmienionych plików z 342 dodań i 310 usunięć

Wyświetl plik

@ -1,3 +1,9 @@
2009-03-06 Louis Lagendijk <llagendijk-guest at users.alioth.debian.org>
* backend/pixma_bjnp.c
- silenced some debug statements during scanner detections
- increased timeouts to 20 seconds as 10 seconds is apparently
- not enough for the combination of a Mac and an MX850.
2009-03-21 Alex Belkin <abc@telekom.ru> 2009-03-21 Alex Belkin <abc@telekom.ru>
* backend/xerox_mfp.conf.in: add Xerox Phaser 6110MFP * backend/xerox_mfp.conf.in: add Xerox Phaser 6110MFP
* backend/xerox_mfp.c: compatibility with scanners w/o feeder. * backend/xerox_mfp.c: compatibility with scanners w/o feeder.

Wyświetl plik

@ -168,34 +168,35 @@ charTo2byte (char d[], char s[], int len)
return copied; return copied;
} }
static char *getusername(void) static char *
getusername (void)
{ {
static char noname[] = "sane_pixma"; static char noname[] = "sane_pixma";
struct passwd *pwdent; struct passwd *pwdent;
#ifdef HAVE_PWD_H #ifdef HAVE_PWD_H
if (((pwdent = getpwuid(geteuid())) != NULL) && if (((pwdent = getpwuid (geteuid ())) != NULL) && (pwdent->pw_name != NULL))
(pwdent->pw_name != NULL))
return pwdent->pw_name; return pwdent->pw_name;
#endif #endif
return noname; return noname;
} }
static char *truncate_hostname(char *hostname, char *short_hostname) static char *
truncate_hostname (char *hostname, char *short_hostname)
{ {
char *dot; char *dot;
/* determine a short hostname (max HOSTNAME_SHORT_MAX chars */ /* determine a short hostname (max HOSTNAME_SHORT_MAX chars */
strncpy(short_hostname, hostname, SHORT_HOSTNAME_MAX); strncpy (short_hostname, hostname, SHORT_HOSTNAME_MAX);
short_hostname[SHORT_HOSTNAME_MAX -1] = '\0'; short_hostname[SHORT_HOSTNAME_MAX - 1] = '\0';
if (strlen(hostname) > SHORT_HOSTNAME_MAX) if (strlen (hostname) > SHORT_HOSTNAME_MAX)
{ {
/* this is a hostname, not an ip-address, so remove domain part of the name */ /* this is a hostname, not an ip-address, so remove domain part of the name */
if ((dot = index(short_hostname, '.')) != NULL ) if ((dot = index (short_hostname, '.')) != NULL)
*dot = '\0'; *dot = '\0';
} }
return short_hostname; return short_hostname;
@ -209,7 +210,7 @@ bjnp_open_tcp (int devno)
if ((sock = socket (PF_INET, SOCK_STREAM, 0)) < 0) if ((sock = socket (PF_INET, SOCK_STREAM, 0)) < 0)
{ {
PDBG(pixma_dbg (LOG_CRIT, "bjnp_open_tcp: Can not create socket: %s\n", PDBG (pixma_dbg (LOG_CRIT, "bjnp_open_tcp: Can not create socket: %s\n",
strerror (errno))); strerror (errno)));
return -1; return -1;
} }
@ -242,7 +243,8 @@ bjnp_open_tcp (int devno)
(sock, (struct sockaddr *) &device[devno].addr, (sock, (struct sockaddr *) &device[devno].addr,
sizeof (device[devno].addr)) != 0) sizeof (device[devno].addr)) != 0)
{ {
PDBG(pixma_dbg (LOG_CRIT, "bjnp_open_tcp: Can not connect to scanner: %s\n", PDBG (pixma_dbg
(LOG_CRIT, "bjnp_open_tcp: Can not connect to scanner: %s\n",
strerror (errno))); strerror (errno)));
return -1; return -1;
} }
@ -274,7 +276,7 @@ split_uri (const char *devname, char *method, char *hostname, int *port,
if (((strncmp (start + i, "://", 3) != 0)) || (i > 255)) if (((strncmp (start + i, "://", 3) != 0)) || (i > 255))
{ {
PDBG(pixma_dbg (LOG_NOTICE, "Can not find method in %s (offset %d)\n", PDBG (pixma_dbg (LOG_NOTICE, "Can not find method in %s (offset %d)\n",
devname, i)); devname, i));
return -1; return -1;
} }
@ -296,7 +298,7 @@ split_uri (const char *devname, char *method, char *hostname, int *port,
if ((strlen (start) == 0) || (i > 255)) if ((strlen (start) == 0) || (i > 255))
{ {
PDBG(pixma_dbg (LOG_NOTICE, "Can not find hostname in %s\n", devname)); PDBG (pixma_dbg (LOG_NOTICE, "Can not find hostname in %s\n", devname));
return -1; return -1;
} }
@ -318,7 +320,7 @@ split_uri (const char *devname, char *method, char *hostname, int *port,
{ {
if ((start[i] < '0') || (start[i] > '9') || (i > 5)) if ((start[i] < '0') || (start[i] > '9') || (i > 5))
{ {
PDBG(pixma_dbg (LOG_NOTICE, "Can not find port number in %s\n", PDBG (pixma_dbg (LOG_NOTICE, "Can not find port number in %s\n",
devname)); devname));
return -1; return -1;
} }
@ -354,12 +356,12 @@ set_cmd (int devno, struct BJNP_command *cmd, char cmd_code, int payload_len)
strncpy (cmd->BJNP_id, BJNP_STRING, sizeof (cmd->BJNP_id)); strncpy (cmd->BJNP_id, BJNP_STRING, sizeof (cmd->BJNP_id));
cmd->dev_type = BJNP_CMD_SCAN; cmd->dev_type = BJNP_CMD_SCAN;
cmd->cmd_code = cmd_code; cmd->cmd_code = cmd_code;
cmd->unknown1 = htons(0); cmd->unknown1 = htons (0);
if (devno == -1) if (devno == -1)
{ {
/* device not opened, use 0 for serial and session) */ /* device not opened, use 0 for serial and session) */
cmd->seq_no = htons(0); cmd->seq_no = htons (0);
cmd->session_id = htons(0); cmd->session_id = htons (0);
} }
else else
{ {
@ -395,7 +397,8 @@ udp_command (const int dev_no, char *command, int cmd_len, char *response,
if ((sockfd = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) if ((sockfd = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, "udp_command: can not open socket - %s\n", strerror (errno))); (LOG_CRIT, "udp_command: can not open socket - %s\n",
strerror (errno)));
return -1; return -1;
} }
@ -404,7 +407,8 @@ udp_command (const int dev_no, char *command, int cmd_len, char *response,
(socklen_t) sizeof (struct sockaddr_in)) != 0) (socklen_t) sizeof (struct sockaddr_in)) != 0)
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, "udp_command: connect failed- %s\n", strerror (errno))); (LOG_CRIT, "udp_command: connect failed- %s\n",
strerror (errno)));
return -1; return -1;
} }
@ -427,8 +431,9 @@ udp_command (const int dev_no, char *command, int cmd_len, char *response,
timeout.tv_sec = device[dev_no].bjnp_timeout_sec; timeout.tv_sec = device[dev_no].bjnp_timeout_sec;
timeout.tv_usec = device[dev_no].bjnp_timeout_msec; timeout.tv_usec = device[dev_no].bjnp_timeout_msec;
} }
while (((result = select (sockfd + 1, &fdset, NULL, NULL, &timeout)) <= 0) && while (((result =
(errno == EINTR) && (attempt++ < MAX_SELECT_ATTEMPTS)); select (sockfd + 1, &fdset, NULL, NULL, &timeout)) <= 0)
&& (errno == EINTR) && (attempt++ < MAX_SELECT_ATTEMPTS));
if (result <= 0) if (result <= 0)
{ {
@ -493,10 +498,10 @@ get_scanner_id (const int dev_no, char *model)
id = (struct IDENTITY *) resp_buf; id = (struct IDENTITY *) resp_buf;
/* truncate string to be safe */ /* truncate string to be safe */
id->id[BJNP_IEEE1284_MAX -1] = '\0'; id->id[BJNP_IEEE1284_MAX - 1] = '\0';
id_len = ntohs (id->id_len) - sizeof (id->id_len); id_len = ntohs (id->id_len) - sizeof (id->id_len);
strcpy(scanner_id, id->id); strcpy (scanner_id, id->id);
PDBG (pixma_dbg (LOG_INFO, "Scanner identity string = %s\n", scanner_id)); PDBG (pixma_dbg (LOG_INFO, "Scanner identity string = %s\n", scanner_id));
@ -574,8 +579,9 @@ parse_scanner_address (char *resp_buf, char *address, char *serial)
} }
static int static int
bjnp_send_broadcast (struct in_addr local_addr, int local_port, struct in_addr broadcast_addr, bjnp_send_broadcast (struct in_addr local_addr, int local_port,
struct BJNP_command cmd, int size) struct in_addr broadcast_addr, struct BJNP_command cmd,
int size)
{ {
/* /*
* send command to interface and return open socket * send command to interface and return open socket
@ -589,7 +595,8 @@ bjnp_send_broadcast (struct in_addr local_addr, int local_port, struct in_addr b
if ((sockfd = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) if ((sockfd = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, "bjnp_send_broadcast: can not open socket - %s", strerror (errno))); (LOG_INFO, "bjnp_send_broadcast: can not open socket - %s",
strerror (errno)));
return -1; return -1;
} }
@ -600,7 +607,8 @@ bjnp_send_broadcast (struct in_addr local_addr, int local_port, struct in_addr b
sizeof (broadcast)) != 0) sizeof (broadcast)) != 0)
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, "bjnp_send_broadcast: setting socket options failed - %s", (LOG_INFO,
"bjnp_send_broadcast: setting socket options failed - %s",
strerror (errno))); strerror (errno)));
close (sockfd); close (sockfd);
return -1; return -1;
@ -618,7 +626,9 @@ bjnp_send_broadcast (struct in_addr local_addr, int local_port, struct in_addr b
(socklen_t) sizeof (sendaddr)) != 0) (socklen_t) sizeof (sendaddr)) != 0)
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, "bjnp_send_broadcast: bind socket to local address failed - %s\n", strerror (errno))); (LOG_INFO,
"bjnp_send_broadcast: bind socket to local address failed - %s\n",
strerror (errno)));
close (sockfd); close (sockfd);
return -1; return -1;
} }
@ -637,8 +647,8 @@ bjnp_send_broadcast (struct in_addr local_addr, int local_port, struct in_addr b
(struct sockaddr *) &sendaddr, (struct sockaddr *) &sendaddr,
sizeof (sendaddr))) != size) sizeof (sendaddr))) != size)
{ {
PDBG (pixma_dbg (LOG_CRIT, PDBG (pixma_dbg (LOG_INFO,
"bjnp_send_broadcasts: Sent only %x = %d bytes of packet, error = %s\n", "bjnp_send_broadcast: Sent only %x = %d bytes of packet, error = %s\n",
numbytes, numbytes, strerror (errno))); numbytes, numbytes, strerror (errno)));
/* not allowed, skip this interface */ /* not allowed, skip this interface */
@ -661,11 +671,12 @@ bjnp_finish_job (int devno)
set_cmd (devno, &cmd, CMD_UDP_CLOSE, 0); set_cmd (devno, &cmd, CMD_UDP_CLOSE, 0);
PDBG(pixma_dbg (LOG_DEBUG2, "Finish scanjob\n")); PDBG (pixma_dbg (LOG_DEBUG2, "Finish scanjob\n"));
PDBG(pixma_hexdump (LOG_DEBUG2, (char *) &cmd, sizeof (struct BJNP_command))); PDBG (pixma_hexdump
(LOG_DEBUG2, (char *) &cmd, sizeof (struct BJNP_command)));
resp_len = resp_len =
udp_command (devno, (char *) &cmd, sizeof (struct BJNP_command), udp_command (devno, (char *) &cmd, sizeof (struct BJNP_command), resp_buf,
resp_buf, BJNP_RESP_MAX); BJNP_RESP_MAX);
if (resp_len != sizeof (struct BJNP_command)) if (resp_len != sizeof (struct BJNP_command))
{ {
@ -675,8 +686,8 @@ bjnp_finish_job (int devno)
resp_len, (int) sizeof (struct BJNP_command))); resp_len, (int) sizeof (struct BJNP_command)));
return; return;
} }
PDBG(pixma_dbg (LOG_DEBUG2, "Finish scanjob response\n")); PDBG (pixma_dbg (LOG_DEBUG2, "Finish scanjob response\n"));
PDBG(pixma_hexdump (LOG_DEBUG2, resp_buf, resp_len)); PDBG (pixma_hexdump (LOG_DEBUG2, resp_buf, resp_len));
} }
@ -747,8 +758,8 @@ bjnp_get_intr (int devno, char type, char *hostname, char *user,
/* length (plen) determines how many bytes get sent, this skips /* length (plen) determines how many bytes get sent, this skips
date for type 0 and 1 */ date for type 0 and 1 */
PDBG(pixma_dbg (LOG_DEBUG2, "Interrupt status request\n")); PDBG (pixma_dbg (LOG_DEBUG2, "Interrupt status request\n"));
PDBG(pixma_hexdump (LOG_DEBUG2, (char *) &request, PDBG (pixma_hexdump (LOG_DEBUG2, (char *) &request,
sizeof (struct BJNP_command) + plen)); sizeof (struct BJNP_command) + plen));
resp_len = udp_command (devno, (char *) &request, resp_len = udp_command (devno, (char *) &request,
@ -756,8 +767,8 @@ bjnp_get_intr (int devno, char type, char *hostname, char *user,
BJNP_RESP_MAX); BJNP_RESP_MAX);
if (resp_len > 0) if (resp_len > 0)
{ {
PDBG(pixma_dbg (LOG_DEBUG2, "Interrupt status response:\n")); PDBG (pixma_dbg (LOG_DEBUG2, "Interrupt status response:\n"));
PDBG(pixma_hexdump (LOG_DEBUG2, resp_buf, resp_len)); PDBG (pixma_hexdump (LOG_DEBUG2, resp_buf, resp_len));
} }
if (resp_len != sizeof (struct INTR_STATUS_RESP)) if (resp_len != sizeof (struct INTR_STATUS_RESP))
{ {
@ -800,8 +811,8 @@ bjnp_send_job_details (int devno, char *hostname, char *user, char *title)
charTo2byte (job->username, user, sizeof (job->username)); charTo2byte (job->username, user, sizeof (job->username));
charTo2byte (job->jobtitle, title, sizeof (job->jobtitle)); charTo2byte (job->jobtitle, title, sizeof (job->jobtitle));
PDBG(pixma_dbg (LOG_DEBUG2, "Job details\n")); PDBG (pixma_dbg (LOG_DEBUG2, "Job details\n"));
PDBG(pixma_hexdump (LOG_DEBUG2, cmd_buf, PDBG (pixma_hexdump (LOG_DEBUG2, cmd_buf,
(sizeof (struct BJNP_command) + sizeof (*job)))); (sizeof (struct BJNP_command) + sizeof (*job))));
resp_len = udp_command (devno, cmd_buf, resp_len = udp_command (devno, cmd_buf,
@ -810,8 +821,8 @@ bjnp_send_job_details (int devno, char *hostname, char *user, char *title)
if (resp_len > 0) if (resp_len > 0)
{ {
PDBG(pixma_dbg (LOG_DEBUG2, "Job details response:\n")); PDBG (pixma_dbg (LOG_DEBUG2, "Job details response:\n"));
PDBG(pixma_hexdump (LOG_DEBUG2, resp_buf, resp_len)); PDBG (pixma_hexdump (LOG_DEBUG2, resp_buf, resp_len));
resp = (struct BJNP_command *) resp_buf; resp = (struct BJNP_command *) resp_buf;
device[devno].session_id = ntohs (resp->session_id); device[devno].session_id = ntohs (resp->session_id);
} }
@ -830,7 +841,8 @@ bjnp_write (int devno, const SANE_Byte * buf, size_t count)
struct SCAN_BUF bjnp_buf; struct SCAN_BUF bjnp_buf;
if (device[devno].scanner_data_left) if (device[devno].scanner_data_left)
PDBG (pixma_dbg (LOG_CRIT, "bjnp_write: ERROR scanner data left = 0x%lx = %ld\n", PDBG (pixma_dbg
(LOG_CRIT, "bjnp_write: ERROR scanner data left = 0x%lx = %ld\n",
(long) device[devno].scanner_data_left, (long) device[devno].scanner_data_left,
(long) device[devno].scanner_data_left)); (long) device[devno].scanner_data_left));
@ -840,7 +852,7 @@ bjnp_write (int devno, const SANE_Byte * buf, size_t count)
memcpy (bjnp_buf.scan_data, buf, count); memcpy (bjnp_buf.scan_data, buf, count);
PDBG (pixma_dbg (LOG_DEBUG, "bjnp_write: sending 0x%lx = %ld bytes\n", PDBG (pixma_dbg (LOG_DEBUG, "bjnp_write: sending 0x%lx = %ld bytes\n",
(long) count, (long) count); (long) count, (long) count);
PDBG( pixma_hexdump (LOG_DEBUG2, (char *) &bjnp_buf, PDBG (pixma_hexdump (LOG_DEBUG2, (char *) &bjnp_buf,
sizeof (struct BJNP_command) + count))); sizeof (struct BJNP_command) + count)));
if ((sent_bytes = if ((sent_bytes =
@ -878,7 +890,8 @@ bjnp_send_read_request (int devno)
if (device[devno].scanner_data_left) if (device[devno].scanner_data_left)
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, "bjnp_send_read_request: ERROR scanner data left = 0x%lx = %ld\n", (LOG_CRIT,
"bjnp_send_read_request: ERROR scanner data left = 0x%lx = %ld\n",
(long) device[devno].scanner_data_left, (long) device[devno].scanner_data_left,
(long) device[devno].scanner_data_left)); (long) device[devno].scanner_data_left));
@ -887,7 +900,7 @@ bjnp_send_read_request (int devno)
set_cmd (devno, (struct BJNP_command *) &bjnp_buf, CMD_TCP_REQ, 0); set_cmd (devno, (struct BJNP_command *) &bjnp_buf, CMD_TCP_REQ, 0);
PDBG (pixma_dbg (LOG_DEBUG, "bjnp_send_read_req sending command\n")); PDBG (pixma_dbg (LOG_DEBUG, "bjnp_send_read_req sending command\n"));
PDBG(pixma_hexdump (LOG_DEBUG2, (char *) &bjnp_buf, PDBG (pixma_hexdump (LOG_DEBUG2, (char *) &bjnp_buf,
sizeof (struct BJNP_command))); sizeof (struct BJNP_command)));
if ((sent_bytes = if ((sent_bytes =
@ -929,7 +942,8 @@ bjnp_recv_header (int devno)
if (device[devno].scanner_data_left) if (device[devno].scanner_data_left)
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, "bjnp_send_request: ERROR scanner data left = 0x%lx = %ld\n", (LOG_CRIT,
"bjnp_send_request: ERROR scanner data left = 0x%lx = %ld\n",
(long) device[devno].scanner_data_left, (long) device[devno].scanner_data_left,
(long) device[devno].scanner_data_left)); (long) device[devno].scanner_data_left));
@ -992,12 +1006,12 @@ bjnp_recv_header (int devno)
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
} }
if (ntohs(resp_buf.seq_no) != (uint16_t) device[devno].serial) if (ntohs (resp_buf.seq_no) != (uint16_t) device[devno].serial)
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, (LOG_CRIT,
"bjnp_recv_header:ERROR, Received response has serial %d, expected %d\n", "bjnp_recv_header:ERROR, Received response has serial %d, expected %d\n",
(int) ntohs(resp_buf.seq_no), (int)device[devno].serial)); (int) ntohs (resp_buf.seq_no), (int) device[devno].serial));
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
} }
@ -1005,10 +1019,11 @@ bjnp_recv_header (int devno)
device[devno].scanner_data_left = ntohl (resp_buf.payload_len); device[devno].scanner_data_left = ntohl (resp_buf.payload_len);
PDBG(pixma_dbg (LOG_DEBUG2, "TCP response header(scanner data = %ld bytes):\n", PDBG (pixma_dbg
(LOG_DEBUG2, "TCP response header(scanner data = %ld bytes):\n",
(long) device[devno].scanner_data_left)); (long) device[devno].scanner_data_left));
PDBG(pixma_hexdump (LOG_DEBUG2, (char *) &resp_buf, PDBG (pixma_hexdump
sizeof (struct BJNP_command))); (LOG_DEBUG2, (char *) &resp_buf, sizeof (struct BJNP_command)));
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
} }
@ -1080,9 +1095,9 @@ bjnp_recv_data (int devno, SANE_Byte * buffer, size_t * len)
*len = 0; *len = 0;
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
} }
PDBG(pixma_dbg (LOG_DEBUG2, "Received TCP response payload (%ld bytes):\n", PDBG (pixma_dbg (LOG_DEBUG2, "Received TCP response payload (%ld bytes):\n",
(long) recv_bytes)); (long) recv_bytes));
PDBG(pixma_hexdump (LOG_DEBUG2, buffer, recv_bytes)); PDBG (pixma_hexdump (LOG_DEBUG2, buffer, recv_bytes));
device[devno].scanner_data_left = device[devno].scanner_data_left =
device[devno].scanner_data_left - recv_bytes; device[devno].scanner_data_left - recv_bytes;
@ -1092,7 +1107,8 @@ bjnp_recv_data (int devno, SANE_Byte * buffer, size_t * len)
} }
static BJNP_Status static BJNP_Status
bjnp_allocate_device (SANE_String_Const devname, SANE_Int * dn, char *res_hostname) bjnp_allocate_device (SANE_String_Const devname, SANE_Int * dn,
char *res_hostname)
{ {
char method[256]; char method[256];
char hostname[256]; char hostname[256];
@ -1102,7 +1118,7 @@ bjnp_allocate_device (SANE_String_Const devname, SANE_Int * dn, char *res_hostna
struct in_addr *addr_list; struct in_addr *addr_list;
int i; int i;
PDBG (pixma_dbg (LOG_DEBUG, "bjnp_allocate_device(%s)", devname )); PDBG (pixma_dbg (LOG_DEBUG, "bjnp_allocate_device(%s)", devname));
if (split_uri (devname, method, hostname, &port, args) != 0) if (split_uri (devname, method, hostname, &port, args) != 0)
{ {
@ -1112,7 +1128,8 @@ bjnp_allocate_device (SANE_String_Const devname, SANE_Int * dn, char *res_hostna
if (strlen (args) != 0) if (strlen (args) != 0)
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, "URI may not contain userid, password or aguments: %s\n", (LOG_CRIT,
"URI may not contain userid, password or aguments: %s\n",
devname)); devname));
return BJNP_STATUS_INVAL; return BJNP_STATUS_INVAL;
@ -1155,7 +1172,7 @@ bjnp_allocate_device (SANE_String_Const devname, SANE_Int * dn, char *res_hostna
/* return hostname if required */ /* return hostname if required */
if (res_hostname != NULL) if (res_hostname != NULL)
strcpy(res_hostname, hostname); strcpy (res_hostname, hostname);
/* /*
* No existing device structure found, fill new device structure * No existing device structure found, fill new device structure
@ -1164,7 +1181,9 @@ bjnp_allocate_device (SANE_String_Const devname, SANE_Int * dn, char *res_hostna
if (first_free_device == BJNP_NO_DEVICES) if (first_free_device == BJNP_NO_DEVICES)
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, "Too many devices, ran out of device structures, can not add %s\n", devname)); (LOG_CRIT,
"Too many devices, ran out of device structures, can not add %s\n",
devname));
return BJNP_STATUS_INVAL; return BJNP_STATUS_INVAL;
} }
*dn = first_free_device++; *dn = first_free_device++;
@ -1261,8 +1280,7 @@ sanei_bjnp_find_devices (const char **conf_devices,
for (i = 0; conf_devices[i] != NULL; i++) for (i = 0; conf_devices[i] != NULL; i++)
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_DEBUG, "Adding configured scanner: %s\n", (LOG_DEBUG, "Adding configured scanner: %s\n", conf_devices[i]));
conf_devices[i]));
/* Allocate device structure for scanner and read its model */ /* Allocate device structure for scanner and read its model */
switch (bjnp_allocate_device (conf_devices[i], &dev_no, hostname)) switch (bjnp_allocate_device (conf_devices[i], &dev_no, hostname))
@ -1280,7 +1298,7 @@ sanei_bjnp_find_devices (const char **conf_devices,
* inform caller of found scanner * inform caller of found scanner
*/ */
truncate_hostname(hostname, short_hostname); truncate_hostname (hostname, short_hostname);
attach_bjnp (conf_devices[i], makemodel, attach_bjnp (conf_devices[i], makemodel,
short_hostname, pixma_devices); short_hostname, pixma_devices);
} }
@ -1300,7 +1318,9 @@ sanei_bjnp_find_devices (const char **conf_devices,
break; break;
} }
} }
PDBG (pixma_dbg (LOG_DEBUG, "Added all configured scanners, now do auto detection...\n")); PDBG (pixma_dbg
(LOG_DEBUG,
"Added all configured scanners, now do auto detection...\n"));
/* /*
* Send UDP broadcast to discover scanners and return the list of scanners found * Send UDP broadcast to discover scanners and return the list of scanners found
@ -1323,15 +1343,17 @@ sanei_bjnp_find_devices (const char **conf_devices,
{ {
/* send broadcast packet to each suitable interface */ /* send broadcast packet to each suitable interface */
if ( (interface->ifa_addr == NULL) || (interface->ifa_broadaddr == NULL) || if ((interface->ifa_addr == NULL)
(interface->ifa_addr->sa_family != AF_INET) || || (interface->ifa_broadaddr == NULL)
(((struct sockaddr_in *) interface->ifa_addr)->sin_addr.s_addr == || (interface->ifa_addr->sa_family != AF_INET)
htonl (INADDR_LOOPBACK))) || (((struct sockaddr_in *) interface->ifa_addr)->sin_addr.
s_addr == htonl (INADDR_LOOPBACK)))
{ {
/* not an IPv4 address */ /* not an IPv4 address */
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_DEBUG, "%s is not a valid IPv4 interface, skipping...\n", (LOG_DEBUG,
"%s is not a valid IPv4 interface, skipping...\n",
interface->ifa_name)); interface->ifa_name));
} }
@ -1342,11 +1364,11 @@ sanei_bjnp_find_devices (const char **conf_devices,
interface->ifa_name)); interface->ifa_name));
if ((socket_fd[no_sockets] = if ((socket_fd[no_sockets] =
bjnp_send_broadcast (((struct sockaddr_in *) interface-> bjnp_send_broadcast (((struct sockaddr_in *)
ifa_addr)->sin_addr, interface->ifa_addr)->sin_addr,
BJNP_PORT_BROADCAST_BASE + attempt, BJNP_PORT_BROADCAST_BASE + attempt,
((struct sockaddr_in *) interface-> ((struct sockaddr_in *)
ifa_broadaddr)->sin_addr, interface->ifa_broadaddr)->sin_addr,
cmd, sizeof (cmd))) != -1) cmd, sizeof (cmd))) != -1)
{ {
if (socket_fd[no_sockets] > last_socketfd) if (socket_fd[no_sockets] > last_socketfd)
@ -1369,13 +1391,14 @@ sanei_bjnp_find_devices (const char **conf_devices,
/* we have no easy way to find interfaces with their broadcast addresses, use global broadcast */ /* we have no easy way to find interfaces with their broadcast addresses, use global broadcast */
no_sockets = 0; no_sockets = 0;
broadcast.s_addr = htonl(INADDR_BROADCAST); broadcast.s_addr = htonl (INADDR_BROADCAST);
local.s_addr = htonl(INADDR_ANY); local.s_addr = htonl (INADDR_ANY);
for (attempt = 0; attempt < MAX_SELECT_ATTEMPTS; attempt++) for (attempt = 0; attempt < MAX_SELECT_ATTEMPTS; attempt++)
{ {
if ((socket_fd[no_sockets] = if ((socket_fd[no_sockets] =
bjnp_send_broadcast (local, BJNP_PORT_BROADCAST_BASE + attempt, broadcast, cmd, sizeof (cmd))) != -1) bjnp_send_broadcast (local, BJNP_PORT_BROADCAST_BASE + attempt,
broadcast, cmd, sizeof (cmd))) != -1)
{ {
if (socket_fd[no_sockets] > last_socketfd) if (socket_fd[no_sockets] > last_socketfd)
{ {
@ -1407,11 +1430,10 @@ sanei_bjnp_find_devices (const char **conf_devices,
if (FD_ISSET (socket_fd[i], &active_fdset)) if (FD_ISSET (socket_fd[i], &active_fdset))
{ {
if ((numbytes = if ((numbytes =
recv (socket_fd[i], resp_buf, sizeof (resp_buf), recv (socket_fd[i], resp_buf, sizeof (resp_buf), 0)) == -1)
0)) == -1)
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, "bjnp_send_broadcasts: no data received")); (LOG_INFO, "bjnp_send_broadcasts: no data received"));
break; break;
} }
else else
@ -1444,7 +1466,8 @@ sanei_bjnp_find_devices (const char **conf_devices,
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_CRIT, (LOG_CRIT,
"Scanner not added: Cannot read scanner make & model: %s\n", uri)); "Scanner not added: Cannot read scanner make & model: %s\n",
uri));
} }
else else
{ {
@ -1452,7 +1475,7 @@ sanei_bjnp_find_devices (const char **conf_devices,
* inform caller of found scanner * inform caller of found scanner
*/ */
truncate_hostname(hostname, short_hostname); truncate_hostname (hostname, short_hostname);
attach_bjnp (uri, makemodel, short_hostname, attach_bjnp (uri, makemodel, short_hostname,
pixma_devices); pixma_devices);
} }
@ -1543,7 +1566,7 @@ sanei_bjnp_close (SANE_Int dn)
{ {
PDBG (pixma_dbg (LOG_INFO, "sanei_bjnp_close(%d):\n", dn)); PDBG (pixma_dbg (LOG_INFO, "sanei_bjnp_close(%d):\n", dn));
if (device[dn].active) if (device[dn].active)
sanei_bjnp_deactivate(dn); sanei_bjnp_deactivate (dn);
device[dn].open = 0; device[dn].open = 0;
} }
@ -1553,7 +1576,8 @@ sanei_bjnp_close (SANE_Int dn)
* @param dn device number * @param dn device number
*/ */
SANE_Status sanei_bjnp_activate(SANE_Int dn) SANE_Status
sanei_bjnp_activate (SANE_Int dn)
{ {
char hostname[256]; char hostname[256];
char pid_str[64]; char pid_str[64];
@ -1563,7 +1587,7 @@ SANE_Status sanei_bjnp_activate(SANE_Int dn)
hostname[255] = '\0'; hostname[255] = '\0';
sprintf (pid_str, "Process ID = %d", getpid ()); sprintf (pid_str, "Process ID = %d", getpid ());
bjnp_send_job_details (dn, hostname, getusername(), pid_str); bjnp_send_job_details (dn, hostname, getusername (), pid_str);
if (bjnp_open_tcp (dn) != 0) if (bjnp_open_tcp (dn) != 0)
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
@ -1576,11 +1600,12 @@ SANE_Status sanei_bjnp_activate(SANE_Int dn)
* @paran dn device number * @paran dn device number
*/ */
SANE_Status sanei_bjnp_deactivate(SANE_Int dn) SANE_Status
sanei_bjnp_deactivate (SANE_Int dn)
{ {
PDBG (pixma_dbg (LOG_INFO, "sanei_bjnp_deactivate (%d)\n", dn)); PDBG (pixma_dbg (LOG_INFO, "sanei_bjnp_deactivate (%d)\n", dn));
bjnp_finish_job (dn); bjnp_finish_job (dn);
close(device[dn].fd); close (device[dn].fd);
device[dn].fd = -1; device[dn].fd = -1;
#ifdef PIXMA_BJNP_STATUS #ifdef PIXMA_BJNP_STATUS
device[dn].polling = 0; device[dn].polling = 0;
@ -1599,8 +1624,8 @@ sanei_bjnp_set_timeout (SANE_Int devno, SANE_Int timeout)
/* timeout must be at least 10 second */ /* timeout must be at least 10 second */
if (my_timeout < 10000) if (my_timeout < 20000)
my_timeout = 10000; my_timeout = 20000;
PDBG (pixma_dbg (LOG_INFO, "bjnp_set_timeout(requested %d, set %d):\n", PDBG (pixma_dbg (LOG_INFO, "bjnp_set_timeout(requested %d, set %d):\n",
timeout, my_timeout)); timeout, my_timeout));
@ -1647,7 +1672,8 @@ sanei_bjnp_read_bulk (SANE_Int dn, SANE_Byte * buffer, size_t * size)
/* so scanner needs first a high level read command. This is not an error */ /* so scanner needs first a high level read command. This is not an error */
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_DEBUG, "Scanner has no more data available, return immediately!\n")); (LOG_DEBUG,
"Scanner has no more data available, return immediately!\n"));
*size = 0; *size = 0;
return SANE_STATUS_EOF; return SANE_STATUS_EOF;
} }
@ -1658,8 +1684,7 @@ sanei_bjnp_read_bulk (SANE_Int dn, SANE_Byte * buffer, size_t * size)
(long) device[dn].scanner_data_left, (long) device[dn].scanner_data_left,
(long) device[dn].scanner_data_left, (long) device[dn].scanner_data_left,
(int) device[dn].short_read, (int) device[dn].short_read,
(long) device[dn].blocksize, (long) device[dn].blocksize, (long) device[dn].blocksize));
(long) device[dn].blocksize));
while ((recvd < *size) while ((recvd < *size)
&& (!device[dn].short_read || device[dn].scanner_data_left)) && (!device[dn].short_read || device[dn].scanner_data_left))
@ -1677,7 +1702,8 @@ sanei_bjnp_read_bulk (SANE_Int dn, SANE_Byte * buffer, size_t * size)
*/ */
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_DEBUG, "No (more) scanner data available, requesting more\n")); (LOG_DEBUG,
"No (more) scanner data available, requesting more\n"));
if ((error = bjnp_send_read_request (dn)) != SANE_STATUS_GOOD) if ((error = bjnp_send_read_request (dn)) != SANE_STATUS_GOOD)
{ {
@ -1707,10 +1733,11 @@ sanei_bjnp_read_bulk (SANE_Int dn, SANE_Byte * buffer, size_t * size)
more = left; more = left;
PDBG (pixma_dbg (LOG_DEBUG, "reading 0x%lx = %ld (of max 0x%lx = %ld) bytes more\n", PDBG (pixma_dbg
device[dn].scanner_data_left, (LOG_DEBUG,
device[dn].scanner_data_left, "reading 0x%lx = %ld (of max 0x%lx = %ld) bytes more\n",
(long) more, (long) more )); device[dn].scanner_data_left, device[dn].scanner_data_left,
(long) more, (long) more));
result = bjnp_recv_data (dn, buffer, &more); result = bjnp_recv_data (dn, buffer, &more);
if (result != SANE_STATUS_GOOD) if (result != SANE_STATUS_GOOD)
{ {
@ -1750,13 +1777,14 @@ sanei_bjnp_write_bulk (SANE_Int dn, const SANE_Byte * buffer, size_t * size)
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_INFO, "bjnp_write_bulk(%d, bufferptr, 0x%lx = %ld)\n", dn, (LOG_INFO, "bjnp_write_bulk(%d, bufferptr, 0x%lx = %ld)\n", dn,
(long) *size, (long)*size)); (long) *size, (long) *size));
sent = bjnp_write (dn, buffer, *size); sent = bjnp_write (dn, buffer, *size);
if (sent < 0) if (sent < 0)
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
if (sent != (int) *size) if (sent != (int) *size)
{ {
PDBG(pixma_dbg (LOG_CRIT, "Sent only %ld bytes to scanner, expected %ld!!\n", PDBG (pixma_dbg
(LOG_CRIT, "Sent only %ld bytes to scanner, expected %ld!!\n",
(long) sent, (long) *size)); (long) sent, (long) *size));
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
} }
@ -1769,7 +1797,7 @@ sanei_bjnp_write_bulk (SANE_Int dn, const SANE_Byte * buffer, size_t * size)
if (device[dn].scanner_data_left != 4) if (device[dn].scanner_data_left != 4)
{ {
PDBG(pixma_dbg (LOG_CRIT, PDBG (pixma_dbg (LOG_CRIT,
"Scanner length of write confirmation = 0x%lx bytes = %ld, expected %d!!\n", "Scanner length of write confirmation = 0x%lx bytes = %ld, expected %d!!\n",
(long) device[dn].scanner_data_left, (long) device[dn].scanner_data_left,
(long) device[dn].scanner_data_left, 4)); (long) device[dn].scanner_data_left, 4));
@ -1779,14 +1807,15 @@ sanei_bjnp_write_bulk (SANE_Int dn, const SANE_Byte * buffer, size_t * size)
if ((bjnp_recv_data (dn, (unsigned char *) &buf, &recvd) != if ((bjnp_recv_data (dn, (unsigned char *) &buf, &recvd) !=
SANE_STATUS_GOOD) || (recvd != 4)) SANE_STATUS_GOOD) || (recvd != 4))
{ {
PDBG(pixma_dbg (LOG_CRIT, PDBG (pixma_dbg (LOG_CRIT,
"Could not read length of data confirmed by device\n")); "Could not read length of data confirmed by device\n"));
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
} }
recvd = ntohl (buf); recvd = ntohl (buf);
if (recvd != *size) if (recvd != *size)
{ {
PDBG(pixma_dbg (LOG_CRIT, "Scanner confirmed %ld bytes, expected %ld!!\n", PDBG (pixma_dbg
(LOG_CRIT, "Scanner confirmed %ld bytes, expected %ld!!\n",
(long) recvd, (long) *size)); (long) recvd, (long) *size));
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
} }
@ -1821,8 +1850,7 @@ sanei_bjnp_read_int (SANE_Int dn, SANE_Byte * buffer, size_t * size)
#ifndef PIXMA_BJNP_STATUS #ifndef PIXMA_BJNP_STATUS
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_INFO, "bjnp_read_int(%d, bufferptr, 0x%lx = %ld):\n", dn, (LOG_INFO, "bjnp_read_int(%d, bufferptr, 0x%lx = %ld):\n", dn,
(long) *size, (long) *size, (long) *size));
(long) *size));
memset (buffer, 0, *size); memset (buffer, 0, *size);
sleep (1); sleep (1);
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
@ -1846,16 +1874,16 @@ sanei_bjnp_read_int (SANE_Int dn, SANE_Byte * buffer, size_t * size)
device[dn].dialogue++; device[dn].dialogue++;
if ((bjnp_get_intr (dn, 0, hostname, getusername (), buffer, if ((bjnp_get_intr (dn, 0, hostname, getusername (), buffer,
*size) != (ssize_t)*size) *size) != (ssize_t) * size)
|| sleep(4) || sleep (4)
|| (bjnp_get_intr (dn, 1, hostname, getusername (), buffer, || (bjnp_get_intr (dn, 1, hostname, getusername (), buffer,
*size) != (ssize_t)*size)) *size) != (ssize_t) * size))
{ {
PDBG (pixma_dbg PDBG (pixma_dbg
(LOG_NOTICE, (LOG_NOTICE,
"Failed to setup read_intr dialogue with device!\n")); "Failed to setup read_intr dialogue with device!\n"));
} }
device[dn].polling =1; device[dn].polling = 1;
} }
result = bjnp_get_intr (dn, 2, hostname, getusername (), buffer, *size); result = bjnp_get_intr (dn, 2, hostname, getusername (), buffer, *size);
@ -1879,11 +1907,9 @@ sanei_bjnp_read_int (SANE_Int dn, SANE_Byte * buffer, size_t * size)
/* no interrupt received, we just sleep for the indicated mount of time /* no interrupt received, we just sleep for the indicated mount of time
* and leave it to the caller to retry */ * and leave it to the caller to retry */
sleep(4); sleep (4);
PDBG (pixma_dbg PDBG (pixma_dbg (LOG_NOTICE, "sanei_bjnp_read_int: no data received\n"));
(LOG_NOTICE,
"sanei_bjnp_read_int: no data received\n"));
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
#endif #endif