Annotation of embedaddon/ntp/sntp/utilities.c, revision 1.1
1.1 ! misho 1: #include <config.h>
! 2: #include "utilities.h"
! 3: #include <assert.h>
! 4:
! 5: /* Display a NTP packet in hex with leading address offset
! 6: * e.g. offset: value, 0: ff 1: fe ... 255: 00
! 7: */
! 8: void
! 9: pkt_output (
! 10: struct pkt *dpkg,
! 11: int pkt_length,
! 12: FILE *output
! 13: )
! 14: {
! 15: register int a;
! 16: u_char *pkt;
! 17:
! 18: pkt = (u_char *)dpkg;
! 19:
! 20: fprintf(output, HLINE);
! 21:
! 22: for (a = 0; a < pkt_length; a++) {
! 23: if (a > 0 && a % 8 == 0)
! 24: fprintf(output, "\n");
! 25:
! 26: fprintf(output, "%d: %x \t", a, pkt[a]);
! 27: }
! 28:
! 29: fprintf(output, "\n");
! 30: fprintf(output, HLINE);
! 31: }
! 32:
! 33: /* Output a long floating point value in hex in the style described above
! 34: */
! 35: void
! 36: l_fp_output (
! 37: l_fp *ts,
! 38: FILE *output
! 39: )
! 40: {
! 41: register int a;
! 42:
! 43: fprintf(output, HLINE);
! 44:
! 45: for(a=0; a<8; a++)
! 46: fprintf(output, "%i: %x \t", a, ((unsigned char *) ts)[a]);
! 47:
! 48: fprintf(output, "\n");
! 49: fprintf(output, HLINE);
! 50:
! 51: }
! 52:
! 53: /* Output a long floating point value in binary in the style described above
! 54: */
! 55: void
! 56: l_fp_output_bin (
! 57: l_fp *ts,
! 58: FILE *output
! 59: )
! 60: {
! 61: register int a, b;
! 62:
! 63: fprintf(output, HLINE);
! 64:
! 65: for(a=0; a<8; a++) {
! 66: short tmp = ((unsigned char *) ts)[a];
! 67: tmp++;
! 68:
! 69: fprintf(output, "%i: ", a);
! 70:
! 71: for(b=7; b>=0; b--) {
! 72: int texp = (int) pow(2, b);
! 73:
! 74: if(tmp - texp > 0) {
! 75: fprintf(output, "1");
! 76: tmp -= texp;
! 77: }
! 78: else {
! 79: fprintf(output, "0");
! 80: }
! 81: }
! 82:
! 83: fprintf(output, " ");
! 84: }
! 85:
! 86: fprintf(output, "\n");
! 87: fprintf(output, HLINE);
! 88: }
! 89:
! 90: /* Output a long floating point value in decimal in the style described above
! 91: */
! 92: void
! 93: l_fp_output_dec (
! 94: l_fp *ts,
! 95: FILE *output
! 96: )
! 97: {
! 98: register int a;
! 99:
! 100: fprintf(output, HLINE);
! 101:
! 102: for(a=0; a<8; a++)
! 103: fprintf(output, "%i: %i \t", a, ((unsigned char *) ts)[a]);
! 104:
! 105: fprintf(output, "\n");
! 106: fprintf(output, HLINE);
! 107:
! 108: }
! 109:
! 110: /* Convert a struct addrinfo to a string containing the address in style
! 111: * of inet_ntoa
! 112: */
! 113: char *
! 114: addrinfo_to_str (
! 115: struct addrinfo *addr
! 116: )
! 117: {
! 118: sockaddr_u s;
! 119:
! 120: memset(&s, 0, sizeof(s));
! 121: memcpy(&s, addr->ai_addr, min(sizeof(s), addr->ai_addrlen));
! 122:
! 123: return ss_to_str(&s);
! 124: }
! 125:
! 126: /* Convert a sockaddr_u to a string containing the address in
! 127: * style of inet_ntoa
! 128: * Why not switch callers to use stoa from libntp? No free() needed
! 129: * in that case.
! 130: */
! 131: char *
! 132: ss_to_str (
! 133: sockaddr_u *saddr
! 134: )
! 135: {
! 136: char * buf;
! 137:
! 138: buf = emalloc(INET6_ADDRSTRLEN);
! 139: strncpy(buf, stoa(saddr), INET6_ADDRSTRLEN);
! 140:
! 141: return buf;
! 142: }
! 143: /*
! 144: * Converts a struct tv to a date string
! 145: */
! 146: char *
! 147: tv_to_str(
! 148: const struct timeval *tv
! 149: )
! 150: {
! 151: const size_t bufsize = 48;
! 152: char *buf;
! 153: time_t gmt_time, local_time;
! 154: struct tm *p_tm_local;
! 155: int hh, mm, lto;
! 156:
! 157: /*
! 158: * convert to struct tm in UTC, then intentionally feed
! 159: * that tm to mktime() which expects local time input, to
! 160: * derive the offset from UTC to local time.
! 161: */
! 162: gmt_time = tv->tv_sec;
! 163: local_time = mktime(gmtime(&gmt_time));
! 164: p_tm_local = localtime(&gmt_time);
! 165:
! 166: /* Local timezone offsets should never cause an overflow. Yeah. */
! 167: lto = difftime(local_time, gmt_time);
! 168: lto /= 60;
! 169: hh = lto / 60;
! 170: mm = abs(lto % 60);
! 171:
! 172: buf = emalloc(bufsize);
! 173: snprintf(buf, bufsize,
! 174: "%d-%.2d-%.2d %.2d:%.2d:%.2d.%.6d (%+03d%02d)",
! 175: p_tm_local->tm_year + 1900,
! 176: p_tm_local->tm_mon + 1,
! 177: p_tm_local->tm_mday,
! 178: p_tm_local->tm_hour,
! 179: p_tm_local->tm_min,
! 180: p_tm_local->tm_sec,
! 181: (int)tv->tv_usec,
! 182: hh,
! 183: mm);
! 184:
! 185: return buf;
! 186: }
! 187:
! 188:
! 189:
! 190:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>