diff --git a/Makefile.am b/Makefile.am index c6f8dfb..e062ff4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -39,6 +39,7 @@ libburn_libburn_la_SOURCES = \ libburn/null.h \ libburn/options.c \ libburn/options.h \ + libburn/os.h \ libburn/read.c \ libburn/read.h \ libburn/sbc.c \ @@ -184,6 +185,8 @@ EXTRA_DIST = \ cdrskin/wiki_plain.txt \ cdrskin/cleanup.h \ cdrskin/cleanup.c \ + libburn/os-freebsd.h \ + libburn/os-linux.h \ libburn/sg-freebsd.c \ libburn/sg-linux.c \ COPYING diff --git a/cdrskin/cleanup.c b/cdrskin/cleanup.c index 6c9f3b6..6703240 100644 --- a/cdrskin/cleanup.c +++ b/cdrskin/cleanup.c @@ -23,31 +23,27 @@ typedef void (*sighandler_t)(int); #include "cleanup.h" -#ifdef __FreeBSD__ + +#ifndef Cleanup_has_no_libburn_os_H + + +#include "../libburn/os.h" + +/* see os.h for name of particular os-*.h where this is defined */ +static int signal_list[]= { BURN_OS_SIGNAL_MACRO_LIST , -1}; +static char *signal_name_list[]= { BURN_OS_SIGNAL_NAME_LIST , "@"}; +static int signal_list_count= BURN_OS_SIGNAL_COUNT; +static int non_signal_list[]= { BURN_OS_NON_SIGNAL_MACRO_LIST, -1}; +static int non_signal_list_count= BURN_OS_NON_SIGNAL_COUNT; + + +#else /* ! Cleanup_has_no_libburn_os_H */ + + +/* Outdated. Linux only. For backward compatibility with pre-libburn-0.2.3 */ /* Signals to be caught */ -static int signal_list[]= { - SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, - SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, - SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, - SIGTTOU, - SIGBUS, SIGPROF, SIGSYS, SIGTRAP, - SIGVTALRM, SIGXCPU, SIGXFSZ, -1 -}; -static char *signal_name_list[]= { - "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", - "SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", - "SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", - "SIGTTOU", - "SIGBUS", "SIGPROF", "SIGSYS", "SIGTRAP", - "SIGVTALRM", "SIGXCPU", "SIGXFSZ", "@" -}; -static int signal_list_count= 23; - -#else /* __FreeBSD__ */ - -/* Signals to be caught */ -static int signal_list[]= { +static int signal_list[]= { SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, @@ -55,7 +51,7 @@ static int signal_list[]= { SIGBUS, SIGPOLL, SIGPROF, SIGSYS, SIGTRAP, SIGVTALRM, SIGXCPU, SIGXFSZ, -1 }; -static char *signal_name_list[]= { +static char *signal_name_list[]= { "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", "SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", @@ -65,15 +61,17 @@ static char *signal_name_list[]= { }; static int signal_list_count= 24; -#endif /* ! __FreeBSD__ */ - /* Signals not to be caught */ static int non_signal_list[]= { SIGKILL, SIGCHLD, SIGSTOP, SIGURG, -1 -}; +}; static int non_signal_list_count= 4; +#endif /* Cleanup_has_no_libburn_os_H */ + + + /* run time dynamic part */ static char cleanup_msg[4096]= {""}; static int cleanup_exiting= 0; diff --git a/cdrskin/compile_cdrskin.sh b/cdrskin/compile_cdrskin.sh index e82e807..2cb6b20 100755 --- a/cdrskin/compile_cdrskin.sh +++ b/cdrskin/compile_cdrskin.sh @@ -32,13 +32,13 @@ do libvers="-DCdrskin_libburn_cvs_A60220_tS" libdax_audioxtr_o= libdax_msgs_o="libburn/message.o" - cleanup_src_or_obj="cdrskin/cleanup.c" + cleanup_src_or_obj="-DCleanup_has_no_libburn_os_H cdrskin/cleanup.c" elif test "$i" = "-libburn_0_2_2" then libvers="-DCdrskin_libburn_0_2_2" libdax_audioxtr_o= libdax_msgs_o="libburn/message.o" - cleanup_src_or_obj="cdrskin/cleanup.c" + cleanup_src_or_obj="-DCleanup_has_no_libburn_os_H cdrskin/cleanup.c" elif test "$i" = "-libburn_0_2_3" then libvers="-DCdrskin_libburn_0_2_3" @@ -51,6 +51,7 @@ do elif test "$i" = "-oldfashioned" then def_opts="$def_opts -DCdrskin_oldfashioned_api_usE" + cleanup_src_or_obj="-DCleanup_has_no_libburn_os_H cdrskin/cleanup.c" elif test "$i" = "-no_largefile" then largefile_opts= diff --git a/libburn/cleanup.c b/libburn/cleanup.c index 6c9f3b6..6703240 100644 --- a/libburn/cleanup.c +++ b/libburn/cleanup.c @@ -23,31 +23,27 @@ typedef void (*sighandler_t)(int); #include "cleanup.h" -#ifdef __FreeBSD__ + +#ifndef Cleanup_has_no_libburn_os_H + + +#include "../libburn/os.h" + +/* see os.h for name of particular os-*.h where this is defined */ +static int signal_list[]= { BURN_OS_SIGNAL_MACRO_LIST , -1}; +static char *signal_name_list[]= { BURN_OS_SIGNAL_NAME_LIST , "@"}; +static int signal_list_count= BURN_OS_SIGNAL_COUNT; +static int non_signal_list[]= { BURN_OS_NON_SIGNAL_MACRO_LIST, -1}; +static int non_signal_list_count= BURN_OS_NON_SIGNAL_COUNT; + + +#else /* ! Cleanup_has_no_libburn_os_H */ + + +/* Outdated. Linux only. For backward compatibility with pre-libburn-0.2.3 */ /* Signals to be caught */ -static int signal_list[]= { - SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, - SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, - SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, - SIGTTOU, - SIGBUS, SIGPROF, SIGSYS, SIGTRAP, - SIGVTALRM, SIGXCPU, SIGXFSZ, -1 -}; -static char *signal_name_list[]= { - "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", - "SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", - "SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", - "SIGTTOU", - "SIGBUS", "SIGPROF", "SIGSYS", "SIGTRAP", - "SIGVTALRM", "SIGXCPU", "SIGXFSZ", "@" -}; -static int signal_list_count= 23; - -#else /* __FreeBSD__ */ - -/* Signals to be caught */ -static int signal_list[]= { +static int signal_list[]= { SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, @@ -55,7 +51,7 @@ static int signal_list[]= { SIGBUS, SIGPOLL, SIGPROF, SIGSYS, SIGTRAP, SIGVTALRM, SIGXCPU, SIGXFSZ, -1 }; -static char *signal_name_list[]= { +static char *signal_name_list[]= { "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", "SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", @@ -65,15 +61,17 @@ static char *signal_name_list[]= { }; static int signal_list_count= 24; -#endif /* ! __FreeBSD__ */ - /* Signals not to be caught */ static int non_signal_list[]= { SIGKILL, SIGCHLD, SIGSTOP, SIGURG, -1 -}; +}; static int non_signal_list_count= 4; +#endif /* Cleanup_has_no_libburn_os_H */ + + + /* run time dynamic part */ static char cleanup_msg[4096]= {""}; static int cleanup_exiting= 0; diff --git a/libburn/os-freebsd.h b/libburn/os-freebsd.h new file mode 100644 index 0000000..21b4b97 --- /dev/null +++ b/libburn/os-freebsd.h @@ -0,0 +1,72 @@ + +/* os-freebsd.h + Operating system specific libburn definitions and declarations. Included + by os.h in case of compilation for + FreeBSD with CAM + + Copyright (C) 2006 Thomas Schmitt , provided under GPL +*/ + +#ifndef BURN_OS_H_INCLUDED +#define BURN_OS_H_INCLUDED 1 + + +/** List of all signals which shall be caught by signal handlers and trigger + a graceful abort of libburn. (See man 7 signal.) +*/ +/* Once as system defined macros */ +#define BURN_OS_SIGNAL_MACRO_LIST \ + SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, \ + SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, \ + SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, \ + SIGTTOU, \ + SIGBUS, SIGPROF, SIGSYS, SIGTRAP, \ + SIGVTALRM, SIGXCPU, SIGXFSZ + +/* Once as text 1:1 list of strings for messages and interpreters */ +#define BURN_OS_SIGNAL_NAME_LIST \ + "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", \ + "SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", \ + "SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", \ + "SIGTTOU", \ + "SIGBUS", "SIGPROF", "SIGSYS", "SIGTRAP", \ + "SIGVTALRM", "SIGXCPU", "SIGXFSZ" + +/* The number of above list items */ +#define BURN_OS_SIGNAL_COUNT 23 + +/** To list all signals which shall surely not be caught */ +#define BURN_OS_NON_SIGNAL_MACRO_LIST \ +SIGKILL, SIGCHLD, SIGSTOP, SIGURG + +/* The number of above list items */ +#define BURN_OS_NON_SIGNAL_COUNT 4 + + +/* The maximum size for a (SCSI) i/o transaction */ +#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536/2 + + +/** To hold all state information of BSD device enumeration + which are now local in sg_enumerate() . So that sg_give_next_adr() + can work in BSD and sg_enumerate() can use it. +*/ +#define BURN_OS_DEFINE_DRIVE_ENUMERATOR_T \ +struct burn_drive_enumeration_state { \ + union ccb ccb; \ + int bufsize, fd; \ + unsigned int i; \ + int skip_device; \ +}; \ +typedef struct burn_drive_enumeration_state burn_drive_enumerator_t; + + +/* The list of operating system dependent elements in struct burn_drive. + To be initialized and used within sg-*.c . +*/ +#define BURN_OS_TRANSPORT_DRIVE_ELEMENTS \ +struct cam_device* cam; + + +#endif /* ! BURN_OS_H_INCLUDED */ + diff --git a/libburn/os-linux.h b/libburn/os-linux.h new file mode 100644 index 0000000..3254191 --- /dev/null +++ b/libburn/os-linux.h @@ -0,0 +1,63 @@ + +/* os-linux.h + Operating system specific libburn definitions and declarations. Included + by os.h in case of compilation for + Linux kernels 2.4 and 2.6 with Linux SCSI Generic (sg) + + Copyright (C) 2006 Thomas Schmitt , provided under GPL +*/ + + +/** List of all signals which shall be caught by signal handlers and trigger + a graceful abort of libburn. (See man 7 signal.) +*/ +/* Once as system defined macros */ +#define BURN_OS_SIGNAL_MACRO_LIST \ + SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, \ + SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, \ + SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, \ + SIGTTOU, \ + SIGBUS, SIGPOLL, SIGPROF, SIGSYS, SIGTRAP, \ + SIGVTALRM, SIGXCPU, SIGXFSZ + +/* Once as text 1:1 list of strings for messages and interpreters */ +#define BURN_OS_SIGNAL_NAME_LIST \ + "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", \ + "SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", \ + "SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", \ + "SIGTTOU", \ + "SIGBUS", "SIGPOLL", "SIGPROF", "SIGSYS", "SIGTRAP", \ + "SIGVTALRM", "SIGXCPU", "SIGXFSZ" + +/* The number of above list items */ +#define BURN_OS_SIGNAL_COUNT 24 + +/** To list all signals which shall surely not be caught */ +#define BURN_OS_NON_SIGNAL_MACRO_LIST \ +SIGKILL, SIGCHLD, SIGSTOP, SIGURG + +/* The number of above list items */ +#define BURN_OS_NON_SIGNAL_COUNT 4 + + +/* The maximum size for a (SCSI) i/o transaction */ +#define BURN_OS_TRANSPORT_BUFFER_SIZE 65536 + + +/* To hold the index number of the most recently delivered address from + device enumeration. +*/ +#define BURN_OS_DEFINE_DRIVE_ENUMERATOR_T \ +typedef int burn_drive_enumerator_t; + + +/* The list of operating system dependent elements in struct burn_drive. + Usually they are initialized in sg-*.c:enumerate_common(). +*/ +#define BURN_OS_TRANSPORT_DRIVE_ELEMENTS \ +int fd; \ + \ +/* ts A60926 : trying to lock against growisofs /dev/srN, /dev/scdN */ \ +int sibling_count; \ +int sibling_fds[LIBBURN_SG_MAX_SIBLINGS]; + diff --git a/libburn/os.h b/libburn/os.h new file mode 100644 index 0000000..3b7a0f4 --- /dev/null +++ b/libburn/os.h @@ -0,0 +1,34 @@ + +/* os.h + Operating system specific libburn definitions and declarations. + The macros defined here are used by libburn modules in order to + avoid own system dependent case distinctions. + Copyright (C) 2006 Thomas Schmitt , provided under GPL +*/ + +#ifndef BURN_OS_H_INCLUDED +#define BURN_OS_H_INCLUDED 1 + +/* + Operating system case distinction +*/ + +#ifdef __FreeBSD__ + + +/* ----------------------------- FreeBSD with CAM -------------------------- */ +#include "os-freebsd.h" + + +#else /* operating system case distinction */ + + +/* --------- Linux kernels 2.4 and 2.6 with Linux SCSI Generic (sg) -------- */ +#include "os-linux.h" + + +#endif /* End of operating system case distinction */ + + +#endif /* ! BURN_OS_H_INCLUDED */ + diff --git a/libburn/sg-freebsd-port.c b/libburn/sg-freebsd-port.c index 7919122..6d0b32e 100644 --- a/libburn/sg-freebsd-port.c +++ b/libburn/sg-freebsd-port.c @@ -2,15 +2,30 @@ /* -This is the operating system dependent SCSI part of libburn. It implements the -transport level aspects of SCSI control and command i/o. +This is the main operating system dependent SCSI part of libburn. It implements +the transport level aspects of SCSI control and command i/o. Present implementation: FreeBSD CAM (untested) + PORTING: -There are public functions, used by other parts of libburn, which have to be -implemented in a way that provides libburn with the desired services: +Porting libburn typically will consist of adding a new operating system case +to the following switcher files: + os.h Operating system specific libburn definitions and declarations. + sg.c Operating system dependent transport level modules. +and to derive the following system specific files from existing examples: + os-*.h Included by os.h. You will need some general system knowledge + about signals and knowledge about the storage object needs of your + transport level module sg-*.c. + + sg-*.c This source module. You will need special system knowledge about + how to detect all potentially available drives and how to perform + low-level SCSI and drive operations. You will not need to know + about CD burning, MMC or other high level SCSI aspects. + +Said low-level operations are defined by a public function interface, which has +to be implemented in a way that provides libburn with the desired services: sg_give_next_adr() iterates over the set of potentially useful drive address strings. @@ -35,12 +50,6 @@ sg_obtain_scsi_adr() tries to obtain SCSI address parameters. Porting hints are marked by the text "PORTING:". Send feedback to libburn-hackers@pykix.org . - -Other source modules where to expect OS dependencies (look for "__FreeBSD__"): - cleanup.c signal_list : add or delete as described in your man 7 signal - transport.h struct burn_drive : OS dependent i/o attributes - BUFFER_SIZE maximum size for a (SCSI) i/o transaction - */ diff --git a/libburn/sg-linux.c b/libburn/sg-linux.c index 572ac04..dd6063b 100644 --- a/libburn/sg-linux.c +++ b/libburn/sg-linux.c @@ -2,15 +2,30 @@ /* -This is the operating system dependent SCSI part of libburn. It implements the -transport level aspects of SCSI control and command i/o. +This is the main operating system dependent SCSI part of libburn. It implements +the transport level aspects of SCSI control and command i/o. Present implementation: Linux SCSI Generic (sg) + PORTING: -There are public functions, used by other parts of libburn, which have to be -implemented in a way that provides libburn with the desired services: +Porting libburn typically will consist of adding a new operating system case +to the following switcher files: + os.h Operating system specific libburn definitions and declarations. + sg.c Operating system dependent transport level modules. +and to derive the following system specific files from existing examples: + os-*.h Included by os.h. You will need some general system knowledge + about signals and knowledge about the storage object needs of your + transport level module sg-*.c. + + sg-*.c This source module. You will need special system knowledge about + how to detect all potentially available drives and how to perform + low-level SCSI and drive operations. You will not need to know + about CD burning, MMC or other high level SCSI aspects. + +Said low-level operations are defined by a public function interface, which has +to be implemented in a way that provides libburn with the desired services: sg_give_next_adr() iterates over the set of potentially useful drive address strings. @@ -38,11 +53,6 @@ Send feedback to libburn-hackers@pykix.org . Hint: You should also look into sg-freebsd-port.c, which is a younger and in some aspects more straightforward implementation of this interface. -Other source modules where to expect OS dependencies (look for "__FreeBSD__"): - cleanup.c signal_list : add or delete as described in your man 7 signal - transport.h struct burn_drive : OS dependent i/o attributes - BUFFER_SIZE maximum size for a (SCSI) i/o transaction - */ diff --git a/libburn/sg.c b/libburn/sg.c index 23c90c4..79b78d9 100644 --- a/libburn/sg.c +++ b/libburn/sg.c @@ -1,5 +1,9 @@ -/* ts A61013 : It would be nice if autotools could do that job */ +/* sg.c + Switcher for operating system dependent transport level modules of libburn. + Copyright (C) 2006 Thomas Schmitt , provided under GPL +*/ + #ifdef __FreeBSD__ diff --git a/libburn/sg.h b/libburn/sg.h index 890a08e..abee161 100644 --- a/libburn/sg.h +++ b/libburn/sg.h @@ -3,30 +3,13 @@ #ifndef __SG #define __SG -#ifdef __FreeBSD__ -/* To hold all state information of BSD device enumeration - which are now local in sg_enumerate() . So that sg_give_next_adr() - can work in BSD and sg_enumerate() can use it. */ -struct burn_drive_enumeration_state { - union ccb ccb; - int bufsize, fd; - unsigned int i; - int skip_device; -}; -typedef struct burn_drive_enumeration_state burn_drive_enumerator_t; +#include "os.h" -#else /* __FreeBSD__ */ -/* <<< just for testing the C syntax */ -struct burn_drive_enumeration_state { - int dummy; -}; -typedef struct burn_drive_enumeration_state burn_drive_enumerator_tX; +/* see os.h for name of particular os-*.h where this is defined */ +BURN_OS_DEFINE_DRIVE_ENUMERATOR_T -typedef int burn_drive_enumerator_t; - -#endif /* ! __FreeBSD__ */ struct burn_drive; struct command; diff --git a/libburn/transport.h b/libburn/transport.h index 6f73217..f44e4ad 100644 --- a/libburn/transport.h +++ b/libburn/transport.h @@ -4,20 +4,16 @@ #define __TRANSPORT #include "libburn.h" +#include "os.h" #include /* sg data structures */ #include -#ifdef __FreeBSD__ -#define BUFFER_SIZE 65536/2 +/* see os.h for name of particular os-*.h where this is defined */ +#define BUFFER_SIZE BURN_OS_TRANSPORT_BUFFER_SIZE -#else /* __FreeBSD__ */ - -#define BUFFER_SIZE 65536 - -#endif /* ! __FreeBSD__ */ enum transfer_direction { TO_DRIVE, FROM_DRIVE, NO_TRANSFER }; @@ -107,15 +103,10 @@ struct burn_drive int lun; char *devname; -#if defined(__FreeBSD__) - struct cam_device* cam; -#else - int fd; - /* ts A60926 : trying to lock against growisofs /dev/srN, /dev/scdN */ - int sibling_count; - int sibling_fds[LIBBURN_SG_MAX_SIBLINGS]; -#endif + /* see os.h for name of particular os-*.h where this is defined */ + BURN_OS_TRANSPORT_DRIVE_ELEMENTS + /* ts A60904 : ticket 62, contribution by elmom */ /**