24 #include "../client/pps-client.h"
27 extern struct ppsFiles
f;
32 static struct nistLocalVars {
39 bool allServersQueried;
45 time_t t = time(NULL);
46 struct tm *tmp = localtime(&t);
47 strftime(timestamp,
STRBUF_SZ-1,
"%F %H:%M:%S ", tmp);
48 strcat(logbuf, timestamp);
81 struct timeval startTime, returnTime;
86 sprintf(
num,
"%d",
id);
89 sprintf(cmd,
"udp-time-client -u%d ",
id);
94 gettimeofday(&startTime, NULL);
99 gettimeofday(&returnTime, NULL);
101 if (returnTime.tv_sec - startTime.tv_sec > 0){
112 int fd = open((
const char *)fname, O_RDONLY);
114 strcpy(buf,
"ERROR: could not open \"");
121 fstat(fd, &stat_buf);
122 int sz = stat_buf.st_size;
125 rv = read(fd, strbuf, sz);
127 strcpy(buf,
"ERROR: reading \"");
129 strcat(buf,
"\" was interrupted.\n");
143 char *pNum = strpbrk(strbuf,
"-0123456789");
146 sscanf(strbuf,
"%ld\n", &delta);
200 int nServersReporting = 0;
205 for (
int j = 0; j < n.numServers; j++){
206 if (n.serverTimeDiff[j] != 1000000){
208 for (k = 0; k < n.numServers; k++){
209 if (n.serverTimeDiff[j] == timeDiff[k]){
214 if (k == n.numServers){
215 for (
int m = 0; m < n.numServers; m++){
217 timeDiff[m] = n.serverTimeDiff[j];
223 nServersReporting += 1;
228 int maxHitsIndex = 0;
230 for (
int j = 0; j < n.numServers; j++){
231 if (count[j] > maxHits){
240 if (maxHits >= 3 && n.gotError ==
false){
242 sprintf(
g.msgbuf,
"getTimeConsensusAndCount(): Time is behind by %d seconds.\n", timeDiff[maxHitsIndex]);
247 else if (n.gotError ==
true){
249 sprintf(
g.msgbuf,
"getTimeConsensusAndCount(): Waiting for controller to become active to correct the time error.\n");
253 sprintf(
g.msgbuf,
"getTimeConsensusAndCount(): Number of servers responding: %d\n", nServersReporting);
260 sprintf(
g.msgbuf,
"getTimeConsensusAndCount(): Number of servers responding: %d\n", nServersReporting);
265 n.serverTimeDiff[i] = 1000000;
267 return nServersReporting;
281 for (
int i = 0; i < numServers; i++){
284 if (strlen(logbuf) > 0){
303 if (n.allServersQueried){
304 if (
g.queryWait ==
false){
305 n.allServersQueried =
false;
310 if (
g.queryWait ==
true){
315 if (n.hasStarted ==
false &&
322 n.serverTimeDiff[i] = 1000000;
323 n.threadIsBusy[i] =
false;
326 n.timeCheckEnable = n.numServers;
331 if (n.timeCheckEnable > 0){
335 n.timeCheckEnable -= 1;
340 n.allServersQueried =
true;
341 n.hasStarted =
false;
345 if (n.threadIsBusy[idx]){
346 sprintf(
g.msgbuf,
"Server %d is busy.\n", idx);
350 sprintf(
g.msgbuf,
"Requesting time from Server %d\n", idx);
353 rv = pthread_create(&((tcp->
tid)[idx]), &(tcp->
attr), (
void* (*)(
void*))&
doTimeCheck, tcp);
355 sprintf(
g.logbuf,
"Can't create thread : %s\n", strerror(errno));
372 memset(&n, 0,
sizeof(
struct nistLocalVars));
383 int rv = pthread_attr_init(&(tcp->
attr));
385 sprintf(
g.logbuf,
"Can't init pthread_attr_t object: %s\n", strerror(errno));
386 writeToLog(
g.logbuf,
"allocInitializeNISTThreads()");
392 sprintf(
g.logbuf,
"Can't set pthread_attr_setstacksize(): %s\n", strerror(errno));
393 writeToLog(
g.logbuf,
"allocInitializeNISTThreads()");
397 rv = pthread_attr_setdetachstate(&(tcp->
attr), PTHREAD_CREATE_DETACHED);
399 sprintf(
g.logbuf,
"Can't set pthread_attr_t object state: %s\n", strerror(errno));
400 writeToLog(
g.logbuf,
"allocInitializeNISTThreads()");
413 pthread_attr_destroy(&(tcp->
attr));
416 if (tcp->
buf != NULL){