-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtsupd.c
More file actions
137 lines (110 loc) · 2.74 KB
/
tsupd.c
File metadata and controls
137 lines (110 loc) · 2.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <stdio.h>
#include <sys/file.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include "config.h"
#include "src/tsup_state.h"
#include "src/events.h"
#include "src/log.h"
#include "src/socket_handler.h"
#include "src/util.h"
enum LogLevel LOGGER_LEVEL = DEF_LOG_LEVEL;
static const char LOCK_EXT[] = ".lock";
void usage()
{
puts("\
Usage: tsupd [OPTION...]\n\
Start tsup server daemon.\n\
\n\
Options:\n\
-h, --help Show this help message\n\
-q Decrease verbosity\n\
-v Increase verbosity\n\
-V, --version Print version information and exit\n\
\n"
);
}
void version()
{
printf("tsupd version %s\n", VERSION);
}
/* Returns flock'ed fd on success, -1 on failure */
int acquire_socket_guard(const char *socket_path)
{
int result = -1;
char *path = malloc(strlen(socket_path) + strlen(LOCK_EXT) + 1);
if (path == NULL) {
log_errno(LOG_ERROR, "Failed to allocate memory: ");
goto exit;
}
strcat(strcpy(path, socket_path), LOCK_EXT);
result = open(path, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (result == -1) {
log_errno(LOG_ERROR, "Failed to open lock file '%s': ", path);
goto exit;
}
if (flock(result, LOCK_EX | LOCK_NB) == -1)
{
log_errno(LOG_ERROR, "Failed to acquire lock on '%s': ", path);
close(result);
result = -1;
}
exit:
free(path);
return result;
}
void release_lock(int fd)
{
if (fd == -1) {
return;
}
flock(fd, LOCK_UN);
close(fd);
}
void start_server()
{
log_msg(LOG_INFO, "Starting server...");
int lock_fd = -1;
int server_fd = -1;
struct TSupState *state = NULL;
char *socket_path = get_socket_path();
if (socket_path == NULL) {
goto exit_nolock;
}
lock_fd = acquire_socket_guard(socket_path);
if (lock_fd == -1) {
log_msg(LOG_INFO, "Check if another instance of tsupd is running");
goto exit_nolock;
}
server_fd = open_server_socket(socket_path);
if (server_fd == -1) {
goto exit;
}
state = new_tsup_state(server_fd);
if (state == NULL) {
close(server_fd);
goto exit;
}
server_event_loop(state);
exit:
free_tsup_state(state, KILL_TIMEOUT);
unlink(socket_path);
exit_nolock:
free(socket_path);
release_lock(lock_fd);
}
int main(int argc, char* argv[])
{
int arg_idx;
for (arg_idx = 1; arg_idx < argc; arg_idx++)
{
if (! parse_global_argument(argv[arg_idx], usage, version)) {
usage();
log_msg(LOG_ERROR, "Unknown argument: '%s'", argv[arg_idx]);
exit(EXIT_FAILURE);
}
}
start_server();
}