98 lines
2.5 KiB
C++
98 lines
2.5 KiB
C++
#include <config.h>
|
|
|
|
#include <apt-pkg/configuration.h>
|
|
#include <apt-pkg/error.h>
|
|
#include <apt-pkg/fileutl.h>
|
|
|
|
#include <apt-private/private-utils.h>
|
|
|
|
#include <cstdlib>
|
|
#include <sstream>
|
|
#include <unistd.h>
|
|
|
|
// DisplayFileInPager - Display File with pager /*{{{*/
|
|
bool DisplayFileInPager(std::string const &filename)
|
|
{
|
|
pid_t Process = ExecFork();
|
|
if (Process == 0)
|
|
{
|
|
const char *Args[3];
|
|
Args[1] = filename.c_str();
|
|
Args[2] = NULL;
|
|
if (isatty(STDOUT_FILENO) == 1)
|
|
{
|
|
// likely installed, provided by sensible-utils
|
|
std::string const pager = _config->Find("Dir::Bin::Pager",
|
|
"sensible-pager");
|
|
Args[0] = pager.c_str();
|
|
execvp(Args[0],(char **)Args);
|
|
// lets try some obvious alternatives
|
|
Args[0] = getenv("PAGER");
|
|
if (Args[0] != NULL)
|
|
execvp(Args[0],(char **)Args);
|
|
|
|
Args[0] = "pager";
|
|
execvp(Args[0],(char **)Args);
|
|
}
|
|
// we could read the file ourselves, but… meh
|
|
Args[0] = "cat";
|
|
execvp(Args[0],(char **)Args);
|
|
exit(100);
|
|
}
|
|
|
|
// Wait for the subprocess
|
|
return ExecWait(Process, "pager", false);
|
|
}
|
|
/*}}}*/
|
|
// EditFileInSensibleEditor - Edit File with editor /*{{{*/
|
|
bool EditFileInSensibleEditor(std::string const &filename)
|
|
{
|
|
pid_t Process = ExecFork();
|
|
if (Process == 0)
|
|
{
|
|
// likely installed, provided by sensible-utils
|
|
std::string const editor = _config->Find("Dir::Bin::Editor",
|
|
"sensible-editor");
|
|
const char *Args[3];
|
|
Args[0] = editor.c_str();
|
|
Args[1] = filename.c_str();
|
|
Args[2] = NULL;
|
|
execvp(Args[0],(char **)Args);
|
|
// the usual suspects we can try as an alternative
|
|
Args[0] = getenv("VISUAL");
|
|
if (Args[0] != NULL)
|
|
execvp(Args[0],(char **)Args);
|
|
|
|
Args[0] = getenv("EDITOR");
|
|
if (Args[0] != NULL)
|
|
execvp(Args[0],(char **)Args);
|
|
|
|
Args[0] = "editor";
|
|
execvp(Args[0],(char **)Args);
|
|
exit(100);
|
|
}
|
|
|
|
// Wait for the subprocess
|
|
return ExecWait(Process, "editor", false);
|
|
}
|
|
/*}}}*/
|
|
time_t GetSecondsSinceEpoch() /*{{{*/
|
|
{
|
|
auto const source_date_epoch = getenv("SOURCE_DATE_EPOCH");
|
|
if (source_date_epoch == nullptr)
|
|
return time(nullptr);
|
|
|
|
time_t epoch;
|
|
std::stringstream ss(source_date_epoch);
|
|
ss >> epoch;
|
|
|
|
if (ss.fail() || !ss.eof())
|
|
{
|
|
_error->Warning("Environment variable SOURCE_DATE_EPOCH was ignored as it has an invalid value: \"%s\"",
|
|
source_date_epoch);
|
|
return time(nullptr);
|
|
}
|
|
|
|
return epoch;
|
|
}
|
|
/*}}}*/
|