Gord> If you want to give me access to your OpenStep box, which you
Gord> offered, then I would be more than happy to help port SANE to
Gord> OpenStep. If you're interested, I like accounts named
Gord> `gord'. ;)
I already offered the same to Neville, but wouldn't mind if you'd take
over. Here are the patches I have come up with based on the OpenStep
version of pnmscan. They probably won't compile, but should be really
close to what's needed.
Happy hacking,
--david
-- diff -urN sane-0.6/configure.in sane-0.61/configure.in --- sane-0.6/configure.in Fri Jun 13 18:28:34 1997 +++ sane-0.61/configure.in Sun Jun 15 10:08:42 1997 @@ -31,7 +31,8 @@ dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(fcntl.h unistd.h libintl.h sys/scanio.h \ - scsi.h sys/scsi.h sys/scsiio.h scsi/sg.h /usr/src/linux/include/scsi/sg.h) + scsi.h sys/scsi.h sys/scsiio.h bsd/dev/scsireg.h \ + scsi/sg.h /usr/src/linux/include/scsi/sg.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST diff -urN sane-0.6/include/sane/config.h.in sane-0.61/include/sane/config.h.in --- sane-0.6/include/sane/config.h.in Fri Jun 13 18:51:05 1997 +++ sane-0.61/include/sane/config.h.in Sun Jun 15 10:09:39 1997 @@ -199,6 +199,9 @@ /* Define if you have the <sys/scanio.h> header file. */ #undef HAVE_SYS_SCANIO_H +/* Define if you have the <bsd/dev/scsireg.h> header file. */ +#undef HAVE_BSD_DEV_SCSIREG_H + /* Define if you have the <unistd.h> header file. */ #undef HAVE_UNISTD_H diff -urN sane-0.6/sanei/sanei_scsi.c sane-0.61/sanei/sanei_scsi.c --- sane-0.6/sanei/sanei_scsi.c Sat Jun 14 14:33:48 1997 +++ sane-0.61/sanei/sanei_scsi.c Sun Jun 15 10:19:11 1997 @@ -44,6 +44,7 @@ #include <lalloca.h> /* MUST come first for AIX! */ +#include <assert.h> #include <errno.h> #include <fcntl.h> #include <stdlib.h> @@ -67,6 +68,9 @@ # ifdef HAVE_SCSI_H # include <scsi.h> # define scsireq_t struct scsireq_t +# ifdef HAVE_BSD_DEV_SCSIREG_H +# include <bsd/dev/scsireg.h> +# endif # endif # endif # endif @@ -90,6 +94,8 @@ static int num_handlers_alloced = 0; static SANEI_SCSI_Sense_Handler *sense_handler = 0; +static u_char cdb_size[8] = {6, 10, 10, 12, 12, 12, 10, 10}; +#define CDB_SIZE(opcode) (((opcode) >> 5) & 7) SANE_Status sanei_scsi_open (const char * dev, int * fdp, SANEI_SCSI_Sense_Handler handler) @@ -222,32 +228,30 @@ sanei_scsi_cmd (int fd, const void * src, size_t src_size, void * dst, size_t * dst_size) { + size_t cdb_size; scsireq_t hdr; - size_t cmd_len; - cmd_len = ((u_char *) src)[0] == 0x55 ? 10 : 6; + cdb_size = CDB_SIZE (*(u_char *) src); memset (&hdr, 0, sizeof (hdr)); - memcpy (hdr.cmd, src, cmd_len); - src_size -= cmd_len; - src = (char *) src + cmd_len; - if (*dst_size) { + assert (cdb_size == src_size); hdr.flags = SCCMD_READ; hdr.databuf = dst; } else { + assert (cdb_size <= src_size); hdr.flags = SCCMD_WRITE; - hdr.databuf = src; + hdr.databuf = (char *) src + cdb_size; } + memcpy (hdr.cmd, src, cdb_size); hdr.timeout = 60000; /* 1 minute timeout */ if (scsireq_enter (fd, &hdr) < 0) { - DBG(1, "sanei_scsi_cmd: scsi_reqenter() failed: %s\n", - strerror (errno)); + DBG(1, "sanei_scsi_cmd: scsi_reqenter() failed: %s\n", strerror (errno)); return SANE_STATUS_IO_ERROR; } @@ -301,6 +305,53 @@ return SANE_STATUS_UNSUPPORTED; } +# ifdef /* HAVE_BSD_DEV_SCSIREG_H */ + +/* This is for NeXtStep/OpenStep and possibility other Mach 2.5 based + systems. */ + +SANE_Status +sanei_scsi_cmd (int fd, const void * src, size_t src_size, + void * dst, size_t * dst_size) +{ + struct scsi_req hdr; + size_t cdb_size; + + cdb_size = CDB_SIZE (*(u_char *) src); + + memset (&hdr, 0, sizeof (sr)); + if (*dst_size) + { + assert (cdb_size == src_size); + hdr.sr_dma_dir = SR_DMA_RD; + hdr.sr_addr = dst; + hdr.sr_dma_max = dst_size; + } + else + { + assert (cdb_size <= src_size); + hdr.sr_dma_dir = SR_DMA_WR; + hdr.sr_addr = (char *) src + cdb_size; + hdr.sr_dma_max = src_size - cdb_size; + } + memcpy (&hdr.sr_cdb, src, cdb_size); + hdr.sr_ioto = 60; /* I/O timeout in seconds */ + + if (ioctl (fd, SGIOCREQ, &hdr) == -1) + { + DBG(1, "sanei_scsi_cmd: ioctl(SGIOCREQ) failed: %s\n", strerror (errno)); + return SANE_STATUS_IO_ERROR; + } + if (hdr.sr_io_status) + DBG(1, "sanei_scsi_cmd: SGIOCREQ completed with sr_io_status=%d\n", + hdr.sr_io_status); + if ((hdr.sr_sense[0] & 0x80) + && (fd < num_handlers_alloced) && sense_handler[fd]) + return (*sense_handler[fd]) (fd, hdr.sense); + return SANE_STATUS_GOOD; +} + +# endif /* !HAVE_BSD_DEV_SCSIREG_H */ # endif /* !HAVE_SYS_SCSI_H */ # endif /* !HAVE_SYS_SCSIIO_H */ #endif /* !HAVE_SCSI_SG_H */
-- Source code, list archive, and docs: http://www.azstarnet.com/~axplinux/sane/ To unsubscribe: mail -s unsubscribe sane-devel-request@listserv.azstarnet.com