Initial commit.

This commit is contained in:
ikolokolnikov committed 2026-09-15 20:37:35 -07:00
commit 7e22bd716f
2 files changed
+211

No files matched your search

+119
View File
@@ -0,0 +1,119 @@
#include <unistd.h> /* access */
#include <stdlib.h> /* exit */
#include <syslog.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <X11/extensions/scrnsaver.h>
#define TEMP_FILE "/tmp/caffeine"
char file_exists(const char *filename)
{
return access(filename, F_OK) != -1;
}
void daemonize()
{
close(0);
close(1);
close(2);
open("/dev/null", O_RDONLY); /* stdin */
open("/dev/null", O_WRONLY); /* stdout */
open("/dev/null", O_WRONLY); /* stderr */
chdir("/");
int pid = fork();
if(pid > 0)
exit(0);
setsid();
pid = fork();
if(pid > 0)
exit(0);
}
#if 1
static volatile sig_atomic_t n = 0;
void usr1hdl(int sig)
{
int save_errno = errno;
signal(SIGUSR1, usr1hdl);
n = 1;
errno = save_errno;
}
void termhdl(int sig)
{
int save_errno = errno;
signal(SIGTERM, termhdl);
n = 2;
errno = save_errno;
}
#endif
int main(int argc, char *argv[])
{
Display *dpy;
int event_base, error_base, major, minor;
int is_on;
/*daemonize();*/
signal(SIGUSR1, usr1hdl);
signal(SIGTERM, termhdl);
openlog("caffeine", 0, LOG_USER);
syslog(LOG_INFO, "Daemon started, pid == %d", getpid());
dpy = XOpenDisplay(0);
if(!dpy) {
syslog(LOG_ERR, "Failed to open display.");
return 1;
}
if(!XScreenSaverQueryExtension(dpy, &event_base, &error_base)) {
syslog(LOG_ERR, "XScreenSaver extension does not exist.");
return 2;
}
XScreenSaverQueryVersion(dpy, &major, &minor);
if(!(major > 1 || (major == 1 && minor >= 1))) {
syslog(LOG_ERR, "XScreenSaver extension is too old, need >=1.1.");
return 3;
}
is_on = 0;
for(;;) {
pause();
if(n == 0) {
/* do nothing */
} else if(n == 1) {
is_on = !is_on;
if(is_on) {
syslog(LOG_INFO, "Enabling...");
creat(TEMP_FILE, 0644);
XScreenSaverSuspend(dpy, True);
} else {
syslog(LOG_INFO, "Disabling...");
unlink(TEMP_FILE);
XScreenSaverSuspend(dpy, False);
}
XSync(dpy, False);
} else if(n == 2) {
syslog(LOG_INFO, "Shutting down...");
unlink(TEMP_FILE);
XScreenSaverSuspend(dpy, False);
XSync(dpy, False);
break;
} else {
/* unknown state */
}
n = 0;
}
closelog();
return 0;
}