]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/timesync/timesyncd-server.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright © 2014 Kay Sievers
6 #include "alloc-util.h"
7 #include "timesyncd-server.h"
9 int server_address_new(
12 const union sockaddr_union
*sockaddr
,
15 ServerAddress
*a
, *tail
;
19 assert(socklen
>= offsetof(struct sockaddr
, sa_data
));
20 assert(socklen
<= sizeof(union sockaddr_union
));
22 a
= new0(ServerAddress
, 1);
26 memcpy(&a
->sockaddr
, sockaddr
, socklen
);
29 LIST_FIND_TAIL(addresses
, n
->addresses
, tail
);
30 LIST_INSERT_AFTER(addresses
, n
->addresses
, tail
, a
);
39 ServerAddress
* server_address_free(ServerAddress
*a
) {
44 LIST_REMOVE(addresses
, a
->name
->addresses
, a
);
46 if (a
->name
->manager
&& a
->name
->manager
->current_server_address
== a
)
47 manager_set_server_address(a
->name
->manager
, NULL
);
64 n
= new0(ServerName
, 1);
69 n
->string
= strdup(string
);
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
);
85 assert_not_reached("Unknown server type");
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
);
94 log_debug("Added new server %s.", string
);
102 ServerName
*server_name_free(ServerName
*n
) {
106 server_name_flush_addresses(n
);
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
);
116 assert_not_reached("Unknown server type");
118 if (n
->manager
->current_server_name
== n
)
119 manager_set_server_name(n
->manager
, NULL
);
122 log_debug("Removed server %s.", n
->string
);
128 void server_name_flush_addresses(ServerName
*n
) {
132 server_address_free(n
->addresses
);