Quellcode durchsuchen

Ignore lookup errors on sync request unless all lookups fail (#2298)

Philip Gladstone vor 6 Jahren
Ursprung
Commit
c7006dfb27
2 geänderte Dateien mit 21 neuen und 10 gelöschten Zeilen
  1. 16 10
      app/modules/sntp.c
  2. 5 0
      docs/en/modules/sntp.md

+ 16 - 10
app/modules/sntp.c

@@ -386,14 +386,13 @@ static void sntp_dns_found(const char *name, ip_addr_t *ipaddr, void *arg)
   if (ipaddr == NULL)
   {
     sntp_dbg("DNS Fail!\n");
-    task_post_low(tasknumber, (uint32_t) name);
   }
   else
   {
     serverp[server_count] = *ipaddr;
     server_count++;
-    task_post_low(tasknumber, SNTP_DOLOOKUPS_ID);
   }
+  task_post_low(tasknumber, SNTP_DOLOOKUPS_ID);
 }
 
 
@@ -621,15 +620,26 @@ static void sntp_dolookups (lua_State *L) {
   // at the end, start the lookups. If we have already looked everything up,
   // then move straight to sending the packets.
   if (state->list_ref == LUA_NOREF) {
-    sntp_dosend(L);
+    sntp_dosend();
     return;
   }
 
   lua_rawgeti(L, LUA_REGISTRYINDEX, state->list_ref);
   while (1) {
+    int l;
+
     if (lua_objlen(L, -1) <= state->lookup_pos) {
       // We reached the end
-      sntp_dosend(L);
+      if (server_count == 0) {
+        // Oh dear -- no valid entries -- generate an error
+        // This means that all the arguments are invalid. Just pick the first
+        lua_rawgeti(L, -1, 1);
+        const char *hostname = luaL_checklstring(L, -1, &l);
+        handle_error(L, NTP_DNS_ERR, hostname);
+        lua_pop(L, 1);
+      } else {
+        sntp_dosend();
+      }
       break;
     }
 
@@ -637,8 +647,6 @@ static void sntp_dolookups (lua_State *L) {
 
     lua_rawgeti(L, -1, state->lookup_pos);
 
-    int l;
-
     const char *hostname = luaL_checklstring(L, -1, &l);
     lua_pop(L, 1);
 
@@ -806,7 +814,7 @@ static int sntp_sync (lua_State *L)
     goto good_ret;
   }
 
-  sntp_dosend (L);
+  sntp_dosend ();
 
 good_ret:
   if (!lua_isnoneornil(L, 4)) {
@@ -837,10 +845,8 @@ static void sntp_task(os_param_t param, uint8_t prio)
     sntp_handle_result(L);
   } else if (param == SNTP_DOLOOKUPS_ID) {
     sntp_dolookups(L);
-  } else if (param >= 0 && param <= NTP_MAX_ERR_ID) {
-    handle_error(L, param, NULL);
   } else {
-    handle_error(L, NTP_DNS_ERR, (const char *) param);
+    handle_error(L, param, NULL);
   }
 }
 

+ 5 - 0
docs/en/modules/sntp.md

@@ -16,6 +16,11 @@ Attempts to obtain time synchronization.
 For best results you may want to to call this periodically in order to compensate for internal clock drift. As stated in the [rtctime](rtctime.md) module documentation it's advisable to sync time after deep sleep and it's necessary to sync after module reset (add it to [`init.lua`](../upload.md#initlua) after WiFi initialization).
 Note that either a single server can be provided as an argument (name or address), or a list (table) of servers can be provided. 
 
+If *all* of the supplied host names/addresses are invalid, then the error callback will be called with argument type 1. Otherwise, if
+there is at least one valid name/address, then then sync will be performed.
+
+If any sync operation fails (maybe the device is disconnected from the internet), then all the names will be looked up again. 
+
 #### Syntax
 `sntp.sync([server_ip], [callback], [errcallback], [autorepeat])`
 `sntp.sync({ server1, server2, .. }, [callback], [errcallback], [autorepeat])`