#include /* access */ #include /* exit */ #include #include #include #include #include #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; }