Example #1
0
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;
}
Example #2
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;
}