long u_ntp_ack(int sockfd, struct timeval *tv) { int len; uint32_t packet[12]; len = recv(sockfd, packet, sizeof(packet), 0); close(sockfd); if (len == sizeof(packet)) { rfc1305(packet, tv); return 1; } return 0; }
int main(int argc, char *argv[]) { int usd; struct sockaddr_in sa; struct hostent *he; struct timeval tv; fd_set fds; int i; char *srv; char buf[256]; // printf("mini ntpclient\n"); if (argc <= 1) { printf("Usage: %s <server> [server [...]]\n", argv[0]); return 1; } for (i = 1; i < argc; ++i) { // ntp.c passes servers as one block of string, so we need to break it down strcpy(buf, argv[i]); srv = strtok(buf, " "); while (srv) { if ((usd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { printf("socket error"); return 1; } if ((he = gethostbyname(srv)) != NULL) { memset(&sa, 0, sizeof(sa)); memcpy(&sa.sin_addr, he->h_addr_list[0], sizeof(sa.sin_addr)); sa.sin_port = htons(NTP_PORT); sa.sin_family = AF_INET; //printf("trying %s [%s]\n", argv[i], inet_ntoa(sa.sin_addr)); if (connect(usd, (struct sockaddr*)&sa, sizeof(sa)) != -1) { send_packet(usd); tv.tv_sec = 3; tv.tv_usec = 0; FD_ZERO(&fds); FD_SET(usd, &fds); if (select(usd + 1, &fds, NULL, NULL, &tv) == 1) { int len; uint32_t packet[12]; len = recv(usd, packet, sizeof(packet), 0); if (len == sizeof(packet)) { rfc1305(packet); close(usd); printf("Time updated.\n"); return 0; } } } else { perror("connect"); } } else { perror("gethostbyname"); } close(usd); srv = strtok(NULL, " "); } } return 1; }