#include <fstream>
#include <sstream>
+#include "zypp/ZConfig.h"
#include "zypp/TmpPath.h"
#include "zypp/Date.h"
#include "zypp/base/LogTools.h"
+#include "zypp/base/Gettext.h"
#include "zypp/base/String.h"
#include "zypp/media/MediaHandler.h"
#include "zypp/media/MediaManager.h"
const bool does_download_r )
: _mediaSource()
, _attachPoint( new AttachPoint())
- , _AttachPointHint()
+ , _attachPointHint()
, _relativeRoot( urlpath_below_attachpoint_r)
, _does_download( does_download_r )
, _attach_mtime(0)
void
MediaHandler::attachPointHint(const Pathname &path, bool temporary)
{
- _AttachPointHint.path = path;
- _AttachPointHint.temp = temporary;
+ _attachPointHint.path = path;
+ _attachPointHint.temp = temporary;
}
///////////////////////////////////////////////////////////////////
AttachPoint
MediaHandler::attachPointHint() const
{
- return _AttachPointHint;
+ return _attachPointHint;
}
///////////////////////////////////////////////////////////////////
Pathname
MediaHandler::createAttachPoint() const
{
- /////////////////////////////////////////////////////////////////
- // provide a default (temporary) attachpoint
- /////////////////////////////////////////////////////////////////
- const char * defmounts[] = {
- "/var/adm/mount", filesystem::TmpPath::defaultLocation().c_str(), /**/NULL/**/
- };
-
+ Pathname aroot;
Pathname apoint;
- Pathname aroot( MediaHandler::_attachPrefix);
-
- if( !aroot.empty())
{
- apoint = createAttachPoint(aroot);
+ aroot = MediaHandler::_attachPrefix; // explicit request
+ if ( ! aroot.empty() )
+ apoint = createAttachPoint( aroot );
}
- for ( const char ** def = defmounts; *def && apoint.empty(); ++def ) {
- aroot = *def;
- if( aroot.empty())
- continue;
- apoint = createAttachPoint(aroot);
+ if ( apoint.empty() ) // fallback to config value
+ {
+ aroot = ZConfig::instance().download_mediaMountdir();
+ if ( ! aroot.empty() )
+ apoint = createAttachPoint( aroot );
}
- if ( aroot.empty() ) {
- ERR << "Create attach point: Can't find a writable directory to create an attach point" << std::endl;
- return aroot;
+ if ( apoint.empty() ) // fall back to temp space
+ {
+ aroot = filesystem::TmpPath::defaultLocation();
+ if ( ! aroot.empty() )
+ apoint = createAttachPoint( aroot );
}
- if ( !apoint.empty() ) {
- MIL << "Created default attach point " << apoint << std::endl;
+ if ( apoint.empty() )
+ {
+ auto except = MediaBadAttachPointException( url() );
+ except.addHistory( _("Create attach point: Can't find a writable directory to create an attach point") );
+ ZYPP_THROW( std::move(except) );
}
+
+ MIL << "Created default attach point " << apoint << std::endl;
return apoint;
}
ref.mediaSource->bdir.empty()))
{
std::string mtype(matchMountFs ? e->type : ref.mediaSource->type);
- MediaSource media(mtype, e->src, dev_info.major(), dev_info.minor());
+ MediaSource media(mtype, e->src, dev_info.devMajor(), dev_info.devMinor());
if( ref.mediaSource->equals( media ) )
{
}
// differs
}
+ else // mixed cases:
+ {
+ // Type ISO: Since 11.1 mtab might contain the name of
+ // the loop device instead of the iso file:
+ if ( ref.mediaSource->type == "iso"
+ && str::hasPrefix( Pathname(e->src).asString(), "/dev/loop" )
+ && ref.attachPoint->path == Pathname(e->dir) )
+ {
+ DBG << "Found bound media "
+ << ref.mediaSource->asString()
+ << " in the mount table as " << e->src << std::endl;
+ _isAttached = true;
+ break;
+ }
+ }
}
if( !_isAttached)
if( is_device && ref->maj_nr)
{
std::string mtype(matchMountFs ? e->type : ref->type);
- MediaSource media(mtype, e->src, dev_info.major(), dev_info.minor());
+ MediaSource media(mtype, e->src, dev_info.devMajor(), dev_info.devMinor());
if( ref->equals( media) && e->type != "subfs")
{