uts-server/src/lib/utils.c

79 lines
1.6 KiB
C
Raw Normal View History

2015-12-17 14:09:44 +01:00
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <syslog.h>
#include <stdarg.h>
2016-08-24 23:03:49 +02:00
#include "context.h"
2015-12-17 14:09:44 +01:00
2016-08-23 19:38:07 +02:00
void skeleton_daemon() {
2015-12-17 14:09:44 +01:00
pid_t pid;
/* Fork off the parent process */
pid = fork();
/* An error occurred */
if (pid < 0)
exit(EXIT_FAILURE);
/* Success: Let the parent terminate */
if (pid > 0)
exit(EXIT_SUCCESS);
/* On success: The child process becomes session leader */
if (setsid() < 0)
exit(EXIT_FAILURE);
/* Catch, ignore and handle signals */
2016-08-23 19:38:07 +02:00
// TODO: Implement a working signal handler */
2015-12-17 14:09:44 +01:00
signal(SIGCHLD, SIG_IGN);
signal(SIGHUP, SIG_IGN);
/* Fork off for the second time*/
pid = fork();
/* An error occurred */
if (pid < 0)
exit(EXIT_FAILURE);
/* Success: Let the parent terminate */
if (pid > 0)
exit(EXIT_SUCCESS);
/* Set new file permissions */
umask(0);
/* Change the working directory to the root directory */
/* or another appropriated directory */
chdir("/");
/* Close all open file descriptors */
int x;
2016-08-23 19:38:07 +02:00
for (x = sysconf(_SC_OPEN_MAX); x > 0; x--) {
close(x);
2015-12-17 14:09:44 +01:00
}
/* Open the log file */
2016-08-23 19:38:07 +02:00
openlog("firstdaemon", LOG_PID, LOG_DAEMON);
2015-12-17 14:09:44 +01:00
}
2016-08-24 23:03:49 +02:00
void logger(rfc3161_context *ct, int priority, char *fmt, ...) {
FILE *stream;
char *out;
size_t len;
stream = open_memstream(&out, &len);
va_list args;
va_start(args, fmt);
vfprintf(stream, fmt, args);
va_end(args);
fflush(stream);
fclose(stream);
printf(out);
syslog(priority, out);
free(out);
}