diff --git a/candm.h b/candm.h
index d62875c..6846fd1 100644
--- a/candm.h
+++ b/candm.h
@@ -263,7 +263,7 @@ typedef struct {
typedef struct {
uint32_t type;
- IPAddr ip_addr;
+ int8_t name[256];
uint32_t port;
int32_t minpoll;
int32_t maxpoll;
@@ -503,6 +503,7 @@ typedef struct {
#define STT_INVALIDAF 17
#define STT_BADPKTVERSION 18
#define STT_BADPKTLENGTH 19
+#define STT_INVALIDNAME 21
typedef struct {
int32_t EOR;
diff --git a/client.c b/client.c
index bd716a9..eb1acc0 100644
--- a/client.c
+++ b/client.c
@@ -1080,7 +1080,10 @@ process_cmd_add_source(CMD_Request *msg, char *line)
LOG(LOGS_ERR, "Invalid syntax for add command");
break;
default:
- if (DNS_Name2IPAddress(data.name, &ip_addr, 1) != DNS_Success) {
+ /* Verify that the address is resolvable (chronyc and chronyd are
+ assumed to be running on the same host) */
+ if (strlen(data.name) >= sizeof (msg->data.ntp_source.name) ||
+ DNS_Name2IPAddress(data.name, &ip_addr, 1) != DNS_Success) {
LOG(LOGS_ERR, "Invalid host/IP address");
break;
}
@@ -1092,8 +1095,11 @@ process_cmd_add_source(CMD_Request *msg, char *line)
}
msg->data.ntp_source.type = htonl(type);
+ if (strlen(data.name) >= sizeof (msg->data.ntp_source.name))
+ assert(0);
+ strncpy((char *)msg->data.ntp_source.name, data.name,
+ sizeof (msg->data.ntp_source.name));
msg->data.ntp_source.port = htonl((unsigned long) data.port);
- UTI_IPHostToNetwork(&ip_addr, &msg->data.ntp_source.ip_addr);
msg->data.ntp_source.minpoll = htonl(data.params.minpoll);
msg->data.ntp_source.maxpoll = htonl(data.params.maxpoll);
msg->data.ntp_source.presend_minpoll = htonl(data.params.presend_minpoll);
@@ -1186,8 +1192,8 @@ give_help(void)
"NTP sources:\0\0"
"activity\0Check how many NTP sources are online/offline\0"
"ntpdata [
]\0Display information about last valid measurement\0"
- "add server [options]\0Add new NTP server\0"
- "add peer [options]\0Add new NTP peer\0"
+ "add server [options]\0Add new NTP server\0"
+ "add peer [options]\0Add new NTP peer\0"
"delete \0Remove server or peer\0"
"burst / [/]\0Start rapid set of measurements\0"
"maxdelay \0Modify maximum valid sample delay\0"
@@ -1579,6 +1585,9 @@ request_reply(CMD_Request *request, CMD_Reply *reply, int requested_reply, int v
case STT_INACTIVE:
printf("519 Client logging is not active in the daemon");
break;
+ case STT_INVALIDNAME:
+ printf("521 Invalid name");
+ break;
default:
printf("520 Got unexpected error from daemon");
}
diff --git a/cmdmon.c b/cmdmon.c
index 453d1e1..4fa9b0c 100644
--- a/cmdmon.c
+++ b/cmdmon.c
@@ -678,10 +678,11 @@ handle_cmdaccheck(CMD_Request *rx_message, CMD_Reply *tx_message)
static void
handle_add_source(CMD_Request *rx_message, CMD_Reply *tx_message)
{
- NTP_Remote_Address rem_addr;
NTP_Source_Type type;
SourceParameters params;
NSR_Status status;
+ char *name;
+ int port;
switch (ntohl(rx_message->data.ntp_source.type)) {
case REQ_ADDSRC_SERVER:
@@ -695,8 +696,15 @@ handle_add_source(CMD_Request *rx_message, CMD_Reply *tx_message)
return;
}
- UTI_IPNetworkToHost(&rx_message->data.ntp_source.ip_addr, &rem_addr.ip_addr);
- rem_addr.port = (unsigned short)(ntohl(rx_message->data.ntp_source.port));
+ name = (char *)rx_message->data.ntp_source.name;
+
+ /* Make sure the name is terminated */
+ if (name[sizeof (rx_message->data.ntp_source.name) - 1] != '\0') {
+ tx_message->status = htons(STT_INVALIDNAME);
+ return;
+ }
+
+ port = (unsigned short)(ntohl(rx_message->data.ntp_source.port));
params.minpoll = ntohl(rx_message->data.ntp_source.minpoll);
params.maxpoll = ntohl(rx_message->data.ntp_source.maxpoll);
params.presend_minpoll = ntohl(rx_message->data.ntp_source.presend_minpoll);
@@ -729,22 +737,25 @@ handle_add_source(CMD_Request *rx_message, CMD_Reply *tx_message)
(ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_TRUST ? SRC_SELECT_TRUST : 0) |
(ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_REQUIRE ? SRC_SELECT_REQUIRE : 0);
- status = NSR_AddSource(&rem_addr, type, ¶ms);
+ status = NSR_AddSourceByName(name, port, 0, type, ¶ms);
switch (status) {
case NSR_Success:
break;
+ case NSR_UnresolvedName:
+ /* Try to resolve the name now */
+ NSR_ResolveSources();
+ break;
case NSR_AlreadyInUse:
tx_message->status = htons(STT_SOURCEALREADYKNOWN);
break;
case NSR_TooManySources:
tx_message->status = htons(STT_TOOMANYSOURCES);
break;
- case NSR_InvalidAF:
- tx_message->status = htons(STT_INVALIDAF);
- break;
- case NSR_NoSuchSource:
case NSR_InvalidName:
- case NSR_UnresolvedName:
+ tx_message->status = htons(STT_INVALIDNAME);
+ break;
+ case NSR_InvalidAF:
+ case NSR_NoSuchSource:
assert(0);
break;
}
diff --git a/doc/chronyc.adoc b/doc/chronyc.adoc
index 2914786..4dd2d6d 100644
--- a/doc/chronyc.adoc
+++ b/doc/chronyc.adoc
@@ -526,7 +526,7 @@ The number of all packets received from the source.
*Total valid RX*:::
The number of valid packets received from the source.
-[[add_peer]]*add peer* _address_ [_option_]...::
+[[add_peer]]*add peer* _name_ [_option_]...::
The *add peer* command allows a new NTP peer to be added whilst
*chronyd* is running.
+
@@ -540,7 +540,7 @@ An example of using this command is shown below.
add peer foo.example.net minpoll 6 maxpoll 10 key 25
----
-[[add_server]]*add server* _address_ [_option_]...::
+[[add_server]]*add server* _name_ [_option_]...::
The *add server* command allows a new NTP server to be added whilst
*chronyd* is running.
+