summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/sbuild/chroot/block-device.cc3
-rw-r--r--lib/sbuild/chroot/btrfs-snapshot.cc2
-rw-r--r--lib/sbuild/chroot/chroot.cc59
-rw-r--r--lib/sbuild/chroot/chroot.h8
-rw-r--r--lib/sbuild/chroot/custom.cc2
-rw-r--r--lib/sbuild/chroot/directory.cc3
-rw-r--r--lib/sbuild/chroot/facet/session.cc60
-rw-r--r--lib/sbuild/chroot/facet/session.h11
-rw-r--r--lib/sbuild/chroot/file.cc2
-rw-r--r--lib/sbuild/chroot/loopback.cc3
-rw-r--r--lib/sbuild/chroot/lvm-snapshot.cc2
11 files changed, 82 insertions, 73 deletions
diff --git a/lib/sbuild/chroot/block-device.cc b/lib/sbuild/chroot/block-device.cc
index c27db24f..d26b494f 100644
--- a/lib/sbuild/chroot/block-device.cc
+++ b/lib/sbuild/chroot/block-device.cc
@@ -19,6 +19,7 @@
#include <config.h>
#include <sbuild/chroot/block-device.h>
+#include <sbuild/chroot/facet/session.h>
#include <sbuild/chroot/facet/session-clonable.h>
#include <sbuild/chroot/facet/source-clonable.h>
#ifdef SBUILD_FEATURE_UNION
@@ -160,7 +161,7 @@ namespace sbuild
(type == SETUP_STOP && lock == false && status == 0))
{
bool start = (type == SETUP_START);
- setup_session_info(start);
+ get_facet_strict<facet::session>()->setup_session_info(start);
}
}
diff --git a/lib/sbuild/chroot/btrfs-snapshot.cc b/lib/sbuild/chroot/btrfs-snapshot.cc
index 407b70a3..60437e86 100644
--- a/lib/sbuild/chroot/btrfs-snapshot.cc
+++ b/lib/sbuild/chroot/btrfs-snapshot.cc
@@ -177,7 +177,7 @@ namespace sbuild
(type == SETUP_STOP && lock == false && status == 0))
{
bool start = (type == SETUP_START);
- setup_session_info(start);
+ get_facet_strict<facet::session>()->setup_session_info(start);
}
}
diff --git a/lib/sbuild/chroot/chroot.cc b/lib/sbuild/chroot/chroot.cc
index 85a19458..5dd3600d 100644
--- a/lib/sbuild/chroot/chroot.cc
+++ b/lib/sbuild/chroot/chroot.cc
@@ -41,22 +41,18 @@
#include <sbuild/chroot/facet/session.h>
#include <sbuild/chroot/facet/session-clonable.h>
#include <sbuild/chroot/facet/source.h>
+#include <sbuild/chroot/facet/storage.h>
#include <sbuild/chroot/facet/userdata.h>
#ifdef SBUILD_FEATURE_UNSHARE
#include <sbuild/chroot/facet/unshare.h>
#endif // SBUILD_FEATURE_UNSHARE
#include "fdstream.h"
-#include "keyfile-writer.h"
-#include "lock.h"
+#include <cassert>
#include <cerrno>
#include <map>
#include <utility>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
#include <boost/format.hpp>
using boost::format;
@@ -552,57 +548,6 @@ namespace sbuild
}
void
- chroot::setup_session_info (bool start)
- {
- /* Create or unlink session information. */
- std::string file = std::string(SCHROOT_SESSION_DIR) + "/" + get_name();
-
- if (start)
- {
- int fd = open(file.c_str(), O_CREAT|O_EXCL|O_WRONLY, 0664);
- if (fd < 0)
- throw error(file, SESSION_WRITE, strerror(errno));
-
- // Create a stream from the file descriptor. The fd will be
- // closed when the stream is destroyed.
-#ifdef BOOST_IOSTREAMS_CLOSE_HANDLE_OLD
- fdostream output(fd, true);
-#else
- fdostream output(fd, boost::iostreams::close_handle);
-#endif
- output.imbue(std::locale::classic());
-
- file_lock lock(fd);
- try
- {
- lock.set_lock(lock::LOCK_EXCLUSIVE, 2);
- }
- catch (lock::error const& e)
- {
- throw error(file, FILE_LOCK, e);
- }
-
- keyfile details;
- get_keyfile(details);
- output << keyfile_writer(details);
-
- try
- {
- lock.unset_lock();
- }
- catch (lock::error const& e)
- {
- throw error(file, FILE_UNLOCK, e);
- }
- }
- else /* start == false */
- {
- if (unlink(file.c_str()) != 0)
- throw error(file, SESSION_UNLINK, strerror(errno));
- }
- }
-
- void
chroot::lock (setup_type type)
{
setup_lock(type, true, 0);
diff --git a/lib/sbuild/chroot/chroot.h b/lib/sbuild/chroot/chroot.h
index bcfdbc52..db41dd1a 100644
--- a/lib/sbuild/chroot/chroot.h
+++ b/lib/sbuild/chroot/chroot.h
@@ -564,14 +564,6 @@ namespace sbuild
protected:
/**
- * Set up persistent session information.
- *
- * @param start true if startion, or false if ending a session.
- */
- virtual void
- setup_session_info (bool start);
-
- /**
* Unlock a chroot during setup. The locking technique (if any) may
* vary depending upon the chroot type and setup stage. For
* example, during creation of an LVM snapshot a block device
diff --git a/lib/sbuild/chroot/custom.cc b/lib/sbuild/chroot/custom.cc
index 806d69bf..22ce9b42 100644
--- a/lib/sbuild/chroot/custom.cc
+++ b/lib/sbuild/chroot/custom.cc
@@ -156,7 +156,7 @@ namespace sbuild
{
bool start = (type == SETUP_START);
- setup_session_info(start);
+ get_facet_strict<facet::session>()->setup_session_info(start);
}
}
diff --git a/lib/sbuild/chroot/directory.cc b/lib/sbuild/chroot/directory.cc
index ed8d70e9..b1037954 100644
--- a/lib/sbuild/chroot/directory.cc
+++ b/lib/sbuild/chroot/directory.cc
@@ -19,6 +19,7 @@
#include <config.h>
#include <sbuild/chroot/directory.h>
+#include <sbuild/chroot/facet/session.h>
#include <sbuild/chroot/facet/session-clonable.h>
#include <sbuild/chroot/facet/source-clonable.h>
#ifdef SBUILD_FEATURE_UNION
@@ -139,7 +140,7 @@ namespace sbuild
(type == SETUP_STOP && lock == false && status == 0))
{
bool start = (type == SETUP_START);
- setup_session_info(start);
+ get_facet_strict<facet::session>()->setup_session_info(start);
}
}
diff --git a/lib/sbuild/chroot/facet/session.cc b/lib/sbuild/chroot/facet/session.cc
index 40b75f78..71b3caac 100644
--- a/lib/sbuild/chroot/facet/session.cc
+++ b/lib/sbuild/chroot/facet/session.cc
@@ -21,10 +21,17 @@
#include <sbuild/chroot/chroot.h>
#include <sbuild/chroot/config.h>
#include <sbuild/chroot/facet/session.h>
-#include "format-detail.h"
+#include <sbuild/keyfile-writer.h>
+#include <sbuild/lock.h>
+#include <sbuild/fdstream.h>
+#include <sbuild/format-detail.h>
#include <cassert>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
#include <boost/format.hpp>
using boost::format;
@@ -97,6 +104,57 @@ namespace sbuild
}
void
+ session::setup_session_info (bool start)
+ {
+ /* Create or unlink session information. */
+ std::string file = std::string(SCHROOT_SESSION_DIR) + "/" + owner->get_name();
+
+ if (start)
+ {
+ int fd = open(file.c_str(), O_CREAT|O_EXCL|O_WRONLY, 0664);
+ if (fd < 0)
+ throw error(file, chroot::SESSION_WRITE, strerror(errno));
+
+ // Create a stream from the file descriptor. The fd will be
+ // closed when the stream is destroyed.
+#ifdef BOOST_IOSTREAMS_CLOSE_HANDLE_OLD
+ fdostream output(fd, true);
+#else
+ fdostream output(fd, boost::iostreams::close_handle);
+#endif
+ output.imbue(std::locale::classic());
+
+ file_lock lock(fd);
+ try
+ {
+ lock.set_lock(lock::LOCK_EXCLUSIVE, 2);
+ }
+ catch (lock::error const& e)
+ {
+ throw error(file, chroot::FILE_LOCK, e);
+ }
+
+ keyfile details;
+ owner->get_keyfile(details);
+ output << keyfile_writer(details);
+
+ try
+ {
+ lock.unset_lock();
+ }
+ catch (lock::error const& e)
+ {
+ throw error(file, chroot::FILE_UNLOCK, e);
+ }
+ }
+ else /* start == false */
+ {
+ if (unlink(file.c_str()) != 0)
+ throw error(file, chroot::SESSION_UNLINK, strerror(errno));
+ }
+ }
+
+ void
session::setup_env (chroot const& chroot,
environment& env) const
{
diff --git a/lib/sbuild/chroot/facet/session.h b/lib/sbuild/chroot/facet/session.h
index 83682181..8a80f186 100644
--- a/lib/sbuild/chroot/facet/session.h
+++ b/lib/sbuild/chroot/facet/session.h
@@ -39,6 +39,9 @@ namespace facet
class session : public facet
{
public:
+ /// Exception type.
+ typedef chroot::error error;
+
/// A shared_ptr to a chroot facet object.
typedef std::shared_ptr<session> ptr;
@@ -100,6 +103,14 @@ namespace facet
void
set_selected_name (std::string const& name);
+ /**
+ * Set up persistent session information.
+ *
+ * @param start true if starting, or false if ending a session.
+ */
+ void
+ setup_session_info (bool start);
+
virtual void
setup_env (chroot const& chroot,
environment& env) const;
diff --git a/lib/sbuild/chroot/file.cc b/lib/sbuild/chroot/file.cc
index c4d948e0..92be8cab 100644
--- a/lib/sbuild/chroot/file.cc
+++ b/lib/sbuild/chroot/file.cc
@@ -197,7 +197,7 @@ namespace sbuild
{
bool start = (type == SETUP_START);
- setup_session_info(start);
+ get_facet_strict<facet::session>()->setup_session_info(start);
}
}
diff --git a/lib/sbuild/chroot/loopback.cc b/lib/sbuild/chroot/loopback.cc
index d09ecbcd..38c8378a 100644
--- a/lib/sbuild/chroot/loopback.cc
+++ b/lib/sbuild/chroot/loopback.cc
@@ -19,6 +19,7 @@
#include <config.h>
#include <sbuild/chroot/loopback.h>
+#include <sbuild/chroot/facet/session.h>
#include <sbuild/chroot/facet/session-clonable.h>
#include <sbuild/chroot/facet/source-clonable.h>
#include <sbuild/chroot/facet/mountable.h>
@@ -169,7 +170,7 @@ namespace sbuild
(type == SETUP_STOP && lock == false && status == 0))
{
bool start = (type == SETUP_START);
- setup_session_info(start);
+ get_facet_strict<facet::session>()->setup_session_info(start);
}
}
diff --git a/lib/sbuild/chroot/lvm-snapshot.cc b/lib/sbuild/chroot/lvm-snapshot.cc
index d064f5c2..87cda4ec 100644
--- a/lib/sbuild/chroot/lvm-snapshot.cc
+++ b/lib/sbuild/chroot/lvm-snapshot.cc
@@ -189,7 +189,7 @@ namespace sbuild
(type == SETUP_STOP && lock == false && status == 0))
{
bool start = (type == SETUP_START);
- setup_session_info(start);
+ get_facet_strict<facet::session>()->setup_session_info(start);
}
}