From 2dfa6d6b3c5fe4369412a0dbf053f1ed1474a755 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sun, 27 Dec 2009 14:45:05 +0000 Subject: [PATCH] Extended sg-API by sg_shutdown(), sg_dispose_drive(), sg_id_string() --- libburn/trunk/cdrskin/cdrskin_timestamp.h | 2 +- libburn/trunk/libburn/drive.c | 1 + libburn/trunk/libburn/init.c | 11 ++- libburn/trunk/libburn/os-libcdio.h | 8 ++- libburn/trunk/libburn/sg-dummy.c | 42 ++++++++++- libburn/trunk/libburn/sg-freebsd-port.c | 54 +++++++++++++- libburn/trunk/libburn/sg-freebsd.c | 47 +++++++++++- libburn/trunk/libburn/sg-libcdio.c | 88 ++++++++++++++++++----- libburn/trunk/libburn/sg-linux.c | 54 +++++++++++++- libburn/trunk/libburn/sg.h | 32 +++++++++ 10 files changed, 310 insertions(+), 29 deletions(-) diff --git a/libburn/trunk/cdrskin/cdrskin_timestamp.h b/libburn/trunk/cdrskin/cdrskin_timestamp.h index c30d7ccd..fa68588c 100644 --- a/libburn/trunk/cdrskin/cdrskin_timestamp.h +++ b/libburn/trunk/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2009.12.27.102342" +#define Cdrskin_timestamP "2009.12.27.144620" diff --git a/libburn/trunk/libburn/drive.c b/libburn/trunk/libburn/drive.c index 243bc699..17623a9f 100644 --- a/libburn/trunk/libburn/drive.c +++ b/libburn/trunk/libburn/drive.c @@ -90,6 +90,7 @@ void burn_drive_free_subs(struct burn_drive *d) if (d->stdio_fd >= 0) close (d->stdio_fd); d->stdio_fd = -1; + sg_dispose_drive(d, 0); } diff --git a/libburn/trunk/libburn/init.c b/libburn/trunk/libburn/init.c index 71f0695f..91eefeda 100644 --- a/libburn/trunk/libburn/init.c +++ b/libburn/trunk/libburn/init.c @@ -60,9 +60,9 @@ int burn_sg_open_o_nonblock = 1; 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 */ @@ -151,13 +151,18 @@ void burn_finish(void) /* ts A60924 : ticket 74 */ libdax_msgs_destroy(&libdax_messenger,0); + sg_shutdown(0); + burn_running = 0; } -/* ts A9122 */ + +/* ts A91226 */ /** API function. See libburn.h */ char *burn_scsi_transport_id(int flag) { + if (!burn_running) + sg_id_string(sg_initialize_msg, 0); return sg_initialize_msg; } diff --git a/libburn/trunk/libburn/os-libcdio.h b/libburn/trunk/libburn/os-libcdio.h index 47255855..c7203984 100644 --- a/libburn/trunk/libburn/os-libcdio.h +++ b/libburn/trunk/libburn/os-libcdio.h @@ -1,8 +1,8 @@ -/* os-dummy.h +/* os-libcdio.h Operating system specific libburn definitions and declarations. Included 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 Copyright (C) 2009 Thomas Schmitt , provided under GPL @@ -40,6 +40,10 @@ SIGKILL, SIGCHLD, SIGSTOP /* The maximum size for a (SCSI) i/o transaction */ /* Important : MUST be at least 32768 ! */ /* (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 diff --git a/libburn/trunk/libburn/sg-dummy.c b/libburn/trunk/libburn/sg-dummy.c index 08378aae..f2e9ed59 100644 --- a/libburn/trunk/libburn/sg-dummy.c +++ b/libburn/trunk/libburn/sg-dummy.c @@ -39,6 +39,22 @@ Present implementation: default dummy which enables libburn only to work 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 needed operating system facilities. Checks for compatibility supporting software components. @@ -48,10 +64,34 @@ extern struct libdax_msgs *libdax_messenger; */ 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; } + +/** 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. The enumeration has to cover all available and accessible drives. It is allowed to return addresses of drives which are not available but under diff --git a/libburn/trunk/libburn/sg-freebsd-port.c b/libburn/trunk/libburn/sg-freebsd-port.c index 7ade1d86..e726f4a0 100644 --- a/libburn/trunk/libburn/sg-freebsd-port.c +++ b/libburn/trunk/libburn/sg-freebsd-port.c @@ -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 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 adapter and eventually needed operating system facilities. Checks for compatibility of supporting software components. +sg_shutdown() performs global finalizations and releases golbally + aquired resources. + sg_give_next_adr() iterates over the set of potentially useful drive address strings. scsi_enumerate_drives() brings all available, not-whitelist-banned, and 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_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 needed operating system facilities. Checks for compatibility supporting 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) { - 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; } +/** 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. The enumeration has to cover all available and accessible drives. It is allowed to return addresses of drives which are not available but under diff --git a/libburn/trunk/libburn/sg-freebsd.c b/libburn/trunk/libburn/sg-freebsd.c index 7f56d843..bdb91e52 100644 --- a/libburn/trunk/libburn/sg-freebsd.c +++ b/libburn/trunk/libburn/sg-freebsd.c @@ -54,7 +54,24 @@ int burn_drive_is_banned(char *device_address); 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 needed operating system facilities. Checks for compatibility supporting software components. @@ -64,11 +81,37 @@ int mmc_function_spy(struct burn_drive *d, char * text); */ 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; } +/** 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 sg_give_next_adr() */ /* Some helper functions for scsi_give_next_adr() */ diff --git a/libburn/trunk/libburn/sg-libcdio.c b/libburn/trunk/libburn/sg-libcdio.c index 80a282ad..7263dad9 100644 --- a/libburn/trunk/libburn/sg-libcdio.c +++ b/libburn/trunk/libburn/sg-libcdio.c @@ -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 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 adapter and eventually needed operating system facilities. Checks for compatibility of supporting software components. - + +sg_shutdown() performs global finalizations and releases golbally + aquired resources. + sg_give_next_adr() iterates over the set of potentially useful drive address strings. scsi_enumerate_drives() brings all available, not-whitelist-banned, and 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_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 needed operating system facilities. Checks for compatibility of supporting software components. @@ -290,26 +330,12 @@ static void enumerate_common(char *fname, char *cdio_name, */ int sg_initialize(char msg[1024], int flag) { - char *version_text, *msg_pt; int cdio_ver; + char *msg_pt; - sprintf(msg, "sg-libcdio adapter v%d with libcdio version ", - 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; - - #else - + msg[0] = 0; + sg_id_string(msg, 0); 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_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, 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. The enumeration has to cover all available and accessible drives. It is allowed to return addresses of drives which are not available but under diff --git a/libburn/trunk/libburn/sg-linux.c b/libburn/trunk/libburn/sg-linux.c index d2784bb8..2ceb30b4 100644 --- a/libburn/trunk/libburn/sg-linux.c +++ b/libburn/trunk/libburn/sg-linux.c @@ -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 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 adapter and eventually needed operating system facilities. Checks for compatibility of supporting software components. +sg_shutdown() performs global finalizations and releases golbally + aquired resources. + sg_give_next_adr() iterates over the set of potentially useful drive address strings. scsi_enumerate_drives() brings all available, not-whitelist-banned, and 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_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 needed operating system facilities. Checks for compatibility supporting 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) { - 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; } +/** 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: In this Linux implementation, this function mirrors the enumeration done in sg_enumerate and ata_enumerate(). It would be better to base those diff --git a/libburn/trunk/libburn/sg.h b/libburn/trunk/libburn/sg.h index 0d1537cf..31f1dd98 100644 --- a/libburn/trunk/libburn/sg.h +++ b/libburn/trunk/libburn/sg.h @@ -33,6 +33,18 @@ int sg_drive_is_open(struct burn_drive * d); 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 */ /** Performs global initialization of the SCSI transport adapter and eventually 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); +/* 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 */