diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2012-12-31 05:04:42 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2012-12-31 05:04:42 +0400 |
commit | 71dc8760ff4de5f365330d1bc571d934deb54af9 (patch) | |
tree | 7346d42a282562a3937d82307012b5857d642ce6 /libusal/scsihack.c | |
download | cdrkit-71dc8760ff4de5f365330d1bc571d934deb54af9.tar.gz |
Imported Upstream version 1.1.11upstream/1.1.11upstream
Diffstat (limited to 'libusal/scsihack.c')
-rw-r--r-- | libusal/scsihack.c | 483 |
1 files changed, 483 insertions, 0 deletions
diff --git a/libusal/scsihack.c b/libusal/scsihack.c new file mode 100644 index 0000000..5427ad0 --- /dev/null +++ b/libusal/scsihack.c @@ -0,0 +1,483 @@ +/* + * 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. + * + */ + +/* @(#)scsihack.c 1.44 06/01/30 Copyright 1997,2000,2001 J. Schilling */ +/* + * Interface for other generic SCSI implementations. + * Emulate the functionality of /dev/usal? with the local + * SCSI user land implementation. + * + * To add a new hack, add something like: + * + * #ifdef __FreeBSD__ + * #define SCSI_IMPL + * #include some code + * #endif + * + * Warning: you may change this source or add new SCSI tranport + * implementations, but if you do that you need to change the + * _usal_version and _usal_auth* string that are returned by the + * SCSI transport code. + * Choose your name instead of "schily" and make clear that the version + * string is related to a modified source. + * If your version has been integrated into the main steam release, + * the return value will be set to "schily". + * + * Copyright (c) 1997,2000,2001 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> + +#ifdef HAVE_SYS_PARAM_H +#include <sys/param.h> /* Include various defs needed with some OS */ +#endif +#include <stdio.h> +#include <standard.h> +#include <stdxlib.h> +#include <unixstd.h> +#include <errno.h> +#include <timedefs.h> +#include <sys/ioctl.h> +#include <fctldefs.h> +#include <strdefs.h> +#include <schily.h> + +#include <usal/usalcmd.h> +#include <usal/scsitransp.h> +#include "usaltimes.h" + +#ifndef HAVE_ERRNO_DEF +extern int errno; +#endif + +static int usalo_send(SCSI *usalp); +static char *usalo_version(SCSI *usalp, int what); +static int usalo_help(SCSI *usalp, FILE *f); +static int usalo_open(SCSI *usalp, char *device); +static int usalo_close(SCSI *usalp); +static long usalo_maxdma(SCSI *usalp, long amt); +static void *usalo_getbuf(SCSI *usalp, long amt); +static void usalo_freebuf(SCSI *usalp); + +static BOOL usalo_havebus(SCSI *usalp, int busno); +static int usalo_fileno(SCSI *usalp, int busno, int tgt, int tlun); +static char * usalo_natname(SCSI *usalp, int busno, int tgt, int tlun); +static int usalo_initiator_id(SCSI *usalp); +static int usalo_isatapi(SCSI *usalp); +static int usalo_reset(SCSI *usalp, int what); + +static char _usal_auth_cdrkit[] = "cdrkit-team"; /* The author for this module */ + +usal_ops_t usal_std_ops = { + usalo_send, + usalo_version, + usalo_help, + usalo_open, + usalo_close, + usalo_maxdma, + usalo_getbuf, + usalo_freebuf, + usalo_havebus, + usalo_fileno, + usalo_initiator_id, + usalo_isatapi, + usalo_reset, + usalo_natname, +}; + +/*#undef sun*/ +/*#undef __sun*/ +/*#undef __sun__*/ + +#if defined(sun) || defined(__sun) || defined(__sun__) +#define SCSI_IMPL /* We have a SCSI implementation for Sun */ + +#include "scsi-sun.c" + +#endif /* Sun */ + + +#ifdef linux +#define SCSI_IMPL /* We have a SCSI implementation for Linux */ + +#ifdef not_needed /* We now have a local vrersion of pg.h */ +#ifndef HAVE_LINUX_PG_H /* If we are compiling on an old version */ +# undef USE_PG_ONLY /* there is no 'pg' driver and we cannot */ +# undef USE_PG /* include <linux/pg.h> which is needed */ +#endif /* by the pg transport code. */ +#endif + +#ifdef USE_PG_ONLY +#include "scsi-linux-pg.c" +#else +#include "scsi-linux-sg.c" +#endif + +#endif /* linux */ + +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) +#define SCSI_IMPL /* We have a SCSI implementation for *BSD */ + +#include "scsi-bsd.c" + +#endif /* *BSD */ + +#if defined(__bsdi__) /* We have a SCSI implementation for BSD/OS 3.x (and later?) */ +# include <sys/param.h> +# if (_BSDI_VERSION >= 199701) +# define SCSI_IMPL + +# include "scsi-bsd-os.c" + +# endif /* BSD/OS >= 3.0 */ +#endif /* BSD/OS */ + +#ifdef __sgi +#define SCSI_IMPL /* We have a SCSI implementation for SGI */ + +#include "scsi-sgi.c" + +#endif /* SGI */ + +#ifdef __hpux +#define SCSI_IMPL /* We have a SCSI implementation for HP-UX */ + +#include "scsi-hpux.c" + +#endif /* HP-UX */ + +#if defined(_IBMR2) || defined(_AIX) +#define SCSI_IMPL /* We have a SCSI implementation for AIX */ + +#include "scsi-aix.c" + +#endif /* AIX */ + +#if defined(__NeXT__) || defined(IS_MACOS_X) +#if defined(HAVE_BSD_DEV_SCSIREG_H) +/* + * This is the + */ +#define SCSI_IMPL /* We found a SCSI implementation for NextStep and Mac OS X */ + +#include "scsi-next.c" +#else + +#define SCSI_IMPL /* We found a SCSI implementation for Mac OS X (Darwin-1.4) */ + +#include "scsi-mac-iokit.c" + +#endif /* HAVE_BSD_DEV_SCSIREG_H */ + +#endif /* NEXT / Mac OS X */ + +#if defined(__osf__) +#define SCSI_IMPL /* We have a SCSI implementation for OSF/1 */ + +#include "scsi-osf.c" + +#endif /* OSF/1 */ + +#ifdef VMS +#define SCSI_IMPL /* We have a SCSI implementation for VMS */ + +#include "scsi-vms.c" + +#endif /* VMS */ + +#ifdef OPENSERVER +#define SCSI_IMPL /* We have a SCSI implementation for SCO OpenServer */ + +#include "scsi-openserver.c" + +#endif /* SCO */ + +#ifdef UNIXWARE +#define SCSI_IMPL /* We have a SCSI implementation for SCO UnixWare */ + +#include "scsi-unixware.c" + +#endif /* UNIXWARE */ + +#ifdef __OS2 +#define SCSI_IMPL /* We have a SCSI implementation for OS/2 */ + +#include "scsi-os2.c" + +#endif /* OS/2 */ + +#ifdef __BEOS__ +#define SCSI_IMPL /* Yep, BeOS does that funky scsi stuff */ +#include "scsi-beos.c" +#endif + +#ifdef __CYGWIN32__ +#define SCSI_IMPL /* Yep, we support WNT and W9? */ +#include "scsi-wnt.c" +#endif + +#ifdef apollo +#define SCSI_IMPL /* We have a SCSI implementation for Apollo Domain/OS */ +#include "scsi-apollo.c" +#endif + +#ifdef AMIGA /* We have a SCSI implementation for AmigaOS */ +#define SCSI_IMPL +#include "scsi-amigaos.c" +#endif + +#if defined(__QNXNTO__) || defined(__QNX__) +#define SCSI_IMPL /* We have a SCSI implementation for QNX */ +#include "scsi-qnx.c" +#endif /* QNX */ + +#ifdef __DJGPP__ /* We have a SCSI implementation for MS-DOS/DJGPP */ +#define SCSI_IMPL +#include "scsi-dos.c" +#endif + +#ifdef __NEW_ARCHITECTURE +#define SCSI_IMPL /* We have a SCSI implementation for XXX */ +/* + * Add new hacks here + */ +#include "scsi-new-arch.c" +#endif + + +#ifndef SCSI_IMPL +/* + * To make scsihack.c compile on all architectures. + * This does not mean that you may use it, but you can see + * if other problems exist. + */ +#define usalo_dversion usalo_version +#define usalo_dhelp usalo_help +#define usalo_dopen usalo_open +#define usalo_dclose usalo_close +#define usalo_dmaxdma usalo_maxdma +#define usalo_dgetbuf usalo_getbuf +#define usalo_dfreebuf usalo_freebuf +#define usalo_dhavebus usalo_havebus +#define usalo_dfileno usalo_fileno +#define usalo_dinitiator_id usalo_initiator_id +#define usalo_disatapi usalo_isatapi +#define usalo_dreset usalo_reset +#define usalo_dsend usalo_send +#endif /* SCSI_IMPL */ + +static int usalo_dsend(SCSI *usalp); +static char *usalo_dversion(SCSI *usalp, int what); +static int usalo_dhelp(SCSI *usalp, FILE *f); +static int usalo_nohelp(SCSI *usalp, FILE *f); +static int usalo_ropen(SCSI *usalp, char *device); +static int usalo_dopen(SCSI *usalp, char *device); +static int usalo_dclose(SCSI *usalp); +static long usalo_dmaxdma(SCSI *usalp, long amt); +static void *usalo_dgetbuf(SCSI *usalp, long amt); +static void usalo_dfreebuf(SCSI *usalp); +static BOOL usalo_dhavebus(SCSI *usalp, int busno); +static int usalo_dfileno(SCSI *usalp, int busno, int tgt, int tlun); +static int usalo_dinitiator_id(SCSI *usalp); +static int usalo_disatapi(SCSI *usalp); +static int usalo_dreset(SCSI *usalp, int what); + +usal_ops_t usal_remote_ops = { + usalo_dsend, + usalo_dversion, + usalo_nohelp, + usalo_ropen, + usalo_dclose, + usalo_dmaxdma, + usalo_dgetbuf, + usalo_dfreebuf, + usalo_dhavebus, + usalo_dfileno, + usalo_dinitiator_id, + usalo_disatapi, + usalo_dreset, + usalo_natname, +}; + +usal_ops_t usal_dummy_ops = { + usalo_dsend, + usalo_dversion, + usalo_dhelp, + usalo_dopen, + usalo_dclose, + usalo_dmaxdma, + usalo_dgetbuf, + usalo_dfreebuf, + usalo_dhavebus, + usalo_dfileno, + usalo_dinitiator_id, + usalo_disatapi, + usalo_dreset, + usalo_natname, +}; + +/* + * Warning: you may change this source, but if you do that + * you need to change the _usal_version and _usal_auth* string below. + * You may not return "schily" for an SCG_AUTHOR request anymore. + * Choose your name instead of "schily" and make clear that the version + * string is related to a modified source. + */ +static char _usal_trans_dversion[] = "scsihack.c-1.44"; /* The version for this transport*/ + +/* + * Return version information for the low level SCSI transport code. + * This has been introduced to make it easier to trace down problems + * in applications. + */ +static char * +usalo_dversion(SCSI *usalp, int what) +{ + if (usalp != (SCSI *)0) { + switch (what) { + + case SCG_VERSION: + return (_usal_trans_dversion); + /* + * If you changed this source, you are not allowed to + * return "schily" for the SCG_AUTHOR request. + */ + case SCG_AUTHOR: + return (_usal_auth_cdrkit); + case SCG_SCCS_ID: + return (_sccsid); + } + } + return ((char *)0); +} + +static int +usalo_dhelp(SCSI *usalp, FILE *f) +{ + printf("None.\n"); + return (0); +} + +static int +usalo_nohelp(SCSI *usalp, FILE *f) +{ + return (0); +} + +static int +usalo_ropen(SCSI *usalp, char *device) +{ + comerrno(EX_BAD, "No remote SCSI transport available.\n"); + return (-1); /* Keep lint happy */ +} + +#ifndef SCSI_IMPL +static int +usalo_dopen(SCSI *usalp, char *device) +{ + comerrno(EX_BAD, "No local SCSI transport implementation for this architecture.\n"); + return (-1); /* Keep lint happy */ +} +#else +static int +usalo_dopen(SCSI *usalp, char *device) +{ + comerrno(EX_BAD, "SCSI open usage error.\n"); + return (-1); /* Keep lint happy */ +} +#endif /* SCSI_IMPL */ + +static int +usalo_dclose(SCSI *usalp) +{ + errno = EINVAL; + return (-1); +} + +static long +usalo_dmaxdma(SCSI *usalp, long amt) +{ + errno = EINVAL; + return (0L); +} + +static void * +usalo_dgetbuf(SCSI *usalp, long amt) +{ + errno = EINVAL; + return ((void *)0); +} + +static void +usalo_dfreebuf(SCSI *usalp) +{ +} + +static BOOL +usalo_dhavebus(SCSI *usalp, int busno) +{ + return (FALSE); +} + +static int +usalo_dfileno(SCSI *usalp, int busno, int tgt, int tlun) +{ + return (-1); +} + +#ifndef HAVE_NAT_NAMES /* to be defined in included source if supported */ +static char * usalo_natname(SCSI *usalp, int busno, int tgt, int tlun) { + static char namebuf[81]; + snprintf(namebuf, 80, "%d,%d,%d", usal_scsibus(usalp), usal_target(usalp), usal_lun(usalp)); + return namebuf; +} +#endif + +static int +usalo_dinitiator_id(SCSI *usalp) +{ + return (-1); +} + +static int +usalo_disatapi(SCSI *usalp) +{ + return (FALSE); +} + +static int +usalo_dreset(SCSI *usalp, int what) +{ + errno = EINVAL; + return (-1); +} + +static int +usalo_dsend(SCSI *usalp) +{ + errno = EINVAL; + return (-1); +} |