]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/timesync/timesyncd-server.c
tree-wide: beautify remaining copyright statements
[thirdparty/systemd.git] / src / timesync / timesyncd-server.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
84e51726 2/***
96b2fb93 3 Copyright © 2014 Kay Sievers
84e51726
LP
4***/
5
b5efdb8a 6#include "alloc-util.h"
84e51726 7#include "timesyncd-server.h"
874ff7bf
LP
8
9int server_address_new(
10 ServerName *n,
11 ServerAddress **ret,
12 const union sockaddr_union *sockaddr,
13 socklen_t socklen) {
14
15 ServerAddress *a, *tail;
16
17 assert(n);
18 assert(sockaddr);
19 assert(socklen >= offsetof(struct sockaddr, sa_data));
20 assert(socklen <= sizeof(union sockaddr_union));
21
22 a = new0(ServerAddress, 1);
23 if (!a)
24 return -ENOMEM;
25
26 memcpy(&a->sockaddr, sockaddr, socklen);
27 a->socklen = socklen;
28
29 LIST_FIND_TAIL(addresses, n->addresses, tail);
30 LIST_INSERT_AFTER(addresses, n->addresses, tail, a);
31 a->name = n;
32
33 if (ret)
34 *ret = a;
35
36 return 0;
37}
38
39ServerAddress* server_address_free(ServerAddress *a) {
40 if (!a)
41 return NULL;
42
43 if (a->name) {
44 LIST_REMOVE(addresses, a->name->addresses, a);
45
46 if (a->name->manager && a->name->manager->current_server_address == a)
47 manager_set_server_address(a->name->manager, NULL);
48 }
49
6b430fdb 50 return mfree(a);
874ff7bf
LP
51}
52
53int server_name_new(
54 Manager *m,
55 ServerName **ret,
56 ServerType type,
57 const char *string) {
58
59 ServerName *n, *tail;
60
61 assert(m);
62 assert(string);
63
64 n = new0(ServerName, 1);
65 if (!n)
66 return -ENOMEM;
67
68 n->type = type;
69 n->string = strdup(string);
70 if (!n->string) {
71 free(n);
72 return -ENOMEM;
73 }
74
75 if (type == SERVER_SYSTEM) {
76 LIST_FIND_TAIL(names, m->system_servers, tail);
77 LIST_INSERT_AFTER(names, m->system_servers, tail, n);
78 } else if (type == SERVER_LINK) {
79 LIST_FIND_TAIL(names, m->link_servers, tail);
80 LIST_INSERT_AFTER(names, m->link_servers, tail, n);
81 } else if (type == SERVER_FALLBACK) {
82 LIST_FIND_TAIL(names, m->fallback_servers, tail);
83 LIST_INSERT_AFTER(names, m->fallback_servers, tail, n);
84 } else
85 assert_not_reached("Unknown server type");
86
87 n->manager = m;
88
89 if (type != SERVER_FALLBACK &&
90 m->current_server_name &&
91 m->current_server_name->type == SERVER_FALLBACK)
92 manager_set_server_name(m, NULL);
93
94 log_debug("Added new server %s.", string);
95
96 if (ret)
97 *ret = n;
98
99 return 0;
100}
101
102ServerName *server_name_free(ServerName *n) {
103 if (!n)
104 return NULL;
105
106 server_name_flush_addresses(n);
107
108 if (n->manager) {
109 if (n->type == SERVER_SYSTEM)
110 LIST_REMOVE(names, n->manager->system_servers, n);
111 else if (n->type == SERVER_LINK)
112 LIST_REMOVE(names, n->manager->link_servers, n);
113 else if (n->type == SERVER_FALLBACK)
114 LIST_REMOVE(names, n->manager->fallback_servers, n);
115 else
116 assert_not_reached("Unknown server type");
117
118 if (n->manager->current_server_name == n)
119 manager_set_server_name(n->manager, NULL);
120 }
121
122 log_debug("Removed server %s.", n->string);
123
124 free(n->string);
6b430fdb 125 return mfree(n);
874ff7bf
LP
126}
127
128void server_name_flush_addresses(ServerName *n) {
129 assert(n);
130
131 while (n->addresses)
132 server_address_free(n->addresses);
133}