Extended sg-API by sg_shutdown(), sg_dispose_drive(), sg_id_string()

This commit is contained in:
Thomas Schmitt 2009-12-27 14:45:05 +00:00
parent 5b56956a1e
commit 2dfa6d6b3c
10 changed files with 310 additions and 29 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2009.12.27.102342" #define Cdrskin_timestamP "2009.12.27.144620"

View File

@ -90,6 +90,7 @@ void burn_drive_free_subs(struct burn_drive *d)
if (d->stdio_fd >= 0) if (d->stdio_fd >= 0)
close (d->stdio_fd); close (d->stdio_fd);
d->stdio_fd = -1; d->stdio_fd = -1;
sg_dispose_drive(d, 0);
} }

View File

@ -60,9 +60,9 @@ int burn_sg_open_o_nonblock = 1;
int burn_sg_open_abort_busy = 0; int burn_sg_open_abort_busy = 0;
/* The message returned from sg_initialize() /* The message returned from sg_id_string() and/or sg_initialize()
*/ */
char sg_initialize_msg[1024] = {""}; static char sg_initialize_msg[1024] = {""};
/* ts A61002 */ /* ts A61002 */
@ -151,13 +151,18 @@ void burn_finish(void)
/* ts A60924 : ticket 74 */ /* ts A60924 : ticket 74 */
libdax_msgs_destroy(&libdax_messenger,0); libdax_msgs_destroy(&libdax_messenger,0);
sg_shutdown(0);
burn_running = 0; burn_running = 0;
} }
/* ts A9122 */
/* ts A91226 */
/** API function. See libburn.h */ /** API function. See libburn.h */
char *burn_scsi_transport_id(int flag) char *burn_scsi_transport_id(int flag)
{ {
if (!burn_running)
sg_id_string(sg_initialize_msg, 0);
return sg_initialize_msg; return sg_initialize_msg;
} }

View File

@ -1,8 +1,8 @@
/* os-dummy.h /* os-libcdio.h
Operating system specific libburn definitions and declarations. Included Operating system specific libburn definitions and declarations. Included
by os.h in case of compilation for by os.h in case of compilation for
Unknown POSIX like systems Unknown X/Open-like systems
with GNU libcdio MMC transport adapter sg-libcdio.c with GNU libcdio MMC transport adapter sg-libcdio.c
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
@ -40,6 +40,10 @@ SIGKILL, SIGCHLD, SIGSTOP
/* The maximum size for a (SCSI) i/o transaction */ /* The maximum size for a (SCSI) i/o transaction */
/* Important : MUST be at least 32768 ! */ /* Important : MUST be at least 32768 ! */
/* (It might be risky to use 64k. FreeBSD is said to can only 32k.) */ /* (It might be risky to use 64k. FreeBSD is said to can only 32k.) */
/* On Linux kernel 2.6.18 when stream recording 2x BD-RE
this would bring about 10 % more speed:
BURN_OS_TRANSPORT_BUFFER_SIZE 65536
*/
#define BURN_OS_TRANSPORT_BUFFER_SIZE 32768 #define BURN_OS_TRANSPORT_BUFFER_SIZE 32768

View File

@ -39,6 +39,22 @@ Present implementation: default dummy which enables libburn only to work
extern struct libdax_msgs *libdax_messenger; extern struct libdax_msgs *libdax_messenger;
/** Returns the id string of the SCSI transport adapter and eventually
needed operating system facilities.
This call is usable even if sg_initialize() was not called yet. In that
case a preliminary constant message might be issued if detailed info is
not available yet.
@param msg returns id string
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_id_string(char msg[1024], int flag)
{
strcpy(msg, "internal X/Open adapter sg-dummy");
return 1;
}
/** Performs global initialization of the SCSI transport adapter and eventually /** Performs global initialization of the SCSI transport adapter and eventually
needed operating system facilities. Checks for compatibility supporting needed operating system facilities. Checks for compatibility supporting
software components. software components.
@ -48,10 +64,34 @@ extern struct libdax_msgs *libdax_messenger;
*/ */
int sg_initialize(char msg[1024], int flag) int sg_initialize(char msg[1024], int flag)
{ {
strcpy(msg, "internal X/Open adapter sg-dummy"); return sg_id_string(msg, 0);
}
/** Performs global finalization of the SCSI transport adapter and eventually
needed operating system facilities. Releases globally aquired resources.
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_shutdown(int flag)
{
return 1; return 1;
} }
/** Finalizes BURN_OS_TRANSPORT_DRIVE_ELEMENTS, the components of
struct burn_drive which are defined in os-*.h.
This will be called when a burn_drive gets disposed.
@param d the drive to be finalized
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_dispose_drive(struct burn_drive *d, int flag)
{
return 1;
}
/** Returns the next index number and the next enumerated drive address. /** Returns the next index number and the next enumerated drive address.
The enumeration has to cover all available and accessible drives. It is The enumeration has to cover all available and accessible drives. It is
allowed to return addresses of drives which are not available but under allowed to return addresses of drives which are not available but under

View File

@ -29,17 +29,28 @@ and of deriving the following system specific files from existing examples:
Said sg-*.c operations are defined by a public function interface, which has Said sg-*.c operations are defined by a public function interface, which has
to be implemented in a way that provides libburn with the desired services: to be implemented in a way that provides libburn with the desired services:
sg_id_string() returns an id string of the SCSI transport adapter.
It may be called before initialization but then may
return only a preliminary id.
sg_initialize() performs global initialization of the SCSI transport sg_initialize() performs global initialization of the SCSI transport
adapter and eventually needed operating system adapter and eventually needed operating system
facilities. Checks for compatibility of supporting facilities. Checks for compatibility of supporting
software components. software components.
sg_shutdown() performs global finalizations and releases golbally
aquired resources.
sg_give_next_adr() iterates over the set of potentially useful drive sg_give_next_adr() iterates over the set of potentially useful drive
address strings. address strings.
scsi_enumerate_drives() brings all available, not-whitelist-banned, and scsi_enumerate_drives() brings all available, not-whitelist-banned, and
accessible drives into libburn's list of drives. accessible drives into libburn's list of drives.
sg_dispose_drive() finalizes adapter specifics of struct burn_drive
on destruction. Releases resources which were aquired
underneath scsi_enumerate_drives().
sg_drive_is_open() tells wether libburn has the given drive in use. sg_drive_is_open() tells wether libburn has the given drive in use.
sg_grab() opens the drive for SCSI commands and ensures sg_grab() opens the drive for SCSI commands and ensures
@ -235,6 +246,22 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/** Returns the id string of the SCSI transport adapter and eventually
needed operating system facilities.
This call is usable even if sg_initialize() was not called yet. In that
case a preliminary constant message might be issued if detailed info is
not available yet.
@param msg returns id string
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_id_string(char msg[1024], int flag)
{
strcpy(msg, "internal FreeBSD CAM adapter sg-freebsd-port");
return 1;
}
/** Performs global initialization of the SCSI transport adapter and eventually /** Performs global initialization of the SCSI transport adapter and eventually
needed operating system facilities. Checks for compatibility supporting needed operating system facilities. Checks for compatibility supporting
software components. software components.
@ -244,11 +271,36 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
*/ */
int sg_initialize(char msg[1024], int flag) int sg_initialize(char msg[1024], int flag)
{ {
strcpy(msg, "internal FreeBSD CAM adapter sg-freebsd-port"); return sg_id_string(msg, 0);
}
/** Performs global finalization of the SCSI transport adapter and eventually
needed operating system facilities. Releases globally aquired resources.
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_shutdown(int flag)
{
return 1; return 1;
} }
/** Finalizes BURN_OS_TRANSPORT_DRIVE_ELEMENTS, the components of
struct burn_drive which are defined in os-*.h.
The eventual initialization of those components was made underneath
scsi_enumerate_drives().
This will be called when a burn_drive gets disposed.
@param d the drive to be finalized
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_dispose_drive(struct burn_drive *d, int flag)
{
return 1;
}
/** Returns the next index number and the next enumerated drive address. /** Returns the next index number and the next enumerated drive address.
The enumeration has to cover all available and accessible drives. It is The enumeration has to cover all available and accessible drives. It is
allowed to return addresses of drives which are not available but under allowed to return addresses of drives which are not available but under

View File

@ -54,7 +54,24 @@ int burn_drive_is_banned(char *device_address);
int mmc_function_spy(struct burn_drive *d, char * text); int mmc_function_spy(struct burn_drive *d, char * text);
/* ts A91225 */ /* ts A91227 */
/** Returns the id string of the SCSI transport adapter and eventually
needed operating system facilities.
This call is usable even if sg_initialize() was not called yet. In that
case a preliminary constant message might be issued if detailed info is
not available yet.
@param msg returns id string
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_id_string(char msg[1024], int flag)
{
strcpy(msg, "internal FreeBSD CAM adapter sg-freebsd");
return 1;
}
/* ts A91227 */
/** Performs global initialization of the SCSI transport adapter and eventually /** Performs global initialization of the SCSI transport adapter and eventually
needed operating system facilities. Checks for compatibility supporting needed operating system facilities. Checks for compatibility supporting
software components. software components.
@ -64,11 +81,37 @@ int mmc_function_spy(struct burn_drive *d, char * text);
*/ */
int sg_initialize(char msg[1024], int flag) int sg_initialize(char msg[1024], int flag)
{ {
strcpy(msg, "internal FreeBSD CAM adapter sg-freebsd"); return sg_id_string(msg, 0);
}
/* ts A91227 */
/** Performs global finalization of the SCSI transport adapter and eventually
needed operating system facilities. Releases globally aquired resources.
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_shutdown(int flag)
{
return 1; return 1;
} }
/** Finalizes BURN_OS_TRANSPORT_DRIVE_ELEMENTS, the components of
struct burn_drive which are defined in os-*.h.
The eventual initialization of those components was made underneath
scsi_enumerate_drives().
This will be called when a burn_drive gets disposed.
@param d the drive to be finalized
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_dispose_drive(struct burn_drive *d, int flag)
{
return 1;
}
/* ts A61021 : Moved most code from scsi_enumerate_drives under /* ts A61021 : Moved most code from scsi_enumerate_drives under
sg_give_next_adr() */ sg_give_next_adr() */
/* Some helper functions for scsi_give_next_adr() */ /* Some helper functions for scsi_give_next_adr() */

View File

@ -29,17 +29,28 @@ and of deriving the following system specific files from existing examples:
Said sg-*.c operations are defined by a public function interface, which has Said sg-*.c operations are defined by a public function interface, which has
to be implemented in a way that provides libburn with the desired services: to be implemented in a way that provides libburn with the desired services:
sg_id_string() returns an id string of the SCSI transport adapter.
It may be called before initialization but then may
return only a preliminary id.
sg_initialize() performs global initialization of the SCSI transport sg_initialize() performs global initialization of the SCSI transport
adapter and eventually needed operating system adapter and eventually needed operating system
facilities. Checks for compatibility of supporting facilities. Checks for compatibility of supporting
software components. software components.
sg_shutdown() performs global finalizations and releases golbally
aquired resources.
sg_give_next_adr() iterates over the set of potentially useful drive sg_give_next_adr() iterates over the set of potentially useful drive
address strings. address strings.
scsi_enumerate_drives() brings all available, not-whitelist-banned, and scsi_enumerate_drives() brings all available, not-whitelist-banned, and
accessible drives into libburn's list of drives. accessible drives into libburn's list of drives.
sg_dispose_drive() finalizes adapter specifics of struct burn_drive
on destruction. Releases resources which were aquired
underneath scsi_enumerate_drives().
sg_drive_is_open() tells wether libburn has the given drive in use. sg_drive_is_open() tells wether libburn has the given drive in use.
sg_grab() opens the drive for SCSI commands and ensures sg_grab() opens the drive for SCSI commands and ensures
@ -281,6 +292,35 @@ static void enumerate_common(char *fname, char *cdio_name,
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/** Returns the id string of the SCSI transport adapter and eventually
needed operating system facilities.
This call is usable even if sg_initialize() was not called yet. In that
case a preliminary constant message might be issued if detailed info is
not available yet.
@param msg returns id string
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_id_string(char msg[1024], int flag)
{
char *version_text;
sprintf(msg, "sg-libcdio h%d with libcdio ", LIBCDIO_VERSION_NUM);
#if LIBCDIO_VERSION_NUM < 83
LIBBURN_MISCONFIGURATION = 0;
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_cdio_version_dot_h_TOO_OLD__NEED_libcdio_VERSION_NUM_83 = 0;
LIBBURN_MISCONFIGURATION_ = 0;
#endif /* LIBCDIO_VERSION_NUM < 83 */
version_text = (char *) cdio_version_string;
strncat(msg, version_text, 800);
return 1;
}
/** Performs global initialization of the SCSI transport adapter and eventually /** Performs global initialization of the SCSI transport adapter and eventually
needed operating system facilities. Checks for compatibility of supporting needed operating system facilities. Checks for compatibility of supporting
software components. software components.
@ -290,26 +330,12 @@ static void enumerate_common(char *fname, char *cdio_name,
*/ */
int sg_initialize(char msg[1024], int flag) int sg_initialize(char msg[1024], int flag)
{ {
char *version_text, *msg_pt;
int cdio_ver; int cdio_ver;
char *msg_pt;
sprintf(msg, "sg-libcdio adapter v%d with libcdio version ", msg[0] = 0;
LIBCDIO_VERSION_NUM); sg_id_string(msg, 0);
#if LIBCDIO_VERSION_NUM < 83
LIBBURN_MISCONFIGURATION = 0;
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_cdio_version_dot_h_TOO_OLD__NEED_LIBCDIO_VERSION_NUM_83 = 0;
LIBBURN_MISCONFIGURATION_ = 0;
#else
cdio_ver = libcdio_version_num; cdio_ver = libcdio_version_num;
version_text = (char *) cdio_version_string;
#endif /* ! LIBCDIO_VERSION_NUM < 83 */
strncat(msg, version_text, 800);
libdax_msgs_submit(libdax_messenger, -1, 0x00000002, libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
msg , 0, 0); msg , 0, 0);
@ -329,6 +355,32 @@ LIBBURN_MISCONFIGURATION_ = 0;
} }
/** Performs global finalization of the SCSI transport adapter and eventually
needed operating system facilities. Releases globally aquired resources.
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_shutdown(int flag)
{
return 1;
}
/** Finalizes BURN_OS_TRANSPORT_DRIVE_ELEMENTS, the components of
struct burn_drive which are defined in os-*.h.
The eventual initialization of those components was made underneath
scsi_enumerate_drives().
This will be called when a burn_drive gets disposed.
@param d the drive to be finalized
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_dispose_drive(struct burn_drive *d, int flag)
{
return 1;
}
/** Returns the next index number and the next enumerated drive address. /** Returns the next index number and the next enumerated drive address.
The enumeration has to cover all available and accessible drives. It is The enumeration has to cover all available and accessible drives. It is
allowed to return addresses of drives which are not available but under allowed to return addresses of drives which are not available but under

View File

@ -35,17 +35,28 @@ and of deriving the following system specific files from existing examples:
Said sg-*.c operations are defined by a public function interface, which has Said sg-*.c operations are defined by a public function interface, which has
to be implemented in a way that provides libburn with the desired services: to be implemented in a way that provides libburn with the desired services:
sg_id_string() returns an id string of the SCSI transport adapter.
It may be called before initialization but then may
return only a preliminary id.
sg_initialize() performs global initialization of the SCSI transport sg_initialize() performs global initialization of the SCSI transport
adapter and eventually needed operating system adapter and eventually needed operating system
facilities. Checks for compatibility of supporting facilities. Checks for compatibility of supporting
software components. software components.
sg_shutdown() performs global finalizations and releases golbally
aquired resources.
sg_give_next_adr() iterates over the set of potentially useful drive sg_give_next_adr() iterates over the set of potentially useful drive
address strings. address strings.
scsi_enumerate_drives() brings all available, not-whitelist-banned, and scsi_enumerate_drives() brings all available, not-whitelist-banned, and
accessible drives into libburn's list of drives. accessible drives into libburn's list of drives.
sg_dispose_drive() finalizes adapter specifics of struct burn_drive
on destruction. Releases resources which were aquired
underneath scsi_enumerate_drives().
sg_drive_is_open() tells wether libburn has the given drive in use. sg_drive_is_open() tells wether libburn has the given drive in use.
sg_grab() opens the drive for SCSI commands and ensures sg_grab() opens the drive for SCSI commands and ensures
@ -1412,6 +1423,22 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/** Returns the id string of the SCSI transport adapter and eventually
needed operating system facilities.
This call is usable even if sg_initialize() was not called yet. In that
case a preliminary constant message might be issued if detailed info is
not available yet.
@param msg returns id string
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_id_string(char msg[1024], int flag)
{
strcpy(msg, "internal Linux SG_IO adapter sg-linux");
return 1;
}
/** Performs global initialization of the SCSI transport adapter and eventually /** Performs global initialization of the SCSI transport adapter and eventually
needed operating system facilities. Checks for compatibility supporting needed operating system facilities. Checks for compatibility supporting
software components. software components.
@ -1421,11 +1448,36 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
*/ */
int sg_initialize(char msg[1024], int flag) int sg_initialize(char msg[1024], int flag)
{ {
strcpy(msg, "internal Linux SG_IO adapter sg-linux"); return sg_id_string(msg, 0);
}
/** Performs global finalization of the SCSI transport adapter and eventually
needed operating system facilities. Releases globally aquired resources.
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_shutdown(int flag)
{
return 1; return 1;
} }
/** Finalizes BURN_OS_TRANSPORT_DRIVE_ELEMENTS, the components of
struct burn_drive which are defined in os-*.h.
The eventual initialization of those components was made underneath
scsi_enumerate_drives().
This will be called when a burn_drive gets disposed.
@param d the drive to be finalized
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_dispose_drive(struct burn_drive *d, int flag)
{
return 1;
}
/** PORTING: /** PORTING:
In this Linux implementation, this function mirrors the enumeration In this Linux implementation, this function mirrors the enumeration
done in sg_enumerate and ata_enumerate(). It would be better to base those done in sg_enumerate and ata_enumerate(). It would be better to base those

View File

@ -33,6 +33,18 @@ int sg_drive_is_open(struct burn_drive * d);
int burn_os_stdio_capacity(char *path, off_t *bytes); int burn_os_stdio_capacity(char *path, off_t *bytes);
/* ts A91227 */
/** Returns the id string of the SCSI transport adapter and eventually
needed operating system facilities.
This call is usable even if sg_initialize() was not called yet. In that
case a preliminary constant message might be issued if detailed info is
not available yet.
@param msg returns id string
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_id_string(char msg[1024], int flag);
/* ts A91225 */ /* ts A91225 */
/** Performs global initialization of the SCSI transport adapter and eventually /** Performs global initialization of the SCSI transport adapter and eventually
needed operating system facilities. Checks for compatibility supporting needed operating system facilities. Checks for compatibility supporting
@ -43,5 +55,25 @@ int burn_os_stdio_capacity(char *path, off_t *bytes);
*/ */
int sg_initialize(char msg[1024], int flag); int sg_initialize(char msg[1024], int flag);
/* ts A91227 */
/** Performs global finalization of the SCSI transport adapter and eventually
needed operating system facilities. Releases globally aquired resources.
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_shutdown(int flag);
/* ts A91227 */
/** Finalizes BURN_OS_TRANSPORT_DRIVE_ELEMENTS, the components of
struct burn_drive which are defined in os-*.h.
The eventual initialization of those components was made underneath
scsi_enumerate_drives().
This will be called when a burn_drive gets disposed.
@param d the drive to be finalized
@param flag unused yet, submit 0
@return 1 = success, <=0 = failure
*/
int sg_dispose_drive(struct burn_drive *d, int flag);
#endif /* __SG */ #endif /* __SG */