barrier/lib/platform/CUnixPlatform.cpp
crs fee4095624 Reorganized source tree. Moved client.cpp into cmd/synergy as
synergy.cpp and server.cpp into cmd/synergyd as synergyd.cpp.
Moved and renamed related files.  Moved remaining source files
into lib/....  Modified and added makefiles as appropriate.
Result is that library files are under lib with each library
in its own directory and program files are under cmd with each
command in its own directory.
2002-07-30 16:52:46 +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;
}