barrier/platform/CUnixPlatform.cpp
crs c6ecc79c0d removed restart function from platform. no longer trying to
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.
2002-07-24 13:01:18 +00:00

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;
}