diff options
author | julian <julian@FreeBSD.org> | 1998-01-26 06:20:48 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 1998-01-26 06:20:48 +0000 |
commit | c9bbca52f223e86d74e01847ff139b261c26e43e (patch) | |
tree | a15145349b399442a61956dd816f62523215784d /usr.sbin/dpt/dpt_sig/dpt_sig.c | |
parent | 68abaddf758c534229cbcc68bbd3df497aa5074e (diff) | |
download | FreeBSD-src-c9bbca52f223e86d74e01847ff139b261c26e43e.zip FreeBSD-src-c9bbca52f223e86d74e01847ff139b261c26e43e.tar.gz |
Obtained from: Simon Shapiro
Userland utilities to control, and monitor a DPT RAID system.
Diffstat (limited to 'usr.sbin/dpt/dpt_sig/dpt_sig.c')
-rw-r--r-- | usr.sbin/dpt/dpt_sig/dpt_sig.c | 596 |
1 files changed, 596 insertions, 0 deletions
diff --git a/usr.sbin/dpt/dpt_sig/dpt_sig.c b/usr.sbin/dpt/dpt_sig/dpt_sig.c new file mode 100644 index 0000000..340b924 --- /dev/null +++ b/usr.sbin/dpt/dpt_sig/dpt_sig.c @@ -0,0 +1,596 @@ +/* + * Copyright (c) 1997 by Simon Shapiro + * 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, + * without modification, immediately at the beginning of the file. + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 THE AUTHOR 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. + * + */ + +/* dpt_sig.c: Dunp a DPT Signature */ + +#ident "$Id: dpt_sig.c,v 1.6 1998/01/22 22:06:30 ShimonR Exp ShimonR $" + +#include <fcntl.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <sys/time.h> +#include <sys/stat.h> +#include <sys/queue.h> +#include <sys/ioctl.h> +#include <scsi/scsi_all.h> +#include <scsi/scsi_message.h> +#include <scsi/scsiconf.h> + +#define DPT_MEASURE_PERFORMANCE + +#include <sys/dpt.h> + +/* A primitive subset of isgraph. Used by hex_dump below */ +#define IsGraph(val) ( (((val) >= ' ') && ((val) <= '~')) ) + +/* + * This function dumps bytes to the screen in hex format. + */ +void +hex_dump(u_int8_t * data, int length, char *name, int no) +{ + int line, column, ndx; + + (void)fprintf(stdout, "Kernel Hex Dump for %s-%d at %p (%d bytes)\n", + name, no, data, length); + + /* Zero out all the counters and repeat for as many bytes as we have */ + for (ndx = 0, column = 0, line = 0; ndx < length; ndx++) { + /* Print relative offset at the beginning of every line */ + if (column == 0) + (void)fprintf(stdout, "%04x ", ndx); + + /* Print the byte as two hex digits, followed by a space */ + (void)fprintf(stdout, "%02x ", data[ndx]); + + /* Split the row of 16 bytes in half */ + if (++column == 8) { + (void)fprintf(stdout, " "); + } + /* St the end of each row of 16 bytes, put a space ... */ + if (column == 16) { + (void)fprintf(stdout, " "); + + /* ... and then print the ASCII-visible on a line. */ + for (column = 0; column < 16; column++) { + int ascii_pos = ndx - 15 + column; + + /* + * Non-printable and non-ASCII are just a + * dot. ;-( + */ + if (IsGraph(data[ascii_pos])) + (void)fprintf(stdout, "%c", data[ascii_pos]); + else + (void)fprintf(stdout, "."); + } + + /* Each line ends with a new line */ + (void)fprintf(stdout, "\n"); + column = 0; + + /* + * Every 256 bytes (16 lines of 16 bytes each) have + * an empty line, separating them from the next + * ``page''. Yes, I programmed on a Z-80, where a + * page was 256 bytes :-) + */ + if (++line > 15) { + (void)fprintf(stdout, "\n"); + line = 0; + } + } + } + + /* + * We are basically done. We do want, however, to handle the ASCII + * translation of fractional lines. + */ + if ((ndx == length) && (column != 0)) { + int modulus = 16 - column, spaces = modulus * 3, skip; + + /* + * Skip to the right, as many spaces as there are bytes + * ``missing'' ... + */ + for (skip = 0; skip < spaces; skip++) + (void)fprintf(stdout, " "); + + /* ... And the gap separating the hex dump from the ASCII */ + (void)fprintf(stdout, " "); + + /* + * Do not forget the extra space that splits the hex dump + * vertically + */ + if (column < 8) + (void)fprintf(stdout, " "); + + for (column = 0; column < (16 - modulus); column++) { + int ascii_pos = ndx - (16 - modulus) + column; + + if (IsGraph(data[ascii_pos])) + (void)fprintf(stdout, "%c", data[ascii_pos]); + else + (void)fprintf(stdout, "."); + } + (void)fprintf(stdout, "\n"); + } +} + + +int +main(int argc, char **argv, char **argp) +{ + eata_pt_t pass_thru; + dpt_sig_t signature; + char *sp1; + char *sp2; + + int result; + int fd; + int ndx; + + /* If we do not do that, gcc complains about uninitialized usage (?) */ + sp1 = "Unknown"; + sp2 = "Unknown"; + + if ( (fd = open(argv[1], O_RDWR, S_IRUSR | S_IWUSR)) == -1 ) { + (void)fprintf(stderr, "%s ERROR: Failed to open \"%s\" - %s\n", + argv[0], argv[1], strerror(errno)); + exit(1); + } + + pass_thru.eataID[0] = 'E'; + pass_thru.eataID[1] = 'A'; + pass_thru.eataID[2] = 'T'; + pass_thru.eataID[3] = 'A'; + pass_thru.command = DPT_SIGNATURE; + pass_thru.command_buffer = (u_int8_t *)&signature; + + if ( (result = ioctl(fd, DPT_IOCTL_SEND, &pass_thru)) != 0 ) { + (void)fprintf(stderr, "%s ERROR: Failed to send IOCTL %x - %s\n", + argv[0], DPT_IOCTL_SEND, + strerror(errno)); + exit(1); + } + + /* dsSignature is not null terminated! */ + for (ndx = 0; ndx < sizeof(signature.dsSignature); ndx++) + (void)fputc(signature.dsSignature[ndx], stdout); + + (void)fprintf(stdout, ":%x:", signature.SigVersion); + + switch (signature.ProcessorFamily) { + case PROC_INTEL: + sp1 = "Intel"; + switch ( signature.Processor ) { + case PROC_8086: + sp2 = "8086"; + break; + case PROC_286: + sp2 = "80286"; + break; + case PROC_386: + sp2 = "386"; + break; + case PROC_486: + sp2 = "486"; + break; + case PROC_PENTIUM: + sp2 = "Pentium"; + break; + case PROC_P6: + sp2 = "PentiumPro"; + break; + default: + sp2 = "Unknown Processor"; + break; + } + break; + case PROC_MOTOROLA: + sp1 = "Motorola"; + switch ( signature.Processor ) { + case PROC_68000: + sp2 = "68000"; + break; + case PROC_68020: + sp2 = "68020"; + break; + case PROC_68030: + sp2 = "68030"; + break; + case PROC_68040: + sp2 = "68040"; + break; + default: + sp2 = "Unknown Processor"; + break; + } + break; + case PROC_MIPS4000: + sp1 = "MIPS/SGI"; + break; + case PROC_ALPHA: + sp1 = "DEC Alpha"; + break; + default: + sp1 = "Unknown Processor Family"; + break; + } + + (void)fprintf(stdout, "%s:%s:", sp1, sp2); + + switch ( signature.Filetype ) { + case FT_EXECUTABLE: + sp1 = "Executable"; + break; + case FT_SCRIPT: + sp1 = "Script"; + break; + case FT_HBADRVR: + sp1 = "HBA Driver"; + break; + case FT_OTHERDRVR: + sp1 = "Other Driver"; + break; + case FT_IFS: + sp1 = "Installable FileSystem"; + break; + case FT_ENGINE: + sp1 = "DPT Engine"; + break; + case FT_COMPDRVR: + sp1 = "Compressed Driver"; + break; + case FT_LANGUAGE: + sp1 = "Language File"; + break; + case FT_FIRMWARE: + sp1 = "DownLoadable Firmware"; + break; + case FT_COMMMODL: + sp1 = "Communications Module"; + break; + case FT_INT13: + sp1 = "INT13 Type HBA Driver"; + break; + case FT_HELPFILE: + sp1 = "Help File"; + break; + case FT_LOGGER: + sp1 = "Event Logger"; + break; + case FT_INSTALL: + sp1 = "Installation Procedure"; + break; + case FT_LIBRARY: + sp1 = "Storage Manager Real-Mode Call"; + break; + case FT_RESOURCE: + sp1 = "Storage Manager Resource File"; + break; + case FT_MODEM_DB: + sp1 = "Storage Manager Modem Database"; + break; + default: + sp1 = "Unknown File Type"; + break; + } + + switch ( signature.FiletypeFlags ) { + case FTF_DLL: + sp2 = "Dynamically Linked Library"; + break; + case FTF_NLM: + sp2 = "NetWare Loadable Module"; + break; + case FTF_OVERLAYS: + sp2 = "Uses Overlays"; + break; + case FTF_DEBUG: + sp2 = "Debug Version"; + break; + case FTF_TSR: + sp2 = "DOS Terminate-n-Stay Resident Thing"; + break; + case FTF_SYS: + sp2 = "DOS Loadable Driver"; + break; + case FTF_PROTECTED: + sp2 = "Runs in Protected Mode"; + break; + case FTF_APP_SPEC: + sp2 = "Application Specific"; + break; + default: + sp2 = "Unknown File Type Flag"; + break; + } + + (void)fprintf(stdout, "%s:%s:", sp1, sp2); + + switch ( signature.OEM ) { + case OEM_DPT: + sp1 = "DPT"; + break; + case OEM_ATT: + sp1 = "AT&T"; + break; + case OEM_NEC: + sp1 = "NEC"; + break; + case OEM_ALPHA: + sp1 = "Alphatronix"; + break; + case OEM_AST: + sp1 = "AST"; + break; + case OEM_OLIVETTI: + sp1 = "Olivetti"; + break; + case OEM_SNI: + sp1 = "Siemens/Nixdorf"; + break; + default: + sp1 = "Unknown OEM"; + break; + } + + switch ( signature.OS ) { + case OS_DOS: + sp2 = "DOS"; + break; + case OS_WINDOWS: + sp2 = "Microsoft Windows 3.x"; + break; + case OS_WINDOWS_NT: + sp2 = "Microsoft Windows NT"; + break; + case OS_OS2M: + sp2 = "OS/2 1.2.x,MS 1.3.0,IBM 1.3.x"; + break; + case OS_OS2L: + sp2 = "Microsoft OS/2 1.301 - LADDR"; + break; + case OS_OS22x: + sp2 = "IBM OS/2 2.x"; + break; + case OS_NW286: + sp2 = "Novell NetWare 286"; + break; + case OS_NW386: + sp2 = "Novell NetWare 386"; + break; + case OS_GEN_UNIX: + sp2 = "Generic Unix"; + break; + case OS_SCO_UNIX: + sp2 = "SCO Unix"; + break; + case OS_ATT_UNIX: + sp2 = "AT&T Unix"; + break; + case OS_UNIXWARE: + sp2 = "UnixWare Unix"; + break; + case OS_INT_UNIX: + sp2 = "Interactive Unix"; + break; + case OS_SOLARIS: + sp2 = "SunSoft Solaris"; + break; + case OS_QNX: + sp2 = "QNX for Tom Moch"; + break; + case OS_NEXTSTEP: + sp2 = "NeXTSTEP"; + break; + case OS_BANYAN: + sp2 = "Banyan Vines"; + break; + case OS_OLIVETTI_UNIX: + sp2 = "Olivetti Unix"; + break; + case OS_FREEBSD: + sp2 = "FreeBSD 2.2 and later"; + break; + case OS_OTHER: + sp2 = "Other"; + break; + default: + sp2 = "Unknown O/S"; + break; + } + + (void)fprintf(stdout, "%s:%s:\n", sp1, sp2); + + if ( signature.Capabilities & CAP_RAID0 ) + (void)fprintf(stdout, "RAID-0:"); + + if ( signature.Capabilities & CAP_RAID1 ) + (void)fprintf(stdout, "RAID-1:"); + + if ( signature.Capabilities & CAP_RAID3 ) + (void)fprintf(stdout, "RAID-3:"); + + if ( signature.Capabilities & CAP_RAID5 ) + (void)fprintf(stdout, "RAID-5:"); + + if ( signature.Capabilities & CAP_SPAN ) + (void)fprintf(stdout, "SPAN:"); + + if ( signature.Capabilities & CAP_PASS ) + (void)fprintf(stdout, "PASS:"); + + if ( signature.Capabilities & CAP_OVERLAP ) + (void)fprintf(stdout, "OVERLAP:"); + + if ( signature.Capabilities & CAP_ASPI ) + (void)fprintf(stdout, "ASPI:"); + + if ( signature.Capabilities & CAP_ABOVE16MB ) + (void)fprintf(stdout, "ISA16MB:"); + + if ( signature.Capabilities & CAP_EXTEND ) + (void)fprintf(stdout, "ISA16MB:"); + + (void)fprintf(stdout, "\n"); + + if ( signature.DeviceSupp & DEV_DASD ) + (void)fprintf(stdout, "DASD:"); + + if ( signature.DeviceSupp & DEV_TAPE ) + (void)fprintf(stdout, "Tape:"); + + if ( signature.DeviceSupp & DEV_PRINTER ) + (void)fprintf(stdout, "Printer:"); + + if ( signature.DeviceSupp & DEV_PROC ) + (void)fprintf(stdout, "CPU:"); + + if ( signature.DeviceSupp & DEV_WORM ) + (void)fprintf(stdout, "WORM:"); + + if ( signature.DeviceSupp & DEV_CDROM ) + (void)fprintf(stdout, "CDROM:"); + + if ( signature.DeviceSupp & DEV_SCANNER ) + (void)fprintf(stdout, "Scanner:"); + + if ( signature.DeviceSupp & DEV_OPTICAL ) + (void)fprintf(stdout, "Optical:"); + + if ( signature.DeviceSupp & DEV_JUKEBOX ) + (void)fprintf(stdout, "Jukebox:"); + + if ( signature.DeviceSupp & DEV_COMM ) + (void)fprintf(stdout, "Comm:"); + + if ( signature.DeviceSupp & DEV_OTHER ) + (void)fprintf(stdout, "Other:"); + + if ( signature.DeviceSupp & DEV_ALL ) + (void)fprintf(stdout, "All:"); + + (void)fprintf(stdout, "\n"); + + if ( signature.AdapterSupp & ADF_2001 ) + (void)fprintf(stdout, "PM2001:"); + + if ( signature.AdapterSupp & ADF_2012A ) + (void)fprintf(stdout, "PM2012A:"); + + if ( signature.AdapterSupp & ADF_PLUS_ISA ) + (void)fprintf(stdout, "PM2011+PM2021:"); + + if ( signature.AdapterSupp & ADF_PLUS_EISA ) + (void)fprintf(stdout, "PM2012B+PM2022:"); + + if ( signature.AdapterSupp & ADF_SC3_ISA ) + (void)fprintf(stdout, "PM2021:"); + + if ( signature.AdapterSupp & ADF_SC3_EISA ) + (void)fprintf(stdout, "PM2022+PM2122:"); + + if ( signature.AdapterSupp & ADF_SC3_PCI ) + (void)fprintf(stdout, "SmartCache III PCI:"); + + if ( signature.AdapterSupp & ADF_SC4_ISA ) + (void)fprintf(stdout, "SmartCache IV ISA:"); + + if ( signature.AdapterSupp & ADF_SC4_EISA ) + (void)fprintf(stdout, "SmartCache IV EISA:"); + + if ( signature.AdapterSupp & ADF_SC4_PCI ) + (void)fprintf(stdout, "SmartCache IV PCI:"); + + if ( signature.AdapterSupp & ADF_ALL_MASTER ) + (void)fprintf(stdout, "All Bus Mastering:"); + + if ( signature.AdapterSupp & ADF_ALL_CACHE ) + (void)fprintf(stdout, "All Caching:"); + + if ( signature.AdapterSupp & ADF_ALL ) + (void)fprintf(stdout, "All HBAs:"); + + (void)fprintf(stdout, "\n"); + + if ( signature.Application & APP_DPTMGR ) + (void)fprintf(stdout, "DPTMGR:"); + + if ( signature.Application & APP_ENGINE ) + (void)fprintf(stdout, "Engine:"); + + if ( signature.Application & APP_SYTOS ) + (void)fprintf(stdout, "Systron Sytos Plus:"); + + if ( signature.Application & APP_CHEYENNE ) + (void)fprintf(stdout, "Cheyenne ARCServe + ARCSolo:"); + + if ( signature.Application & APP_MSCDEX ) + (void)fprintf(stdout, "Microsoft CD-ROM extensions:"); + + if ( signature.Application & APP_NOVABACK ) + (void)fprintf(stdout, "NovaStor Novaback:"); + + if ( signature.Application & APP_AIM ) + (void)fprintf(stdout, "Archive Information Manager:"); + + (void)fprintf(stdout, "\n"); + + if ( signature.Requirements & REQ_SMARTROM ) + (void)fprintf(stdout, "SmartROM:"); + + if ( signature.Requirements & REQ_DPTDDL ) + (void)fprintf(stdout, "DPTDDL.SYS:"); + + if ( signature.Requirements & REQ_HBA_DRIVER ) + (void)fprintf(stdout, "HBA Driver:"); + + if ( signature.Requirements & REQ_ASPI_TRAN ) + (void)fprintf(stdout, "ASPI Transport Modules:"); + + if ( signature.Requirements & REQ_ENGINE ) + (void)fprintf(stdout, "DPT Engine:"); + + if ( signature.Requirements & REQ_COMM_ENG ) + (void)fprintf(stdout, "DPT Comm Engine:"); + + (void)fprintf(stdout, "\n"); + + (void)fprintf(stdout, "%x.%x.%x:%d.%d.%d\n", + signature.Version, signature.Revision, + signature.SubRevision, + signature.Month, signature.Day, signature.Year + 1980); + + return(0); +} |