[Debburn-changes] r514 - in cdrkit/branches/experimental: . genisoimage icedax include libwost readom wodim

Eduard Bloch blade at alioth.debian.org
Tue Nov 28 14:48:17 CET 2006


Author: blade
Date: 2006-11-28 14:48:17 +0100 (Tue, 28 Nov 2006)
New Revision: 514

Added:
   cdrkit/branches/experimental/libwost/cd_misc.c
   cdrkit/branches/experimental/libwost/defaults.c
   cdrkit/branches/experimental/libwost/getnum.c
   cdrkit/branches/experimental/libwost/modes.c
   cdrkit/branches/experimental/libwost/scsi_cdr.c
   cdrkit/branches/experimental/libwost/scsi_scan.c
Removed:
   cdrkit/branches/experimental/wodim/cd_misc.c
   cdrkit/branches/experimental/wodim/defaults.c
   cdrkit/branches/experimental/wodim/getnum.c
   cdrkit/branches/experimental/wodim/modes.c
   cdrkit/branches/experimental/wodim/scsi_cdr.c
   cdrkit/branches/experimental/wodim/scsi_scan.c
Modified:
   cdrkit/branches/experimental/CMakeLists.txt
   cdrkit/branches/experimental/genisoimage/CMakeLists.txt
   cdrkit/branches/experimental/icedax/CMakeLists.txt
   cdrkit/branches/experimental/include/CMakeLists.txt
   cdrkit/branches/experimental/readom/CMakeLists.txt
   cdrkit/branches/experimental/wodim/CMakeLists.txt
Log:
moved some shared stuff to libwost

Modified: cdrkit/branches/experimental/CMakeLists.txt
===================================================================
--- cdrkit/branches/experimental/CMakeLists.txt	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/CMakeLists.txt	2006-11-28 13:48:17 UTC (rev 514)
@@ -1,3 +1,3 @@
 PROJECT (cdrkit)
-SUBDIRS(include genisoimage wodim libdeflt libedc libhfs_iso libparanoia icedax libusal librols libunls readom netscsid 3rd-party/dirsplit)
+SUBDIRS(include genisoimage libwost wodim libdeflt libedc libhfs_iso libparanoia icedax libusal librols libunls readom netscsid 3rd-party/dirsplit)
 

Modified: cdrkit/branches/experimental/genisoimage/CMakeLists.txt
===================================================================
--- cdrkit/branches/experimental/genisoimage/CMakeLists.txt	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/genisoimage/CMakeLists.txt	2006-11-28 13:48:17 UTC (rev 514)
@@ -3,7 +3,7 @@
 INCLUDE(../include/AddScgBits.cmake)
 INCLUDE(../include/AddSchilyBits.cmake)
 
-INCLUDE_DIRECTORIES(../include ../libhfs_iso ../wodim ${CMAKE_BINARY_DIR})
+INCLUDE_DIRECTORIES(../include ../wodim ../libhfs_iso ${CMAKE_BINARY_DIR})
 
 INCLUDE(CheckIncludeFiles)
 CHECK_INCLUDE_FILES("magic.h" USE_MAGIC)
@@ -25,18 +25,18 @@
 
 ADD_DEFINITIONS(-DUSE_LARGEFILES -DABORT_DEEP_ISO_ONLY -DAPPLE_HYB -DUDF -DDVD_VIDEO -DSORTING -DHAVE_CONFIG_H -DUSE_LIBSCHILY -DUSE_SCG -DJIGDO_TEMPLATE)
 
-SET(MKISOFS_MOST_SRCS apple.c boot.c cd_misc.c defaults.c desktop.c dvd_file.c dvd_reader.c eltorito.c exclude.c files.c fnmatch.c getnum.c getopt.c getopt1.c hash.c ifo_read.c joliet.c mac_label.c match.c modes.c multi.c name.c rock.c scsi.c scsi_cdr.c stream.c tree.c udf.c vms.c volume.c write.c boot-alpha.c boot-hppa.c boot-mips.c md5.c jte.c rsync.c
+SET(MKISOFS_MOST_SRCS apple.c boot.c   desktop.c dvd_file.c dvd_reader.c eltorito.c exclude.c files.c fnmatch.c  getopt.c getopt1.c hash.c ifo_read.c joliet.c mac_label.c match.c  multi.c name.c rock.c scsi.c  stream.c tree.c udf.c vms.c volume.c write.c boot-alpha.c boot-hppa.c boot-mips.c md5.c jte.c rsync.c
 	boot-mipsel.c endian.c  )
 
 #SET_SOURCE_FILES_PROPERTIES(${MKISOFS_MOST_SRCS} PROPERTIES )
-LINK_DIRECTORIES(../libhfs_iso ../librols ../libusal ../libunls ../libdeflt)
+LINK_DIRECTORIES(../libhfs_iso ../librols ../libusal ../libunls ../libdeflt ../libwost)
 
 ADD_EXECUTABLE (genisoimage genisoimage.c ${MKISOFS_MOST_SRCS})
-TARGET_LINK_LIBRARIES(genisoimage hfs_iso deflt ${MAGICLIBS} c unls z ${EXTRA_LIBICONV} ${EXTRA_LIBS})
+TARGET_LINK_LIBRARIES(genisoimage wost hfs_iso deflt ${MAGICLIBS} c unls z ${EXTRA_LIBICONV} ${EXTRA_LIBS})
 
 # common lib set and genisoimage source parts for the rest
-LINK_LIBRARIES(${EXTRA_LIBS} deflt unls ${EXTRA_LIBICONV} )
-SET(MI_COMMON scsi.c scsi_cdr.c cd_misc.c modes.c defaults.c getnum.c)
+LINK_LIBRARIES(${EXTRA_LIBS} wost deflt unls ${EXTRA_LIBICONV} )
+SET(MI_COMMON scsi.c )
 ADD_EXECUTABLE(devdump diag/dump.c  ${MI_COMMON})
 ADD_EXECUTABLE(isodebug	diag/isodebug.c   ${MI_COMMON})
 ADD_EXECUTABLE(isodump	diag/isodump.c    ${MI_COMMON})

Modified: cdrkit/branches/experimental/icedax/CMakeLists.txt
===================================================================
--- cdrkit/branches/experimental/icedax/CMakeLists.txt	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/icedax/CMakeLists.txt	2006-11-28 13:48:17 UTC (rev 514)
@@ -12,13 +12,13 @@
    	ADD_DEFINITIONS(-DHAVE_LINUX_SOUNDCARD_H)
 ENDIF(HAVE_LINUX_SOUNDCARD_H)
 
-LIST(APPEND EXTRA_LIBS deflt paranoia)
+LIST(APPEND EXTRA_LIBS paranoia wost deflt )
 IF (WIN32)
 	LIST(APPEND EXTRA_LIBS winmm)
 ENDIF (WIN32)
 
-LINK_DIRECTORIES(../librols ../libusal ../libdeflt ../libparanoia)
-ADD_EXECUTABLE (icedax aifc.c aiff.c base64.c cd_misc.c icedax.c defaults.c getnum.c interface.c ioctl.c md5c.c modes.c raw.c resample.c ringbuff.c scsi_cdr.c scsi_cmds.c scsi_scan.c semshm.c setuid.c sha_func.c sndconfig.c sun.c toc.c wav.c)
+LINK_DIRECTORIES(../librols ../libusal ../libdeflt ../libwost ../libparanoia)
+ADD_EXECUTABLE (icedax aifc.c aiff.c base64.c  icedax.c   interface.c ioctl.c md5c.c  raw.c resample.c ringbuff.c  scsi_cmds.c semshm.c setuid.c sha_func.c sndconfig.c sun.c toc.c wav.c)
 TARGET_LINK_LIBRARIES(icedax ${EXTRA_LIBS})
 SET_TARGET_PROPERTIES(icedax PROPERTIES  SKIP_BUILD_RPATH TRUE)
 

Modified: cdrkit/branches/experimental/include/CMakeLists.txt
===================================================================
--- cdrkit/branches/experimental/include/CMakeLists.txt	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/include/CMakeLists.txt	2006-11-28 13:48:17 UTC (rev 514)
@@ -100,15 +100,15 @@
 #include <iconv.h>
 int main(int a, char **b) { iconv_t foo = iconv_open(b[0], b[0]); return(0); }
 ")
-CHECK_C_SOURCE_COMPILES("${TESTSRC}" USE_LIBICONV)
-IF(NOT USE_LIBICONV)
-   FIND_FILE(ICONV_H_LOCATION "iconv.h")
-   IF(NOT "${ICONV_H_LOCATION}" EQUAL "/usr/include/iconv.h")
-      MESSAGE("WARNING: iconv.h found in non-standard location (${ICONV_H_LOCATION}) but")
-      MESSAGE("GNU libiconv is not available. See INSTALL for details. Sleeping 10 seconds.")
-      EXECUTE_PROCESS(COMMAND "sleep" "10")
-   ENDIF(NOT "${ICONV_H_LOCATION}" EQUAL "/usr/include/iconv.h")
-ENDIF(NOT USE_LIBICONV)
+#CHECK_C_SOURCE_COMPILES("${TESTSRC}" USE_LIBICONV)
+#IF(NOT USE_LIBICONV)
+#   FIND_FILE(ICONV_H_LOCATION "iconv.h")
+#   IF(NOT "${ICONV_H_LOCATION}" EQUAL "/usr/include/iconv.h")
+#      MESSAGE("WARNING: iconv.h found in non-standard location (${ICONV_H_LOCATION}) but")
+#     MESSAGE("GNU libiconv is not available. See INSTALL for details. Sleeping 10 seconds.")
+#      EXECUTE_PROCESS(COMMAND "sleep" "10")
+#   ENDIF(NOT "${ICONV_H_LOCATION}" EQUAL "/usr/include/iconv.h")
+#ENDIF(NOT USE_LIBICONV)
 
 SET(CMAKE_REQUIRED_LIBRARIES )
 SET(TESTSRC " 

Copied: cdrkit/branches/experimental/libwost/cd_misc.c (from rev 512, cdrkit/branches/experimental/wodim/cd_misc.c)

Copied: cdrkit/branches/experimental/libwost/defaults.c (from rev 512, cdrkit/branches/experimental/wodim/defaults.c)

Copied: cdrkit/branches/experimental/libwost/getnum.c (from rev 512, cdrkit/branches/experimental/wodim/getnum.c)

Copied: cdrkit/branches/experimental/libwost/modes.c (from rev 512, cdrkit/branches/experimental/wodim/modes.c)

Copied: cdrkit/branches/experimental/libwost/scsi_cdr.c (from rev 512, cdrkit/branches/experimental/wodim/scsi_cdr.c)

Copied: cdrkit/branches/experimental/libwost/scsi_scan.c (from rev 512, cdrkit/branches/experimental/wodim/scsi_scan.c)

Modified: cdrkit/branches/experimental/readom/CMakeLists.txt
===================================================================
--- cdrkit/branches/experimental/readom/CMakeLists.txt	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/readom/CMakeLists.txt	2006-11-28 13:48:17 UTC (rev 514)
@@ -10,7 +10,7 @@
 ADD_DEFINITIONS(-DCLONE_WRITE)
 
 ADD_EXECUTABLE (readom ${readom_SRCS})
-TARGET_LINK_LIBRARIES(readom ${EXTRA_LIBS} deflt)
+TARGET_LINK_LIBRARIES(readom ${EXTRA_LIBS} wost deflt)
 SET_TARGET_PROPERTIES(readom PROPERTIES  SKIP_BUILD_RPATH TRUE)
 
 INSTALL(TARGETS readom DESTINATION bin)

Modified: cdrkit/branches/experimental/wodim/CMakeLists.txt
===================================================================
--- cdrkit/branches/experimental/wodim/CMakeLists.txt	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/wodim/CMakeLists.txt	2006-11-28 13:48:17 UTC (rev 514)
@@ -17,12 +17,12 @@
    ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
 ENDIF(HAVE_SYS_CAPABILITY_H)
 
-LINK_DIRECTORIES(../librols ../libusal ../libdeflt ../libedc)
+LINK_DIRECTORIES(../librols ../libusal ../libwost ../libdeflt ../libedc)
 
 ADD_DEFINITIONS(-DHAVE_LIB_EDC_ECC -DCLONE_WRITE)
 
 ADD_EXECUTABLE (wodim ${CDRECORD_SRCS})
-TARGET_LINK_LIBRARIES(wodim ${EXTRA_LIBS} deflt edc)
+TARGET_LINK_LIBRARIES(wodim ${EXTRA_LIBS} deflt edc wost)
 SET_TARGET_PROPERTIES(wodim PROPERTIES SKIP_BUILD_RPATH TRUE)
 
 INSTALL(TARGETS wodim DESTINATION bin)

Deleted: cdrkit/branches/experimental/wodim/cd_misc.c
===================================================================
--- cdrkit/branches/experimental/wodim/cd_misc.c	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/wodim/cd_misc.c	2006-11-28 13:48:17 UTC (rev 514)
@@ -1,148 +0,0 @@
-/*
- * This file has been modified for the cdrkit suite.
- *
- * The behaviour and appearence of the program code below can differ to a major
- * extent from the version distributed by the original author(s).
- *
- * For details, see Changelog file distributed with the cdrkit package. If you
- * received this file from another source then ask the distributing person for
- * a log of modifications.
- *
- */
-
-/* @(#)cd_misc.c	1.10 01/10/29 Copyright 1997 J. Schilling */
-#ifndef lint
-static	char sccsid[] =
-	"@(#)cd_misc.c	1.10 01/10/29 Copyright 1997 J. Schilling";
-#endif
-/*
- *	Misc CD support routines
- *
- *	Copyright (c) 1997 J. Schilling
- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; see the file COPYING.  If not, write to the Free Software
- * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <mconfig.h>
-#include <standard.h>
-#include <utypes.h>	/* Includes <sys/types.h> for caddr_t */
-#include <stdio.h>
-#include <schily.h>
-
-#include "wodim.h"
-
-int	from_bcd(int b);
-int	to_bcd(int i);
-long	msf_to_lba(int m, int s, int f, BOOL force_positive);
-BOOL	lba_to_msf(long lba, msf_t *mp);
-void	sec_to_msf(long sec, msf_t *mp);
-void	print_min_atip(long li, long lo);
-
-int 
-from_bcd(int b)
-{
-	return ((b & 0x0F) + 10 * (((b)>> 4) & 0x0F));
-}
-
-int 
-to_bcd(int i)
-{
-	return (i % 10 | ((i / 10) % 10) << 4);
-}
-
-long 
-msf_to_lba(int m, int s, int f, BOOL force_positive)
-{
-	long	ret = m * 60 + s;
-
-	ret *= 75;
-	ret += f;
-	if (m < 90 || force_positive)
-		ret -= 150;
-	else
-		ret -= 450150;
-	return (ret);
-}
-
-BOOL 
-lba_to_msf(long lba, msf_t *mp)
-{
-	int	m;
-	int	s;
-	int	f;
-
-#ifdef	__follow_redbook__
-	if (lba >= -150 && lba < 405000) {	/* lba <= 404849 */
-#else
-	if (lba >= -150) {
-#endif
-		m = (lba + 150) / 60 / 75;
-		s = (lba + 150 - m*60*75)  / 75;
-		f = (lba + 150 - m*60*75 - s*75);
-
-	} else if (lba >= -45150 && lba <= -151) {
-		m = (lba + 450150) / 60 / 75;
-		s = (lba + 450150 - m*60*75)  / 75;
-		f = (lba + 450150 - m*60*75 - s*75);
-
-	} else {
-		mp->msf_min   = -1;
-		mp->msf_sec   = -1;
-		mp->msf_frame = -1;
-
-		return (FALSE);
-	}
-	mp->msf_min   = m;
-	mp->msf_sec   = s;
-	mp->msf_frame = f;
-
-	if (lba > 404849)			/* 404850 -> 404999: lead out */
-		return (FALSE);
-	return (TRUE);
-}
-
-void 
-sec_to_msf(long sec, msf_t *mp)
-{
-	int	m;
-	int	s;
-	int	f;
-
-	m = (sec) / 60 / 75;
-	s = (sec - m*60*75)  / 75;
-	f = (sec - m*60*75 - s*75);
-
-	mp->msf_min   = m;
-	mp->msf_sec   = s;
-	mp->msf_frame = f;
-}
-
-void 
-print_min_atip(long li, long lo)
-{
-	msf_t	msf;
-
-	if (li < 0) {
-		lba_to_msf(li, &msf);
-
-		printf("  ATIP start of lead in:  %ld (%02d:%02d/%02d)\n",
-			li, msf.msf_min, msf.msf_sec, msf.msf_frame);
-	}
-	if (lo > 0) {
-		lba_to_msf(lo, &msf);
-		printf("  ATIP start of lead out: %ld (%02d:%02d/%02d)\n",
-			lo, msf.msf_min, msf.msf_sec, msf.msf_frame);
-	}
-}

Deleted: cdrkit/branches/experimental/wodim/defaults.c
===================================================================
--- cdrkit/branches/experimental/wodim/defaults.c	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/wodim/defaults.c	2006-11-28 13:48:17 UTC (rev 514)
@@ -1,143 +0,0 @@
-/* 
- * Copyright 2006 Eduard Bloch 
- *
- * This code emulates the interface of the original defaults.c file. However,
- * it improves its behaviour and deals with corner cases: prepended and
- * trailing spaces on variable and value, no requirement for using TABs
- * anymore. No requirements to insert dummy values like -1 or "".
- *
- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; see the file COPYING.  If not, write to the Free Software
- * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <mconfig.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <deflts.h>
-#include <ctype.h>
-#include <string.h>
-
-#define CFGPATH "/etc/wodim.conf"
-/* The better way would be exporting the meta functions to getnum.h or so */
-extern int	getnum(char *arg, long *valp);
-
-void 
-cdr_defaults(char **p_dev_name, int *p_speed, long *p_fifosize, 
-					char **p_drv_opts)
-{
-	FILE *stream;
-	char *t; /* tmp */
-	int wc=0;
-	char loc[256], sSpeed[11], sFs[11], sOpts[81];
-	char *devcand=NULL;
-
-  cfg_open(CFGPATH);
-
-	if(p_dev_name && *p_dev_name)
-		devcand=*p_dev_name;
-	else if(NULL!=(t=getenv("CDR_DEVICE")))
-		devcand=t;
-	else if(NULL!=(t=cfg_get("CDR_DEVICE")))
-		devcand=strdup(t); /* needs to use it as a key later, same stat. memory */
-
-	if(devcand && NULL != (t=cfg_get(devcand))) {
-		/* extract them now, may be used later */
-		wc=sscanf(t, "%255s %10s %10s %80s", loc, sSpeed, sFs, sOpts);
-	}
-
-	if(p_dev_name) {
-		if(wc>0)
-			*p_dev_name = strdup(loc);
-		else if(devcand) /* small mem. leak possible, does not matter, checks for that would require more code size than we loose */
-			*p_dev_name=strdup(devcand);
-	}
-	if(p_speed) { /* sth. to write back */
-		char *bad;
-		int cfg_speed=-1;
-
-		/* that value may be used twice */
-		if(NULL!=(t=cfg_get("CDR_SPEED"))) {
-			cfg_speed=strtol(t,&bad,10);
-			if(*bad || cfg_speed<-1) {
-				fprintf(stderr, "Bad default CDR_SPEED setting (%s).\n", t);
-				exit(EXIT_FAILURE);
-			}
-		}
-
-		if(*p_speed>0) { 
-			/* ok, already set by the program arguments */
-		}
-		else if(NULL!=(t=getenv("CDR_SPEED"))) {
-			*p_speed=strtol(t,&bad,10);
-			if(*bad || *p_speed<-1) {
-				fprintf(stderr, "Bad CDR_SPEED environment (%s).\n", t);
-				exit(EXIT_FAILURE);
-			}
-		}
-		else if(wc>1 && *sSpeed) {
-			*p_speed=strtol(sSpeed, &bad, 10);
-			if(*bad || *p_speed<-1) {
-				fprintf(stderr, "Bad speed (%s) in the config, drive description.\n", sSpeed);
-				exit(EXIT_FAILURE);
-			}
-			if(*p_speed==-1) 
-				/* that's autodetect, use the config default as last ressort */
-				*p_speed=cfg_speed;
-		}
-		else 
-			*p_speed=cfg_speed;
-	}
-	if(p_fifosize) { /* sth. to write back */
-		if(*p_fifosize>0) { 
-			/* ok, already set by the user */
-		}
-		else if(NULL!=(t=getenv("CDR_FIFOSIZE"))) {
-			if(getnum(t, p_fifosize)!=1 || *p_fifosize<-1) {
-				fprintf(stderr, "Bad CDR_FIFOSIZE environment (%s).\n", t);
-				exit(EXIT_FAILURE);
-			}
-		}
-		else if(wc>2 && *sFs) {
-			if(getnum(sFs, p_fifosize)!=1 || *p_fifosize<-1) {
-				fprintf(stderr, "Bad fifo size (%s) in the config, device description.\n", sSpeed);
-				exit(EXIT_FAILURE);
-			}
-		}
-		else if(NULL!=(t=cfg_get("CDR_FIFOSIZE"))) {
-			if(getnum(t, p_fifosize)!=1 || *p_fifosize<-1) {
-				fprintf(stderr, "Bad speed default setting (%s).\n", t);
-				exit(EXIT_FAILURE);
-			}
-		}
-		/* undocumented option. Most likely to prevent killing Schily's
-		 * underpowered machines (see docs) by allocating too much memory after
-		 * doing a mistake in the config. */
-		if(NULL!=(t=cfg_get("CDR_MAXFIFOSIZE"))) {
-			long max;
-			if(getnum(t, &max)!=1 || *p_fifosize<-1) {
-				fprintf(stderr, "Bad CDR_MAXFIFOSIZE setting (%s).\n", t);
-				exit(EXIT_FAILURE);
-			}
-			if(*p_fifosize>max)
-				*p_fifosize=max;
-		}
-	}
-
-	if(p_drv_opts && !*p_drv_opts && wc>3 && strcmp(sOpts, "\"\""))
-		*p_drv_opts=strdup(sOpts);
-
-  cfg_close();
-
-}

Deleted: cdrkit/branches/experimental/wodim/getnum.c
===================================================================
--- cdrkit/branches/experimental/wodim/getnum.c	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/wodim/getnum.c	2006-11-28 13:48:17 UTC (rev 514)
@@ -1,127 +0,0 @@
-/*
- * This file has been modified for the cdrkit suite.
- *
- * The behaviour and appearence of the program code below can differ to a major
- * extent from the version distributed by the original author(s).
- *
- * For details, see Changelog file distributed with the cdrkit package. If you
- * received this file from another source then ask the distributing person for
- * a log of modifications.
- *
- */
-
-/* @(#)getnum.c	1.2 04/03/02 Copyright 1984-2002, 2004 J. Schilling */
-#ifndef lint
-static	char sccsid[] =
-	"@(#)getnum.c	1.2 04/03/02 Copyright 1984-2002, 2004 J. Schilling";
-#endif
-/*
- *	Number conversion routines to implement 'dd' like options.
- *
- *	Copyright (c) 1984-2002, 2004 J. Schilling
- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; see the file COPYING.  If not, write to the Free Software
- * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <mconfig.h>
-#include <standard.h>
-#include <utypes.h>
-#include <schily.h>
-
-static	Llong	number(char *arg, int *retp);
-int	getnum(char *arg, long *valp);
-int	getllnum(char *arg, Llong *lvalp);
-
-static Llong
-number(register char *arg, int *retp)
-{
-	Llong	val	= 0;
-
-	if (*retp != 1)
-		return (val);
-	if (*arg == '\0') {
-		*retp = -1;
-	} else if (*(arg = astoll(arg, &val))) {
-		if (*arg == 'p' || *arg == 'P') {
-			val *= (1024*1024);
-			val *= (1024*1024*1024);
-			arg++;
-
-		} else if (*arg == 't' || *arg == 'T') {
-			val *= (1024*1024);
-			val *= (1024*1024);
-			arg++;
-
-		} else if (*arg == 'g' || *arg == 'G') {
-			val *= (1024*1024*1024);
-			arg++;
-
-		} else if (*arg == 'm' || *arg == 'M') {
-			val *= (1024*1024);
-			arg++;
-
-		} else if (*arg == 'f' || *arg == 'F') {
-			val *= 2352;
-			arg++;
-
-		} else if (*arg == 's' || *arg == 'S') {
-			val *= 2048;
-			arg++;
-
-		} else if (*arg == 'k' || *arg == 'K') {
-			val *= 1024;
-			arg++;
-
-		} else if (*arg == 'b' || *arg == 'B') {
-			val *= 512;
-			arg++;
-
-		} else if (*arg == 'w' || *arg == 'W') {
-			val *= 2;
-			arg++;
-		}
-		if (*arg == '*' || *arg == 'x')
-			val *= number(++arg, retp);
-		else if (*arg != '\0')
-			*retp = -1;
-	}
-	return (val);
-}
-
-int
-getnum(char *arg, long *valp)
-{
-	Llong	llval;
-	int	ret = 1;
-
-	llval = number(arg, &ret);
-	*valp = llval;
-	if (*valp != llval) {
-		errmsgno(EX_BAD,
-			"Value %lld is too large for data type 'long'.\n",
-									llval);
-		ret = -1;
-	}
-	return (ret);
-}
-
-int
-getllnum(char *arg, Llong *lvalp)
-{
-	int	ret = 1;
-
-	*lvalp = number(arg, &ret);
-	return (ret);
-}

Deleted: cdrkit/branches/experimental/wodim/modes.c
===================================================================
--- cdrkit/branches/experimental/wodim/modes.c	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/wodim/modes.c	2006-11-28 13:48:17 UTC (rev 514)
@@ -1,293 +0,0 @@
-/*
- * This file has been modified for the cdrkit suite.
- *
- * The behaviour and appearence of the program code below can differ to a major
- * extent from the version distributed by the original author(s).
- *
- * For details, see Changelog file distributed with the cdrkit package. If you
- * received this file from another source then ask the distributing person for
- * a log of modifications.
- *
- */
-
-/* @(#)modes.c	1.25 04/03/02 Copyright 1988, 1997-2001, 2004 J. Schilling */
-#ifndef lint
-static	char sccsid[] =
-	"@(#)modes.c	1.25 04/03/02 Copyright 1988, 1997-2001, 2004 J. Schilling";
-#endif
-/*
- *	SCSI mode page handling
- *
- *	Copyright (c) 1988, 1997-2001, 2004 J. Schilling
- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; see the file COPYING.  If not, write to the Free Software
- * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <mconfig.h>
-#include <utypes.h>
-#include <standard.h>
-#include <schily.h>
-#include <usal/usalcmd.h>
-#include <usal/scsireg.h>
-#include <usal/scsitransp.h>
-
-#include "wodim.h"
-
-int	scsi_compliant;
-
-static	BOOL	has_mode_page(SCSI *usalp, int page, char *pagename, int *lenp);
-BOOL	get_mode_params(SCSI *usalp, int page, char *pagename, Uchar *modep, 
-							 Uchar *cmodep, Uchar *dmodep, Uchar *smodep, int *lenp);
-BOOL	set_mode_params(SCSI *usalp, char *pagename, Uchar *modep, int len, 
-							 int save, int secsize);
-
-#define	XXX
-
-#ifdef	XXX
-static BOOL
-has_mode_page(SCSI *usalp, int page, char *pagename, int *lenp)
-{
-	Uchar	mode[0x100];
-	int	hdlen;
-	int	len = 1;				/* Nach SCSI Norm */
-	int	try = 0;
-	struct	scsi_mode_page_header *mp;
-
-	/*
-	 * ATAPI drives (used e.g. by IOMEGA) from y2k have the worst firmware
-	 * I've seen. They create DMA buffer overruns if we request less than
-	 * 3 bytes with 6 byte mode sense which equals 4 byte with 10 byte mode
-	 * sense. In order to prevent repeated bus resets, we remember this
-	 * bug.
-	 *
-	 * IOMEGA claims that they are using Philips clone drives but a Philips
-	 * drive I own does not have the problem.
-	 */
-	if ((usalp->dflags & DRF_MODE_DMA_OVR) != 0)
-		len = sizeof (struct scsi_mode_header);
-again:
-	fillbytes((caddr_t)mode, sizeof (mode), '\0');
-	if (lenp)
-		*lenp = 0;
-
-	usalp->silent++;
-	(void) unit_ready(usalp);
-/* Maxoptix bringt Aborted cmd 0x0B mit code 0x4E (overlapping cmds)*/
-
-	/*
-	 * The Matsushita CW-7502 will sometimes deliver a zeroed
-	 * mode page 2A if "Page n default" is used instead of "current".
-	 */
-	if (mode_sense(usalp, mode, len, page, 0) < 0) {	/* Page n current */
-		usalp->silent--;
-		if (len < (int)sizeof (struct scsi_mode_header) && try == 0) {
-			len = sizeof (struct scsi_mode_header);
-			goto again;
-		}
-		return (FALSE);
-	} else {
-		if (len > 1 && try == 0) {
-			/*
-			 * If we come here, we got a hard failure with the
-			 * fist try. Remember this (IOMEGA USB) firmware bug.
-			 */
-			if ((usalp->dflags & DRF_MODE_DMA_OVR) == 0) {
-				/* XXX if (!nowarn) */
-				errmsgno(EX_BAD,
-				"Warning: controller creates hard SCSI failure when retrieving %s page.\n",
-								pagename);
-				usalp->dflags |= DRF_MODE_DMA_OVR;
-			}
-		}
-		len = ((struct scsi_mode_header *)mode)->sense_data_len + 1;
-	}
-	/*
-	 * ATAPI drives as used by IOMEGA may receive a SCSI bus device reset
-	 * in between these two mode sense commands.
-	 */
-	(void) unit_ready(usalp);
-	if (mode_sense(usalp, mode, len, page, 0) < 0) {	/* Page n current */
-		usalp->silent--;
-		return (FALSE);
-	}
-	usalp->silent--;
-
-	if (usalp->verbose)
-		usal_prbytes("Mode Sense Data", mode, len - usal_getresid(usalp));
-	hdlen = sizeof (struct scsi_mode_header) +
-			((struct scsi_mode_header *)mode)->blockdesc_len;
-	mp = (struct scsi_mode_page_header *)(mode + hdlen);
-	if (usalp->verbose)
-		usal_prbytes("Mode Page  Data", (Uchar *)mp, mp->p_len+2);
-
-	if (mp->p_len == 0) {
-		if (!scsi_compliant && try == 0) {
-			len = hdlen;
-			/*
-			 * add sizeof page header (page # + len byte)
-			 * (should normaly result in len == 14)
-			 * this allowes to work with:
-			 * 	Quantum Q210S	(wants at least 13)
-			 * 	MD2x		(wants at least 4)
-			 */
-			len += 2;
-			try++;
-			goto again;
-		}
-		/* XXX if (!nowarn) */
-		errmsgno(EX_BAD,
-			"Warning: controller returns zero sized %s page.\n",
-								pagename);
-	}
-	if (!scsi_compliant &&
-	    (len < (int)(mp->p_len + hdlen + 2))) {
-		len = mp->p_len + hdlen + 2;
-
-		/* XXX if (!nowarn) */
-		errmsgno(EX_BAD,
-			"Warning: controller returns wrong size for %s page.\n",
-								pagename);
-	}
-	if (mp->p_code != page) {
-		/* XXX if (!nowarn) */
-		errmsgno(EX_BAD,
-			"Warning: controller returns wrong page %X for %s page (%X).\n",
-						mp->p_code, pagename, page);
-		return (FALSE);
-	}
-
-	if (lenp)
-		*lenp = len;
-	return (mp->p_len > 0);
-}
-#endif
-
-BOOL
-get_mode_params(SCSI *usalp, int page, char *pagename, Uchar *modep, 
-                Uchar *cmodep, Uchar *dmodep, Uchar *smodep, int *lenp)
-{
-	int	len;
-	BOOL	ret = TRUE;
-
-#ifdef	XXX
-	if (lenp)
-		*lenp = 0;
-	if (!has_mode_page(usalp, page, pagename, &len)) {
-		if (!usalp->silent) errmsgno(EX_BAD,
-			"Warning: controller does not support %s page.\n",
-								pagename);
-		return (FALSE);
-	}
-	if (lenp)
-		*lenp = len;
-#else
-	if (lenp == 0)
-		len = 0xFF;
-#endif
-
-	if (modep) {
-		fillbytes(modep, 0x100, '\0');
-		usalp->silent++;
-		(void) unit_ready(usalp);
-		usalp->silent--;
-		if (mode_sense(usalp, modep, len, page, 0) < 0) { /* Page x current */
-			errmsgno(EX_BAD, "Cannot get %s data.\n", pagename);
-			ret = FALSE;
-		} else if (usalp->verbose) {
-			usal_prbytes("Mode Sense Data", modep, len - usal_getresid(usalp));
-		}
-	}
-
-	if (cmodep) {
-		fillbytes(cmodep, 0x100, '\0');
-		usalp->silent++;
-		(void) unit_ready(usalp);
-		usalp->silent--;
-		if (mode_sense(usalp, cmodep, len, page, 1) < 0) { /* Page x change */
-			errmsgno(EX_BAD, "Cannot get %s mask.\n", pagename);
-			ret = FALSE;
-		} else if (usalp->verbose) {
-			usal_prbytes("Mode Sense Data", cmodep, len - usal_getresid(usalp));
-		}
-	}
-
-	if (dmodep) {
-		fillbytes(dmodep, 0x100, '\0');
-		usalp->silent++;
-		(void) unit_ready(usalp);
-		usalp->silent--;
-		if (mode_sense(usalp, dmodep, len, page, 2) < 0) { /* Page x default */
-			errmsgno(EX_BAD, "Cannot get default %s data.\n",
-								pagename);
-			ret = FALSE;
-		} else if (usalp->verbose) {
-			usal_prbytes("Mode Sense Data", dmodep, len - usal_getresid(usalp));
-		}
-	}
-
-	if (smodep) {
-		fillbytes(smodep, 0x100, '\0');
-		usalp->silent++;
-		(void) unit_ready(usalp);
-		usalp->silent--;
-		if (mode_sense(usalp, smodep, len, page, 3) < 0) { /* Page x saved */
-			errmsgno(EX_BAD, "Cannot get saved %s data.\n", pagename);
-			ret = FALSE;
-		} else if (usalp->verbose) {
-			usal_prbytes("Mode Sense Data", smodep, len - usal_getresid(usalp));
-		}
-	}
-
-	return (ret);
-}
-
-BOOL
-set_mode_params(SCSI *usalp, char *pagename, Uchar *modep, int len, int save, 
-                int secsize)
-{
-	int	i;
-
-	((struct scsi_modesel_header *)modep)->sense_data_len	= 0;
-	((struct scsi_modesel_header *)modep)->res2		= 0;
-
-	i = ((struct scsi_mode_header *)modep)->blockdesc_len;
-	if (i > 0) {
-		i_to_3_byte(
-			((struct scsi_mode_data *)modep)->blockdesc.nlblock,
-								0);
-		if (secsize >= 0)
-		i_to_3_byte(((struct scsi_mode_data *)modep)->blockdesc.lblen,
-							secsize);
-	}
-
-	usalp->silent++;
-	(void) unit_ready(usalp);
-	usalp->silent--;
-	if (save == 0 || mode_select(usalp, modep, len, save, usalp->inq->data_format >= 2) < 0) {
-		usalp->silent++;
-		(void) unit_ready(usalp);
-		usalp->silent--;
-		if (mode_select(usalp, modep, len, 0, usalp->inq->data_format >= 2) < 0) {
-			if (usalp->silent == 0) {
-				errmsgno(EX_BAD,
-					"Warning: using default %s data.\n",
-					pagename);
-				usal_prbytes("Mode Select Data", modep, len);
-			}
-			return (FALSE);
-		}
-	}
-	return (TRUE);
-}

Deleted: cdrkit/branches/experimental/wodim/scsi_cdr.c
===================================================================
--- cdrkit/branches/experimental/wodim/scsi_cdr.c	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/wodim/scsi_cdr.c	2006-11-28 13:48:17 UTC (rev 514)
@@ -1,2925 +0,0 @@
-/*
- * This file has been modified for the cdrkit suite.
- *
- * The behaviour and appearence of the program code below can differ to a major
- * extent from the version distributed by the original author(s).
- *
- * For details, see Changelog file distributed with the cdrkit package. If you
- * received this file from another source then ask the distributing person for
- * a log of modifications.
- *
- */
-
-/*
-XXX
-SIZEOF testen !!!
-*/
-/* @(#)scsi_cdr.c	1.137 04/05/25 Copyright 1995-2004 J. Schilling */
-#ifndef lint
-static	char sccsid[] =
-	"@(#)scsi_cdr.c	1.137 04/05/25 Copyright 1995-2004 J. Schilling";
-#endif
-/*
- *	SCSI command functions for cdrecord
- *	covering pre-MMC standard functions up to MMC-2
- *
- *	Copyright (c) 1995-2004 J. Schilling
- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; see the file COPYING.  If not, write to the Free Software
- * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-/*
- * NOTICE:	The Philips CDD 521 has several firmware bugs.
- *		One of them is not to respond to a SCSI selection
- *		within 200ms if the general load on the
- *		SCSI bus is high. To deal with this problem
- *		most of the SCSI commands are send with the
- *		SCG_CMD_RETRY flag enabled.
- */
-#include <mconfig.h>
-
-#include <stdio.h>
-#include <standard.h>
-#include <stdxlib.h>
-#include <unixstd.h>
-#include <fctldefs.h>
-#include <errno.h>
-#include <strdefs.h>
-#include <timedefs.h>
-
-#include <utypes.h>
-#include <btorder.h>
-#include <intcvt.h>
-#include <schily.h>
-
-#include <usal/usalcmd.h>
-#include <usal/scsidefs.h>
-#include <usal/scsireg.h>
-#include <usal/scsitransp.h>
-
-#include "scsimmc.h"
-#include "wodim.h"
-
-#define	strbeg(s1, s2)	(strstr((s2), (s1)) == (s2))
-
-BOOL	unit_ready(SCSI *usalp);
-BOOL	wait_unit_ready(SCSI *usalp, int secs);
-BOOL	scsi_in_progress(SCSI *usalp);
-BOOL	cdr_underrun(SCSI *usalp);
-int	test_unit_ready(SCSI *usalp);
-int	rezero_unit(SCSI *usalp);
-int	request_sense(SCSI *usalp);
-int	request_sense_b(SCSI *usalp, caddr_t bp, int cnt);
-int	inquiry(SCSI *usalp, caddr_t, int);
-int	read_capacity(SCSI *usalp);
-void	print_capacity(SCSI *usalp, FILE *f);
-int	scsi_load_unload(SCSI *usalp, int);
-int	scsi_prevent_removal(SCSI *usalp, int);
-int	scsi_start_stop_unit(SCSI *usalp, int, int, BOOL immed);
-int	scsi_set_speed(SCSI *usalp, int readspeed, int writespeed, int rotctl);
-int	scsi_get_speed(SCSI *usalp, int *readspeedp, int *writespeedp);
-int	qic02(SCSI *usalp, int);
-int	write_xscsi(SCSI *usalp, caddr_t, long, long, int);
-int	write_xg0(SCSI *usalp, caddr_t, long, long, int);
-int	write_xg1(SCSI *usalp, caddr_t, long, long, int);
-int	write_xg5(SCSI *usalp, caddr_t, long, long, int);
-int	seek_scsi(SCSI *usalp, long addr);
-int	seek_g0(SCSI *usalp, long addr);
-int	seek_g1(SCSI *usalp, long addr);
-int	scsi_flush_cache(SCSI *usalp, BOOL immed);
-int	read_buffer(SCSI *usalp, caddr_t bp, int cnt, int mode);
-int	write_buffer(SCSI *usalp, char *buffer, long length, int mode, 
-						 int bufferid, long offset);
-int	read_subchannel(SCSI *usalp, caddr_t bp, int track, int cnt, int msf, 
-							 int subq, int fmt);
-int	read_toc(SCSI *usalp, caddr_t, int, int, int, int);
-int	read_toc_philips(SCSI *usalp, caddr_t, int, int, int, int);
-int	read_header(SCSI *usalp, caddr_t, long, int, int);
-int	read_disk_info(SCSI *usalp, caddr_t, int);
-int	read_track_info(SCSI *usalp, caddr_t, int type, int addr, int cnt);
-int	read_rzone_info(SCSI *usalp, caddr_t bp, int cnt);
-int	reserve_tr_rzone(SCSI *usalp, long size);
-int	read_dvd_structure(SCSI *usalp, caddr_t bp, int cnt, int addr, int layer, 
-								 int fmt);
-int	send_dvd_structure(SCSI *usalp, caddr_t bp, int cnt, int layer, int fmt);
-int	send_opc(SCSI *usalp, caddr_t, int cnt, int doopc);
-int	read_track_info_philips(SCSI *usalp, caddr_t, int, int);
-int	scsi_close_tr_session(SCSI *usalp, int type, int track, BOOL immed);
-int	read_master_cue(SCSI *usalp, caddr_t bp, int sheet, int cnt);
-int	send_cue_sheet(SCSI *usalp, caddr_t bp, long size);
-int	read_buff_cap(SCSI *usalp, long *, long *);
-int	scsi_blank(SCSI *usalp, long addr, int blanktype, BOOL immed);
-int	scsi_format(SCSI *usalp, caddr_t addr, int size, BOOL background);
-int	scsi_set_streaming(SCSI *usalp, caddr_t addr, int size);
-BOOL	allow_atapi(SCSI *usalp, BOOL new);
-int	mode_select(SCSI *usalp, Uchar *, int, int, int);
-int	mode_sense(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
-int	mode_select_sg0(SCSI *usalp, Uchar *, int, int, int);
-int	mode_sense_sg0(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
-int	mode_select_g0(SCSI *usalp, Uchar *, int, int, int);
-int	mode_select_g1(SCSI *usalp, Uchar *, int, int, int);
-int	mode_sense_g0(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
-int	mode_sense_g1(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
-int	read_tochdr(SCSI *usalp, cdr_t *, int *, int *);
-int	read_cdtext(SCSI *usalp);
-int	read_trackinfo(SCSI *usalp, int, long *, struct msf *, int *, int *, 
-							int *);
-int	read_B0(SCSI *usalp, BOOL isbcd, long *b0p, long *lop);
-int	read_session_offset(SCSI *usalp, long *);
-int	read_session_offset_philips(SCSI *usalp, long *);
-int	sense_secsize(SCSI *usalp, int current);
-int	select_secsize(SCSI *usalp, int);
-BOOL	is_cddrive(SCSI *usalp);
-BOOL	is_unknown_dev(SCSI *usalp);
-int	read_scsi(SCSI *usalp, caddr_t, long, int);
-int	read_g0(SCSI *usalp, caddr_t, long, int);
-int	read_g1(SCSI *usalp, caddr_t, long, int);
-BOOL	getdev(SCSI *usalp, BOOL);
-void	printinq(SCSI *usalp, FILE *f);
-void	printdev(SCSI *usalp);
-BOOL	do_inquiry(SCSI *usalp, BOOL);
-BOOL	recovery_needed(SCSI *usalp, cdr_t *);
-int	scsi_load(SCSI *usalp, cdr_t *);
-int	scsi_unload(SCSI *usalp, cdr_t *);
-int	scsi_cdr_write(SCSI *usalp, caddr_t bp, long sectaddr, long size, 
-							int blocks, BOOL islast);
-struct cd_mode_page_2A * mmc_cap(SCSI *usalp, Uchar *modep);
-void	mmc_getval(struct cd_mode_page_2A *mp, BOOL *cdrrp, BOOL *cdwrp, 
-					  BOOL *cdrrwp, BOOL *cdwrwp, BOOL *dvdp, BOOL *dvdwp);
-BOOL	is_mmc(SCSI *usalp, BOOL *cdwp, BOOL *dvdwp);
-BOOL	mmc_check(SCSI *usalp, BOOL *cdrrp, BOOL *cdwrp, BOOL *cdrrwp, 
-					 BOOL *cdwrwp, BOOL *dvdp, BOOL *dvdwp);
-static	void	print_speed(char *fmt, int val);
-void	print_capabilities(SCSI *usalp);
-
-BOOL
-unit_ready(SCSI *usalp)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	if (test_unit_ready(usalp) >= 0)		/* alles OK */
-		return (TRUE);
-	else if (scmd->error >= SCG_FATAL)	/* nicht selektierbar */
-		return (FALSE);
-
-	if (usal_sense_key(usalp) == SC_UNIT_ATTENTION) {
-		if (test_unit_ready(usalp) >= 0)	/* alles OK */
-			return (TRUE);
-	}
-	if ((usal_cmd_status(usalp) & ST_BUSY) != 0) {
-		/*
-		 * Busy/reservation_conflict
-		 */
-		usleep(500000);
-		if (test_unit_ready(usalp) >= 0)	/* alles OK */
-			return (TRUE);
-	}
-	if (usal_sense_key(usalp) == -1) {	/* non extended Sense */
-		if (usal_sense_code(usalp) == 4)	/* NOT_READY */
-			return (FALSE);
-		return (TRUE);
-	}
-						/* FALSE wenn NOT_READY */
-	return (usal_sense_key(usalp) != SC_NOT_READY);
-}
-
-BOOL
-wait_unit_ready(SCSI *usalp, int secs)
-{
-	int	i;
-	int	c;
-	int	k;
-	int	ret;
-
-	usalp->silent++;
-	ret = test_unit_ready(usalp);		/* eat up unit attention */
-	if (ret < 0)
-		ret = test_unit_ready(usalp);	/* got power on condition? */
-	usalp->silent--;
-
-	if (ret >= 0)				/* success that's enough */
-		return (TRUE);
-
-	usalp->silent++;
-	for (i = 0; i < secs && (ret = test_unit_ready(usalp)) < 0; i++) {
-		if (usalp->scmd->scb.busy != 0) {
-			sleep(1);
-			continue;
-		}
-		c = usal_sense_code(usalp);
-		k = usal_sense_key(usalp);
-		/*
-		 * Abort quickly if it does not make sense to wait.
-		 * 0x30 == Cannot read medium
-		 * 0x3A == Medium not present
-		 */
-		if ((k == SC_NOT_READY && (c == 0x3A || c == 0x30)) ||
-		    (k == SC_MEDIUM_ERROR)) {
-			if (usalp->silent <= 1)
-				usal_printerr(usalp);
-			usalp->silent--;
-			return (FALSE);
-		}
-		sleep(1);
-	}
-	usalp->silent--;
-	if (ret < 0)
-		return (FALSE);
-	return (TRUE);
-}
-
-BOOL
-scsi_in_progress(SCSI *usalp)
-{
-	if (usal_sense_key(usalp) == SC_NOT_READY &&
-		/*
-		 * Logigal unit not ready operation/long_write in progress
-		 */
-	    usal_sense_code(usalp) == 0x04 &&
-	    (usal_sense_qual(usalp) == 0x04 || /* CyberDr. "format in progress"*/
-	    usal_sense_qual(usalp) == 0x07 || /* "operation in progress"	    */
-	    usal_sense_qual(usalp) == 0x08)) { /* "long write in progress"    */
-		return (TRUE);
-	} else {
-		if (usalp->silent <= 1)
-			usal_printerr(usalp);
-	}
-	return (FALSE);
-}
-
-BOOL
-cdr_underrun(SCSI *usalp)
-{
-	if ((usal_sense_key(usalp) != SC_ILLEGAL_REQUEST &&
-	    usal_sense_key(usalp) != SC_MEDIUM_ERROR))
-		return (FALSE);
-
-	if ((usal_sense_code(usalp) == 0x21 &&
-	    (usal_sense_qual(usalp) == 0x00 ||	/* logical block address out of range */
-	    usal_sense_qual(usalp) == 0x02)) ||	/* invalid address for write */
-
-	    (usal_sense_code(usalp) == 0x0C &&
-	    usal_sense_qual(usalp) == 0x09)) {	/* write error - loss of streaming */
-		return (TRUE);
-	}
-	/*
-	 * XXX Bei manchen Brennern kommt mach dem der Brennvorgang bereits
-	 * XXX eine Weile gelaufen ist ein 5/24/0 Invalid field in CDB.
-	 * XXX Daher sollte man testen ob schon geschrieben wurde...
-	 */
-	return (FALSE);
-}
-
-int
-test_unit_ready(SCSI *usalp)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = (caddr_t)0;
-	scmd->size = 0;
-	scmd->flags = SCG_DISRE_ENA | (usalp->silent ? SCG_SILENT:0);
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = SC_TEST_UNIT_READY;
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-
-	usalp->cmdname = "test unit ready";
-
-	return (usal_cmd(usalp));
-}
-
-int
-rezero_unit(SCSI *usalp)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = (caddr_t)0;
-	scmd->size = 0;
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = SC_REZERO_UNIT;
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-
-	usalp->cmdname = "rezero unit";
-
-	return (usal_cmd(usalp));
-}
-
-int
-request_sense(SCSI *usalp)
-{
-		char	sensebuf[CCS_SENSE_LEN];
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = sensebuf;
-	scmd->size = sizeof (sensebuf);
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = SC_REQUEST_SENSE;
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g0_cdb.count = CCS_SENSE_LEN;
-
-	usalp->cmdname = "request_sense";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	usal_prsense((Uchar *)sensebuf, CCS_SENSE_LEN - usal_getresid(usalp));
-	return (0);
-}
-
-int
-request_sense_b(SCSI *usalp, caddr_t bp, int cnt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = SC_REQUEST_SENSE;
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g0_cdb.count = cnt;
-
-	usalp->cmdname = "request_sense";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-inquiry(SCSI *usalp, caddr_t bp, int cnt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes(bp, cnt, '\0');
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = SC_INQUIRY;
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g0_cdb.count = cnt;
-
-	usalp->cmdname = "inquiry";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	if (usalp->verbose)
-		usal_prbytes("Inquiry Data   :", (Uchar *)bp, cnt - usal_getresid(usalp));
-	return (0);
-}
-
-int
-read_capacity(SCSI *usalp)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = (caddr_t)usalp->cap;
-	scmd->size = sizeof (struct scsi_capacity);
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x25;	/* Read Capacity */
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	g1_cdblen(&scmd->cdb.g1_cdb, 0); /* Full Media */
-
-	usalp->cmdname = "read capacity";
-
-	if (usal_cmd(usalp) < 0) {
-		return (-1);
-	} else {
-		long	cbsize;
-		long	cbaddr;
-
-		/*
-		 * c_bsize & c_baddr are signed Int32_t
-		 * so we use signed int conversion here.
-		 */
-		cbsize = a_to_4_byte(&usalp->cap->c_bsize);
-		cbaddr = a_to_4_byte(&usalp->cap->c_baddr);
-		usalp->cap->c_bsize = cbsize;
-		usalp->cap->c_baddr = cbaddr;
-	}
-	return (0);
-}
-
-void
-print_capacity(SCSI *usalp, FILE *f)
-{
-	long	kb;
-	long	mb;
-	long	prmb;
-	double	dkb;
-
-	dkb =  (usalp->cap->c_baddr+1.0) * (usalp->cap->c_bsize/1024.0);
-	kb = dkb;
-	mb = dkb / 1024.0;
-	prmb = dkb / 1000.0 * 1.024;
-	fprintf(f, "Capacity: %ld Blocks = %ld kBytes = %ld MBytes = %ld prMB\n",
-		(long)usalp->cap->c_baddr+1, kb, mb, prmb);
-	fprintf(f, "Sectorsize: %ld Bytes\n", (long)usalp->cap->c_bsize);
-}
-
-int
-scsi_load_unload(SCSI *usalp, int load)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G5_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g5_cdb.cmd = 0xA6;
-	scmd->cdb.g5_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g5_cdb.addr[1] = load?3:2;
-	scmd->cdb.g5_cdb.count[2] = 0; /* slot # */
-
-	usalp->cmdname = "medium load/unload";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-scsi_prevent_removal(SCSI *usalp, int prevent)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = 0x1E;
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g0_cdb.count = prevent & 1;
-
-	usalp->cmdname = "prevent/allow medium removal";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-
-int
-scsi_start_stop_unit(SCSI *usalp, int flg, int loej, BOOL immed)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = 0x1B;	/* Start Stop Unit */
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g0_cdb.count = (flg ? 1:0) | (loej ? 2:0);
-
-	if (immed)
-		scmd->cdb.cmd_cdb[1] |= 0x01;
-
-	usalp->cmdname = "start/stop unit";
-
-	return (usal_cmd(usalp));
-}
-
-int
-scsi_set_streaming(SCSI *usalp, caddr_t perf_desc, int size)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = perf_desc;
-	scmd->size = size;
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G5_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g5_cdb.cmd = 0xB6;
-	scmd->cdb.cmd_cdb[11] = 0;
-	scmd->cdb.cmd_cdb[10] = size;
-
-	usalp->cmdname = "set streaming";
-
-  if(usalp->verbose) 
-     fprintf(stderr, "scsi_set_streaming\n");
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-    
-int
-scsi_set_speed(SCSI *usalp, int readspeed, int writespeed, int rotctl)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G5_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g5_cdb.cmd = 0xBB;
-	scmd->cdb.g5_cdb.lun = usal_lun(usalp);
-
-	if (readspeed < 0)
-		i_to_2_byte(&scmd->cdb.g5_cdb.addr[0], 0xFFFF);
-	else
-		i_to_2_byte(&scmd->cdb.g5_cdb.addr[0], readspeed);
-	if (writespeed < 0)
-		i_to_2_byte(&scmd->cdb.g5_cdb.addr[2], 0xFFFF);
-	else
-		i_to_2_byte(&scmd->cdb.g5_cdb.addr[2], writespeed);
-
-	scmd->cdb.cmd_cdb[1] |= rotctl & 0x03;
-
-	usalp->cmdname = "set cd speed";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-scsi_get_speed(SCSI *usalp, int *readspeedp, int *writespeedp)
-{
-	struct	cd_mode_page_2A *mp;
-	Uchar	m[256];
-	int	val;
-
-	usalp->silent++;
-	mp = mmc_cap(usalp, m); /* Get MMC capabilities in allocated mp */
-	usalp->silent--;
-	if (mp == NULL)
-		return (-1);	/* Pre SCSI-3/mmc drive		*/
-
-	val = a_to_u_2_byte(mp->cur_read_speed);
-	if (readspeedp)
-		*readspeedp = val;
-
-	if (mp->p_len >= 28)
-		val = a_to_u_2_byte(mp->v3_cur_write_speed);
-	else
-		val = a_to_u_2_byte(mp->cur_write_speed);
-	if (writespeedp)
-		*writespeedp = val;
-
-	return (0);
-}
-
-
-int
-qic02(SCSI *usalp, int cmd)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = (caddr_t)0;
-	scmd->size = 0;
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = DEF_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = 0x0D;	/* qic02 Sysgen SC4000 */
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g0_cdb.mid_addr = cmd;
-
-	usalp->cmdname = "qic 02";
-	return (usal_cmd(usalp));
-}
-
-#define	G0_MAXADDR	0x1FFFFFL
-
-int 
-write_xscsi(SCSI *usalp, caddr_t bp, long addr, long size, int cnt)
-{
-	if (addr <= G0_MAXADDR)
-		return (write_xg0(usalp, bp, addr, size, cnt));
-	else
-		return (write_xg1(usalp, bp, addr, size, cnt));
-}
-
-int 
-write_xg0(SCSI *usalp, 
-          caddr_t bp    /* address of buffer */, 
-          long addr     /* disk address (sector) to put */, 
-          long size     /* number of bytes to transfer */, 
-          int cnt       /* sectorcount */)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = size;
-	scmd->flags = SCG_DISRE_ENA|SCG_CMD_RETRY;
-/*	scmd->flags = SCG_DISRE_ENA;*/
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = SC_WRITE;
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-	g0_cdbaddr(&scmd->cdb.g0_cdb, addr);
-	scmd->cdb.g0_cdb.count = cnt;
-
-	usalp->cmdname = "write_g0";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (size - usal_getresid(usalp));
-}
-
-int 
-write_xg1(SCSI *usalp, 
-          caddr_t bp    /* address of buffer */, 
-          long addr     /* disk address (sector) to put */, 
-          long size     /* number of bytes to transfer */, 
-          int cnt       /* sectorcount */)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = size;
-	scmd->flags = SCG_DISRE_ENA|SCG_CMD_RETRY;
-/*	scmd->flags = SCG_DISRE_ENA;*/
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = SC_EWRITE;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	g1_cdbaddr(&scmd->cdb.g1_cdb, addr);
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "write_g1";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (size - usal_getresid(usalp));
-}
-
-int 
-write_xg5(SCSI *usalp,
-          caddr_t bp    /* address of buffer */, 
-          long addr     /* disk address (sector) to put */, 
-          long size     /* number of bytes to transfer */, 
-          int cnt       /* sectorcount */)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = size;
-	scmd->flags = SCG_DISRE_ENA|SCG_CMD_RETRY;
-/*	scmd->flags = SCG_DISRE_ENA;*/
-	scmd->cdb_len = SC_G5_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g5_cdb.cmd = 0xAA;
-	scmd->cdb.g5_cdb.lun = usal_lun(usalp);
-	g5_cdbaddr(&scmd->cdb.g5_cdb, addr);
-	g5_cdblen(&scmd->cdb.g5_cdb, cnt);
-
-	usalp->cmdname = "write_g5";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (size - usal_getresid(usalp));
-}
-
-int
-seek_scsi(SCSI *usalp, long addr)
-{
-	if (addr <= G0_MAXADDR)
-		return (seek_g0(usalp, addr));
-	else
-		return (seek_g1(usalp, addr));
-}
-
-int
-seek_g0(SCSI *usalp, long addr)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = 0x0B;	/* Seek */
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-	g0_cdbaddr(&scmd->cdb.g0_cdb, addr);
-
-	usalp->cmdname = "seek_g0";
-
-	return (usal_cmd(usalp));
-}
-
-int
-seek_g1(SCSI *usalp, long addr)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x2B;	/* Seek G1 */
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	g1_cdbaddr(&scmd->cdb.g1_cdb, addr);
-
-	usalp->cmdname = "seek_g1";
-
-	return (usal_cmd(usalp));
-}
-
-int
-scsi_flush_cache(SCSI *usalp, BOOL immed)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->timeout = 2 * 60;		/* Max: sizeof (CDR-cache)/150KB/s */
-	scmd->cdb.g1_cdb.cmd = 0x35;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-
-	if (immed)
-		scmd->cdb.cmd_cdb[1] |= 0x02;
-
-	usalp->cmdname = "flush cache";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-read_buffer(SCSI *usalp, caddr_t bp, int cnt, int mode)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->dma_read = 1;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x3C;	/* Read Buffer */
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	scmd->cdb.cmd_cdb[1] |= (mode & 7);
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "read buffer";
-
-	return (usal_cmd(usalp));
-}
-
-int
-write_buffer(SCSI *usalp, char *buffer, long length, int mode, int bufferid, 
-             long offset)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-	char			*cdb;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = buffer;
-	scmd->size = length;
-	scmd->flags = SCG_DISRE_ENA|SCG_CMD_RETRY;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-
-	cdb = (char *)scmd->cdb.cmd_cdb;
-
-	cdb[0] = 0x3B;
-	cdb[1] = mode & 7;
-	cdb[2] = bufferid;
-	cdb[3] = offset >> 16;
-	cdb[4] = (offset >> 8) & 0xff;
-	cdb[5] = offset & 0xff;
-	cdb[6] = length >> 16;
-	cdb[7] = (length >> 8) & 0xff;
-	cdb[8] = length & 0xff;
-
-	usalp->cmdname = "write_buffer";
-
-	if (usal_cmd(usalp) >= 0)
-		return (1);
-	return (0);
-}
-
-int
-read_subchannel(SCSI *usalp, caddr_t bp, int track, int cnt, int msf, int subq, 
-					 int fmt)
-
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x42;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	if (msf)
-		scmd->cdb.g1_cdb.res = 1;
-	if (subq)
-		scmd->cdb.g1_cdb.addr[0] = 0x40;
-	scmd->cdb.g1_cdb.addr[1] = fmt;
-	scmd->cdb.g1_cdb.res6 = track;
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "read subchannel";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-read_toc(SCSI *usalp, caddr_t bp, int track, int cnt, int msf, int fmt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x43;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	if (msf)
-		scmd->cdb.g1_cdb.res = 1;
-	scmd->cdb.g1_cdb.addr[0] = fmt & 0x0F;
-	scmd->cdb.g1_cdb.res6 = track;
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "read toc";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-read_toc_philips(SCSI *usalp, caddr_t bp, int track, int cnt, int msf, int fmt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->timeout = 4 * 60;		/* May last  174s on a TEAC CD-R55S */
-	scmd->cdb.g1_cdb.cmd = 0x43;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	if (msf)
-		scmd->cdb.g1_cdb.res = 1;
-	scmd->cdb.g1_cdb.res6 = track;
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	if (fmt & 1)
-		scmd->cdb.g1_cdb.vu_96 = 1;
-	if (fmt & 2)
-		scmd->cdb.g1_cdb.vu_97 = 1;
-
-	usalp->cmdname = "read toc";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-read_header(SCSI *usalp, caddr_t bp, long addr, int cnt, int msf)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x44;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	if (msf)
-		scmd->cdb.g1_cdb.res = 1;
-	g1_cdbaddr(&scmd->cdb.g1_cdb, addr);
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "read header";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-read_disk_info(SCSI *usalp, caddr_t bp, int cnt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->timeout = 4 * 60;		/* Needs up to 2 minutes */
-	scmd->cdb.g1_cdb.cmd = 0x51;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "read disk info";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-read_track_info(SCSI *usalp, caddr_t bp, int type, int addr, int cnt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->timeout = 4 * 60;		/* Needs up to 2 minutes */
-	scmd->cdb.g1_cdb.cmd = 0x52;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-/*	scmd->cdb.cmd_cdb[1] = type & 0x03;*/
-	scmd->cdb.cmd_cdb[1] = type;
-	g1_cdbaddr(&scmd->cdb.g1_cdb, addr);	/* LBA/Track/Session */
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "read track info";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-reserve_track(SCSI *usalp, Ulong size)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x53;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	i_to_4_byte(&scmd->cdb.g1_cdb.addr[3], size);
-
-	usalp->cmdname = "reserve track";
-
-	if (usal_cmd(usalp) < 0) 
-		return (-1);
-
-	return (0);
-
-}
-
-int
-read_rzone_info(SCSI *usalp, caddr_t bp, int cnt)
-{
-	return (read_track_info(usalp, bp, TI_TYPE_LBA, 0, cnt));
-}
-
-int
-reserve_tr_rzone(SCSI *usalp, long size /* number of blocks */)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = (caddr_t)0;
-	scmd->size = 0;
-	scmd->flags = SCG_DISRE_ENA|SCG_CMD_RETRY;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x53;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-
-	i_to_4_byte(&scmd->cdb.g1_cdb.addr[3], size);
-
-	usalp->cmdname = "reserve_track_rzone";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-read_dvd_structure(SCSI *usalp, caddr_t bp, int cnt, int addr, int layer, 
-                   int fmt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G5_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->timeout = 4 * 60;		/* Needs up to 2 minutes ??? */
-	scmd->cdb.g5_cdb.cmd = 0xAD;
-	scmd->cdb.g5_cdb.lun = usal_lun(usalp);
-	g5_cdbaddr(&scmd->cdb.g5_cdb, addr);
-	g5_cdblen(&scmd->cdb.g5_cdb, cnt);
-	scmd->cdb.g5_cdb.count[0] = layer;
-	scmd->cdb.g5_cdb.count[1] = fmt;
-
-	usalp->cmdname = "read dvd structure";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-send_dvd_structure(SCSI *usalp, caddr_t bp, int cnt, int layer, int fmt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G5_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->timeout = 4 * 60;		/* Needs up to 2 minutes ??? */
-	scmd->cdb.g5_cdb.cmd = 0xBF;
-	scmd->cdb.g5_cdb.lun = usal_lun(usalp);
-	g5_cdblen(&scmd->cdb.g5_cdb, cnt);
-
-	scmd->cdb.cmd_cdb[7] = fmt;
-
-	usalp->cmdname = "send dvd structure";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-send_opc(SCSI *usalp, caddr_t bp, int cnt, int doopc)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->timeout = 60;
-	scmd->cdb.g1_cdb.cmd = 0x54;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g1_cdb.reladr = doopc?1:0;
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "send opc";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-read_track_info_philips(SCSI *usalp, caddr_t bp, int track, int cnt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0xE5;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	g1_cdbaddr(&scmd->cdb.g1_cdb, track);
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "read track info";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-scsi_close_tr_session(SCSI *usalp, int type, int track, BOOL immed)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->timeout = 8 * 60;		/* Needs up to 4 minutes */
-	scmd->cdb.g1_cdb.cmd = 0x5B;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g1_cdb.addr[0] = type;
-	scmd->cdb.g1_cdb.addr[3] = track;
-
-	if (immed)
-		scmd->cdb.g1_cdb.reladr = 1;
-/*		scmd->cdb.cmd_cdb[1] |= 0x01;*/
-#ifdef	nono
-	scmd->cdb.g1_cdb.reladr = 1;	/* IMM hack to test Mitsumi behaviour*/
-#endif
-
-	usalp->cmdname = "close track/session";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-read_master_cue(SCSI *usalp, caddr_t bp, int sheet, int cnt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x59;		/* Read master cue */
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g1_cdb.addr[2] = sheet;
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "read master cue";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (0);
-}
-
-int
-send_cue_sheet(SCSI *usalp, caddr_t bp, long size)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = size;
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x5D;	/* Send CUE sheet */
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	g1_cdblen(&scmd->cdb.g1_cdb, size);
-
-	usalp->cmdname = "send_cue_sheet";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	return (size - scmd->resid);
-}
-
-int
-read_buff_cap(SCSI *usalp, long *sp, long *fp)
-{
-	char	resp[12];
-	Ulong	freespace;
-	Ulong	bufsize;
-	int	per;
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = (caddr_t)resp;
-	scmd->size = sizeof (resp);
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x5C;		/* Read buffer cap */
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	g1_cdblen(&scmd->cdb.g1_cdb, sizeof (resp));
-
-	usalp->cmdname = "read buffer cap";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-
-	bufsize   = a_to_u_4_byte(&resp[4]);
-	freespace = a_to_u_4_byte(&resp[8]);
-	if (sp)
-		*sp = bufsize;
-	if (fp)
-		*fp = freespace;
-
-	if (usalp->verbose || (sp == 0 && fp == 0))
-		printf("BFree: %ld K BSize: %ld K\n", freespace >> 10, bufsize >> 10);
-
-	if (bufsize == 0)
-		return (0);
-	per = (100 * (bufsize - freespace)) / bufsize;
-	if (per < 0)
-		return (0);
-	if (per > 100)
-		return (100);
-	return (per);
-}
-
-int
-scsi_blank(SCSI *usalp, long addr, int blanktype, BOOL immed)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G5_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->timeout = 160 * 60; /* full blank at 1x could take 80 minutes */
-	scmd->cdb.g5_cdb.cmd = 0xA1;	/* Blank */
-	scmd->cdb.g0_cdb.high_addr = blanktype;
-	g1_cdbaddr(&scmd->cdb.g5_cdb, addr);
-
-	if (immed)
-		scmd->cdb.g5_cdb.res |= 8;
-/*		scmd->cdb.cmd_cdb[1] |= 0x10;*/
-
-	usalp->cmdname = "blank unit";
-
-	return (usal_cmd(usalp));
-}
-
-int
-scsi_format(SCSI *usalp, caddr_t addr, int size, BOOL background)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-	int progress=0, ret=-1, pid=-1;
-	unsigned char sense_table[18];
-	int i;
-	
-	printf("scsi_format: preparing\n");
-
-	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');
-	scmd->addr = addr;
-	scmd->size = size;
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G5_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->timeout = 160 * 60;     /* Do not know what to set */
-	scmd->cdb.g5_cdb.cmd = 0x04;   /* Format Unit */
-	scmd->cdb.cmd_cdb[1] = 0x11;  /* "FmtData" and "Format Code" */
-	scmd->cdb.cmd_cdb[5] = 0;
-
-	usalp->cmdname = "format unit";
-
-	printf("scsi_format: running\n");
-	ret = (usal_cmd(usalp));
-	printf("scsi_format: post processing %d\n", ret);
-	if (ret == -1) return ret;
-	if (background) {
-		if ((pid=fork()) == (pid_t)-1)
-			perror ("- [unable to fork()]");
-		else {
-			if (!pid) {
-			    while (1) {
-				if (test_unit_ready(usalp) >= 0)
-				    break;
-				sleep(1);
-			    }
-			    return ret;
-			}
-		}
-	}
-	printf("Formating in progress: 0.00 %% done.");
-	sleep(20);
-	i = 0;
-	while (progress < 0xfff0 && !(progress == 0 && i > 50)) {
-		test_unit_ready(usalp);
-		request_sense_b(usalp, (caddr_t)sense_table, 18);
-		progress = sense_table[16]<<8|sense_table[17];
-		printf("\rFormating in progress: %.2f %% done [%d].                           ", (float)(progress*100)/0x10000,progress);
-		usleep(100000);
-		i++;
-		/*for (i=0; i < 18; i++) {
-		    printf("%d ", sense_table[i]);
-		}*/
-	}
-	sleep(10);
-	printf("\rFormating in progress: 100.00 %% done.        \n");
-	if (pid) exit (0);
-	return ret;
-}
-
-/*
- * XXX First try to handle ATAPI:
- * XXX ATAPI cannot handle SCSI 6 byte commands.
- * XXX We try to simulate 6 byte mode sense/select.
- */
-static BOOL	is_atapi;
-
-BOOL
-allow_atapi(SCSI *usalp, BOOL new)
-{
-	BOOL	old = is_atapi;
-	Uchar	mode[256];
-
-	if (new == old)
-		return (old);
-
-	usalp->silent++;
-	/*
-	 * If a bad drive has been reset before, we may need to fire up two
-	 * test unit ready commands to clear status.
-	 */
-	(void) unit_ready(usalp);
-	if (new &&
-	    mode_sense_g1(usalp, mode, 8, 0x3F, 0) < 0) {	/* All pages current */
-		new = FALSE;
-	}
-	usalp->silent--;
-
-	is_atapi = new;
-	return (old);
-}
-
-int
-mode_select(SCSI *usalp, Uchar *dp, int cnt, int smp, int pf)
-{
-	if (is_atapi)
-		return (mode_select_sg0(usalp, dp, cnt, smp, pf));
-	return (mode_select_g0(usalp, dp, cnt, smp, pf));
-}
-
-int
-mode_sense(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf)
-{
-	if (is_atapi)
-		return (mode_sense_sg0(usalp, dp, cnt, page, pcf));
-	return (mode_sense_g0(usalp, dp, cnt, page, pcf));
-}
-
-/*
- * Simulate mode select g0 with mode select g1.
- */
-int
-mode_select_sg0(SCSI *usalp, Uchar *dp, int cnt, int smp, int pf)
-{
-	Uchar	xmode[256+4];
-	int	amt = cnt;
-
-	if (amt < 1 || amt > 255) {
-		/* XXX clear SCSI error codes ??? */
-		return (-1);
-	}
-
-	if (amt < 4) {		/* Data length. medium type & VU */
-		amt += 1;
-	} else {
-		amt += 4;
-		movebytes(&dp[4], &xmode[8], cnt-4);
-	}
-	xmode[0] = 0;
-	xmode[1] = 0;
-	xmode[2] = dp[1];
-	xmode[3] = dp[2];
-	xmode[4] = 0;
-	xmode[5] = 0;
-	i_to_2_byte(&xmode[6], (unsigned int)dp[3]);
-
-	if (usalp->verbose) usal_prbytes("Mode Parameters (un-converted)", dp, cnt);
-
-	return (mode_select_g1(usalp, xmode, amt, smp, pf));
-}
-
-/*
- * Simulate mode sense g0 with mode sense g1.
- */
-int
-mode_sense_sg0(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf)
-{
-	Uchar	xmode[256+4];
-	int	amt = cnt;
-	int	len;
-
-	if (amt < 1 || amt > 255) {
-		/* XXX clear SCSI error codes ??? */
-		return (-1);
-	}
-
-	fillbytes((caddr_t)xmode, sizeof (xmode), '\0');
-	if (amt < 4) {		/* Data length. medium type & VU */
-		amt += 1;
-	} else {
-		amt += 4;
-	}
-	if (mode_sense_g1(usalp, xmode, amt, page, pcf) < 0)
-		return (-1);
-
-	amt = cnt - usal_getresid(usalp);
-/*
- * For tests: Solaris 8 & LG CD-ROM always returns resid == amt
- */
-/*	amt = cnt;*/
-	if (amt > 4)
-		movebytes(&xmode[8], &dp[4], amt-4);
-	len = a_to_u_2_byte(xmode);
-	if (len == 0) {
-		dp[0] = 0;
-	} else if (len < 6) {
-		if (len > 2)
-			len = 2;
-		dp[0] = len;
-	} else {
-		dp[0] = len - 3;
-	}
-	dp[1] = xmode[2];
-	dp[2] = xmode[3];
-	len = a_to_u_2_byte(&xmode[6]);
-	dp[3] = len;
-
-	if (usalp->verbose) usal_prbytes("Mode Sense Data (converted)", dp, amt);
-	return (0);
-}
-
-int
-mode_select_g0(SCSI *usalp, Uchar *dp, int cnt, int smp, int pf)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = (caddr_t)dp;
-	scmd->size = cnt;
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = SC_MODE_SELECT;
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g0_cdb.high_addr = smp ? 1 : 0 | pf ? 0x10 : 0;
-	scmd->cdb.g0_cdb.count = cnt;
-
-	if (usalp->verbose) {
-		fprintf(stderr, "%s ", smp?"Save":"Set ");
-		usal_prbytes("Mode Parameters", dp, cnt);
-	}
-
-	usalp->cmdname = "mode select g0";
-
-	return (usal_cmd(usalp));
-}
-
-int
-mode_select_g1(SCSI *usalp, Uchar *dp, int cnt, int smp, int pf)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = (caddr_t)dp;
-	scmd->size = cnt;
-	scmd->flags = SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x55;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	scmd->cdb.g0_cdb.high_addr = smp ? 1 : 0 | pf ? 0x10 : 0;
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	if (usalp->verbose) {
-		printf("%s ", smp?"Save":"Set ");
-		usal_prbytes("Mode Parameters", dp, cnt);
-	}
-
-	usalp->cmdname = "mode select g1";
-
-	return (usal_cmd(usalp));
-}
-
-int
-mode_sense_g0(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = (caddr_t)dp;
-	scmd->size = 0xFF;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = SC_MODE_SENSE;
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-#ifdef	nonono
-	scmd->cdb.g0_cdb.high_addr = 1<<4;	/* DBD Disable Block desc. */
-#endif
-	scmd->cdb.g0_cdb.mid_addr = (page&0x3F) | ((pcf<<6)&0xC0);
-	scmd->cdb.g0_cdb.count = page ? 0xFF : 24;
-	scmd->cdb.g0_cdb.count = cnt;
-
-	usalp->cmdname = "mode sense g0";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	if (usalp->verbose) usal_prbytes("Mode Sense Data", dp, cnt - usal_getresid(usalp));
-	return (0);
-}
-
-int
-mode_sense_g1(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = (caddr_t)dp;
-	scmd->size = cnt;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = 0x5A;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-#ifdef	nonono
-	scmd->cdb.g0_cdb.high_addr = 1<<4;	/* DBD Disable Block desc. */
-#endif
-	scmd->cdb.g1_cdb.addr[0] = (page&0x3F) | ((pcf<<6)&0xC0);
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "mode sense g1";
-
-	if (usal_cmd(usalp) < 0)
-		return (-1);
-	if (usalp->verbose) usal_prbytes("Mode Sense Data", dp, cnt - usal_getresid(usalp));
-	return (0);
-}
-
-struct trackdesc {
-	Uchar	res0;
-
-#if defined(_BIT_FIELDS_LTOH)		/* Intel byteorder */
-	Ucbit	control		: 4;
-	Ucbit	adr		: 4;
-#else					/* Motorola byteorder */
-	Ucbit	adr		: 4;
-	Ucbit	control		: 4;
-#endif
-
-	Uchar	track;
-	Uchar	res3;
-	Uchar	addr[4];
-};
-
-struct diskinfo {
-	struct tocheader	hd;
-	struct trackdesc	desc[1];
-};
-
-struct siheader {
-	Uchar	len[2];
-	Uchar	finished;
-	Uchar	unfinished;
-};
-
-struct sidesc {
-	Uchar	sess_number;
-	Uchar	res1;
-	Uchar	track;
-	Uchar	res3;
-	Uchar	addr[4];
-};
-
-struct sinfo {
-	struct siheader	hd;
-	struct sidesc	desc[1];
-};
-
-struct trackheader {
-	Uchar	mode;
-	Uchar	res[3];
-	Uchar	addr[4];
-};
-#define	TRM_ZERO	0
-#define	TRM_USER_ECC	1	/* 2048 bytes user data + 288 Bytes ECC/EDC */
-#define	TRM_USER	2	/* All user data (2336 bytes) */
-
-
-int
-read_tochdr(SCSI *usalp, cdr_t *dp, int *fp, int *lp)
-{
-	struct	tocheader *tp;
-	char	xb[256];
-	int	len;
-
-	tp = (struct tocheader *)xb;
-
-	fillbytes((caddr_t)xb, sizeof (xb), '\0');
-	if (read_toc(usalp, xb, 0, sizeof (struct tocheader), 0, FMT_TOC) < 0) {
-		if (usalp->silent == 0)
-			errmsgno(EX_BAD, "Cannot read TOC header\n");
-		return (-1);
-	}
-	len = a_to_u_2_byte(tp->len) + sizeof (struct tocheader)-2;
-	if (len >= 4) {
-		if (fp)
-			*fp = tp->first;
-		if (lp)
-			*lp = tp->last;
-		return (0);
-	}
-	return (-1);
-}
-
-int
-read_cdtext(SCSI *usalp)
-{
-	struct	tocheader *tp;
-	char	xb[256];
-	int	len;
-	char	xxb[10000];
-
-	tp = (struct tocheader *)xb;
-
-	fillbytes((caddr_t)xb, sizeof (xb), '\0');
-	if (read_toc(usalp, xb, 0, sizeof (struct tocheader), 0, FMT_CDTEXT) < 0) {
-		if (usalp->silent == 0 || usalp->verbose > 0)
-			errmsgno(EX_BAD, "Cannot read CD-Text header\n");
-		return (-1);
-	}
-	len = a_to_u_2_byte(tp->len) + sizeof (struct tocheader)-2;
-	printf("CD-Text len: %d\n", len);
-
-	if (read_toc(usalp, xxb, 0, len, 0, FMT_CDTEXT) < 0) {
-		if (usalp->silent == 0)
-			errmsgno(EX_BAD, "Cannot read CD-Text\n");
-		return (-1);
-	}
-	{
-		FILE	*f = fileopen("cdtext.dat", "wctb");
-		filewrite(f, xxb, len);
-	}
-	return (0);
-}
-
-int
-read_trackinfo(SCSI *usalp, int track, long *offp, struct msf *msfp, int *adrp, 
-					int *controlp, int *modep)
-{
-	struct	diskinfo *dp;
-	char	xb[256];
-	int	len;
-
-	dp = (struct diskinfo *)xb;
-
-	fillbytes((caddr_t)xb, sizeof (xb), '\0');
-	if (read_toc(usalp, xb, track, sizeof (struct diskinfo), 0, FMT_TOC) < 0) {
-		if (usalp->silent <= 0)
-			errmsgno(EX_BAD, "Cannot read TOC\n");
-		return (-1);
-	}
-	len = a_to_u_2_byte(dp->hd.len) + sizeof (struct tocheader)-2;
-	if (len <  (int)sizeof (struct diskinfo))
-		return (-1);
-
-	if (offp)
-		*offp = a_to_4_byte(dp->desc[0].addr);
-	if (adrp)
-		*adrp = dp->desc[0].adr;
-	if (controlp)
-		*controlp = dp->desc[0].control;
-
-	if (msfp) {
-		usalp->silent++;
-		if (read_toc(usalp, xb, track, sizeof (struct diskinfo), 1, FMT_TOC)
-									>= 0) {
-			msfp->msf_min = dp->desc[0].addr[1];
-			msfp->msf_sec = dp->desc[0].addr[2];
-			msfp->msf_frame = dp->desc[0].addr[3];
-		} else if (read_toc(usalp, xb, track, sizeof (struct diskinfo), 0, FMT_TOC)
-									>= 0) {
-			/*
-			 * Some drives (e.g. the Philips CDD-522) don't support
-			 * to read the TOC in MSF mode.
-			 */
-			long off = a_to_4_byte(dp->desc[0].addr);
-
-			lba_to_msf(off, msfp);
-		} else {
-			msfp->msf_min = 0;
-			msfp->msf_sec = 0;
-			msfp->msf_frame = 0;
-		}
-		usalp->silent--;
-	}
-
-	if (modep == NULL)
-		return (0);
-
-	if (track == 0xAA) {
-		*modep = -1;
-		return (0);
-	}
-
-	fillbytes((caddr_t)xb, sizeof (xb), '\0');
-
-	usalp->silent++;
-	if (read_header(usalp, xb, *offp, 8, 0) >= 0) {
-		*modep = xb[0];
-	} else if (read_track_info_philips(usalp, xb, track, 14) >= 0) {
-		*modep = xb[0xb] & 0xF;
-	} else {
-		*modep = -1;
-	}
-	usalp->silent--;
-	return (0);
-}
-
-int
-read_B0(SCSI *usalp, BOOL isbcd, long *b0p, long *lop)
-{
-	struct	fdiskinfo *dp;
-	struct	ftrackdesc *tp;
-	char	xb[8192];
-	char	*pe;
-	int	len;
-	long	l;
-
-	dp = (struct fdiskinfo *)xb;
-
-	fillbytes((caddr_t)xb, sizeof (xb), '\0');
-	if (read_toc_philips(usalp, xb, 1, sizeof (struct tocheader), 0, FMT_FULLTOC) < 0) {
-		return (-1);
-	}
-	len = a_to_u_2_byte(dp->hd.len) + sizeof (struct tocheader)-2;
-	if (len <  (int)sizeof (struct fdiskinfo))
-		return (-1);
-	if (read_toc_philips(usalp, xb, 1, len, 0, FMT_FULLTOC) < 0) {
-		return (-1);
-	}
-	if (usalp->verbose) {
-		usal_prbytes("TOC data: ", (Uchar *)xb,
-			len > (int)sizeof (xb) - usal_getresid(usalp) ?
-				sizeof (xb) - usal_getresid(usalp) : len);
-
-		tp = &dp->desc[0];
-		pe = &xb[len];
-
-		while ((char *)tp < pe) {
-			usal_prbytes("ENT: ", (Uchar *)tp, 11);
-			tp++;
-		}
-	}
-	tp = &dp->desc[0];
-	pe = &xb[len];
-
-	for (; (char *)tp < pe; tp++) {
-		if (tp->sess_number != dp->hd.last)
-			continue;
-		if (tp->point != 0xB0)
-			continue;
-		if (usalp->verbose)
-			usal_prbytes("B0: ", (Uchar *)tp, 11);
-		if (isbcd) {
-			l = msf_to_lba(from_bcd(tp->amin),
-				from_bcd(tp->asec),
-				from_bcd(tp->aframe), TRUE);
-		} else {
-			l = msf_to_lba(tp->amin,
-				tp->asec,
-				tp->aframe, TRUE);
-		}
-		if (b0p)
-			*b0p = l;
-
-		if (usalp->verbose)
-			printf("B0 start: %ld\n", l);
-
-		if (isbcd) {
-			l = msf_to_lba(from_bcd(tp->pmin),
-				from_bcd(tp->psec),
-				from_bcd(tp->pframe), TRUE);
-		} else {
-			l = msf_to_lba(tp->pmin,
-				tp->psec,
-				tp->pframe, TRUE);
-		}
-
-		if (usalp->verbose)
-			printf("B0 lout: %ld\n", l);
-		if (lop)
-			*lop = l;
-		return (0);
-	}
-	return (-1);
-}
-
-
-/*
- * Return address of first track in last session (SCSI-3/mmc version).
- */
-int
-read_session_offset(SCSI *usalp, long *offp)
-{
-	struct	diskinfo *dp;
-	char	xb[256];
-	int	len;
-
-	dp = (struct diskinfo *)xb;
-
-	fillbytes((caddr_t)xb, sizeof (xb), '\0');
-	if (read_toc(usalp, (caddr_t)xb, 0, sizeof (struct tocheader), 0, FMT_SINFO) < 0)
-		return (-1);
-
-	if (usalp->verbose)
-		usal_prbytes("tocheader: ",
-		(Uchar *)xb, sizeof (struct tocheader) - usal_getresid(usalp));
-
-	len = a_to_u_2_byte(dp->hd.len) + sizeof (struct tocheader)-2;
-	if (len > (int)sizeof (xb)) {
-		errmsgno(EX_BAD, "Session info too big.\n");
-		return (-1);
-	}
-	if (read_toc(usalp, (caddr_t)xb, 0, len, 0, FMT_SINFO) < 0)
-		return (-1);
-
-	if (usalp->verbose)
-		usal_prbytes("tocheader: ",
-			(Uchar *)xb, len - usal_getresid(usalp));
-
-	dp = (struct diskinfo *)xb;
-	if (offp)
-		*offp = a_to_u_4_byte(dp->desc[0].addr);
-	return (0);
-}
-
-/*
- * Return address of first track in last session (pre SCSI-3 version).
- */
-int
-read_session_offset_philips(SCSI *usalp, long *offp)
-{
-	struct	sinfo *sp;
-	char	xb[256];
-	int	len;
-
-	sp = (struct sinfo *)xb;
-
-	fillbytes((caddr_t)xb, sizeof (xb), '\0');
-	if (read_toc_philips(usalp, (caddr_t)xb, 0, sizeof (struct siheader), 0, FMT_SINFO) < 0)
-		return (-1);
-	len = a_to_u_2_byte(sp->hd.len) + sizeof (struct siheader)-2;
-	if (len > (int)sizeof (xb)) {
-		errmsgno(EX_BAD, "Session info too big.\n");
-		return (-1);
-	}
-	if (read_toc_philips(usalp, (caddr_t)xb, 0, len, 0, FMT_SINFO) < 0)
-		return (-1);
-	/*
-	 * Old drives return the number of finished sessions in first/finished
-	 * a descriptor is returned for each session.
-	 * New drives return the number of the first and last session
-	 * one descriptor for the last finished session is returned
-	 * as in SCSI-3
-	 * In all cases the lowest session number is set to 1.
-	 */
-	sp = (struct sinfo *)xb;
-	if (offp)
-		*offp = a_to_u_4_byte(sp->desc[sp->hd.finished-1].addr);
-	return (0);
-}
-
-int
-sense_secsize(SCSI *usalp, int current)
-{
-	Uchar	mode[0x100];
-	Uchar	*p;
-	Uchar	*ep;
-	int	len;
-	int	secsize = -1;
-
-	usalp->silent++;
-	(void) unit_ready(usalp);
-	usalp->silent--;
-
-	/* XXX Quick and dirty, musz verallgemeinert werden !!! */
-
-	fillbytes(mode, sizeof (mode), '\0');
-	usalp->silent++;
-
-	len =	sizeof (struct scsi_mode_header) +
-		sizeof (struct scsi_mode_blockdesc);
-	/*
-	 * Wenn wir hier get_mode_params() nehmen bekommen wir die Warnung:
-	 * Warning: controller returns wrong page 1 for All pages page (3F).
-	 */
-	if (mode_sense(usalp, mode, len, 0x3F, current?0:2) < 0) {
-		fillbytes(mode, sizeof (mode), '\0');
-		if (mode_sense(usalp, mode, len, 0, current?0:2) < 0)	{ /* VU (block desc) */
-			usalp->silent--;
-			return (-1);
-		}
-	}
-	if (mode[3] == 8) {
-		if (usalp->debug) {
-			printf("Density: 0x%X\n", mode[4]);
-			printf("Blocks:  %ld\n", a_to_u_3_byte(&mode[5]));
-			printf("Blocklen:%ld\n", a_to_u_3_byte(&mode[9]));
-		}
-		secsize = a_to_u_3_byte(&mode[9]);
-	}
-	fillbytes(mode, sizeof (mode), '\0');
-	/*
-	 * The ACARD TECH AEC-7720 ATAPI<->SCSI adaptor
-	 * chokes if we try to transfer more than 0x40 bytes with
-	 * mode_sense of all pages. So try to avoid to run this
-	 * command if possible.
-	 */
-	if (usalp->debug &&
-	    mode_sense(usalp, mode, 0xFE, 0x3F, current?0:2) >= 0) {	/* All Pages */
-
-		ep = mode+mode[0];	/* Points to last byte of data */
-		p = &mode[4];
-		p += mode[3];
-		printf("Pages: ");
-		while (p < ep) {
-			printf("0x%X ", *p&0x3F);
-			p += p[1]+2;
-		}
-		printf("\n");
-	}
-	usalp->silent--;
-
-	return (secsize);
-}
-
-int
-select_secsize(SCSI *usalp, int secsize)
-{
-	struct scsi_mode_data md;
-	int	count = sizeof (struct scsi_mode_header) +
-			sizeof (struct scsi_mode_blockdesc);
-
-	(void) test_unit_ready(usalp);	/* clear any error situation */
-
-	fillbytes((caddr_t)&md, sizeof (md), '\0');
-	md.header.blockdesc_len = 8;
-	i_to_3_byte(md.blockdesc.lblen, secsize);
-
-	return (mode_select(usalp, (Uchar *)&md, count, 0, usalp->inq->data_format >= 2));
-}
-
-BOOL
-is_cddrive(SCSI *usalp)
-{
-	return (usalp->inq->type == INQ_ROMD || usalp->inq->type == INQ_WORM);
-}
-
-BOOL
-is_unknown_dev(SCSI *usalp)
-{
-	return (usalp->dev == DEV_UNKNOWN);
-}
-
-#ifndef	DEBUG
-#define	DEBUG
-#endif
-#ifdef	DEBUG
-
-int
-read_scsi(SCSI *usalp, caddr_t bp, long addr, int cnt)
-{
-	if (addr <= G0_MAXADDR && cnt < 256 && !is_atapi)
-		return (read_g0(usalp, bp, addr, cnt));
-	else
-		return (read_g1(usalp, bp, addr, cnt));
-}
-
-int
-read_g0(SCSI *usalp, caddr_t bp, long addr, int cnt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	if (usalp->cap->c_bsize <= 0)
-		raisecond("capacity_not_set", 0L);
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt*usalp->cap->c_bsize;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G0_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g0_cdb.cmd = SC_READ;
-	scmd->cdb.g0_cdb.lun = usal_lun(usalp);
-	g0_cdbaddr(&scmd->cdb.g0_cdb, addr);
-	scmd->cdb.g0_cdb.count = cnt;
-/*	scmd->cdb.g0_cdb.vu_56 = 1;*/
-
-	usalp->cmdname = "read_g0";
-
-	return (usal_cmd(usalp));
-}
-
-int
-read_g1(SCSI *usalp, caddr_t bp, long addr, int cnt)
-{
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	if (usalp->cap->c_bsize <= 0)
-		raisecond("capacity_not_set", 0L);
-
-	fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
-	scmd->addr = bp;
-	scmd->size = cnt*usalp->cap->c_bsize;
-	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
-	scmd->cdb_len = SC_G1_CDBLEN;
-	scmd->sense_len = CCS_SENSE_LEN;
-	scmd->cdb.g1_cdb.cmd = SC_EREAD;
-	scmd->cdb.g1_cdb.lun = usal_lun(usalp);
-	g1_cdbaddr(&scmd->cdb.g1_cdb, addr);
-	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
-
-	usalp->cmdname = "read_g1";
-
-	return (usal_cmd(usalp));
-}
-#endif	/* DEBUG */
-
-BOOL
-getdev(SCSI *usalp, BOOL print)
-{
-		BOOL	got_inquiry = TRUE;
-		char	vendor_info[8+1];
-		char	prod_ident[16+1];
-		char	prod_revision[4+1];
-		int	inq_len = 0;
-	register struct	usal_cmd	*scmd = usalp->scmd;
-	register struct scsi_inquiry *inq = usalp->inq;
-
-
-	fillbytes((caddr_t)inq, sizeof (*inq), '\0');
-	usalp->dev = DEV_UNKNOWN;
-	usalp->silent++;
-	(void) unit_ready(usalp);
-	if (scmd->error >= SCG_FATAL &&
-				!(scmd->scb.chk && scmd->sense_count > 0)) {
-		usalp->silent--;
-		return (FALSE);
-	}
-
-
-/*	if (scmd->error < SCG_FATAL || scmd->scb.chk && scmd->sense_count > 0){*/
-
-	if (inquiry(usalp, (caddr_t)inq, sizeof (*inq)) < 0) {
-		got_inquiry = FALSE;
-	} else {
-		inq_len = sizeof (*inq) - usal_getresid(usalp);
-	}
-	if (!got_inquiry) {
-		if (usalp->verbose) {
-			printf(
-		"error: %d scb.chk: %d sense_count: %d sense.code: 0x%x\n",
-				scmd->error, scmd->scb.chk,
-				scmd->sense_count, scmd->sense.code);
-		}
-			/*
-			 * Folgende Kontroller kennen das Kommando
-			 * INQUIRY nicht:
-			 *
-			 * ADAPTEC	ACB-4000, ACB-4010, ACB 4070
-			 * SYSGEN	SC4000
-			 *
-			 * Leider reagieren ACB40X0 und ACB5500 identisch
-			 * wenn drive not ready (code == not ready),
-			 * sie sind dann nicht zu unterscheiden.
-			 */
-
-		if (scmd->scb.chk && scmd->sense_count == 4) {
-			/* Test auf SYSGEN				 */
-			(void) qic02(usalp, 0x12);	/* soft lock on  */
-			if (qic02(usalp, 1) < 0) {	/* soft lock off */
-				usalp->dev = DEV_ACB40X0;
-/*				usalp->dev = acbdev();*/
-			} else {
-				usalp->dev = DEV_SC4000;
-				inq->type = INQ_SEQD;
-				inq->removable = 1;
-			}
-		}
-	} else if (usalp->verbose) {
-		int	i;
-		int	len = inq->add_len + 5;
-		Uchar	ibuf[256+5];
-		Uchar	*ip = (Uchar *)inq;
-		Uchar	c;
-
-		if (len > (int)sizeof (*inq) &&
-				inquiry(usalp, (caddr_t)ibuf, inq->add_len+5) >= 0) {
-			len = inq->add_len+5 - usal_getresid(usalp);
-			ip = ibuf;
-		} else {
-			len = sizeof (*inq);
-		}
-		printf("Inquiry Data   : ");
-		for (i = 0; i < len; i++) {
-			c = ip[i];
-			if (c >= ' ' && c < 0177)
-				printf("%c", c);
-			else
-				printf(".");
-		}
-		printf("\n");
-	}
-
-	strncpy(vendor_info, inq->vendor_info, sizeof (inq->vendor_info));
-	strncpy(prod_ident, inq->prod_ident, sizeof (inq->prod_ident));
-	strncpy(prod_revision, inq->prod_revision, sizeof (inq->prod_revision));
-
-	vendor_info[sizeof (inq->vendor_info)] = '\0';
-	prod_ident[sizeof (inq->prod_ident)] = '\0';
-	prod_revision[sizeof (inq->prod_revision)] = '\0';
-
-	switch (inq->type) {
-
-	case INQ_DASD:
-		if (inq->add_len == 0 && inq->vendor_info[0] != '\0') {
-			Uchar	*p;
-			/*
-			 * NT-4.0 creates fake inquiry data for IDE disks.
-			 * Unfortunately, it does not set add_len wo we
-			 * check if vendor_info, prod_ident and prod_revision
-			 * contains valid chars for a CCS inquiry.
-			 */
-			if (inq_len >= 36)
-				inq->add_len = 31;
-
-			for (p = (Uchar *)&inq->vendor_info[0];
-					p < (Uchar *)&inq->prod_revision[4];
-									p++) {
-				if (*p < 0x20 || *p > 0x7E) {
-					inq->add_len = 0;
-					break;
-				}
-			}
-		}
-		if (inq->add_len == 0) {
-			if (usalp->dev == DEV_UNKNOWN && got_inquiry) {
-				usalp->dev = DEV_ACB5500;
-				strcpy(inq->vendor_info,
-					"ADAPTEC ACB-5500        FAKE");
-
-			} else switch (usalp->dev) {
-
-			case DEV_ACB40X0:
-				strcpy(inq->vendor_info,
-					"ADAPTEC ACB-40X0        FAKE");
-				break;
-			case DEV_ACB4000:
-				strcpy(inq->vendor_info,
-					"ADAPTEC ACB-4000        FAKE");
-				break;
-			case DEV_ACB4010:
-				strcpy(inq->vendor_info,
-					"ADAPTEC ACB-4010        FAKE");
-				break;
-			case DEV_ACB4070:
-				strcpy(inq->vendor_info,
-					"ADAPTEC ACB-4070        FAKE");
-				break;
-			}
-		} else if (inq->add_len < 31) {
-			usalp->dev = DEV_NON_CCS_DSK;
-
-		} else if (strbeg("EMULEX", vendor_info)) {
-			if (strbeg("MD21", prod_ident))
-				usalp->dev = DEV_MD21;
-			if (strbeg("MD23", prod_ident))
-				usalp->dev = DEV_MD23;
-			else
-				usalp->dev = DEV_CCS_GENDISK;
-		} else if (strbeg("ADAPTEC", vendor_info)) {
-			if (strbeg("ACB-4520", prod_ident))
-				usalp->dev = DEV_ACB4520A;
-			if (strbeg("ACB-4525", prod_ident))
-				usalp->dev = DEV_ACB4525;
-			else
-				usalp->dev = DEV_CCS_GENDISK;
-		} else if (strbeg("SONY", vendor_info) &&
-					strbeg("SMO-C501", prod_ident)) {
-			usalp->dev = DEV_SONY_SMO;
-		} else {
-			usalp->dev = DEV_CCS_GENDISK;
-		}
-		break;
-
-	case INQ_SEQD:
-		if (usalp->dev == DEV_SC4000) {
-			strcpy(inq->vendor_info,
-				"SYSGEN  SC4000          FAKE");
-		} else if (inq->add_len == 0 &&
-					inq->removable &&
-						inq->ansi_version == 1) {
-			usalp->dev = DEV_MT02;
-			strcpy(inq->vendor_info,
-				"EMULEX  MT02            FAKE");
-		}
-		break;
-
-/*	case INQ_OPTD:*/
-	case INQ_ROMD:
-	case INQ_WORM:
-		if (strbeg("RXT-800S", prod_ident))
-			usalp->dev = DEV_RXT800S;
-
-		/*
-		 * Start of CD-Recorders:
-		 */
-		if (strbeg("ACER", vendor_info)) {
-			if (strbeg("CR-4020C", prod_ident))
-				usalp->dev = DEV_RICOH_RO_1420C;
-
-		} else if (strbeg("CREATIVE", vendor_info)) {
-			if (strbeg("CDR2000", prod_ident))
-				usalp->dev = DEV_RICOH_RO_1060C;
-
-		} else if (strbeg("GRUNDIG", vendor_info)) {
-			if (strbeg("CDR100IPW", prod_ident))
-				usalp->dev = DEV_CDD_2000;
-
-		} else if (strbeg("JVC", vendor_info)) {
-			if (strbeg("XR-W2001", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-			else if (strbeg("XR-W2010", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-			else if (strbeg("R2626", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-
-		} else if (strbeg("MITSBISH", vendor_info)) {
-
-#ifdef	XXXX_REALLY
-			/* It's MMC compliant */
-			if (strbeg("CDRW226", prod_ident))
-				usalp->dev = DEV_MMC_CDRW;
-#else
-			/* EMPTY */
-#endif
-
-		} else if (strbeg("MITSUMI", vendor_info)) {
-			/* Don't know any product string */
-			usalp->dev = DEV_CDD_522;
-
-		} else if (strbeg("OPTIMA", vendor_info)) {
-			if (strbeg("CD-R 650", prod_ident))
-				usalp->dev = DEV_SONY_CDU_924;
-
-		} else if (strbeg("PHILIPS", vendor_info) ||
-				strbeg("IMS", vendor_info) ||
-				strbeg("KODAK", vendor_info) ||
-				strbeg("HP", vendor_info)) {
-
-			if (strbeg("CDD521/00", prod_ident))
-				usalp->dev = DEV_CDD_521_OLD;
-			else if (strbeg("CDD521/02", prod_ident))
-				usalp->dev = DEV_CDD_521_OLD;		/* PCD 200R? */
-			else if (strbeg("CDD521", prod_ident))
-				usalp->dev = DEV_CDD_521;
-
-			if (strbeg("CDD522", prod_ident))
-				usalp->dev = DEV_CDD_522;
-			if (strbeg("PCD225", prod_ident))
-				usalp->dev = DEV_CDD_522;
-			if (strbeg("KHSW/OB", prod_ident))	/* PCD600 */
-				usalp->dev = DEV_PCD_600;
-			if (strbeg("CDR-240", prod_ident))
-				usalp->dev = DEV_CDD_2000;
-
-			if (strbeg("CDD20", prod_ident))
-				usalp->dev = DEV_CDD_2000;
-			if (strbeg("CDD26", prod_ident))
-				usalp->dev = DEV_CDD_2600;
-
-			if (strbeg("C4324/C4325", prod_ident))
-				usalp->dev = DEV_CDD_2000;
-			if (strbeg("CD-Writer 6020", prod_ident))
-				usalp->dev = DEV_CDD_2600;
-
-		} else if (strbeg("PINNACLE", vendor_info)) {
-			if (strbeg("RCD-1000", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-			if (strbeg("RCD5020", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-			if (strbeg("RCD5040", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-			if (strbeg("RCD 4X4", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-
-		} else if (strbeg("PIONEER", vendor_info)) {
-			if (strbeg("CD-WO DW-S114X", prod_ident))
-				usalp->dev = DEV_PIONEER_DW_S114X;
-			else if (strbeg("CD-WO DR-R504X", prod_ident))	/* Reoprt from philip at merge.com */
-				usalp->dev = DEV_PIONEER_DW_S114X;
-			else if (strbeg("DVD-R DVR-S101", prod_ident))
-				usalp->dev = DEV_PIONEER_DVDR_S101;
-
-		} else if (strbeg("PLASMON", vendor_info)) {
-			if (strbeg("RF4100", prod_ident))
-				usalp->dev = DEV_PLASMON_RF_4100;
-			else if (strbeg("CDR4220", prod_ident))
-				usalp->dev = DEV_CDD_2000;
-
-		} else if (strbeg("PLEXTOR", vendor_info)) {
-			if (strbeg("CD-R   PX-R24CS", prod_ident))
-				usalp->dev = DEV_RICOH_RO_1420C;
-
-		} else if (strbeg("RICOH", vendor_info)) {
-			if (strbeg("RO-1420C", prod_ident))
-				usalp->dev = DEV_RICOH_RO_1420C;
-			if (strbeg("RO1060C", prod_ident))
-				usalp->dev = DEV_RICOH_RO_1060C;
-
-		} else if (strbeg("SAF", vendor_info)) {	/* Smart & Friendly */
-			if (strbeg("CD-R2004", prod_ident) ||
-			    strbeg("CD-R2006 ", prod_ident))
-				usalp->dev = DEV_SONY_CDU_924;
-			else if (strbeg("CD-R2006PLUS", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-			else if (strbeg("CD-RW226", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-			else if (strbeg("CD-R4012", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-
-		} else if (strbeg("SANYO", vendor_info)) {
-			if (strbeg("CD-WO CRD-R24S", prod_ident))
-				usalp->dev = DEV_CDD_521;
-
-		} else if (strbeg("SONY", vendor_info)) {
-			if (strbeg("CD-R   CDU92", prod_ident) ||
-			    strbeg("CD-R   CDU94", prod_ident))
-				usalp->dev = DEV_SONY_CDU_924;
-
-		} else if (strbeg("TEAC", vendor_info)) {
-			if (strbeg("CD-R50S", prod_ident) ||
-			    strbeg("CD-R55S", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-
-		} else if (strbeg("TRAXDATA", vendor_info) ||
-				strbeg("Traxdata", vendor_info)) {
-			if (strbeg("CDR4120", prod_ident))
-				usalp->dev = DEV_TEAC_CD_R50S;
-
-		} else if (strbeg("T.YUDEN", vendor_info)) {
-			if (strbeg("CD-WO EW-50", prod_ident))
-				usalp->dev = DEV_TYUDEN_EW50;
-
-		} else if (strbeg("WPI", vendor_info)) {	/* Wearnes */
-			if (strbeg("CDR-632P", prod_ident))
-				usalp->dev = DEV_CDD_2600;
-
-		} else if (strbeg("YAMAHA", vendor_info)) {
-			if (strbeg("CDR10", prod_ident))
-				usalp->dev = DEV_YAMAHA_CDR_100;
-			if (strbeg("CDR200", prod_ident))
-				usalp->dev = DEV_YAMAHA_CDR_400;
-			if (strbeg("CDR400", prod_ident))
-				usalp->dev = DEV_YAMAHA_CDR_400;
-
-		} else if (strbeg("MATSHITA", vendor_info)) {
-			if (strbeg("CD-R   CW-7501", prod_ident))
-				usalp->dev = DEV_MATSUSHITA_7501;
-			if (strbeg("CD-R   CW-7502", prod_ident))
-				usalp->dev = DEV_MATSUSHITA_7502;
-		}
-		if (usalp->dev == DEV_UNKNOWN) {
-			/*
-			 * We do not have Manufacturer strings for
-			 * the following drives.
-			 */
-			if (strbeg("CDS615E", prod_ident))	/* Olympus */
-				usalp->dev = DEV_SONY_CDU_924;
-		}
-		if (usalp->dev == DEV_UNKNOWN && inq->type == INQ_ROMD) {
-			BOOL	cdrr	 = FALSE;
-			BOOL	cdwr	 = FALSE;
-			BOOL	cdrrw	 = FALSE;
-			BOOL	cdwrw	 = FALSE;
-			BOOL	dvd	 = FALSE;
-			BOOL	dvdwr	 = FALSE;
-
-			usalp->dev = DEV_CDROM;
-
-			if (mmc_check(usalp, &cdrr, &cdwr, &cdrrw, &cdwrw,
-								&dvd, &dvdwr))
-				usalp->dev = DEV_MMC_CDROM;
-			if (cdwr)
-				usalp->dev = DEV_MMC_CDR;
-			if (cdwrw)
-				usalp->dev = DEV_MMC_CDRW;
-			if (dvd)
-				usalp->dev = DEV_MMC_DVD;
-			if (dvdwr)
-				usalp->dev = DEV_MMC_DVD_WR;
-		}
-		break;
-
-	case INQ_PROCD:
-		if (strbeg("BERTHOLD", vendor_info)) {
-			if (strbeg("", prod_ident))
-				usalp->dev = DEV_HRSCAN;
-		}
-		break;
-
-	case INQ_SCAN:
-		usalp->dev = DEV_MS300A;
-		break;
-	}
-	usalp->silent--;
-	if (!print)
-		return (TRUE);
-
-	if (usalp->dev == DEV_UNKNOWN && !got_inquiry) {
-#ifdef	PRINT_INQ_ERR
-		usal_printerr(usalp);
-#endif
-		return (FALSE);
-	}
-
-	printinq(usalp, stdout);
-	return (TRUE);
-}
-
-void
-printinq(SCSI *usalp, FILE *f)
-{
-	register struct scsi_inquiry *inq = usalp->inq;
-
-	fprintf(f, "Device type    : ");
-	usal_fprintdev(f, inq);
-	fprintf(f, "Version        : %d\n", inq->ansi_version);
-	fprintf(f, "Response Format: %d\n", inq->data_format);
-	if (inq->data_format >= 2) {
-		fprintf(f, "Capabilities   : ");
-		if (inq->aenc)		fprintf(f, "AENC ");
-		if (inq->termiop)	fprintf(f, "TERMIOP ");
-		if (inq->reladr)	fprintf(f, "RELADR ");
-		if (inq->wbus32)	fprintf(f, "WBUS32 ");
-		if (inq->wbus16)	fprintf(f, "WBUS16 ");
-		if (inq->sync)		fprintf(f, "SYNC ");
-		if (inq->linked)	fprintf(f, "LINKED ");
-		if (inq->cmdque)	fprintf(f, "CMDQUE ");
-		if (inq->softreset)	fprintf(f, "SOFTRESET ");
-		fprintf(f, "\n");
-	}
-	if (inq->add_len >= 31 ||
-			inq->vendor_info[0] ||
-			inq->prod_ident[0] ||
-			inq->prod_revision[0]) {
-		fprintf(f, "Vendor_info    : '%.8s'\n", inq->vendor_info);
-		fprintf(f, "Identification : '%.16s'\n", inq->prod_ident);
-		fprintf(f, "Revision       : '%.4s'\n", inq->prod_revision);
-	}
-}
-
-void
-printdev(SCSI *usalp)
-{
-	printf("Device seems to be: ");
-
-	switch (usalp->dev) {
-
-	case DEV_UNKNOWN:	printf("unknown");		break;
-	case DEV_ACB40X0:	printf("Adaptec 4000/4010/4070"); break;
-	case DEV_ACB4000:	printf("Adaptec 4000");		break;
-	case DEV_ACB4010:	printf("Adaptec 4010");		break;
-	case DEV_ACB4070:	printf("Adaptec 4070");		break;
-	case DEV_ACB5500:	printf("Adaptec 5500");		break;
-	case DEV_ACB4520A:	printf("Adaptec 4520A");	break;
-	case DEV_ACB4525:	printf("Adaptec 4525");		break;
-	case DEV_MD21:		printf("Emulex MD21");		break;
-	case DEV_MD23:		printf("Emulex MD23");		break;
-	case DEV_NON_CCS_DSK:	printf("Generic NON CCS Disk");	break;
-	case DEV_CCS_GENDISK:	printf("Generic CCS Disk");	break;
-	case DEV_SONY_SMO:	printf("Sony SMO-C501");	break;
-	case DEV_MT02:		printf("Emulex MT02");		break;
-	case DEV_SC4000:	printf("Sysgen SC4000");	break;
-	case DEV_RXT800S:	printf("Maxtor RXT800S");	break;
-	case DEV_HRSCAN:	printf("Berthold HR-Scanner");	break;
-	case DEV_MS300A:	printf("Microtek MS300A");	break;
-
-	case DEV_CDROM:		printf("Generic CD-ROM");	break;
-	case DEV_MMC_CDROM:	printf("Generic mmc CD-ROM");	break;
-	case DEV_MMC_CDR:	printf("Generic mmc CD-R");	break;
-	case DEV_MMC_CDRW:	printf("Generic mmc CD-RW");	break;
-	case DEV_MMC_DVD:	printf("Generic mmc2 DVD-ROM");	break;
-	case DEV_MMC_DVD_WR:	printf("Generic mmc2 DVD-R/DVD-RW"); break;
-	case DEV_CDD_521_OLD:	printf("Philips old CDD-521");	break;
-	case DEV_CDD_521:	printf("Philips CDD-521");	break;
-	case DEV_CDD_522:	printf("Philips CDD-522");	break;
-	case DEV_PCD_600:	printf("Kodak PCD-600");	break;
-	case DEV_CDD_2000:	printf("Philips CDD-2000");	break;
-	case DEV_CDD_2600:	printf("Philips CDD-2600");	break;
-	case DEV_YAMAHA_CDR_100:printf("Yamaha CDR-100");	break;
-	case DEV_YAMAHA_CDR_400:printf("Yamaha CDR-400");	break;
-	case DEV_PLASMON_RF_4100:printf("Plasmon RF-4100");	break;
-	case DEV_SONY_CDU_924:	printf("Sony CDU-924S");	break;
-	case DEV_RICOH_RO_1060C:printf("Ricoh RO-1060C");	break;
-	case DEV_RICOH_RO_1420C:printf("Ricoh RO-1420C");	break;
-	case DEV_TEAC_CD_R50S:	printf("Teac CD-R50S");		break;
-	case DEV_MATSUSHITA_7501:printf("Matsushita CW-7501");	break;
-	case DEV_MATSUSHITA_7502:printf("Matsushita CW-7502");	break;
-
-	case DEV_PIONEER_DW_S114X: printf("Pioneer DW-S114X");	break;
-	case DEV_PIONEER_DVDR_S101:printf("Pioneer DVD-R S101"); break;
-
-	default:		printf("Missing Entry for dev %d",
-						usalp->dev);	break;
-
-	}
-	printf(".\n");
-
-}
-
-BOOL
-do_inquiry(SCSI *usalp, int print)
-{
-	if (getdev(usalp, print)) {
-		if (print)
-			printdev(usalp);
-		return (TRUE);
-	} else {
-		return (FALSE);
-	}
-}
-
-BOOL
-recovery_needed(SCSI *usalp, cdr_t *dp)
-{
-		int err;
-	register struct	usal_cmd	*scmd = usalp->scmd;
-
-	usalp->silent++;
-	err = test_unit_ready(usalp);
-	usalp->silent--;
-
-	if (err >= 0)
-		return (FALSE);
-	else if (scmd->error >= SCG_FATAL)	/* nicht selektierbar */
-		return (FALSE);
-
-	if (scmd->sense.code < 0x70)		/* non extended Sense */
-		return (FALSE);
-
-						/* XXX Old Philips code */
-	return (((struct scsi_ext_sense *)&scmd->sense)->sense_code == 0xD0);
-}
-
-int
-scsi_load(SCSI *usalp, cdr_t *dp)
-{
-	int	key;
-	int	code;
-
-	if ((dp->cdr_flags & CDR_CADDYLOAD) == 0) {
-		if (scsi_start_stop_unit(usalp, 1, 1, dp && (dp->cdr_cmdflags&F_IMMED)) >= 0)
-			return (0);
-	}
-
-	if (wait_unit_ready(usalp, 60))
-		return (0);
-
-	key = usal_sense_key(usalp);
-	code = usal_sense_code(usalp);
-
-	if (key == SC_NOT_READY && (code == 0x3A || code == 0x30)) {
-		errmsgno(EX_BAD, "Cannot load media with %s drive!\n",
-			(dp->cdr_flags & CDR_CADDYLOAD) ? "caddy" : "this");
-		errmsgno(EX_BAD, "Try to load media by hand.\n");
-	}
-	return (-1);
-}
-
-int
-scsi_unload(SCSI *usalp, cdr_t *dp)
-{
-	return (scsi_start_stop_unit(usalp, 0, 1, dp && (dp->cdr_cmdflags&F_IMMED)));
-}
-
-int 
-scsi_cdr_write(SCSI *usalp, 
-               caddr_t bp       /* address of buffer */, 
-               long sectaddr    /* disk address (sector) to put */, 
-               long size        /* number of bytes to transfer */, 
-               int blocks       /* sector count */, 
-               BOOL islast      /* last write for track */)
-{
-	return (write_xg1(usalp, bp, sectaddr, size, blocks));
-}
-
-struct cd_mode_page_2A *
-mmc_cap(SCSI *usalp, Uchar *modep)
-{
-	int	len;
-	int	val;
-	Uchar	mode[0x100];
-	struct	cd_mode_page_2A *mp;
-	struct	cd_mode_page_2A *mp2;
-
-
-retry:
-	fillbytes((caddr_t)mode, sizeof (mode), '\0');
-
-	if (!get_mode_params(usalp, 0x2A, "CD capabilities",
-			mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) {
-
-		if (usal_sense_key(usalp) == SC_NOT_READY) {
-			if (wait_unit_ready(usalp, 60))
-				goto retry;
-		}
-		return (NULL);		/* Pre SCSI-3/mmc drive		*/
-	}
-
-	if (len == 0)			/* Pre SCSI-3/mmc drive		*/
-		return (NULL);
-
-	mp = (struct cd_mode_page_2A *)
-		(mode + sizeof (struct scsi_mode_header) +
-		((struct scsi_mode_header *)mode)->blockdesc_len);
-
-	/*
-	 * Do some heuristics against pre SCSI-3/mmc VU page 2A
-	 * We should test for a minimum p_len of 0x14, but some
-	 * buggy CD-ROM readers ommit the write speed values.
-	 */
-	if (mp->p_len < 0x10)
-		return (NULL);
-
-	val = a_to_u_2_byte(mp->max_read_speed);
-	if (val != 0 && val < 176)
-		return (NULL);
-
-	val = a_to_u_2_byte(mp->cur_read_speed);
-	if (val != 0 && val < 176)
-		return (NULL);
-
-	len -= sizeof (struct scsi_mode_header) +
-		((struct scsi_mode_header *)mode)->blockdesc_len;
-	if (modep)
-		mp2 = (struct cd_mode_page_2A *)modep;
-	else
-		mp2 = malloc(len);
-	if (mp2)
-		movebytes(mp, mp2, len);
-
-	return (mp2);
-}
-
-void
-mmc_getval(struct cd_mode_page_2A *mp, 
-           BOOL *cdrrp  /* CD ROM */, 
-           BOOL *cdwrp  /* CD-R writer */, 
-           BOOL *cdrrwp /* CD-RW reader */, 
-           BOOL *cdwrwp /* CD-RW writer */, 
-           BOOL *dvdp   /* DVD reader */, 
-           BOOL *dvdwp  /* DVD writer */)
-{
-	BOOL	isdvd;				/* Any DVD reader	*/
-	BOOL	isdvd_wr;			/* DVD writer (R / RAM)	*/
-	BOOL	iscd_wr;			/* CD  writer		*/
-
-	iscd_wr = (mp->cd_r_write != 0) ||	/* SCSI-3/mmc CD-R	*/
-		    (mp->cd_rw_write != 0);	/* SCSI-3/mmc CD-RW	*/
-
-	if (cdrrp)
-		*cdrrp = (mp->cd_r_read != 0);	/* SCSI-3/mmc CD	*/
-	if (cdwrp)
-		*cdwrp = (mp->cd_r_write != 0);	/* SCSI-3/mmc CD-R	*/
-
-	if (cdrrwp)
-		*cdrrwp = (mp->cd_rw_read != 0); /* SCSI-3/mmc CD	*/
-	if (cdwrwp)
-		*cdwrwp = (mp->cd_rw_write != 0); /* SCSI-3/mmc CD-RW	*/
-
-	isdvd =					/* SCSI-3/mmc2 DVD 	*/
-		(mp->dvd_ram_read + mp->dvd_r_read  +
-		    mp->dvd_rom_read) != 0;
-
-	isdvd_wr =				/* SCSI-3/mmc2 DVD writer*/
-		(mp->dvd_ram_write + mp->dvd_r_write) != 0;
-
-	if (dvdp)
-		*dvdp = isdvd;
-	if (dvdwp)
-		*dvdwp = isdvd_wr;
-}
-
-BOOL
-is_mmc(SCSI *usalp, BOOL *cdwp, BOOL *dvdwp)
-{
-	BOOL	cdwr	= FALSE;
-	BOOL	cdwrw	= FALSE;
-
-	if (cdwp)
-		*cdwp = FALSE;
-	if (dvdwp)
-		*dvdwp = FALSE;
-
-	if (!mmc_check(usalp, NULL, &cdwr, NULL, &cdwrw, NULL, dvdwp))
-		return (FALSE);
-
-	if (cdwp)
-		*cdwp = cdwr | cdwrw;
-
-	return (TRUE);
-}
-
-BOOL
-mmc_check(SCSI *usalp, 
-          BOOL *cdrrp   /* CD ROM */, 
-          BOOL *cdwrp   /* CD-R writer */, 
-          BOOL *cdrrwp  /* CD-RW reader */, 
-          BOOL *cdwrwp  /* CD-RW writer */, 
-          BOOL *dvdp    /* DVD reader */, 
-          BOOL *dvdwp   /* DVD writer */)
-{
-	Uchar	mode[0x100];
-	BOOL	was_atapi;
-	struct	cd_mode_page_2A *mp;
-
-	if (usalp->inq->type != INQ_ROMD)
-		return (FALSE);
-
-	fillbytes((caddr_t)mode, sizeof (mode), '\0');
-
-	was_atapi = allow_atapi(usalp, TRUE);
-	usalp->silent++;
-	mp = mmc_cap(usalp, mode);
-	usalp->silent--;
-	allow_atapi(usalp, was_atapi);
-	if (mp == NULL)
-		return (FALSE);
-
-	mmc_getval(mp, cdrrp, cdwrp, cdrrwp, cdwrwp, dvdp, dvdwp);
-
-	return (TRUE);			/* Generic SCSI-3/mmc CD	*/
-}
-
-static void
-print_speed(char *fmt, int val)
-{
-	printf("  %s: %5d kB/s", fmt, val);
-	printf(" (CD %3ux,", val/176);
-	printf(" DVD %2ux)\n", val/1385);
-}
-
-#define	DOES(what, flag)	printf("  Does %s%s\n", flag?"":"not ", what)
-#define	IS(what, flag)		printf("  Is %s%s\n", flag?"":"not ", what)
-#define	VAL(what, val)		printf("  %s: %d\n", what, val[0]*256 + val[1])
-#define	SVAL(what, val)		printf("  %s: %s\n", what, val)
-
-void
-print_capabilities(SCSI *usalp)
-{
-	BOOL	was_atapi;
-	Uchar	mode[0x100];
-	struct	cd_mode_page_2A *mp;
-static	const	char	*bclk[4] = {"32", "16", "24", "24 (I2S)"};
-static	const	char	*load[8] = {"caddy", "tray", "pop-up", "reserved(3)",
-				"disc changer", "cartridge changer",
-				"reserved(6)", "reserved(7)" };
-static	const	char	*rotctl[4] = {"CLV/PCAV", "CAV", "reserved(2)", "reserved(3)"};
-
-
-	if (usalp->inq->type != INQ_ROMD)
-		return;
-
-	fillbytes((caddr_t)mode, sizeof (mode), '\0');
-
-	was_atapi = allow_atapi(usalp, TRUE);	/* Try to switch to 10 byte mode cmds */
-	usalp->silent++;
-	mp = mmc_cap(usalp, mode);
-	usalp->silent--;
-	allow_atapi(usalp, was_atapi);
-	if (mp == NULL)
-		return;
-
-	printf("\nDrive capabilities, per");
-	if (mp->p_len >= 28)
-		printf(" MMC-3");
-	else if (mp->p_len >= 24)
-		printf(" MMC-2");
-	else
-		printf(" MMC");
-	printf(" page 2A:\n\n");
-
-	DOES("read CD-R media", mp->cd_r_read);
-	DOES("write CD-R media", mp->cd_r_write);
-	DOES("read CD-RW media", mp->cd_rw_read);
-	DOES("write CD-RW media", mp->cd_rw_write);
-	DOES("read DVD-ROM media", mp->dvd_rom_read);
-	DOES("read DVD-R media", mp->dvd_r_read);
-	DOES("write DVD-R media", mp->dvd_r_write);
-	DOES("read DVD-RAM media", mp->dvd_ram_read);
-	DOES("write DVD-RAM media", mp->dvd_ram_write);
-	DOES("support test writing", mp->test_write);
-	printf("\n");
-	DOES("read Mode 2 Form 1 blocks", mp->mode_2_form_1);
-	DOES("read Mode 2 Form 2 blocks", mp->mode_2_form_2);
-	DOES("read digital audio blocks", mp->cd_da_supported);
-	if (mp->cd_da_supported)
-		DOES("restart non-streamed digital audio reads accurately", mp->cd_da_accurate);
-	DOES("support Buffer-Underrun-Free recording", mp->BUF);
-	DOES("read multi-session CDs", mp->multi_session);
-	DOES("read fixed-packet CD media using Method 2", mp->method2);
-	DOES("read CD bar code", mp->read_bar_code);
-	DOES("read R-W subcode information", mp->rw_supported);
-	if (mp->rw_supported)
-		DOES("return R-W subcode de-interleaved and error-corrected", mp->rw_deint_corr);
-	DOES("read raw P-W subcode data from lead in", mp->pw_in_lead_in);
-	DOES("return CD media catalog number", mp->UPC);
-	DOES("return CD ISRC information", mp->ISRC);
-	DOES("support C2 error pointers", mp->c2_pointers);
-	DOES("deliver composite A/V data", mp->composite);
-	printf("\n");
-	DOES("play audio CDs", mp->audio_play);
-	if (mp->audio_play) {
-		VAL("Number of volume control levels", mp->num_vol_levels);
-		DOES("support individual volume control setting for each channel", mp->sep_chan_vol);
-		DOES("support independent mute setting for each channel", mp->sep_chan_mute);
-		DOES("support digital output on port 1", mp->digital_port_1);
-		DOES("support digital output on port 2", mp->digital_port_2);
-		if (mp->digital_port_1 || mp->digital_port_2) {
-			DOES("send digital data LSB-first", mp->LSBF);
-			DOES("set LRCK high for left-channel data", mp->RCK);
-			DOES("have valid data on falling edge of clock", mp->BCK);
-			SVAL("Length of data in BCLKs", bclk[mp->length]);
-		}
-	}
-	printf("\n");
-	SVAL("Loading mechanism type", load[mp->loading_type]);
-	DOES("support ejection of CD via START/STOP command", mp->eject);
-	DOES("lock media on power up via prevent jumper", mp->prevent_jumper);
-	DOES("allow media to be locked in the drive via PREVENT/ALLOW command", mp->lock);
-	IS("currently in a media-locked state", mp->lock_state);
-	DOES("support changing side of disk", mp->side_change);
-	DOES("have load-empty-slot-in-changer feature", mp->sw_slot_sel);
-	DOES("support Individual Disk Present feature", mp->disk_present_rep);
-	printf("\n");
-	print_speed("Maximum read  speed", a_to_u_2_byte(mp->max_read_speed));
-	print_speed("Current read  speed", a_to_u_2_byte(mp->cur_read_speed));
-	print_speed("Maximum write speed", a_to_u_2_byte(mp->max_write_speed));
-	if (mp->p_len >= 28)
-		print_speed("Current write speed", a_to_u_2_byte(mp->v3_cur_write_speed));
-	else
-		print_speed("Current write speed", a_to_u_2_byte(mp->cur_write_speed));
-	if (mp->p_len >= 28) {
-		SVAL("Rotational control selected", rotctl[mp->rot_ctl_sel]);
-	}
-	VAL("Buffer size in KB", mp->buffer_size);
-
-	if (mp->p_len >= 24) {
-		VAL("Copy management revision supported", mp->copy_man_rev);
-	}
-
-	if (mp->p_len >= 28) {
-		struct cd_wr_speed_performance *pp;
-		Uint	ndesc;
-		Uint	i;
-		Uint	n;
-
-		ndesc = a_to_u_2_byte(mp->num_wr_speed_des);
-		pp = mp->wr_speed_des;
-		printf("  Number of supported write speeds: %d\n", ndesc);
-		for (i = 0; i < ndesc; i++, pp++) {
-			printf("  Write speed # %d:", i);
-			n = a_to_u_2_byte(pp->wr_speed_supp);
-			printf(" %5d kB/s", n);
-			printf(" %s", rotctl[pp->rot_ctl_sel]);
-			printf(" (CD %3ux,", n/176);
-			printf(" DVD %2ux)\n", n/1385);
-		}
-	}
-
-	/* Generic SCSI-3/mmc CD	*/
-}

Deleted: cdrkit/branches/experimental/wodim/scsi_scan.c
===================================================================
--- cdrkit/branches/experimental/wodim/scsi_scan.c	2006-11-28 13:20:56 UTC (rev 513)
+++ cdrkit/branches/experimental/wodim/scsi_scan.c	2006-11-28 13:48:17 UTC (rev 514)
@@ -1,233 +0,0 @@
-/*
- * This file has been modified for the cdrkit suite.
- *
- * The behaviour and appearence of the program code below can differ to a major
- * extent from the version distributed by the original author(s).
- *
- * For details, see Changelog file distributed with the cdrkit package. If you
- * received this file from another source then ask the distributing person for
- * a log of modifications.
- *
- */
-
-/* @(#)scsi_scan.c	1.19 04/04/16 Copyright 1997-2004 J. Schilling */
-#ifndef lint
-static	char sccsid[] =
-	"@(#)scsi_scan.c	1.19 04/04/16 Copyright 1997-2004 J. Schilling";
-#endif
-/*
- *	Scan SCSI Bus.
- *	Stolen from sformat. Need a more general form to
- *	re-use it in sformat too.
- *
- *	Copyright (c) 1997-2004 J. Schilling
- */
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; see the file COPYING.  If not, write to the Free Software
- * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <mconfig.h>
-#include <stdio.h>
-#include <stdxlib.h>
-#include <standard.h>
-#include <btorder.h>
-#include <errno.h>
-#include <schily.h>
-
-#include <usal/usalcmd.h>
-#include <usal/scsidefs.h>
-#include <usal/scsireg.h>
-#include <usal/scsitransp.h>
-
-#include "scsi_scan.h"
-#include "wodim.h"
-
-static	void	print_product(FILE *f, struct scsi_inquiry *ip);
-int	select_target(SCSI *usalp, FILE *f);
-static	int	select_unit(SCSI *usalp, FILE *f);
-
-static void
-print_product(FILE *f, struct  scsi_inquiry *ip)
-{
-	fprintf(f, "'%.8s' ", ip->vendor_info);
-	fprintf(f, "'%.16s' ", ip->prod_ident);
-	fprintf(f, "'%.4s' ", ip->prod_revision);
-	if (ip->add_len < 31) {
-		fprintf(f, "NON CCS ");
-	}
-	usal_fprintdev(f, ip);
-}
-
-int
-select_target(SCSI *usalp, FILE *f)
-{
-	int	initiator;
-#ifdef	FMT
-	int	cscsibus = usal_scsibus(usalp);
-	int	ctarget  = usal_target(usalp);
-	int	clun	 = usal_lun(usalp);
-#endif
-	int	n;
-	int	low	= -1;
-	int	high	= -1;
-	int	amt	= 0;
-	int	bus;
-	int	tgt;
-	int	lun = 0;
-	BOOL	have_tgt;
-
-	usalp->silent++;
-
-	for (bus = 0; bus < 256; bus++) {
-		usal_settarget(usalp, bus, 0, 0);
-
-		if (!usal_havebus(usalp, bus))
-			continue;
-
-		initiator = usal_initiator_id(usalp);
-		fprintf(f, "scsibus%d:\n", bus);
-
-		for (tgt = 0; tgt < 16; tgt++) {
-			n = bus*100 + tgt;
-
-			usal_settarget(usalp, bus, tgt, lun);
-			have_tgt = unit_ready(usalp) || usalp->scmd->error != SCG_FATAL;
-
-			if (!have_tgt && tgt > 7) {
-				if (usalp->scmd->ux_errno == EINVAL)
-					break;
-				continue;
-			}
-
-#ifdef	FMT
-			if (print_disknames(bus, tgt, -1) < 8)
-				fprintf(f, "\t");
-			else
-				fprintf(f, " ");
-#else
-			fprintf(f, "\t");
-#endif
-			if (fprintf(f, "%d,%d,%d", bus, tgt, lun) < 8)
-				fprintf(f, "\t");
-			else
-				fprintf(f, " ");
-			fprintf(f, "%3d) ", n);
-			if (tgt == initiator) {
-				fprintf(f, "HOST ADAPTOR\n");
-				continue;
-			}
-			if (!have_tgt) {
-				/*
-				 * Hack: fd -> -2 means no access
-				 */
-				fprintf(f, "%c\n", usalp->fd == -2 ? '?':'*');
-				continue;
-			}
-			amt++;
-			if (low < 0)
-				low = n;
-			high = n;
-
-			getdev(usalp, FALSE);
-			print_product(f, usalp->inq);
-		}
-	}
-	usalp->silent--;
-
-	if (low < 0) {
-		errmsgno(EX_BAD, "No target found.\n");
-		return (0);
-	}
-	n = -1;
-#ifdef	FMT
-	getint("Select target", &n, low, high);
-	bus = n/100;
-	tgt = n%100;
-	usal_settarget(usalp, bus, tgt, lun);
-	return (select_unit(usalp));
-
-	usal_settarget(usalp, cscsibus, ctarget, clun);
-#endif
-	return (amt);
-}
-
-static int
-select_unit(SCSI *usalp, FILE *f)
-{
-	int	initiator;
-	int	clun	= usal_lun(usalp);
-	int	low	= -1;
-	int	high	= -1;
-	int	lun;
-
-	usalp->silent++;
-
-	fprintf(f, "scsibus%d target %d:\n", usal_scsibus(usalp), usal_target(usalp));
-
-	initiator = usal_initiator_id(usalp);
-	for (lun = 0; lun < 8; lun++) {
-
-#ifdef	FMT
-		if (print_disknames(usal_scsibus(usalp), usal_target(usalp), lun) < 8)
-			fprintf(f, "\t");
-		else
-			fprintf(f, " ");
-#else
-		fprintf(f, "\t");
-#endif
-		if (fprintf(f, "%d,%d,%d", usal_scsibus(usalp), usal_target(usalp), lun) < 8)
-			fprintf(f, "\t");
-		else
-			fprintf(f, " ");
-		fprintf(f, "%3d) ", lun);
-		if (usal_target(usalp) == initiator) {
-			fprintf(f, "HOST ADAPTOR\n");
-			continue;
-		}
-		usal_settarget(usalp, usal_scsibus(usalp), usal_target(usalp), lun);
-		if (!unit_ready(usalp) && usalp->scmd->error == SCG_FATAL) {
-			fprintf(f, "*\n");
-			continue;
-		}
-		if (unit_ready(usalp)) {
-			/* non extended sense illegal lun */
-			if (usalp->scmd->sense.code == 0x25) {
-				fprintf(f, "BAD UNIT\n");
-				continue;
-			}
-		}
-		if (low < 0)
-			low = lun;
-		high = lun;
-
-		getdev(usalp, FALSE);
-		print_product(f, usalp->inq);
-	}
-	usalp->silent--;
-
-	if (low < 0) {
-		errmsgno(EX_BAD, "No lun found.\n");
-		return (0);
-	}
-	lun = -1;
-#ifdef	FMT
-	getint("Select lun", &lun, low, high);
-	usal_settarget(usalp, usal_scsibus(usalp), usal_target(usalp), lun);
-	format_one(usalp);
-	return (1);
-#endif
-
-	usal_settarget(usalp, usal_scsibus(usalp), usal_target(usalp), clun);
-	return (1);
-}




More information about the Debburn-changes mailing list