Skip to content

time_t NTPClient::get_timestamp() incorrect error logic #13

Open
@gmgallo

Description

@gmgallo

The problem:
time_t is defined as:

typedef unsigned int time_t; /* date/time in unix secs past 1-Jan-70 */

therefore, get_timestamp() can't return a negative value on error.
Instead, it should return 0 on error or be changed as follows to be consistent with error report in other Mbed OS modules:


int NTPClient::get_timestamp(time_t *time, int timeout) 
{
    const time_t TIME1970 = (time_t)2208988800UL;
    int ntp_send_values[12] = {0};
    int ntp_recv_values[12] = {0};

    SocketAddress nist;

    if (iface) 
    {
        int ret_gethostbyname = iface->gethostbyname(nist_server_address, &nist);

        if (ret_gethostbyname < 0) {
            // Network error on DNS lookup
            return ret_gethostbyname;
        }

        nist.set_port(nist_server_port);

        memset(ntp_send_values, 0x00, sizeof(ntp_send_values));
        ntp_send_values[0] = '\x1b';

        memset(ntp_recv_values, 0x00, sizeof(ntp_recv_values));

        UDPSocket sock;
        sock.open(iface);
        sock.set_timeout(timeout);

        sock.sendto(nist, (void*)ntp_send_values, sizeof(ntp_send_values));

        SocketAddress source;
        const int n = sock.recvfrom(&source, (void*)ntp_recv_values, sizeof(ntp_recv_values));

        if (n > 10) /* success */
        {
            *time = ntohl(ntp_recv_values[10]) - TIME1970;

            return NSAPI_ERROR_OK; /* return 0 if no error */

        } else {
            if (n < 0) 
            {
                // Network error
                return n;

            } else {
                // No or partial data returned
                return -1;
            }
        }

    } else {
        // No network interface
        return -2;
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions