Implemented daemon
This commit is contained in:
parent
6bdf096f08
commit
6b5f7a50d9
70
tncattach.c
70
tncattach.c
|
@ -3,6 +3,8 @@
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
#include <argp.h>
|
#include <argp.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include "Constants.h"
|
#include "Constants.h"
|
||||||
#include "Serial.h"
|
#include "Serial.h"
|
||||||
#include "KISS.h"
|
#include "KISS.h"
|
||||||
|
@ -42,9 +44,15 @@ void cleanup(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void signal_handler(int signal) {
|
void signal_handler(int signal) {
|
||||||
|
if (daemonize) {
|
||||||
|
cleanup();
|
||||||
|
syslog(LOG_NOTICE, "tncattach daemon exiting");
|
||||||
|
exit(0);
|
||||||
|
} else {
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool is_ipv6(uint8_t* frame) {
|
bool is_ipv6(uint8_t* frame) {
|
||||||
if (device_type == IF_TAP) {
|
if (device_type == IF_TAP) {
|
||||||
|
@ -73,8 +81,13 @@ void read_loop(void) {
|
||||||
min_frame_size = ETHERNET_MIN_FRAME_SIZE;
|
min_frame_size = ETHERNET_MIN_FRAME_SIZE;
|
||||||
} else if (device_type == IF_TUN) {
|
} else if (device_type == IF_TUN) {
|
||||||
min_frame_size = TUN_MIN_FRAME_SIZE;
|
min_frame_size = TUN_MIN_FRAME_SIZE;
|
||||||
|
} else {
|
||||||
|
if (daemonize) {
|
||||||
|
syslog(LOG_ERR, "Unsupported interface type");
|
||||||
} else {
|
} else {
|
||||||
printf("Error: Unsupported interface type\r\n");
|
printf("Error: Unsupported interface type\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -88,12 +101,20 @@ void read_loop(void) {
|
||||||
// Check for hangup event
|
// Check for hangup event
|
||||||
if (fds[fdi].revents & POLLHUP) {
|
if (fds[fdi].revents & POLLHUP) {
|
||||||
if (fdi == IF_FD_INDEX) {
|
if (fdi == IF_FD_INDEX) {
|
||||||
|
if (daemonize) {
|
||||||
|
syslog(LOG_ERR, "Received hangup from interface");
|
||||||
|
} else {
|
||||||
printf("Received hangup from interface\r\n");
|
printf("Received hangup from interface\r\n");
|
||||||
|
}
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (fdi == TNC_FD_INDEX) {
|
if (fdi == TNC_FD_INDEX) {
|
||||||
|
if (daemonize) {
|
||||||
|
syslog(LOG_ERR, "Received hangup from TNC");
|
||||||
|
} else {
|
||||||
printf("Received hangup from TNC\r\n");
|
printf("Received hangup from TNC\r\n");
|
||||||
|
}
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -102,12 +123,20 @@ void read_loop(void) {
|
||||||
// Check for error event
|
// Check for error event
|
||||||
if (fds[fdi].revents & POLLERR) {
|
if (fds[fdi].revents & POLLERR) {
|
||||||
if (fdi == IF_FD_INDEX) {
|
if (fdi == IF_FD_INDEX) {
|
||||||
|
if (daemonize) {
|
||||||
|
syslog(LOG_ERR, "Received error event from interface");
|
||||||
|
} else {
|
||||||
perror("Received error event from interface\r\n");
|
perror("Received error event from interface\r\n");
|
||||||
|
}
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (fdi == TNC_FD_INDEX) {
|
if (fdi == TNC_FD_INDEX) {
|
||||||
|
if (daemonize) {
|
||||||
|
syslog(LOG_ERR, "Received error event from TNC");
|
||||||
|
} else {
|
||||||
perror("Received error event from TNC\r\n");
|
perror("Received error event from TNC\r\n");
|
||||||
|
}
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -123,8 +152,12 @@ void read_loop(void) {
|
||||||
kiss_write_frame(attached_tnc, if_buffer, if_len);
|
kiss_write_frame(attached_tnc, if_buffer, if_len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (daemonize) {
|
||||||
|
syslog(LOG_ERR, "Could not read from network interface, exiting now");
|
||||||
} else {
|
} else {
|
||||||
printf("Error: Could not read from network interface, exiting now\r\n");
|
printf("Error: Could not read from network interface, exiting now\r\n");
|
||||||
|
}
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -137,8 +170,13 @@ void read_loop(void) {
|
||||||
for (int i = 0; i < tnc_len; i++) {
|
for (int i = 0; i < tnc_len; i++) {
|
||||||
kiss_serial_read(serial_buffer[i]);
|
kiss_serial_read(serial_buffer[i]);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (daemonize) {
|
||||||
|
syslog(LOG_ERR, "Could not read from TNC, exiting now");
|
||||||
} else {
|
} else {
|
||||||
printf("Error: Could not read from TNC, exiting now\r\n");
|
printf("Error: Could not read from TNC, exiting now\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -363,6 +401,34 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void become_daemon() {
|
||||||
|
pid_t pid;
|
||||||
|
pid = fork();
|
||||||
|
|
||||||
|
if (pid < 0) {
|
||||||
|
perror("Fork failed");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pid > 0) {
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setsid() < 0) exit(1);
|
||||||
|
|
||||||
|
signal(SIGCHLD, signal_handler);
|
||||||
|
signal(SIGHUP, signal_handler);
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
if (pid < 0) exit(1);
|
||||||
|
if (pid > 0) exit(0);
|
||||||
|
|
||||||
|
umask(0);
|
||||||
|
chdir("/");
|
||||||
|
|
||||||
|
openlog("tncattach", LOG_PID, LOG_DAEMON);
|
||||||
|
}
|
||||||
|
|
||||||
static struct argp argp = {options, parse_opt, args_doc, doc};
|
static struct argp argp = {options, parse_opt, args_doc, doc};
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
struct arguments arguments;
|
struct arguments arguments;
|
||||||
|
@ -398,6 +464,10 @@ int main(int argc, char **argv) {
|
||||||
fds[IF_FD_INDEX].events = POLLIN;
|
fds[IF_FD_INDEX].events = POLLIN;
|
||||||
fds[TNC_FD_INDEX].fd = attached_tnc;
|
fds[TNC_FD_INDEX].fd = attached_tnc;
|
||||||
fds[TNC_FD_INDEX].events = POLLIN;
|
fds[TNC_FD_INDEX].events = POLLIN;
|
||||||
|
if (daemonize) {
|
||||||
|
become_daemon();
|
||||||
|
syslog(LOG_NOTICE, "tncattach daemon running");
|
||||||
|
}
|
||||||
read_loop();
|
read_loop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue