From 0523d4ee49ad3e78e10dbd2a034de9a4933ec70b Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Tue, 29 Jan 2008 18:44:54 +0000 Subject: [PATCH] New API call isoburn_is_compatible() --- configure.ac | 19 +++++++++---- libisoburn/burn_wrap.c | 4 +++ libisoburn/isoburn.c | 12 +++++++- libisoburn/libisoburn.h | 55 ++++++++++++++++++++++++++++++++----- version.h.in | 3 ++ xorriso/configure_ac.txt | 36 ++++++++++++++++++------ xorriso/xorriso_timestamp.h | 2 +- xorriso/xorrisoburn.c | 15 +++++++++- 8 files changed, 122 insertions(+), 24 deletions(-) diff --git a/configure.ac b/configure.ac index 85b6c9ca..2c3e1110 100644 --- a/configure.ac +++ b/configure.ac @@ -7,21 +7,30 @@ AC_CANONICAL_TARGET AM_INIT_AUTOMAKE([subdir-objects]) +dnl The API version codes are now defined in libisoburn/libisoburn.h +dnl #define isoburn_header_version_* +dnl configure.ac only rules the libtool revision numbering about +dnl LT_CURREN, LT_AGE, LT_REVISION where SONAME becomes LT_CURRENT - LT_AGE +dnl +dnl These three are only copies to provide libtool with unused LT_RELEASE ISOBURN_MAJOR_VERSION=0 ISOBURN_MINOR_VERSION=0 ISOBURN_MICRO_VERSION=1 -ISOBURN_VERSION=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION.$ISOBURN_MICRO_VERSION - +dnl ISOBURN_VERSION=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION.$ISOBURN_MICRO_VERSION + AC_SUBST(ISOBURN_MAJOR_VERSION) AC_SUBST(ISOBURN_MINOR_VERSION) AC_SUBST(ISOBURN_MICRO_VERSION) -AC_SUBST(ISOBURN_VERSION) +dnl AC_SUBST(ISOBURN_VERSION) dnl Libtool versioning +dnl Generate libisoburn.so.1.0.0 +dnl SONAME will become LT_CURRENT - LT_AGE +dnl LT_RELEASE=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION -LT_CURRENT=0 +LT_CURRENT=1 LT_AGE=0 -LT_REVISION=1 +LT_REVISION=0 LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE` AC_SUBST(LT_RELEASE) diff --git a/libisoburn/burn_wrap.c b/libisoburn/burn_wrap.c index 600a78b6..491cc1f1 100644 --- a/libisoburn/burn_wrap.c +++ b/libisoburn/burn_wrap.c @@ -59,6 +59,8 @@ int isoburn_initialize(char msg[1024], int flag) iso_lib_version(&major, &minor, µ); sprintf(msg+strlen(msg), "libisofs-%d.%d.%d , ", major, minor, micro); + /* >>> check for suitability of library */ + if(!burn_initialize()) { sprintf(msg+strlen(msg), "Cannot initialize libburn\n"); return(0); @@ -66,6 +68,8 @@ int isoburn_initialize(char msg[1024], int flag) burn_version(&major, &minor, µ); sprintf(msg+strlen(msg), "libburn-%d.%d.%d , ", major, minor, micro); + /* >>> check for suitability of library */ + isoburn_destroy_all(&isoburn_list_start, 0); /* isoburn_list_start= NULL */ isoburn_version(&major, &minor, µ); diff --git a/libisoburn/isoburn.c b/libisoburn/isoburn.c index a05dffad..f67f4f19 100644 --- a/libisoburn/isoburn.c +++ b/libisoburn/isoburn.c @@ -37,8 +37,10 @@ #include "isoburn.h" +/* No more: version numbers out of configure.ac + major.minor.micro now comes from libisoburn.h #include "../version.h" - +*/ /* -------------------------- isoburn ----------------------- */ @@ -408,9 +410,17 @@ int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc, void isoburn_version(int *major, int *minor, int *micro) { + *major= isoburn_header_version_major; + *minor= isoburn_header_version_minor; + *micro= isoburn_header_version_micro; + +/* No more: values from version.h generated from version.h.in and + macro values defined in configure.ac + *major = ISOBURN_MAJOR_VERSION; *minor = ISOBURN_MINOR_VERSION; *micro = ISOBURN_MICRO_VERSION; +*/ } diff --git a/libisoburn/libisoburn.h b/libisoburn/libisoburn.h index aa66a181..e1a05558 100644 --- a/libisoburn/libisoburn.h +++ b/libisoburn/libisoburn.h @@ -116,24 +116,65 @@ eventual multi-session emulation. int isoburn_initialize(char msg[1024], int flag); -/** Obtain the three release version numbers of the library. +/** Check whether all features of header file libisoburn.h from the given + major.minor.micro revision triple can be delivered by the library version + which is performing this call. + An application of libisoburn can easily memorize the version of the + libisofs.h header in its own code. Immediately after isoburn_initialize() + it should simply do this check: + if (! isoburn_is_compatible(isoburn_header_version_major, + isoburn_header_version_minor, + isoburn_header_version_micro, 0)) + ...refuse to start the program with this dynamic library version... + @param major obtained at build time + @param minor obtained at build time + @param micro obtained at build time + @param flag Bitfield for control purposes. Unused yet. Submit 0. + @return 1= library can work for caller + 0= library is not usable in some aspects. Caller must restrict + itself to an earlier API version or must not use this libray + at all. +*/ +int isoburn_is_compatible(int major, int minor, int micro, int flag); + + +/** These three release version numbers tell the revision of this header file + and of the API it describes. They are memorized by applications at build + time. +*/ +#define isoburn_header_version_major 0 +#define isoburn_header_version_minor 0 +#define isoburn_header_version_micro 1 +/** Note: + Above version numbers are also recorded in configure.ac because libtool + wants them as parameters at build time. + For the library compatibility check ISOBURN_*_VERSION in configure.ac + are not decisive. Only the three numbers above do matter. +*/ + + +/** Obtain the three release version numbers of the library. These are the + numbers encountered by the application when linking with lisbisoburn, + i.e. possibly not before run time. + Better do not base the fundamental compatibility decision of an application + on these numbers. For a reliable check use isoburn_is_compatible(). @param major The maturity version (0 for now, as we are still learning) @param minor The development goal version. @param micro The development step version. This has an additional meaning: + Pare numbers indicate a version with frozen API. I.e. you can rely on the same set of features to be present in all published releases with that major.minor.micro combination. Odd numbers indicate that API upgrades are in progress. I.e. new features might be already present or they might - be still missing. You need to check before compiling an - application which relies on freshly introduced features. + be still missing. + So micro revisions {1,3,5,7,9} should never be used for + dynamic linking unless the proper library match can be + guaranteed by external circumstances. */ void isoburn_version(int *major, int *minor, int *micro); -/* >>> isoburn_is_compatible() */ - - /** Aquire a target drive by its filesystem path resp. libburn persistent address. Wrapper for: burn_drive_scan_and_grab() @@ -411,7 +452,7 @@ int isoburn_igopt_get_over_ugid(struct isoburn_imgen_opts *o, int *replace_uid, int *replace_gid, uid_t *uid, gid_t *gid); -/** Set this to NULL to use the default charset. +/** Set this to NULL to use the default output charset. >>> What if not NULL or not want default ? */ int isoburn_igopt_set_out_charset(struct isoburn_imgen_opts *o, diff --git a/version.h.in b/version.h.in index bf3eea11..cf529233 100644 --- a/version.h.in +++ b/version.h.in @@ -1,3 +1,6 @@ + +/* <<< this file is on its way out #define ISOBURN_MAJOR_VERSION @ISOBURN_MAJOR_VERSION@ #define ISOBURN_MINOR_VERSION @ISOBURN_MINOR_VERSION@ #define ISOBURN_MICRO_VERSION @ISOBURN_MICRO_VERSION@ +*/ diff --git a/xorriso/configure_ac.txt b/xorriso/configure_ac.txt index fdc677b2..b40e364c 100644 --- a/xorriso/configure_ac.txt +++ b/xorriso/configure_ac.txt @@ -9,24 +9,30 @@ AM_INIT_AUTOMAKE([subdir-objects]) BURN_MAJOR_VERSION=0 BURN_MINOR_VERSION=4 -BURN_MICRO_VERSION=1 +BURN_MICRO_VERSION=3 AC_SUBST(BURN_MAJOR_VERSION) AC_SUBST(BURN_MINOR_VERSION) AC_SUBST(BURN_MICRO_VERSION) LIBISOFS_MAJOR_VERSION=0 -LIBISOFS_MINOR_VERSION=5 -LIBISOFS_MICRO_VERSION=0 +LIBISOFS_MINOR_VERSION=6 +LIBISOFS_MICRO_VERSION=1 AC_SUBST(LIBISOFS_MAJOR_VERSION) AC_SUBST(LIBISOFS_MINOR_VERSION) AC_SUBST(LIBISOFS_MICRO_VERSION) -ISOBURN_MAJOR_VERSION=0 -ISOBURN_MINOR_VERSION=0 -ISOBURN_MICRO_VERSION=1 -AC_SUBST(ISOBURN_MAJOR_VERSION) -AC_SUBST(ISOBURN_MINOR_VERSION) -AC_SUBST(ISOBURN_MICRO_VERSION) +dnl The API version codes are now defined in libisoburn/libisoburn.h +dnl #define isoburn_header_version_* +dnl configure.ac only rules the libtool revision numbering about +dnl LT_CURREN, LT_AGE, LT_REVISION where SONAME becomes LT_CURRENT - LT_AGE +dnl +dnl These three are only copies to provide libtool with unused LT_RELEASE +dnl ISOBURN_MAJOR_VERSION=0 +dnl ISOBURN_MINOR_VERSION=0 +dnl ISOBURN_MICRO_VERSION=1 +dnl AC_SUBST(ISOBURN_MAJOR_VERSION) +dnl AC_SUBST(ISOBURN_MINOR_VERSION) +dnl AC_SUBST(ISOBURN_MICRO_VERSION) AC_PREFIX_DEFAULT([/usr/local]) @@ -61,6 +67,18 @@ AC_CHECK_MEMBER([struct tm.tm_gmtoff], , [#include ]) +dnl Check if non standard timegm() function is available +AC_CHECK_DECL([timegm], + [AC_DEFINE(HAVE_TIMEGM, 1, [Define this if timegm function is available])], + , + [#include ]) + +dnl Check if non standard eaccess() function is available +AC_CHECK_DECL([eaccess], + [AC_DEFINE(HAVE_EACCESS, 1, [Define this if eaccess function is available])], + , + [#include ]) + THREAD_LIBS=-lpthread AC_SUBST(THREAD_LIBS) diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 609c49e1..4862a10d 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2008.01.29.125956" +#define Xorriso_timestamP "2008.01.29.184356" diff --git a/xorriso/xorrisoburn.c b/xorriso/xorrisoburn.c index b11c57e6..115059c1 100644 --- a/xorriso/xorrisoburn.c +++ b/xorriso/xorrisoburn.c @@ -76,7 +76,7 @@ int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive, int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag) { - int ret; + int ret, major, minor, micro; char *handler_prefix= NULL; char *queue_sev, *print_sev, reason[1024]; @@ -101,6 +101,19 @@ int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag) free(handler_prefix); return(0); } + ret= isoburn_is_compatible(isoburn_header_version_major, + isoburn_header_version_minor, + isoburn_header_version_micro, 0); + if(ret<=0) { + isoburn_version(&major, &minor, µ); + sprintf(xorriso->info_text, + "libisoburn version too old: %d.%d.%d . Need at least: %d.%d.%d .\n", + major, minor, micro, + isoburn_header_version_major, isoburn_header_version_minor, + isoburn_header_version_micro); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0); + return(-1); + } if(reason[0]) { sprintf(xorriso->info_text, "%s", reason);