/* daemon.c: This is -*- c -*- Implements the functions used in talking to the user-defaults daemon */ #include #include #include #include #include #include #include #include #include #include #include "proplist.h" #include "plconf.h" #include "util.h" #define GIVEUP(x, y) { char buf[255]; \ fprintf(stderr, "libPropList: %s:\n", x); \ sprintf(buf, "libPropList: %s", y); \ perror(buf); \ fprintf(stderr, "libPropList: Giving up.\n"); \ exit(1); } static int sock; static pid_t mypid, childpid; static plcallback_t cb; static char password[255]; BOOL initialized = NO; void sighandler(int sig) { #if 0 signal(sig, sighandler); #else /* in Linux, signals are reset to their default behaviour after raised. * Since it is quite common that libPL raises many HUPs quickly... */ struct sigaction sig_action; sig_action.sa_handler = sighandler; sigemptyset(&sig_action.sa_mask); sigaction(SIGHUP, &sig_action, NULL); #endif if(cb) (*cb)(); } int start_daemon(void) { char *daemonpath; daemonpath = ManglePath(DAEMON); if((childpid = fork()) < 0) return -1; if(childpid==0) { /* execute daemon */ if(execvp(daemonpath, NULL) < 0) { fprintf(stderr, "libPropList: Couldn't start daemon %s:\n", DAEMON); perror("libPropList: start_daemon"); fprintf(stderr, "libPropList: Giving up.\n"); kill(mypid, SIGTERM); exit(1); } } free(daemonpath); return 0; } void initialize(void) { struct stat file_stat; FILE *pidfile; char *pidfilename; char buf[255]; int portno; pid_t pid; int i; mypid = getpid(); pidfilename = ManglePath(PIDFILE); if(stat(pidfilename, &file_stat) < 0) { if(start_daemon() < 0) { fprintf(stderr, "libPropList: Could not start daemon %s:\n", DAEMON); perror("libPropList: start_daemon"); fprintf(stderr, "libPropList: Giving up.\n"); exit(1); } else /* start_daemon succeeded */ if(stat(pidfilename, &file_stat) < 0) { i=0; while(i