mirror of
https://github.com/debauchee/barrier.git
synced 2024-12-18 16:31:44 +03:00
c6ecc79c0d
restart if the X server connection was lost; since synergy is likely to be started by xdm or the user's xsession, it's better for synergy to simply terminate when the connection is lost. synergy will still restart due to other errors. also fixed numerous other minor bugs and cleaned some stuff up (like app error codes are now consistent and enumerated in Version.h, for lack of a better place). and boosted version and protocol numbers.
181 lines
3.0 KiB
C++
181 lines
3.0 KiB
C++
#include "CUnixPlatform.h"
|
|
#include "CLog.h"
|
|
#include <cstring>
|
|
#include <unistd.h>
|
|
#include <pwd.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <syslog.h>
|
|
|
|
|
|
//
|
|
// CUnixPlatform
|
|
//
|
|
|
|
CUnixPlatform::CUnixPlatform()
|
|
{
|
|
// do nothing
|
|
}
|
|
|
|
CUnixPlatform::~CUnixPlatform()
|
|
{
|
|
// do nothing
|
|
}
|
|
|
|
bool
|
|
CUnixPlatform::installDaemon(const char*, const char*, const char*, const char*)
|
|
{
|
|
// daemons don't require special installation
|
|
return true;
|
|
}
|
|
|
|
CUnixPlatform::EResult
|
|
CUnixPlatform::uninstallDaemon(const char*)
|
|
{
|
|
// daemons don't require special installation
|
|
return kSuccess;
|
|
}
|
|
|
|
int
|
|
CUnixPlatform::daemonize(const char* name, DaemonFunc func)
|
|
{
|
|
// fork so shell thinks we're done and so we're not a process
|
|
// group leader
|
|
switch (fork()) {
|
|
case -1:
|
|
// failed
|
|
return -1;
|
|
|
|
case 0:
|
|
// child
|
|
break;
|
|
|
|
default:
|
|
// parent exits
|
|
exit(0);
|
|
}
|
|
|
|
// become leader of a new session
|
|
setsid();
|
|
|
|
// chdir to root so we don't keep mounted filesystems points busy
|
|
chdir("/");
|
|
|
|
// mask off permissions for any but owner
|
|
umask(077);
|
|
|
|
// close open files. we only expect stdin, stdout, stderr to be open.
|
|
close(0);
|
|
close(1);
|
|
close(2);
|
|
|
|
// attach file descriptors 0, 1, 2 to /dev/null so inadvertent use
|
|
// of standard I/O safely goes in the bit bucket.
|
|
open("/dev/null", O_RDONLY);
|
|
open("/dev/null", O_RDWR);
|
|
dup(1);
|
|
|
|
// hook up logger
|
|
installDaemonLogger(name);
|
|
|
|
// invoke function
|
|
return func(this, 1, &name);
|
|
}
|
|
|
|
void
|
|
CUnixPlatform::installDaemonLogger(const char* name)
|
|
{
|
|
openlog(name, 0, LOG_DAEMON);
|
|
CLog::setOutputter(&CUnixPlatform::deamonLogger);
|
|
}
|
|
|
|
const char*
|
|
CUnixPlatform::getBasename(const char* pathname) const
|
|
{
|
|
if (pathname == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
const char* basename = strrchr(pathname, '/');
|
|
if (basename != NULL) {
|
|
return basename + 1;
|
|
}
|
|
else {
|
|
return pathname;
|
|
}
|
|
}
|
|
|
|
CString
|
|
CUnixPlatform::getUserDirectory() const
|
|
{
|
|
#if HAVE_GETPWUID_R
|
|
struct passwd pwent;
|
|
struct passwd* pwentp;
|
|
long size = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
char* buffer = new char[size];
|
|
getpwuid_r(getuid(), &pwent, buffer, size, &pwentp);
|
|
delete[] buffer;
|
|
#else
|
|
struct passwd* pwentp = getpwuid(getuid());
|
|
#endif
|
|
if (pwentp != NULL && pwentp->pw_dir != NULL) {
|
|
return pwentp->pw_dir;
|
|
}
|
|
else {
|
|
return CString();
|
|
}
|
|
}
|
|
|
|
CString
|
|
CUnixPlatform::getSystemDirectory() const
|
|
{
|
|
return "/etc";
|
|
}
|
|
|
|
CString
|
|
CUnixPlatform::addPathComponent(const CString& prefix,
|
|
const CString& suffix) const
|
|
{
|
|
CString path;
|
|
path.reserve(prefix.size() + 1 + suffix.size());
|
|
path += prefix;
|
|
if (path.size() == 0 || path[path.size() - 1] != '/') {
|
|
path += '/';
|
|
}
|
|
path += suffix;
|
|
return path;
|
|
}
|
|
|
|
bool
|
|
CUnixPlatform::deamonLogger(int priority, const char* msg)
|
|
{
|
|
// convert priority
|
|
switch (priority) {
|
|
case CLog::kFATAL:
|
|
case CLog::kERROR:
|
|
priority = LOG_ERR;
|
|
break;
|
|
|
|
case CLog::kWARNING:
|
|
priority = LOG_WARNING;
|
|
break;
|
|
|
|
case CLog::kNOTE:
|
|
priority = LOG_NOTICE;
|
|
break;
|
|
|
|
case CLog::kINFO:
|
|
priority = LOG_INFO;
|
|
break;
|
|
|
|
default:
|
|
priority = LOG_DEBUG;
|
|
break;
|
|
}
|
|
|
|
// log it
|
|
syslog(priority, "%s", msg);
|
|
return true;
|
|
}
|