Hello community, here is the log from the commit of package libzypp for openSUSE:Factory checked in at 2011-11-14 13:16:55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libzypp (Old) and /work/SRC/openSUSE:Factory/.libzypp.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libzypp", Maintainer is "[email protected]" Changes: -------- --- /work/SRC/openSUSE:Factory/libzypp/libzypp.changes 2011-11-07 17:24:58.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.libzypp.new/libzypp.changes 2011-11-14 13:17:00.000000000 +0100 @@ -1,0 +2,8 @@ +Fri Nov 11 13:38:42 CET 2011 - [email protected] + +- Try to find and use some CD/DVD device even if HAL/UDEV detection + fails (bnc#724807) +- Static initialization problem fixes (by Harald Fernengel) +- version 10.3.4 (3) + +------------------------------------------------------------------- Old: ---- libzypp-10.3.3.tar.bz2 New: ---- libzypp-10.3.4.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libzypp.spec ++++++ --- /var/tmp/diff_new_pack.PEUGng/_old 2011-11-14 13:17:02.000000000 +0100 +++ /var/tmp/diff_new_pack.PEUGng/_new 2011-11-14 13:17:02.000000000 +0100 @@ -23,7 +23,7 @@ Group: System/Packages BuildRoot: %{_tmppath}/%{name}-%{version}-build Summary: Package, Patch, Pattern, and Product Management -Version: 10.3.3 +Version: 10.3.4 Release: 1 Source: %{name}-%{version}.tar.bz2 Source1: %{name}-rpmlintrc ++++++ libzypp-10.3.3.tar.bz2 -> libzypp-10.3.4.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-10.3.3/VERSION.cmake new/libzypp-10.3.4/VERSION.cmake --- old/libzypp-10.3.3/VERSION.cmake 2011-11-07 15:56:50.000000000 +0100 +++ new/libzypp-10.3.4/VERSION.cmake 2011-11-11 13:47:39.000000000 +0100 @@ -61,8 +61,8 @@ SET(LIBZYPP_MAJOR "10") SET(LIBZYPP_COMPATMINOR "3") SET(LIBZYPP_MINOR "3") -SET(LIBZYPP_PATCH "3") +SET(LIBZYPP_PATCH "4") # -# LAST RELEASED: 10.3.3 (3) +# LAST RELEASED: 10.3.4 (3) # (The number in parenthesis is LIBZYPP_COMPATMINOR) #======= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-10.3.3/doc/autodoc/Doxyfile.cmake new/libzypp-10.3.4/doc/autodoc/Doxyfile.cmake --- old/libzypp-10.3.3/doc/autodoc/Doxyfile.cmake 2011-11-07 15:56:51.000000000 +0100 +++ new/libzypp-10.3.4/doc/autodoc/Doxyfile.cmake 2011-11-11 13:47:40.000000000 +0100 @@ -89,8 +89,8 @@ SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO USE_HTAGS = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-10.3.3/package/libzypp.changes new/libzypp-10.3.4/package/libzypp.changes --- old/libzypp-10.3.3/package/libzypp.changes 2011-11-07 15:56:50.000000000 +0100 +++ new/libzypp-10.3.4/package/libzypp.changes 2011-11-11 13:47:39.000000000 +0100 @@ -1,4 +1,12 @@ ------------------------------------------------------------------- +Fri Nov 11 13:38:42 CET 2011 - [email protected] + +- Try to find and use some CD/DVD device even if HAL/UDEV detection + fails (bnc#724807) +- Static initialization problem fixes (by Harald Fernengel) +- version 10.3.4 (3) + +------------------------------------------------------------------- Mon Nov 7 15:45:28 CET 2011 - [email protected] - Don't use proxy if disabled (bnc#696805) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-10.3.3/zypp/Arch.cc new/libzypp-10.3.4/zypp/Arch.cc --- old/libzypp-10.3.3/zypp/Arch.cc 2011-11-07 15:56:51.000000000 +0100 +++ new/libzypp-10.3.4/zypp/Arch.cc 2011-11-11 13:47:41.000000000 +0100 @@ -152,7 +152,7 @@ // NOTE: Thake care CompatBits::IntT is able to provide one // bit for each architecture. // -#define DEF_BUILTIN(A) const IdString _##A( #A ); +#define DEF_BUILTIN(A) static inline const IdString & _##A () { static IdString __str(#A); return __str; } DEF_BUILTIN( noarch ); DEF_BUILTIN( i386 ); @@ -273,63 +273,63 @@ // _noarch must have _idBit 0. // Other builtins have 1-bit set // and are initialized done on the fly. - _compatSet.insert( Arch::CompatEntry( _noarch, 0 ) ); + _compatSet.insert( Arch::CompatEntry( _noarch(), 0 ) ); /////////////////////////////////////////////////////////////////// // Define the CompatibleWith relation: // // NOTE: Order of definition is significant! (Arch::compare) // - define compatible (less) architectures first! // - defCompatibleWith( _i386, _noarch ); - defCompatibleWith( _i486, _noarch,_i386 ); - defCompatibleWith( _i586, _noarch,_i386,_i486 ); - defCompatibleWith( _i686, _noarch,_i386,_i486,_i586 ); - defCompatibleWith( _athlon, _noarch,_i386,_i486,_i586,_i686 ); - defCompatibleWith( _x86_64, _noarch,_i386,_i486,_i586,_i686,_athlon ); + defCompatibleWith( _i386(), _noarch() ); + defCompatibleWith( _i486(), _noarch(),_i386() ); + defCompatibleWith( _i586(), _noarch(),_i386(),_i486() ); + defCompatibleWith( _i686(), _noarch(),_i386(),_i486(),_i586() ); + defCompatibleWith( _athlon(), _noarch(),_i386(),_i486(),_i586(),_i686() ); + defCompatibleWith( _x86_64(), _noarch(),_i386(),_i486(),_i586(),_i686(),_athlon() ); - defCompatibleWith( _pentium3, _noarch,_i386,_i486,_i586,_i686 ); - defCompatibleWith( _pentium4, _noarch,_i386,_i486,_i586,_i686,_pentium3 ); + defCompatibleWith( _pentium3(), _noarch(),_i386(),_i486(),_i586(),_i686() ); + defCompatibleWith( _pentium4(), _noarch(),_i386(),_i486(),_i586(),_i686(),_pentium3() ); - defCompatibleWith( _ia64, _noarch,_i386,_i486,_i586,_i686 ); + defCompatibleWith( _ia64(), _noarch(),_i386(),_i486(),_i586(),_i686() ); // - defCompatibleWith( _s390, _noarch ); - defCompatibleWith( _s390x, _noarch,_s390 ); + defCompatibleWith( _s390(), _noarch() ); + defCompatibleWith( _s390x(), _noarch(),_s390() ); // - defCompatibleWith( _ppc, _noarch ); - defCompatibleWith( _ppc64, _noarch,_ppc ); + defCompatibleWith( _ppc(), _noarch() ); + defCompatibleWith( _ppc64(), _noarch(),_ppc() ); // - defCompatibleWith( _alpha, _noarch ); - defCompatibleWith( _alphaev5, _noarch,_alpha ); - defCompatibleWith( _alphaev56, _noarch,_alpha,_alphaev5 ); - defCompatibleWith( _alphapca56, _noarch,_alpha,_alphaev5,_alphaev56 ); - defCompatibleWith( _alphaev6, _noarch,_alpha,_alphaev5,_alphaev56,_alphapca56 ); - defCompatibleWith( _alphaev67, _noarch,_alpha,_alphaev5,_alphaev56,_alphapca56,_alphaev6 ); + defCompatibleWith( _alpha(), _noarch() ); + defCompatibleWith( _alphaev5(), _noarch(),_alpha() ); + defCompatibleWith( _alphaev56(), _noarch(),_alpha(),_alphaev5() ); + defCompatibleWith( _alphapca56(), _noarch(),_alpha(),_alphaev5(),_alphaev56() ); + defCompatibleWith( _alphaev6(), _noarch(),_alpha(),_alphaev5(),_alphaev56(),_alphapca56() ); + defCompatibleWith( _alphaev67(), _noarch(),_alpha(),_alphaev5(),_alphaev56(),_alphapca56(),_alphaev6() ); // - defCompatibleWith( _sparc, _noarch ); - defCompatibleWith( _sparcv8, _noarch,_sparc ); - defCompatibleWith( _sparcv9, _noarch,_sparc,_sparcv8 ); - defCompatibleWith( _sparcv9v, _noarch,_sparc,_sparcv8,_sparcv9 ); + defCompatibleWith( _sparc(), _noarch() ); + defCompatibleWith( _sparcv8(), _noarch(),_sparc() ); + defCompatibleWith( _sparcv9(), _noarch(),_sparc(),_sparcv8() ); + defCompatibleWith( _sparcv9v(), _noarch(),_sparc(),_sparcv8(),_sparcv9() ); // - defCompatibleWith( _sparc64, _noarch,_sparc,_sparcv8,_sparcv9 ); - defCompatibleWith( _sparc64v, _noarch,_sparc,_sparcv8,_sparcv9,_sparcv9v,_sparc64 ); + defCompatibleWith( _sparc64(), _noarch(),_sparc(),_sparcv8(),_sparcv9() ); + defCompatibleWith( _sparc64v(), _noarch(),_sparc(),_sparcv8(),_sparcv9(),_sparcv9v(),_sparc64() ); // - defCompatibleWith( _armv3l, _noarch ); - defCompatibleWith( _armv4l, _noarch,_armv3l ); - defCompatibleWith( _armv4tl, _noarch,_armv3l,_armv4l ); - defCompatibleWith( _armv5l, _noarch,_armv3l,_armv4l,_armv4tl ); - defCompatibleWith( _armv5tel, _noarch,_armv3l,_armv4l,_armv4tl,_armv5l ); - defCompatibleWith( _armv5tejl, _noarch,_armv3l,_armv4l,_armv4tl,_armv5l,_armv5tel ); - defCompatibleWith( _armv6l, _noarch,_armv3l,_armv4l,_armv4tl,_armv5l,_armv5tel,_armv5tejl ); - defCompatibleWith( _armv7l, _noarch,_armv3l,_armv4l,_armv4tl,_armv5l,_armv5tel,_armv5tejl,_armv6l ); - defCompatibleWith( _armv7hl, _noarch ); - defCompatibleWith( _armv7nhl, _noarch,_armv7hl ); - defCompatibleWith( _armv7thl, _noarch,_armv7hl ); - defCompatibleWith( _armv7tnhl, _noarch,_armv7hl,_armv7nhl,_armv7thl); + defCompatibleWith( _armv3l(), _noarch() ); + defCompatibleWith( _armv4l(), _noarch(),_armv3l() ); + defCompatibleWith( _armv4tl(), _noarch(),_armv3l(),_armv4l() ); + defCompatibleWith( _armv5l(), _noarch(),_armv3l(),_armv4l(),_armv4tl() ); + defCompatibleWith( _armv5tel(), _noarch(),_armv3l(),_armv4l(),_armv4tl(),_armv5l() ); + defCompatibleWith( _armv5tejl(), _noarch(),_armv3l(),_armv4l(),_armv4tl(),_armv5l(),_armv5tel() ); + defCompatibleWith( _armv6l(), _noarch(),_armv3l(),_armv4l(),_armv4tl(),_armv5l(),_armv5tel(),_armv5tejl() ); + defCompatibleWith( _armv7l(), _noarch(),_armv3l(),_armv4l(),_armv4tl(),_armv5l(),_armv5tel(),_armv5tejl(),_armv6l() ); + defCompatibleWith( _armv7hl(), _noarch() ); + defCompatibleWith( _armv7nhl(), _noarch(),_armv7hl() ); + defCompatibleWith( _armv7thl(), _noarch(),_armv7hl() ); + defCompatibleWith( _armv7tnhl(), _noarch(),_armv7hl(),_armv7nhl(),_armv7thl() ); // - defCompatibleWith( _sh3, _noarch ); + defCompatibleWith( _sh3(), _noarch() ); // - defCompatibleWith( _sh4, _noarch ); - defCompatibleWith( _sh4a, _noarch,_sh4 ); + defCompatibleWith( _sh4(), _noarch() ); + defCompatibleWith( _sh4a(), _noarch(),_sh4() ); // /////////////////////////////////////////////////////////////////// // dumpOn( USR ) << endl; @@ -396,57 +396,57 @@ /////////////////////////////////////////////////////////////////// const Arch Arch_empty ( IdString::Empty ); - const Arch Arch_noarch( _noarch ); + const Arch Arch_noarch( _noarch() ); - const Arch Arch_i386( _i386 ); - const Arch Arch_i486( _i486 ); - const Arch Arch_i586( _i586 ); - const Arch Arch_i686( _i686 ); - const Arch Arch_athlon( _athlon ); - const Arch Arch_x86_64( _x86_64 ); - - const Arch Arch_pentium3( _pentium3 ); - const Arch Arch_pentium4( _pentium4 ); - - const Arch Arch_s390( _s390 ); - const Arch Arch_s390x( _s390x ); - - const Arch Arch_ppc( _ppc ); - const Arch Arch_ppc64( _ppc64 ); - - const Arch Arch_ia64( _ia64 ); - - const Arch Arch_alphaev67( _alphaev67 ); - const Arch Arch_alphaev6( _alphaev6 ); - const Arch Arch_alphapca56( _alphapca56 ); - const Arch Arch_alphaev56( _alphaev56 ); - const Arch Arch_alphaev5( _alphaev5 ); - const Arch Arch_alpha( _alpha ); - - const Arch Arch_sparc64v( _sparc64v ); - const Arch Arch_sparc64( _sparc64 ); - const Arch Arch_sparcv9v( _sparcv9v ); - const Arch Arch_sparcv9( _sparcv9 ); - const Arch Arch_sparcv8( _sparcv8 ); - const Arch Arch_sparc( _sparc ); - - const Arch Arch_armv7tnhl( _armv7tnhl ); - const Arch Arch_armv7thl( _armv7thl ); - const Arch Arch_armv7nhl( _armv7nhl ); - const Arch Arch_armv7hl( _armv7hl ); - const Arch Arch_armv7l( _armv7l ); - const Arch Arch_armv6l( _armv6l ); - const Arch Arch_armv5tejl( _armv5tejl ); - const Arch Arch_armv5tel( _armv5tel ); - const Arch Arch_armv5l( _armv5l ); - const Arch Arch_armv4tl( _armv4tl ); - const Arch Arch_armv4l( _armv4l ); - const Arch Arch_armv3l( _armv3l ); + const Arch Arch_i386( _i386() ); + const Arch Arch_i486( _i486() ); + const Arch Arch_i586( _i586() ); + const Arch Arch_i686( _i686() ); + const Arch Arch_athlon( _athlon() ); + const Arch Arch_x86_64( _x86_64() ); + + const Arch Arch_pentium3( _pentium3() ); + const Arch Arch_pentium4( _pentium4() ); + + const Arch Arch_s390( _s390() ); + const Arch Arch_s390x( _s390x() ); + + const Arch Arch_ppc( _ppc() ); + const Arch Arch_ppc64( _ppc64() ); + + const Arch Arch_ia64( _ia64() ); + + const Arch Arch_alphaev67( _alphaev67() ); + const Arch Arch_alphaev6( _alphaev6() ); + const Arch Arch_alphapca56( _alphapca56() ); + const Arch Arch_alphaev56( _alphaev56() ); + const Arch Arch_alphaev5( _alphaev5() ); + const Arch Arch_alpha( _alpha() ); + + const Arch Arch_sparc64v( _sparc64v() ); + const Arch Arch_sparc64( _sparc64() ); + const Arch Arch_sparcv9v( _sparcv9v() ); + const Arch Arch_sparcv9( _sparcv9() ); + const Arch Arch_sparcv8( _sparcv8() ); + const Arch Arch_sparc( _sparc() ); + + const Arch Arch_armv7tnhl( _armv7tnhl() ); + const Arch Arch_armv7thl( _armv7thl() ); + const Arch Arch_armv7nhl ( _armv7nhl() ); + const Arch Arch_armv7hl ( _armv7hl() ); + const Arch Arch_armv7l( _armv7l() ); + const Arch Arch_armv6l( _armv6l() ); + const Arch Arch_armv5tejl( _armv5tejl() ); + const Arch Arch_armv5tel( _armv5tel() ); + const Arch Arch_armv5l( _armv5l() ); + const Arch Arch_armv4tl( _armv4tl() ); + const Arch Arch_armv4l( _armv4l() ); + const Arch Arch_armv3l( _armv3l() ); - const Arch Arch_sh3( _sh3 ); + const Arch Arch_sh3( _sh3() ); - const Arch Arch_sh4( _sh4 ); - const Arch Arch_sh4a( _sh4a ); + const Arch Arch_sh4( _sh4() ); + const Arch Arch_sh4a( _sh4a() ); /////////////////////////////////////////////////////////////////// // @@ -454,7 +454,7 @@ // METHOD TYPE : Ctor // Arch::Arch() - : _entry( &ArchCompatSet::instance().assertDef( _noarch ) ) + : _entry( &ArchCompatSet::instance().assertDef( _noarch() ) ) {} Arch::Arch( IdString::IdType id_r ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-10.3.3/zypp/Url.cc new/libzypp-10.3.4/zypp/Url.cc --- old/libzypp-10.3.3/zypp/Url.cc 2011-11-07 15:56:51.000000000 +0100 +++ new/libzypp-10.3.4/zypp/Url.cc 2011-11-11 13:47:41.000000000 +0100 @@ -379,7 +379,7 @@ catch( ... ) {} - if(ret && out.size() == 5) + if(ret && out.size() == 6) { std::string scheme = out[1]; if (scheme.size() > 1) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-10.3.3/zypp/base/Regex.cc new/libzypp-10.3.4/zypp/base/Regex.cc --- old/libzypp-10.3.3/zypp/base/Regex.cc 2011-11-07 15:56:51.000000000 +0100 +++ new/libzypp-10.3.4/zypp/base/Regex.cc 2011-11-11 13:47:40.000000000 +0100 @@ -85,15 +85,14 @@ unsigned smatch::size() const { - unsigned matches = 0; + unsigned matches = unsigned(-1); // Get highest (pmatch[i].rm_so != -1). Just looking for the 1st // (pmatch[i].rm_so == -1) is wrong as optional mayches "()?" // may be embeded. - // NOTE: index is submatch size beacause match[0] is not counted for ( unsigned i = 0; i < sizeof(pmatch)/sizeof(*pmatch); ++i ) { if ( pmatch[i].rm_so != -1 ) matches = i; } - return matches; + return ++matches; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-10.3.3/zypp/base/Regex.h new/libzypp-10.3.4/zypp/base/Regex.h --- old/libzypp-10.3.3/zypp/base/Regex.h 2011-11-07 15:56:51.000000000 +0100 +++ new/libzypp-10.3.4/zypp/base/Regex.h 2011-11-11 13:47:40.000000000 +0100 @@ -18,73 +18,82 @@ #include "zypp/base/Exception.h" -/////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////// namespace zypp -{ ///////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////// - /** String related utilities and \ref ZYPP_STR_REGEX. - \see \ref ZYPP_STR_REGEX - */ +{ + ////////////////////////////////////////////////////////////////// + /// \namespace str + /// \brief String related utilities and \ref ZYPP_STR_REGEX. namespace str - { ///////////////////////////////////////////////////////////////// - - /////////////////////////////////////////////////////////////////// - /** \defgroup ZYPP_STR_REGEX Regular expressions - * - * \brief Namespace zypp::str regular expressions \b using the glibc regex library. - * \see also \ref sat::AttrMatcher string matcher supporing regex, globing, etc. - * - * \code - * str::regex rxexpr( "^(A)?([0-9]*) im" ); - * str::smatch what; - * - * std::string mytext( "Y123 imXXXX" ); - * if ( str::regex_match( mytext, what, rxexpr ) ) - * { - * MIL << "MATCH '" << what[0] << "'" << endl; - * MIL << " subs: " << what.size()-1 << endl; - * for_( i, 1U, what.size() ) - * MIL << " [" << i << "] " << what[i] << endl; - * } - * else - * { - * WAR << "NO MATCH '" << rxexpr << "' in '" << mytext << endl; - * } - * \endcode - */ + { + ////////////////////////////////////////////////////////////////// + /// \defgroup ZYPP_STR_REGEX Regular expression matching + /// \brief Regular expressions using the glibc regex library. + /// + /// \see also \ref sat::AttrMatcher string matcher also supporting globing, etc. + /// + /// \code + /// str::regex rxexpr( "^(A)?([0-9]*) im" ); + /// str::smatch what; + /// + /// std::string mytext( "Y123 imXXXX" ); + /// if ( str::regex_match( mytext, what, rxexpr ) ) + /// { + /// MIL << "MATCH '" << what[0] << "'" << endl; + /// MIL << " subs: " << what.size()-1 << endl; + /// for_( i, 1U, what.size() ) + /// MIL << " [" << i << "] " << what[i] << endl; + /// } + /// else + /// { + /// WAR << "NO MATCH '" << rxexpr << "' in '" << mytext << endl; + /// } + /// \endcode + ////////////////////////////////////////////////////////////////// typedef Exception regex_error; class smatch; class regex; - /** - * \ingroup ZYPP_STR_REGEX - */ - bool regex_match(const char * s, str::smatch& matches, const regex& regex); - inline bool regex_match(const std::string& s, str::smatch& matches, const regex& regex) + ////////////////////////////////////////////////////////////////// + /// \brief Regular expression matching + /// + /// \ingroup ZYPP_STR_REGEX + /// \relates regex + /// Return whether a \ref regex matches a specific string. An optionally + /// passed \ref smatch object will contain the match reults. + ////////////////////////////////////////////////////////////////// + bool regex_match( const char * s, smatch & matches, const regex & regex ); + + /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */ + inline bool regex_match(const std::string & s, smatch & matches, const regex & regex) { return regex_match( s.c_str(), matches, regex ); } - /** - * \ingroup ZYPP_STR_REGEX - */ - bool regex_match(const char * s, const regex& regex); - inline bool regex_match(const std::string& s, const regex& regex) + /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */ + bool regex_match( const char * s, const regex & regex ); + + /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */ + inline bool regex_match( const std::string & s, const regex & regex ) { return regex_match( s.c_str(), regex ); } - /** - * \ingroup ZYPP_STR_REGEX - */ - class regex { + ////////////////////////////////////////////////////////////////// + /// \class regex + /// \brief Regular expression + /// + /// \ingroup ZYPP_STR_REGEX + ////////////////////////////////////////////////////////////////// + class regex + { public: enum RegFlags { - optimize = 0, - match_extra = 0, - icase = REG_ICASE, - nosubs = REG_NOSUB, - match_extended = REG_EXTENDED, - normal = 1<<16 + optimize = 0, ///< \deprecated legacy, obsolete + match_extra = 0, ///< \deprecated legacy, obsolete + icase = REG_ICASE, ///< Do not differentiate case + nosubs = REG_NOSUB, ///< Support for substring addressing of matches is not required + match_extended = REG_EXTENDED, ///< Use POSIX Extended Regular Expression syntax when interpreting regex. + normal = 1<<16 ///< \deprecated legacy, use match_extended }; regex(); @@ -125,10 +134,19 @@ inline std::ostream & operator<<( std::ostream & str, const regex & obj ) { return str << obj.asString(); } - /** - * \ingroup ZYPP_STR_REGEX - */ - class smatch { + ////////////////////////////////////////////////////////////////// + /// \class smatch + /// \brief Regular expression match result + /// + /// \ingroup ZYPP_STR_REGEX + /// + /// Index \c n=0 returns the string object representing the character + /// sequence that matched the whole regular expression. + /// If \c n is out of range, or if \c n is an unmatched sub-expression, + /// then an empty string is returned. + ////////////////////////////////////////////////////////////////// + class smatch + { public: smatch(); @@ -140,12 +158,8 @@ regmatch_t pmatch[12]; }; - - - ///////////////////////////////////////////////////////////////// } // namespace str - /////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////// } // namespace zypp -/////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_STRING_H diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-10.3.3/zypp/media/CredentialManager.cc new/libzypp-10.3.4/zypp/media/CredentialManager.cc --- old/libzypp-10.3.3/zypp/media/CredentialManager.cc 2011-11-07 15:56:51.000000000 +0100 +++ new/libzypp-10.3.4/zypp/media/CredentialManager.cc 2011-11-11 13:47:41.000000000 +0100 @@ -39,16 +39,16 @@ // ////////////////////////////////////////////////////////////////////// - const url::ViewOption AuthDataComparator::vopt = - url::ViewOption::DEFAULTS - - url::ViewOption::WITH_USERNAME - - url::ViewOption::WITH_PASSWORD - - url::ViewOption::WITH_QUERY_STR; - bool AuthDataComparator::operator()( const AuthData_Ptr & lhs, const AuthData_Ptr & rhs) { + static const url::ViewOption vopt = + url::ViewOption::DEFAULTS + - url::ViewOption::WITH_USERNAME + - url::ViewOption::WITH_PASSWORD + - url::ViewOption::WITH_QUERY_STR; + if (lhs->username() != rhs->username()) return true; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-10.3.3/zypp/media/CredentialManager.h new/libzypp-10.3.4/zypp/media/CredentialManager.h --- old/libzypp-10.3.3/zypp/media/CredentialManager.h 2011-11-07 15:56:51.000000000 +0100 +++ new/libzypp-10.3.4/zypp/media/CredentialManager.h 2011-11-11 13:47:41.000000000 +0100 @@ -48,7 +48,6 @@ // comparator for CredentialSet struct AuthDataComparator { - static const url::ViewOption vopt; bool operator()(const AuthData_Ptr & lhs, const AuthData_Ptr & rhs); }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-10.3.3/zypp/media/MediaCD.cc new/libzypp-10.3.4/zypp/media/MediaCD.cc --- old/libzypp-10.3.3/zypp/media/MediaCD.cc 2011-11-07 15:56:51.000000000 +0100 +++ new/libzypp-10.3.4/zypp/media/MediaCD.cc 2011-11-11 13:47:41.000000000 +0100 @@ -52,59 +52,180 @@ using namespace std; -namespace zypp { - namespace media { +////////////////////////////////////////////////////////////////// +namespace zypp +{ + ////////////////////////////////////////////////////////////////// + namespace media + { + + ////////////////////////////////////////////////////////////////// + namespace + { + typedef std::list<MediaSource> DeviceList; + + ////////////////////////////////////////////////////////////////// + /// \brief Try to detect cd/dvd devices using hal/udev + /// + /// Returns an empty device list on error. + /// + /// \todo I took the code more or less as it was from MediaCD::detectDevices + /// into this function. Semantic between HAL and UDEV seems to be slightly + /// different, esp. in supportingDVD mode. This should be investigated and fixed. + ////////////////////////////////////////////////////////////////// + DeviceList systemDetectDevices( bool supportingDVD_r ) + { + DeviceList detected; -/////////////////////////////////////////////////////////////////// -// -// CLASS NAME : MediaCD -// -/////////////////////////////////////////////////////////////////// +#ifdef HAVE_UDEV + // http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/index.html + zypp::AutoDispose<struct udev *> udev( ::udev_new(), ::udev_unref ); + if ( ! udev ) + { + ERR << "Can't create udev context." << endl; + return DeviceList(); + } + + zypp::AutoDispose<struct udev_enumerate *> enumerate( ::udev_enumerate_new(udev), ::udev_enumerate_unref ); + if ( ! enumerate ) + { + ERR << "Can't create udev list entry." << endl; + return DeviceList(); + } + + ::udev_enumerate_add_match_subsystem( enumerate, "block" ); + ::udev_enumerate_add_match_property( enumerate, "ID_CDROM", "1" ); + ::udev_enumerate_scan_devices( enumerate ); + + struct udev_list_entry * entry = 0; + udev_list_entry_foreach( entry, ::udev_enumerate_get_list_entry( enumerate ) ) + { + zypp::AutoDispose<struct udev_device *> device( ::udev_device_new_from_syspath( ::udev_enumerate_get_udev( enumerate ), + ::udev_list_entry_get_name( entry ) ), + ::udev_device_unref ); + if ( ! device ) + { + ERR << "Can't create udev device." << endl; + continue; + } + + if ( supportingDVD_r && ! ::udev_device_get_property_value( device, "ID_CDROM_DVD" ) ) + { + continue; // looking for dvd only + } + + const char * devnodePtr( ::udev_device_get_devnode( device ) ); + if ( ! devnodePtr ) + { + ERR << "Got NULL devicenode." << endl; + continue; + } + + // In case we need it someday: + //const char * mountpath = ::udev_device_get_property_value( device, "FSTAB_DIR" ); + + PathInfo devnode( devnodePtr ); + if ( devnode.isBlk() ) + { + MediaSource media( "cdrom", devnode.path().asString(), devnode.major(), devnode.minor() ); + DBG << "Found (udev): " << media << std::endl; + detected.push_back( media ); + } + } + if ( detected.empty() ) + { + WAR << "Did not find any CD/DVD device." << endl; + } +#elif HAVE_HAL + using namespace zypp::target::hal; + try + { + HalContext hal(true); + + std::vector<std::string> drv_udis; + drv_udis = hal.findDevicesByCapability("storage.cdrom"); + + DBG << "Found " << drv_udis.size() << " cdrom drive udis" << std::endl; + for(size_t d = 0; d < drv_udis.size(); d++) + { + HalDrive drv( hal.getDriveFromUDI( drv_udis[d])); + + if( drv) + { + bool supportsDVD=false; + if( supportingDVD_r) + { + std::vector<std::string> caps; + try { + caps = drv.getCdromCapabilityNames(); + } + catch(const HalException &e) + { + ZYPP_CAUGHT(e); + } + + std::vector<std::string>::const_iterator ci; + for( ci=caps.begin(); ci != caps.end(); ++ci) + { + if( *ci == "dvd") + supportsDVD = true; + } + } + + MediaSource media("cdrom", drv.getDeviceFile(), + drv.getDeviceMajor(), + drv.getDeviceMinor()); + DBG << "Found " << drv_udis[d] << ": " + << media.asString() << std::endl; + if( supportingDVD_r && supportsDVD) + { + detected.push_front(media); + } + else + { + detected.push_back(media); + } + } + } + } + catch(const zypp::target::hal::HalException &e) + { + ZYPP_CAUGHT(e); + } +#endif + return detected; + } + } // namespace + ////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////// - // - // - // METHOD NAME : MediaCD::MediaCD - // METHOD TYPE : Constructor - // - // DESCRIPTION : - // - MediaCD::MediaCD( const Url & url_r, - const Pathname & attach_point_hint_r ) - : MediaHandler( url_r, attach_point_hint_r, - url_r.getPathName(), // urlpath below attachpoint - false ), - _lastdev(-1), _lastdev_tried(-1) + + MediaCD::MediaCD( const Url & url_r, const Pathname & attach_point_hint_r ) + : MediaHandler( url_r, attach_point_hint_r, url_r.getPathName(), false ) + , _lastdev( -1 ) + , _lastdev_tried( -1 ) { - MIL << "MediaCD::MediaCD(" << url_r << ", " << attach_point_hint_r << ")" - << endl; + MIL << "MediaCD::MediaCD(" << url_r << ", " << attach_point_hint_r << ")" << endl; - if( url_r.getScheme() != "dvd" && url_r.getScheme() != "cd") + if ( url_r.getScheme() != "dvd" && url_r.getScheme() != "cd" ) { ERR << "Unsupported schema in the Url: " << url_r.asString() << endl; ZYPP_THROW(MediaUnsupportedUrlSchemeException(_url)); } - string devices = _url.getQueryParam("devices"); - if (!devices.empty()) + string devices = _url.getQueryParam( "devices" ); + if ( ! devices.empty() ) { - string::size_type pos; - DBG << "parse " << devices << endl; - while(!devices.empty()) - { - pos = devices.find(','); - string device = devices.substr(0,pos); - if (!device.empty()) - { - MediaSource media("cdrom", device, 0, 0); - _devices.push_back( media); - DBG << "use device (delayed verify)" << device << endl; - } - if (pos!=string::npos) - devices=devices.substr(pos+1); - else - devices.erase(); + std::vector<std::string> words; + str::split( devices, std::back_inserter(words), "," ); + for ( const std::string & device : words ) + { + if ( device.empty() ) + continue; + + MediaSource media( "cdrom", device, 0, 0 ); + _devices.push_back( media ); + DBG << "use device (delayed verify)" << device << endl; } } else @@ -113,7 +234,7 @@ return; } - if( _devices.empty()) + if ( _devices.empty() ) { ERR << "Unable to find any cdrom drive for " << _url.asString() << endl; ZYPP_THROW(MediaBadUrlEmptyDestinationException(_url)); @@ -202,147 +323,71 @@ return true; } - /////////////////////////////////////////////////////////////////// - // - // - // METHOD NAME : MediaCD::detectDevices - // METHOD TYPE : MediaCD::DeviceList - // - MediaCD::DeviceList MediaCD::detectDevices( bool supportingDVD ) const - { - DeviceList detected; -#ifdef HAVE_UDEV - // http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/index.html - zypp::AutoDispose<struct udev *> udev( ::udev_new(), ::udev_unref ); - if ( ! udev ) - { - ERR << "Can't create udev context." << endl; - return DeviceList(); - } - - zypp::AutoDispose<struct udev_enumerate *> enumerate( ::udev_enumerate_new(udev), ::udev_enumerate_unref ); - if ( ! enumerate ) - { - ERR << "Can't create udev list entry." << endl; - return DeviceList(); - } - ::udev_enumerate_add_match_subsystem( enumerate, "block" ); - ::udev_enumerate_add_match_property( enumerate, "ID_CDROM", "1" ); - ::udev_enumerate_scan_devices( enumerate ); + MediaCD::DeviceList MediaCD::detectDevices( bool supportingDVD_r ) const + { + DeviceList detected( systemDetectDevices( supportingDVD_r ) ); - struct udev_list_entry * entry = 0; - udev_list_entry_foreach( entry, ::udev_enumerate_get_list_entry( enumerate ) ) + if ( detected.empty() ) { - zypp::AutoDispose<struct udev_device *> device( ::udev_device_new_from_syspath( ::udev_enumerate_get_udev( enumerate ), - ::udev_list_entry_get_name( entry ) ), - ::udev_device_unref ); - if ( ! device ) + WAR << "CD/DVD drive detection with HAL/UDEV failed! Guessing..." << std::endl; + PathInfo dvdinfo( "/dev/dvd" ); + PathInfo cdrinfo( "/dev/cdrom" ); + if ( dvdinfo.isBlk() ) { - ERR << "Can't create udev device." << endl; - continue; + MediaSource media( "cdrom", dvdinfo.path().asString(), dvdinfo.major(), dvdinfo.minor() ); + DBG << "Found (GUESS): " << media << std::endl; + detected.push_back( media ); } - - if ( supportingDVD && ! ::udev_device_get_property_value( device, "ID_CDROM_DVD" ) ) + if ( cdrinfo.isBlk() + && ! ( cdrinfo.major() == dvdinfo.major() && cdrinfo.minor() == dvdinfo.minor() ) ) { - continue; // looking for dvd only + MediaSource media( "cdrom", cdrinfo.path().asString(), cdrinfo.major(), cdrinfo.minor() ); + DBG << "Found (GUESS): " << media << std::endl; + detected.push_back( media ); } + } - const char * devnodePtr( ::udev_device_get_devnode( device ) ); - if ( ! devnodePtr ) + // NOTE: On the fly build on-demand device list. Code was moved to + // here to get rid of code duplication, while keeping the ABI. Acuallty + // this code should be moved to a _devices accessor method. + if ( _devices.empty() ) + { + DBG << "creating on-demand device list" << endl; + //default is /dev/cdrom; for dvd: /dev/dvd if it exists + string device( "/dev/cdrom" ); + if ( _url.getScheme() == "dvd" && PathInfo( "/dev/dvd" ).isBlk() ) { - ERR << "Got NULL devicenode." << endl; - continue; + device = "/dev/dvd"; } - // In case we need it someday: - //const char * mountpath = ::udev_device_get_property_value( device, "FSTAB_DIR" ); - - PathInfo devnode( devnodePtr ); - if ( devnode.isBlk() ) + PathInfo dinfo( device ); + if ( dinfo.isBlk() ) { - MediaSource media( "cdrom", devnode.path().asString(), devnode.major(), devnode.minor() ); - DBG << "Found (udev): " << media << std::endl; - detected.push_back( media ); + MediaSource media( "cdrom", device, dinfo.major(), dinfo.minor() ); + if ( detected.empty() ) + { + _devices.push_front( media ); // better try this than nothing + } + else + { + for( const auto & d : detected ) + { + // /dev/cdrom or /dev/dvd to the front + if ( media.equals( d ) ) + _devices.push_front( d ); + else + _devices.push_back( d ); + } + } } - } - if ( detected.empty() ) - WAR << "Did not find any CD/DVD device." << endl; -#elif HAVE_HAL - using namespace zypp::target::hal; - try - { - HalContext hal(true); - - std::vector<std::string> drv_udis; - drv_udis = hal.findDevicesByCapability("storage.cdrom"); - - DBG << "Found " << drv_udis.size() << " cdrom drive udis" << std::endl; - for(size_t d = 0; d < drv_udis.size(); d++) + else { - HalDrive drv( hal.getDriveFromUDI( drv_udis[d])); - - if( drv) - { - bool supportsDVD=false; - if( supportingDVD) - { - std::vector<std::string> caps; - try { - caps = drv.getCdromCapabilityNames(); - } - catch(const HalException &e) - { - ZYPP_CAUGHT(e); - } - - std::vector<std::string>::const_iterator ci; - for( ci=caps.begin(); ci != caps.end(); ++ci) - { - if( *ci == "dvd") - supportsDVD = true; - } - } - - MediaSource media("cdrom", drv.getDeviceFile(), - drv.getDeviceMajor(), - drv.getDeviceMinor()); - DBG << "Found " << drv_udis[d] << ": " - << media.asString() << std::endl; - if( supportingDVD && supportsDVD) - { - detected.push_front(media); - } - else - { - detected.push_back(media); - } - } + // no /dev/cdrom or /dev/dvd link + _devices = detected; } } - catch(const zypp::target::hal::HalException &e) - { - ZYPP_CAUGHT(e); - } -#else // manual way -#warning Poor CDROM devices detection without udev/HAL - WAR << "Cdrom drive detection without HAL! " << std::endl; - PathInfo dvdinfo( "/dev/dvd" ); - PathInfo cdrinfo( "/dev/cdrom" ); - if ( dvdinfo.isBlk() ) - { - MediaSource media( "cdrom", dvdinfo.path().asString(), dvdinfo.major(), dvdinfo.minor() ); - DBG << "Found (NO_HAL): " << media << std::endl; - detected.push_back( media ); - } - if ( cdrinfo.isBlk() - && ! ( cdrinfo.major() == dvdinfo.major() && cdrinfo.minor() == dvdinfo.minor() ) ) - { - MediaSource media( "cdrom", cdrinfo.path().asString(), cdrinfo.major(), cdrinfo.minor() ); - DBG << "Found (NO_HAL): " << media << std::endl; - detected.push_back( media ); - } -#endif + return detected; } @@ -355,55 +400,21 @@ // // DESCRIPTION : Asserted that not already attached, and attachPoint is a directory. // - void MediaCD::attachTo(bool next) + void MediaCD::attachTo( bool next ) { DBG << "next " << next << " last " << _lastdev << " last tried " << _lastdev_tried << endl; - if (next && _lastdev == -1) + if ( next && _lastdev == -1 ) ZYPP_THROW(MediaNotSupportedException(url())); - DeviceList detected( - detectDevices(_url.getScheme() == "dvd" ? true : false)); - - if(_devices.empty()) - { - DBG << "creating on-demand device list" << endl; - //default is /dev/cdrom; for dvd: /dev/dvd if it exists - string device( "/dev/cdrom" ); - if ( _url.getScheme() == "dvd" && PathInfo( "/dev/dvd" ).isBlk() ) - { - device = "/dev/dvd"; - } - - PathInfo dinfo(device); - if( dinfo.isBlk()) - { - MediaSource media("cdrom", device, dinfo.major(), dinfo.minor()); - - DeviceList::const_iterator d( detected.begin()); - for( ; d != detected.end(); ++d) - { - // /dev/cdrom or /dev/dvd to the front - if( media.equals( *d)) - _devices.push_front( *d); - else - _devices.push_back( *d); - } - } - else - { - // no /dev/cdrom or /dev/dvd link - _devices = detected; - } - } + // This also fills the _devices list on demand + DeviceList detected( detectDevices( _url.getScheme() == "dvd" ? true : false ) ); Mount mount; - string mountpoint = attachPoint().asString(); - bool mountsucceeded = false; - int count = 0; MediaMountException merr; + string mountpoint = attachPoint().asString(); - string options = _url.getQueryParam("mountoptions"); - if (options.empty()) + string options = _url.getQueryParam( "mountoptions" ); + if ( options.empty() ) { options="ro"; } @@ -418,9 +429,9 @@ filesystems.push_back("iso9660"); // try all devices in sequence - for (DeviceList::iterator it = _devices.begin() - ; !mountsucceeded && it != _devices.end() - ; ++it, count++ ) + int count = 0; + bool mountsucceeded = false; + for ( DeviceList::iterator it = _devices.begin() ; ! mountsucceeded && it != _devices.end() ; ++it, ++count ) { DBG << "count " << count << endl; if (next && count <=_lastdev_tried ) @@ -428,28 +439,32 @@ DBG << "skipping device " << it->name << endl; continue; } + DBG << "trying device " << it->name << endl; _lastdev_tried = count; + bool valid( false ); - MediaSource temp( *it); - bool valid=false; - PathInfo dinfo(temp.name); - if( dinfo.isBlk()) + MediaSource temp( *it ); + PathInfo dinfo( temp.name ); + if ( dinfo.isBlk() ) { temp.maj_nr = dinfo.major(); temp.min_nr = dinfo.minor(); - DeviceList::const_iterator d( detected.begin()); - for( ; d != detected.end(); ++d) - { - if( temp.equals( *d)) - { - valid = true; - break; - } - } + if ( detected.empty() ) + valid = true; // better try this than nothing + else + for ( const auto & d : detected ) + { + if ( temp.equals( d ) ) + { + valid = true; + break; + } + } } - if( !valid) + + if ( ! valid ) { DBG << "skipping invalid device: " << it->name << endl; continue; @@ -656,42 +671,11 @@ // void MediaCD::forceEject(const std::string & ejectDev) { - bool ejected=false; - if ( !isAttached()) { // no device mounted in this instance - - DeviceList detected( - detectDevices(_url.getScheme() == "dvd" ? true : false)); - - if(_devices.empty()) - { - DBG << "creating on-demand device list" << endl; - //default is /dev/cdrom; for dvd: /dev/dvd if it exists - string device( "/dev/cdrom" ); - if ( _url.getScheme() == "dvd" && PathInfo( "/dev/dvd" ).isBlk() ) { - device = "/dev/dvd"; - } - - PathInfo dinfo(device); - if( dinfo.isBlk()) - { - MediaSource media("cdrom", device, dinfo.major(), dinfo.minor()); - - DeviceList::const_iterator d( detected.begin()); - for( ; d != detected.end(); ++d) - { - // /dev/cdrom or /dev/dvd to the front - if( media.equals( *d)) - _devices.push_front( *d); - else - _devices.push_back( *d); - } - } - else - { - // no /dev/cdrom or /dev/dvd link - _devices = detected; - } - } + bool ejected = false; + if ( ! isAttached() ) // no device mounted in this instance + { + // This also fills the _devices list on demand + DeviceList detected( detectDevices( _url.getScheme() == "dvd" ? true : false ) ); DeviceList::iterator it; for( it = _devices.begin(); it != _devices.end(); ++it ) { @@ -802,17 +786,18 @@ // // DESCRIPTION : Asserted that media is attached and retlist is empty. // - void MediaCD::getDirInfo( filesystem::DirContent & retlist, - const Pathname & dirname, bool dots ) const + void MediaCD::getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } + bool MediaCD::getDoesFileExist( const Pathname & filename ) const { return MediaHandler::getDoesFileExist( filename ); } + bool MediaCD::hasMoreDevices() { if (_devices.size() == 0) @@ -823,44 +808,27 @@ return (unsigned) _lastdev_tried < _devices.size() - 1; } - void - MediaCD::getDetectedDevices(std::vector<std::string> & devices, - unsigned int & index) const + + void MediaCD::getDetectedDevices( std::vector<std::string> & devices, unsigned int & index ) const { - index = 0; - if (!devices.empty()) + if ( ! devices.empty() ) devices.clear(); - for (DeviceList::const_iterator it = _devices.begin(); - it != _devices.end(); ++it) - devices.push_back(it->name); - - if (_lastdev >= 0) - index = _lastdev; - - // try to detect again if _devices are empty (maybe this method will be - // called before _devices get actually filled) - if (devices.empty()) - { - DBG << "no device list so far, trying to detect" << endl; + if ( _devices.empty() ) + // This also fills the _devices list on demand + detectDevices( _url.getScheme() == "dvd" ? true : false ); - DeviceList detected( - detectDevices(_url.getScheme() == "dvd" ? true : false)); + for ( const auto & it : _devices ) + devices.push_back( it.name ); - for (DeviceList::const_iterator it = detected.begin(); - it != detected.end(); ++it) - devices.push_back(it->name); - - // don't know which one is in use in this case - index = 0; - } + index = ( _lastdev >= 0 ? (unsigned)_lastdev : 0 ); MIL << "got " << devices.size() << " detected devices, current: " << (index < devices.size() ? devices[index] : "<none>") << "(" << index << ")" << endl; } - } // namespace media + ////////////////////////////////////////////////////////////////// } // namespace zypp -// vim: set ts=8 sts=2 sw=2 ai noet: +////////////////////////////////////////////////////////////////// diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libzypp-10.3.3/zypp/media/MediaCD.h new/libzypp-10.3.4/zypp/media/MediaCD.h --- old/libzypp-10.3.3/zypp/media/MediaCD.h 2011-11-07 15:56:51.000000000 +0100 +++ new/libzypp-10.3.4/zypp/media/MediaCD.h 2011-11-11 13:47:41.000000000 +0100 @@ -28,10 +28,9 @@ class MediaCD : public MediaHandler { private: - typedef std::list<MediaSource> DeviceList; /** list of devices to try to mount */ - DeviceList _devices; + mutable DeviceList _devices; /** number of last successful mounted device in list */ int _lastdev; -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
