mirror of
https://github.com/OpenVPN/openvpn3.git
synced 2024-09-20 12:12:15 +02:00
unix file utils: added mtime_ns parameter to write_binary_unix() and write_binary_atomic()
mtime_ns is nanoseconds-since-epoch. Signed-off-by: James Yonan <james@openvpn.net>
This commit is contained in:
parent
bf00c6e3ed
commit
1eb9cd657c
@ -47,6 +47,7 @@ namespace openvpn {
|
||||
inline void write_binary_atomic(const std::string& fn,
|
||||
const std::string& tmpdir,
|
||||
const mode_t mode,
|
||||
const std::uint64_t mtime_ns, // set explicit modification-time in nanoseconds since epoch, or 0 to defer to system
|
||||
const ConstBuffer& buf,
|
||||
RandomAPI& rng)
|
||||
{
|
||||
@ -56,7 +57,7 @@ namespace openvpn {
|
||||
const std::string tfn = path::join(tmpdir, '.' + path::basename(fn) + '.' + render_hex(data, sizeof(data)));
|
||||
|
||||
// write to temporary file
|
||||
write_binary_unix(tfn, mode, buf);
|
||||
write_binary_unix(tfn, mode, mtime_ns, buf);
|
||||
|
||||
// then move into position
|
||||
if (::rename(tfn.c_str(), fn.c_str()) == -1)
|
||||
@ -69,10 +70,11 @@ namespace openvpn {
|
||||
inline void write_binary_atomic(const std::string& fn,
|
||||
const std::string& tmpdir,
|
||||
const mode_t mode,
|
||||
const std::uint64_t mtime_ns,
|
||||
const Buffer& buf,
|
||||
RandomAPI& rng)
|
||||
{
|
||||
return write_binary_atomic(fn, tmpdir, mode, const_buffer_ref(buf), rng);
|
||||
return write_binary_atomic(fn, tmpdir, mode, mtime_ns, const_buffer_ref(buf), rng);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -35,12 +35,14 @@
|
||||
#include <sys/types.h> // for lseek, open
|
||||
#include <sys/stat.h> // for open
|
||||
#include <fcntl.h> // for open
|
||||
#include <cstdint>
|
||||
|
||||
#include <openvpn/common/exception.hpp>
|
||||
#include <openvpn/common/size.hpp>
|
||||
#include <openvpn/common/scoped_fd.hpp>
|
||||
#include <openvpn/common/write.hpp>
|
||||
#include <openvpn/common/strerror.hpp>
|
||||
#include <openvpn/common/modstat.hpp>
|
||||
#include <openvpn/buffer/bufread.hpp>
|
||||
|
||||
namespace openvpn {
|
||||
@ -49,6 +51,7 @@ namespace openvpn {
|
||||
// write binary buffer to file
|
||||
inline void write_binary_unix(const std::string& fn,
|
||||
const mode_t mode,
|
||||
const std::uint64_t mtime_ns, // set explicit modification-time in nanoseconds since epoch, or 0 to defer to system
|
||||
const void *buf,
|
||||
const size_t size)
|
||||
{
|
||||
@ -61,11 +64,16 @@ namespace openvpn {
|
||||
}
|
||||
|
||||
// write
|
||||
{
|
||||
const ssize_t len = write_retry(fd(), buf, size);
|
||||
if (len != size)
|
||||
throw file_unix_error(fn + " : incomplete write");
|
||||
}
|
||||
if (size)
|
||||
{
|
||||
const ssize_t len = write_retry(fd(), buf, size);
|
||||
if (len != size)
|
||||
throw file_unix_error(fn + " : incomplete write");
|
||||
}
|
||||
|
||||
// explicit modification time
|
||||
if (mtime_ns)
|
||||
update_file_mod_time_nanoseconds(fd(), mtime_ns);
|
||||
|
||||
// close
|
||||
{
|
||||
@ -77,23 +85,26 @@ namespace openvpn {
|
||||
|
||||
inline void write_binary_unix(const std::string& fn,
|
||||
const mode_t mode,
|
||||
const std::uint64_t mtime_ns,
|
||||
const Buffer& buf)
|
||||
{
|
||||
write_binary_unix(fn, mode, buf.c_data(), buf.size());
|
||||
write_binary_unix(fn, mode, mtime_ns, buf.c_data(), buf.size());
|
||||
}
|
||||
|
||||
inline void write_binary_unix(const std::string& fn,
|
||||
const mode_t mode,
|
||||
const std::uint64_t mtime_ns,
|
||||
const ConstBuffer& buf)
|
||||
{
|
||||
write_binary_unix(fn, mode, buf.c_data(), buf.size());
|
||||
write_binary_unix(fn, mode, mtime_ns, buf.c_data(), buf.size());
|
||||
}
|
||||
|
||||
inline void write_text_unix(const std::string& fn,
|
||||
const mode_t mode,
|
||||
const std::uint64_t mtime_ns,
|
||||
const std::string& content)
|
||||
{
|
||||
write_binary_unix(fn, mode, content.c_str(), content.length());
|
||||
write_binary_unix(fn, mode, mtime_ns, content.c_str(), content.length());
|
||||
}
|
||||
|
||||
enum { // MUST be distinct from BufferAllocated flags
|
||||
|
Loading…
Reference in New Issue
Block a user