|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1985 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: static char sccsid[] = "@(#)correct.c 2.5 (Berkeley) 6/18/88"; ! 20: #endif /* not lint */ ! 21: ! 22: #include "globals.h" ! 23: #include <protocols/timed.h> ! 24: ! 25: #ifdef MEASURE ! 26: extern FILE *fp; ! 27: #endif ! 28: ! 29: /* ! 30: * `correct' sends to the slaves the corrections for their clocks ! 31: */ ! 32: ! 33: correct(avdelta) ! 34: long avdelta; ! 35: { ! 36: int i; ! 37: int corr; ! 38: struct timeval adjlocal; ! 39: struct tsp msgs; ! 40: struct timeval mstotvround(); ! 41: struct tsp *answer, *acksend(); ! 42: ! 43: #ifdef MEASURE ! 44: for(i=0; i<slvcount; i++) { ! 45: if (hp[i].delta == HOSTDOWN) ! 46: fprintf(fp, "%s\t", "down"); ! 47: else { ! 48: fprintf(fp, "%d\t", hp[i].delta); ! 49: } ! 50: } ! 51: fprintf(fp, "\n"); ! 52: #endif ! 53: corr = avdelta - hp[0].delta; ! 54: adjlocal = mstotvround(&corr); ! 55: adjclock(&adjlocal); ! 56: #ifdef MEASURE ! 57: fprintf(fp, "%d\t", corr); ! 58: #endif ! 59: ! 60: for(i=1; i<slvcount; i++) { ! 61: if (hp[i].delta != HOSTDOWN) { ! 62: corr = avdelta - hp[i].delta; ! 63: msgs.tsp_time = mstotvround(&corr); ! 64: msgs.tsp_type = (u_char)TSP_ADJTIME; ! 65: (void)strcpy(msgs.tsp_name, hostname); ! 66: answer = acksend(&msgs, &hp[i].addr, hp[i].name, ! 67: TSP_ACK, (struct netinfo *)NULL); ! 68: if (answer == NULL) { ! 69: hp[i].delta = HOSTDOWN; ! 70: #ifdef MEASURE ! 71: fprintf(fp, "%s\t", "down"); ! 72: } else { ! 73: fprintf(fp, "%d\t", corr); ! 74: #endif ! 75: } ! 76: } else { ! 77: #ifdef MEASURE ! 78: fprintf(fp, "%s\t", "down"); ! 79: #endif ! 80: } ! 81: } ! 82: #ifdef MEASURE ! 83: fprintf(fp, "\n"); ! 84: #endif ! 85: } ! 86: ! 87: /* ! 88: * `mstotvround' rounds up the value of the argument to the ! 89: * nearest multiple of five, and converts it into a timeval ! 90: */ ! 91: ! 92: struct timeval mstotvround(x) ! 93: int *x; ! 94: { ! 95: int temp; ! 96: struct timeval adj; ! 97: ! 98: temp = *x % 5; ! 99: if (temp >= 3) ! 100: *x = *x-temp+5; ! 101: else { ! 102: if (temp <= -3) ! 103: *x = *x - temp -5; ! 104: else ! 105: *x = *x-temp; ! 106: } ! 107: adj.tv_sec = *x/1000; ! 108: adj.tv_usec = (*x-adj.tv_sec*1000)*1000; ! 109: if (adj.tv_usec < 0) { ! 110: adj.tv_usec += 1000000; ! 111: adj.tv_sec--; ! 112: } ! 113: return(adj); ! 114: } ! 115: ! 116: adjclock(corr) ! 117: struct timeval *corr; ! 118: { ! 119: struct timeval now; ! 120: ! 121: if (timerisset(corr)) { ! 122: if (corr->tv_sec < MAXADJ && corr->tv_sec > - MAXADJ) { ! 123: (void)adjtime(corr, (struct timeval *)0); ! 124: } else { ! 125: syslog(LOG_WARNING, ! 126: "clock correction too large to adjust (%d sec)", ! 127: corr->tv_sec); ! 128: (void) gettimeofday(&now, (struct timezone *)0); ! 129: timevaladd(&now, corr); ! 130: if (settimeofday(&now, (struct timezone *)0) < 0) ! 131: syslog(LOG_ERR, "can't set time"); ! 132: } ! 133: } ! 134: } ! 135: ! 136: timevaladd(tv1, tv2) ! 137: register struct timeval *tv1, *tv2; ! 138: { ! 139: ! 140: tv1->tv_sec += tv2->tv_sec; ! 141: tv1->tv_usec += tv2->tv_usec; ! 142: if (tv1->tv_usec >= 1000000) { ! 143: tv1->tv_sec++; ! 144: tv1->tv_usec -= 1000000; ! 145: } ! 146: if (tv1->tv_usec < 0) { ! 147: tv1->tv_sec--; ! 148: tv1->tv_usec += 1000000; ! 149: } ! 150: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.