14 #include <zypp/TmpPath.h> 15 #include <zypp/base/Logger.h> 16 #include <zypp/base/String.h> 32 #include <zypp-core/zyppng/base/private/linuxhelpers_p.h> 44 volatile sig_atomic_t shutdownPipeRead{-1};
45 volatile sig_atomic_t shutdownPipeWrite{-1};
47 bool makeShutdownPipe() {
48 int pipeFds[]{ -1, -1 };
50 if ( ::pipe2( pipeFds, O_CLOEXEC ) != 0 )
53 if ( ::pipe( pipeFds ) != 0 )
55 ::fcntl( pipeFds[0], F_SETFD, O_CLOEXEC );
56 ::fcntl( pipeFds[1], F_SETFD, O_CLOEXEC );
58 shutdownPipeRead = pipeFds[0];
59 shutdownPipeWrite = pipeFds[1];
63 const bool ensureShutdownPipe() {
64 static auto pipesInitialized = makeShutdownPipe();
65 return pipesInitialized;
68 const int shutdownPipeReadFd() {
69 if ( !ensureShutdownPipe() )
71 return static_cast<int>(shutdownPipeRead);
74 const int shutdownPipeWriteFd() {
75 return static_cast<int>(shutdownPipeWrite);
89 static weak_ptr<callback::TempConnect<media::MediaChangeReport> > globalguard;
90 if ( condition_r && ! (
_guard = globalguard.lock()) )
108 namespace zypp_detail
121 if ( !ensureShutdownPipe() )
122 WAR <<
"Failed to create shutdown pipe" << std::endl;
125 MIL <<
"Initializing keyring..." << std::endl;
177 INT <<
"2 active targets at the same time must not happen!" << endl;
180 resolver()->setDefaultSolverFlags(
false );
185 MIL <<
"initTarget( " << root << (doRebuild_r?
", rebuilddb":
"") <<
")" << endl;
188 MIL <<
"Repeated call to initializeTarget()" << endl;
213 if ( getenv(
"ZYPP_TESTSUITE_FAKE_ARCH") )
218 MIL <<
"Attempt to commit (" << policy_r <<
")" << endl;
245 MIL <<
"Commit (" << policy_r <<
") returned: " 254 _target->_pimpl->installSrcPackage( srcPackage_r );
261 return _target->_pimpl->provideSrcPackage( srcPackage_r );
280 int sigFd = shutdownPipeWriteFd();
285 zyppng::eintrSafeCall(
write, sigFd,
"1", 1 );
292 int sigFd = shutdownPipeWriteFd();
299 while( zyppng::eintrSafeCall(
read, sigFd, &buf, 1 ) > 0 )
310 return str <<
"ZYppImpl";
316 const auto shutdownFd = shutdownPipeReadFd();
317 if (shutdownFd == -1) {
328 OnScopeExit removeShutdownFd( [&](){ fds.pop_back(); } );
330 int r = zyppng::eintrSafeCall( g_poll, fds.data(), fds.size(), timeout );
333 if ( fds.back().revents )
346 return _tmpdir.
path();
Target_Ptr target() const
std::ostream & about(std::ostream &str) const
Print some detail about the current libzypp version.
void setHomePath(const Pathname &path)
set the home, if you need to change it
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Result returned from ZYpp::commit.
static ZConfig & instance()
Singleton ctor.
static void clearShutdownSignal()
Disable the shutdown signal for zypp_poll calls.
ZYppCommitPolicy & dryRun(bool yesNo_r)
Set dry run (default: false).
String related utilities and Regular expression matching.
static const Pathname & defaultLocation()
DiskUsageCounter::MountPointSet diskUsage()
Resolver_Ptr resolver() const
DiskUsageCounter::MountPointSet getPartitions() const
std::map< std::string, std::string > read(const Pathname &_path)
Read sysconfig file path_r and return (key,valye) pairs.
void initializeTarget(const Pathname &root, bool doRebuild_r)
Temporarily connect a ReceiveReport then restore the previous one.
Temporarily set/unset an environment variable.
bool write(const Pathname &path_r, const std::string &key_r, const std::string &val_r, const std::string &newcomment_r)
Add or change a value in sysconfig file path_r.
void changeTargetTo(Target_Ptr newtarget_r)
Hook for actions to trigger if the Target changes (initialize/finish)
std::set< MountPoint > MountPointSet
shared_ptr< DiskUsageCounter > _disk_usage
defined mount points, used for disk usage counting
ZYppCommitResult commit(const ZYppCommitPolicy &policy_r)
Commit changes and transactions.
bool empty() const
Test for an empty path.
static Pool instance()
Singleton ctor.
Dependency resolver interface.
Provide a new empty temporary directory and recursively delete it when no longer needed.
static const std::string & systemRepoAlias()
Reserved system repository alias .
Options and policies for ZYpp::commit.
Pathname tmpPath() const
Get the path where zypp related plugins store tmp data.
void installSrcPackage(const SrcPackage_constPtr &srcPackage_r)
Install a source package on the Target.
Pathname homePath() const
Get the path where zypp related plugins store persistent data and caches.
Pathname myTmpDir()
Global access to the zypp.TMPDIR (created on demand, deleted when libzypp is unloaded) ...
ZYppCommitPolicy & syncPoolAfterCommit(bool yesNo_r)
Kepp pool in sync with the Target databases after commit (default: true)
std::string numstring(char n, int w=0)
std::ostream & operator<<(std::ostream &str, const ZYppImpl &obj)
Base class for Exception.
Compute disk space occupied by packages across partitions/directories.
static void setShutdownSignal()
Enable the shutdown signal for zypp_poll calls.
Base for exceptions caused by explicit user request.
static callback::SendReport< JobReport > & instance()
Singleton sender instance.
int zypp_poll(std::vector< GPollFD > &fds, int timeout)
Small wrapper around g_poll that additionally listens to the shutdown FD returned by ZYpp::shutdownSi...
Easy-to use interface to the ZYPP dependency resolver.
void setPartitions(const DiskUsageCounter::MountPointSet &mp)
void notifyTargetChanged()
internal
ManagedFile provideSrcPackage(const SrcPackage_constPtr &srcPackage_r)
Install a source package on the Target.
static MountPointSet detectMountPoints(const std::string &rootdir="/")
Get mountpoints of system below rootdir If we happen to detect snapshotting btrfs partitions...