diff options
-rw-r--r-- | lib/libutil/Makefile | 19 | ||||
-rw-r--r-- | lib/libutil/scsi.3 | 357 | ||||
-rw-r--r-- | lib/libutil/shlib_version | 4 | ||||
-rw-r--r-- | sbin/scsi/Makefile | 5 | ||||
-rw-r--r-- | sbin/scsi/libscsi.c (renamed from lib/libutil/scsi.c) | 8 | ||||
-rw-r--r-- | sbin/scsi/libscsi.h (renamed from lib/libutil/scsi.h) | 14 | ||||
-rw-r--r-- | sbin/scsi/scsi.c | 5 |
7 files changed, 22 insertions, 390 deletions
diff --git a/lib/libutil/Makefile b/lib/libutil/Makefile index c64984c8b28..6bbb8167f67 100644 --- a/lib/libutil/Makefile +++ b/lib/libutil/Makefile @@ -1,17 +1,17 @@ -# $OpenBSD: Makefile,v 1.26 2003/05/15 01:26:26 ian Exp $ +# $OpenBSD: Makefile,v 1.27 2003/07/23 23:10:25 deraadt Exp $ # $NetBSD: Makefile,v 1.8 1996/05/16 07:03:28 thorpej Exp $ LIB= util CFLAGS+=-DLIBC_SCCS -HDRS= util.h scsi.h +HDRS= util.h SRCS= check_expire.c getmaxpartitions.c getrawpartition.c login.c \ login_tty.c logout.c logwtmp.c opendev.c passwd.c pty.c readlabel.c \ - scsi.c login_fbtab.c uucplock.c fparseln.c opendisk.c pidfile.c \ + login_fbtab.c uucplock.c fparseln.c opendisk.c pidfile.c \ fmt_scaled.c MAN= check_expire.3 getmaxpartitions.3 getrawpartition.3 login.3 opendev.3 \ - openpty.3 pw_init.3 pw_lock.3 readlabelfs.3 scsi.3 pw_getconf.3 \ + openpty.3 pw_init.3 pw_lock.3 readlabelfs.3 pw_getconf.3 \ uucplock.3 fparseln.3 opendisk.3 login_fbtab.3 pidfile.3 \ fmt_scaled.3 @@ -29,17 +29,6 @@ MLINKS+=pw_init.3 pw_scan.3 MLINKS+=pw_init.3 pw_error.3 MLINKS+=pw_lock.3 pw_mkdb.3 MLINKS+=pw_lock.3 pw_abort.3 -MLINKS+=scsi.3 scsireq_buff_decode.3 -MLINKS+=scsi.3 scsireq_build.3 -MLINKS+=scsi.3 scsireq_decode.3 -MLINKS+=scsi.3 scsireq_encode.3 -MLINKS+=scsi.3 scsireq_enter.3 -MLINKS+=scsi.3 scsireq_new.3 -MLINKS+=scsi.3 scsireq_reset.3 -MLINKS+=scsi.3 SCSIREQ_ERROR.3 -MLINKS+=scsi.3 scsi_open.3 -MLINKS+=scsi.3 scsi_debug.3 -MLINKS+=scsi.3 scsi_debug_output.3 MLINKS+=uucplock.3 uu_lock.3 MLINKS+=uucplock.3 uu_unlock.3 MLINKS+=uucplock.3 uu_lockerr.3 diff --git a/lib/libutil/scsi.3 b/lib/libutil/scsi.3 deleted file mode 100644 index 1624564f9a8..00000000000 --- a/lib/libutil/scsi.3 +++ /dev/null @@ -1,357 +0,0 @@ -.\" $OpenBSD: scsi.3,v 1.11 2003/07/15 10:20:51 jmc Exp $ -.\" Copyright (c) 1994 HD Associates (hd@world.std.com) -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by HD Associates -.\" 4. Neither the name of the HD Associates nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" -.Dd November 20, 1994 -.Dt SCSI 3 -.Os -.Sh NAME -.Nm scsireq_buff_decode , -.Nm scsireq_build , -.Nm scsireq_decode , -.Nm scsireq_encode , -.Nm scsireq_enter , -.Nm scsireq_new , -.Nm scsireq_reset , -.Nm SCSIREQ_ERROR , -.Nm scsi_open , -.Nm scsi_debug , -.Nm scsi_debug_output -.Nd SCSI User library -.Sh SYNOPSIS -.Fd #include <sys/types.h> -.Fd #include <sys/scsiio.h> -.Fd #include <scsi.h> -.Ft int -.Fn "scsireq_buff_decode" "u_char *ptr" "size_t len" "char *fmt" "..." -.Ft "struct scsireq *" -.Fn "scsireq_build" "struct scsireq *" "u_long len" "caddr_t buf" "u_long flags" "char *fmt" "..." -.Ft "int" -.Fn "scsireq_decode" "struct scsireq *" "char *fmt" "..." -.Ft int -.Fn "scsireq_encode" "struct scsireq *" "char *fmt" "..." -.Ft int -.Fn "scsireq_enter" "int fid" "struct scsireq *s" -.Ft "struct scsireq *" -.Fn "scsireq_new" "void" -.Ft struct scsireq * -.Fn "scsireq_reset" "struct scsireq *" -.Ft int -.Fn "SCSIREQ_ERROR" "struct scsireq *" -.Ft int -.Fn "scsi_open" "const char *path" "int flags" -.Ft void -.Fn "scsi_debug" "FILE *f" "int ret" "struct scsireq *s" -.Ft "FILE *" -.Fn "scsi_debug_output" "char *s" -.Sh DESCRIPTION -These functions -use the SCIOCCOMMAND -.Xr ioctl 2 -of the SCSI subsystem -to provide user level access to SCSI commands. -The programmer must know the SCSI CDB (Command Descriptor -Block) to perform the desired command. -These functions assist in -building up the CDB, submitting it to the SCSI subsystem, and decoding -the result. -.Pp -Look at the -.Xr scsi 8 -command before using the library directly - simple programs are -best implemented as scripts using that facility. -.Pp -To provide for security, -not all devices accept the SCIOCCOMAND ioctl. -It is accepted by the -control device for tape drives, partition D for disk drives, partition C -for CD ROM drives, and any "unknown" device. -.\" The "super scsi" -.\" .Xr ssc 4 -.\" device also accepts the ioctl. -.Pp -Most of the SCSI library functions build up and manipulate the -.Ar scsireq -structure found in the include file -.Aq Pa sys/scsiio.h : -.Bd -literal -offset indent -#define SENSEBUFLEN 48 -.Pp -typedef struct scsireq { - u_long flags; /* info about the request status and type */ - u_long timeout; - u_char cmd[16]; /* 12 is actually the max */ - u_char cmdlen; - caddr_t databuf; /* address in user space of buffer */ - u_long datalen; /* size of user buffer (request) */ - u_long datalen_used; /* size of user buffer (used)*/ - u_char sense[SENSEBUFLEN]; /* returned sense will be in here */ - u_char senselen; /* sensedata request size (MAX of SENSEBUFLEN)*/ - u_char senselen_used; /* return value only */ - u_char status; /* what the scsi status was from the adapter */ - u_char retsts; /* the return status for the command */ - int error; /* error bits */ -} scsireq_t; -.Ed -.Pp -.Fn scsireq_new -allocates a new -.Ar scsireq -structure and returns a pointer to it or NULL if it can't allocate -memory. -.Pp -.Fn scsireq_reset -resets the structure to reasonable values and returns the same pointer passed -in to it. -It gracefully handles the NULL pointer passed in to it so that you can -unconditionally use -.Ar scsireq_new . -.Pp -.Fn scsireq_build -builds up a scsireq structure based on the information provided in -the variable argument list. -It gracefully handles a NULL pointer passed to it. -.Pp -.Fa len -is the length of the data phase; the data transfer direction is -determined by the -.Ar flags -argument. -.Pp -.Fa buf -is the data buffer used during the SCSI data phase. -If it is NULL it is allocated via malloc and -.Ar scsireq->databuf -is set to point to the newly allocated memory. -.Pp -.Fa flags -are the flags defined in -.Aq Pa sys/scsiio.h : -.Bd -literal -offset indent -/* bit definitions for flags */ -#define SCCMD_READ 0x00000001 -#define SCCMD_WRITE 0x00000002 -#define SCCMD_IOV 0x00000004 -#define SCCMD_ESCAPE 0x00000010 -#define SCCMD_TARGET 0x00000020 -.Ed -.Pp -Only two of these flags are supported in this release of the software: -.Fa SCCMD_READ -indicates a data in phase (a transfer into the user buffer at -.Ar scsireg->databuf ) , -and -.Fa SCCMD_WRITE -indicates a data out phase (a transfer out of the user buffer). -.Pp -.Fa fmt -is a CDB format specifier used to build up the SCSI CDB. -This text string is made up of a list of field specifiers. -Field specifiers specify the value for each CDB field (including indicating -that the value be taken from the next argument in the -variable argument list), the width -of the field in bits or bytes, and an optional name. -Whitespace is ignored, and the pound sign ('#') introduces a comment that -ends at the end of the current line. -.Pp -The optional name is the first part of a field specifier and -is in curly braces. -The text in curly braces in this example are the names: -.Bd -literal -offset indent -.Em "{PS} v:b1 {Reserved} 0:b1 {Page Code} v:b6 # Mode select page" -.Ed -.Pp -This field specifier has two one bit fields and one six bit field. -The second one bit field is the constant value 0 and the first -one bit field and the six bit field are taken from the variable -argument list. -Multi byte fields are swapped into the SCSI byte order in the -CDB and whitespace is ignored. -.Pp -When the field is a hex value or the letter v, (e.g., -.Fa "1A" -or -.Fa "v" ) -then a single byte value -is copied to the next unused byte of the CDB. -When the letter -.Fa v -is used the next integer argument is taken from the variable argument list -and that value used. -.Pp -A constant hex value followed by a field width specifier or the letter -.Fa v -followed by a field width specifier (e.g., -.Fa 3:4 , -.Fa 3:b4 , -.Fa 3:i3 , -.Fa v:i3 ) -specifies a field of a given bit or byte width. -Either the constant value or (for the V specifier) the next integer value from -the variable argument list is copied to the next unused -bits or bytes of the CDB. -.Pp -A decimal number or the letter -.Fa b -followed by a decimal number field width indicates a bit field of that width. -The bit fields are packed as tightly as possible beginning with the -high bit (so that it reads the same as the SCSI spec), and a new byte of -the CDB is started whenever a byte fills completely or when an -.Fa i -field is encountered. -.Pp -A field width specifier consisting of the letter -.Fa i -followed by either -1, 2, 3 or 4 indicates a 1, 2, 3 or 4 byte integral value that must -be swapped into SCSI byte order (MSB first). -.Pp -For the -.Fa v -field specifier the next integer argument is taken from the variable argument -list and that value is used swapped into SCSI byte order. -.Pp -.Fn scsireq_decode -is used to decode information from the data in phase of the SCSI -transfer. -.Pp -The decoding is similar to -the command specifier processing of -.Fn scsireq_build -except that the data is extracted from the data pointed to by -.Fa scsireq->databuf . -The stdarg list should be pointers to integers instead of integer -values. -A seek field type and a suppression modifier are added. -The -.Fa * -suppression modifier (e.g., -.Fa *i3 -or -.Fa *b4 ) -suppresses assignment from the field and can be used to skip -over bytes or bits in the data, without having to copy -them to a dummy variable in the arg list. -.Pp -The seek field type -.Fa s -permits you to skip over data. -This seeks to an absolute position -.Pq Fa s3 -or a relative position -.Pq Fa s+3 -in the data, based on whether or not the '+' sign is present. -The seek value can be specified as -.Fa v -and the next integer value from the argument list will be -used as the seek value. -.Pp -.Fn scsireq_buff_decode -decodes an arbitrary data buffer using the method -described above in -.Fn scsireq_decode . -.Pp -.Fn scsireq_encode -encodes the data phase section of the structure. -The encoding is handled identically as the encoding of the CDB structure by -.Fn scsireq_build . -.Pp -.Fn scsireq_enter -submits the built up structure for processing using -the SCIOCCOMMAND ioctl. -.Pp -.Fn SCSIREQ_ERROR -is a macro that determines if the result of the SCIOCCOMMAND ioctl may -have been -in error by examining the host adapter return code, whether sense was sent -or not, and so on. -.Pp -.Fn scsi_open -checks environment variables and initializes the library for -consistent library use and then calls the regular open system call. -.Pp -.Fn scsi_debug -prints the results of a scsireq_enter function to the specified stdio -stream. -.Pp -.Fn scsi_debug_output -requests that the results of all transactions be debugged to the -supplied file using -.Fn scsi_debug . -.Sh RETURN VALUES -The function -.Fn scsireq_new -returns a pointer to storage allocated from malloc, and therefore -potentially a NULL. -.Pp -The functions -.Fn scsireq_build -and -.Fn scsireq_reset -return the same pointer as the one passed in. -.Pp -The functions -.Fn scsireq_buff_decode and -.Fn scsireq_decode -return the number of assignments performed. -.Pp -.Fn scsireq_encode -returns the number of fields processed. -.Pp -The function -.Fn scsireq_enter -returns the result of the ioctl call. -.Sh SEE ALSO -.Xr scsi 4 , -.Xr scsi 8 -.Sh HISTORY -Many systems have comparable interfaces to permit a user to construct a -SCSI command in user space. -.Pp -The data structure is almost identical to the SGI /dev/scsi data -structure. -If anyone knows the name of the authors it should -go here; Peter Dufault first read about it in a 1989 Sun Expert magazine. -.Pp -Peter Dufault implemented a clone of SGI's interface in 386bsd that -led to this library and the related kernel ioctl. -If anyone needs that for compatibility contact dufault@hda.com. -.Sh BUGS -This only works completely for the 1542C. -The host adapter code -that sets up the residual amount of data transfer has to be added -to each individual adapter. -This library is usable on the other -host adapters; however, the SCSI driver pretends that the proper -amount of data is always transferred. -If you have an Adaptec 174x -and can hack contact dufault@hda.com and you can have the code to -calculate residual data for the 174x series to integrate and test. diff --git a/lib/libutil/shlib_version b/lib/libutil/shlib_version index 00604e64e7d..1c5d96eb2aa 100644 --- a/lib/libutil/shlib_version +++ b/lib/libutil/shlib_version @@ -1,2 +1,2 @@ -major=8 -minor=1 +major=9 +minor=0 diff --git a/sbin/scsi/Makefile b/sbin/scsi/Makefile index d5a127ad585..67d0dbae1e2 100644 --- a/sbin/scsi/Makefile +++ b/sbin/scsi/Makefile @@ -1,8 +1,7 @@ -# $OpenBSD: Makefile,v 1.3 2002/02/24 00:00:36 hugh Exp $ +# $OpenBSD: Makefile,v 1.4 2003/07/23 23:10:22 deraadt Exp $ PROG= scsi +SRCS= scsi.c libscsi.c MAN= scsi.8 -LDADD= -lutil -DPADD= ${LIBUTIL} .include <bsd.prog.mk> diff --git a/lib/libutil/scsi.c b/sbin/scsi/libscsi.c index b759c0065de..34a5fdb9090 100644 --- a/lib/libutil/scsi.c +++ b/sbin/scsi/libscsi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scsi.c,v 1.5 2002/08/23 23:47:32 deraadt Exp $ */ +/* $OpenBSD: libscsi.c,v 1.1 2003/07/23 23:10:23 deraadt Exp $ */ /* Copyright (c) 1994 HD Associates * (contact: dufault@hda.com) @@ -1070,7 +1070,8 @@ static void sense_7x_dump(FILE *f, scsireq_t *scsireq) /* scsi_sense_dump: Dump the sense portion of the scsireq structure. */ -void scsi_sense_dump(FILE *f, scsireq_t *scsireq) +static void +scsi_sense_dump(FILE *f, scsireq_t *scsireq) { u_char *s = (u_char *)scsireq->sense; int code = (*s) & 0x7f; @@ -1099,7 +1100,8 @@ void scsi_sense_dump(FILE *f, scsireq_t *scsireq) scsi_dump(f, "sense", s, scsireq->senselen, scsireq->senselen_used, 0); } -void scsi_retsts_dump(FILE *f, scsireq_t *scsireq) +static void +scsi_retsts_dump(FILE *f, scsireq_t *scsireq) { if (scsireq->retsts == 0) return; diff --git a/lib/libutil/scsi.h b/sbin/scsi/libscsi.h index 3551ce54eee..5aa3d5d25a4 100644 --- a/lib/libutil/scsi.h +++ b/sbin/scsi/libscsi.h @@ -1,4 +1,4 @@ -/* $OpenBSD: scsi.h,v 1.3 2002/02/17 19:42:26 millert Exp $ */ +/* $OpenBSD: libscsi.h,v 1.1 2003/07/23 23:10:23 deraadt Exp $ */ /* Copyright (c) 1994 HD Associates (hd@world.std.com) * All rights reserved. @@ -42,13 +42,11 @@ #include <sys/scsiio.h> #include <stdio.h> -#define SCSIREQ_ERROR(SR) (\ -0 \ -|| SR->senselen_used /* Sent sense */ \ -|| SR->status /* Host adapter status */ \ -|| SR->retsts /* SCSI transfer status */ \ -|| SR->error /* copy of errno */ \ -) +#define SCSIREQ_ERROR(SR) \ + (SR->senselen_used || /* Sent sense */ \ + SR->status || /* Host adapter status */ \ + SR->retsts || /* SCSI transfer status */ \ + SR->error) /* copy of errno */ scsireq_t *scsireq_reset(scsireq_t *); scsireq_t *scsireq_new(void); diff --git a/sbin/scsi/scsi.c b/sbin/scsi/scsi.c index 6e2e2ca3c67..b215fe48d2f 100644 --- a/sbin/scsi/scsi.c +++ b/sbin/scsi/scsi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scsi.c,v 1.13 2003/07/06 22:03:58 deraadt Exp $ */ +/* $OpenBSD: scsi.c,v 1.14 2003/07/23 23:10:23 deraadt Exp $ */ /* $FreeBSD: scsi.c,v 1.11 1996/04/06 11:00:28 joerg Exp $ */ /* @@ -50,11 +50,12 @@ #include <errno.h> #include <sys/scsiio.h> #include <sys/file.h> -#include <scsi.h> #include <ctype.h> #include <signal.h> #include <err.h> +#include "libscsi.h" + int fd; int debuglevel; int debugflag; |