xref: /freebsd/contrib/ntp/util/timetrim.c (revision 224ba2bd37e182b64f7d78defef8a6cacaad3415)
1c0b746e5SOllivier Robert #ifdef sgi
2c0b746e5SOllivier Robert /*
3c0b746e5SOllivier Robert  * timetrim.c
4c0b746e5SOllivier Robert  *
5c0b746e5SOllivier Robert  * "timetrim" allows setting and adjustment of the system clock frequency
6c0b746e5SOllivier Robert  * trim parameter on Silicon Graphics machines.  The trim value native
7c0b746e5SOllivier Robert  * units are nanoseconds per second (10**-9), so a trim value of 1 makes
8c0b746e5SOllivier Robert  * the system clock step ahead 1 nanosecond more per second than a value
9c0b746e5SOllivier Robert  * of zero.  Xntpd currently uses units of 2**-20 secs for its frequency
10c0b746e5SOllivier Robert  * offset (drift) values; to convert to a timetrim value, multiply by
11c0b746e5SOllivier Robert  * 1E9 / 2**20 (about 954).
12c0b746e5SOllivier Robert  *
13c0b746e5SOllivier Robert  * "timetrim" with no arguments just prints out the current kernel value.
14c0b746e5SOllivier Robert  * With a numeric argument, the kernel value is set to the supplied value.
15c0b746e5SOllivier Robert  * The "-i" flag causes the supplied value to be added to the kernel value.
16c0b746e5SOllivier Robert  * The "-n" option causes all input and output to be in xntpd units rather
17c0b746e5SOllivier Robert  * than timetrim native units.
18c0b746e5SOllivier Robert  *
19c0b746e5SOllivier Robert  * Note that there is a limit of +-3000000 (0.3%) on the timetrim value
20c0b746e5SOllivier Robert  * which is (silently?) enforced by the kernel.
21c0b746e5SOllivier Robert  *
22c0b746e5SOllivier Robert  */
23c0b746e5SOllivier Robert 
24c0b746e5SOllivier Robert #ifdef HAVE_CONFIG_H
25c0b746e5SOllivier Robert #include <config.h>
26c0b746e5SOllivier Robert #endif
27c0b746e5SOllivier Robert 
28c0b746e5SOllivier Robert #include <stdio.h>
29c0b746e5SOllivier Robert #include <ctype.h>
30224ba2bdSOllivier Robert #include <stdlib.h>
31c0b746e5SOllivier Robert #ifdef HAVE_SYS_SYSSGI_H
32c0b746e5SOllivier Robert # include <sys/syssgi.h>
33c0b746e5SOllivier Robert #endif
34c0b746e5SOllivier Robert 
35c0b746e5SOllivier Robert #define abs(X) (((X) < 0) ? -(X) : (X))
36c0b746e5SOllivier Robert #define USAGE "usage: timetrim [-n] [[-i] value]\n"
37c0b746e5SOllivier Robert #define SGITONTP(X) ((double)(X) * 1048576.0/1.0e9)
38c0b746e5SOllivier Robert #define NTPTOSGI(X) ((long)((X) * 1.0e9/1048576.0))
39c0b746e5SOllivier Robert 
40c0b746e5SOllivier Robert int
41c0b746e5SOllivier Robert main(
42c0b746e5SOllivier Robert 	int argc,
43c0b746e5SOllivier Robert 	char *argv[]
44c0b746e5SOllivier Robert 	)
45c0b746e5SOllivier Robert {
46c0b746e5SOllivier Robert 	char *rem;
47224ba2bdSOllivier Robert 	int incremental = 0, ntpunits = 0;
48c0b746e5SOllivier Robert 	long timetrim;
49224ba2bdSOllivier Robert 	double value;
50c0b746e5SOllivier Robert 
51224ba2bdSOllivier Robert 	while (--argc && **++argv == '-' && isalpha((int)argv[0][1])) {
52c0b746e5SOllivier Robert 		switch (argv[0][1]) {
53c0b746e5SOllivier Robert 		    case 'i':
54c0b746e5SOllivier Robert 			incremental++;
55c0b746e5SOllivier Robert 			break;
56c0b746e5SOllivier Robert 		    case 'n':
57c0b746e5SOllivier Robert 			ntpunits++;
58c0b746e5SOllivier Robert 			break;
59c0b746e5SOllivier Robert 		    default:
60c0b746e5SOllivier Robert 			fprintf(stderr, USAGE);
61c0b746e5SOllivier Robert 			exit(1);
62c0b746e5SOllivier Robert 		}
63c0b746e5SOllivier Robert 	}
64c0b746e5SOllivier Robert 
65c0b746e5SOllivier Robert 	if (syssgi(SGI_GETTIMETRIM, &timetrim) < 0) {
66c0b746e5SOllivier Robert 		perror("syssgi");
67c0b746e5SOllivier Robert 		exit(2);
68c0b746e5SOllivier Robert 	}
69c0b746e5SOllivier Robert 
70c0b746e5SOllivier Robert 	if (argc == 0) {
71c0b746e5SOllivier Robert 		if (ntpunits)
72224ba2bdSOllivier Robert 		    fprintf(stdout, "%0.5f\n", SGITONTP(timetrim));
73c0b746e5SOllivier Robert 		else
74c0b746e5SOllivier Robert 		    fprintf(stdout, "%ld\n", timetrim);
75c0b746e5SOllivier Robert 	} else if (argc != 1) {
76c0b746e5SOllivier Robert 		fprintf(stderr, USAGE);
77c0b746e5SOllivier Robert 		exit(1);
78c0b746e5SOllivier Robert 	} else {
79c0b746e5SOllivier Robert 		value = strtod(argv[0], &rem);
80c0b746e5SOllivier Robert 		if (*rem != '\0') {
81c0b746e5SOllivier Robert 			fprintf(stderr, USAGE);
82c0b746e5SOllivier Robert 			exit(1);
83c0b746e5SOllivier Robert 		}
84c0b746e5SOllivier Robert 		if (ntpunits)
85c0b746e5SOllivier Robert 		    value = NTPTOSGI(value);
86c0b746e5SOllivier Robert 		if (incremental)
87c0b746e5SOllivier Robert 		    timetrim += value;
88c0b746e5SOllivier Robert 		else
89c0b746e5SOllivier Robert 		    timetrim = value;
90c0b746e5SOllivier Robert 		if (syssgi(SGI_SETTIMETRIM, timetrim) < 0) {
91c0b746e5SOllivier Robert 			perror("syssgi");
92c0b746e5SOllivier Robert 			exit(2);
93c0b746e5SOllivier Robert 		}
94c0b746e5SOllivier Robert 	}
95224ba2bdSOllivier Robert 	return 0;
96c0b746e5SOllivier Robert }
97c0b746e5SOllivier Robert #endif
98