Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.02 KB | None | 0 0
  1.  
  2. #include <stdlib.h>
  3. #include <signal.h>
  4. #include <stdio.h>
  5.  
  6. #define DAEMON_NAME "polld"
  7. #define RUN_AS_USER "rps"
  8. #define LOCK_FILE "/var/lock/polld"
  9. #define WORKING_DIR "/tmp"
  10. #define LOG_FILE "/var/log/polld"
  11.  
  12. #define INTERVAL 1
  13.  
  14. #define TRUE 1
  15. #define FALSE 0
  16.  
  17.  
  18.  
  19.  
  20. int running;
  21.  
  22. void daemonize();
  23. void catch_SIGUSR1();
  24. void catch_SIGTERM();
  25. void catch_SIGALRM();
  26. void execute();
  27.  
  28.  
  29.  
  30.  
  31. int
  32. main(int argc, char* argv[])
  33. {
  34.         daemonize();
  35.  
  36.         running = TRUE;
  37.  
  38.         signal(SIGTERM, catch_SIGTERM);
  39.         signal(SIGALRM, catch_SIGALRM);
  40.  
  41.         while (running)
  42.         {
  43.                 alarm(INTERVAL);
  44.                 pause();
  45.         }
  46.  
  47.         signal(SIGTERM, SIG_DFL);
  48.         signal(SIGALRM, SIG_DFL);
  49.  
  50.         exit(EXIT_SUCCESS);
  51. }
  52.  
  53.  
  54.  
  55.  
  56. void
  57. daemonize()
  58. {
  59.         pid_t pid;
  60.         pid_t sid;
  61.         pid_t parrent;
  62.  
  63.         FILE* fp;
  64.  
  65.         if (getppid() == 1)
  66.                 return;
  67.         if (fp = fopen(LOCK_FILE, "r"))
  68.         {
  69.                 fclose(fp);
  70.                 fprintf(stderr, "Daemon is already running.\n\n");
  71.                 exit(EXIT_FAILURE);
  72.         }
  73.         else
  74.         {
  75.                 fp = fopen(LOCK_FILE, "w");
  76.         }
  77.  
  78.         signal(SIGUSR1, catch_SIGUSR1);
  79.  
  80.         pid = fork();
  81.         if (pid < 0)
  82.         {
  83.                 fprintf(stderr, "Starting daemon failed (unable to fork child process).\n\n");
  84.                 exit(EXIT_FAILURE);
  85.         }
  86.         else if (pid > 0)
  87.         {
  88.                 alarm(10);
  89.                 pause();
  90.  
  91.                 fprintf(stderr, "Starting daemon failed (child process did not kill parrent).\n\n");
  92.                 exit(EXIT_SUCCESS);
  93.         }
  94.  
  95.         fprintf(fp, "%d\n", getpid());
  96.         fclose(fp);
  97.  
  98.         parrent = getppid();
  99.  
  100.         signal(SIGCHLD, SIG_DFL);
  101.         signal(SIGTSTP, SIG_IGN);
  102.         signal(SIGTTOU, SIG_IGN);
  103.         signal(SIGTTIN, SIG_IGN);
  104.         signal(SIGHUP, SIG_IGN);
  105.         signal(SIGTERM, SIG_DFL);
  106.  
  107.         umask(0);
  108.  
  109.         sid = setsid();
  110.         if (sid < 0)
  111.         {
  112.                 fprintf(stderr, "Starting daemon failed (unable to establish new session).\n\n");
  113.                 exit(EXIT_FAILURE);
  114.         }
  115.  
  116.         if ((chdir(WORKING_DIR)) < 0)
  117.         {
  118.                 fprintf(stderr, "Error: Unable to change to working directory.\n\n");
  119.                 exit(EXIT_FAILURE);
  120.         }
  121.  
  122.         freopen("/dev/null", "r", stdin);
  123.  
  124.         freopen(LOG_FILE, "a+", stdout);
  125.         freopen(LOG_FILE, "a+", stderr);
  126.  
  127.         kill(parrent, SIGUSR1);
  128. }
  129.  
  130.  
  131.  
  132.  
  133. void
  134. catch_SIGUSR1()
  135. {
  136.         exit(EXIT_SUCCESS);
  137. }
  138.  
  139.  
  140.  
  141.  
  142. void
  143. catch_SIGTERM()
  144. {
  145.         running = FALSE;
  146.         unlink(LOCK_FILE);
  147. }
  148.  
  149.  
  150.  
  151.  
  152. void
  153. catch_SIGALRM()
  154. {
  155.         pid_t pid;
  156.  
  157.         pid = fork();
  158.         if (pid == 0)
  159.         {
  160.                 execute();
  161.                 exit(EXIT_SUCCESS);
  162.         }
  163.         else {
  164.                 wait();
  165.         }
  166.  
  167. }
  168.  
  169.  
  170.  
  171.  
  172. void
  173. execute()
  174. {
  175.         printf("Testing.\n");
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement