19c2daa00SOllivier Robert #if defined(sgi) || defined(_UNICOSMP)
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
349c2daa00SOllivier Robert #ifdef HAVE_SYS_SYSTUNE_H
359c2daa00SOllivier Robert # include <sys/systune.h>
369c2daa00SOllivier Robert #endif
37c0b746e5SOllivier Robert
38c0b746e5SOllivier Robert #define abs(X) (((X) < 0) ? -(X) : (X))
39c0b746e5SOllivier Robert #define USAGE "usage: timetrim [-n] [[-i] value]\n"
40c0b746e5SOllivier Robert #define SGITONTP(X) ((double)(X) * 1048576.0/1.0e9)
41c0b746e5SOllivier Robert #define NTPTOSGI(X) ((long)((X) * 1.0e9/1048576.0))
42c0b746e5SOllivier Robert
43c0b746e5SOllivier Robert int
main(int argc,char * argv[])44c0b746e5SOllivier Robert main(
45c0b746e5SOllivier Robert int argc,
46c0b746e5SOllivier Robert char *argv[]
47c0b746e5SOllivier Robert )
48c0b746e5SOllivier Robert {
49c0b746e5SOllivier Robert char *rem;
50224ba2bdSOllivier Robert int incremental = 0, ntpunits = 0;
51c0b746e5SOllivier Robert long timetrim;
52224ba2bdSOllivier Robert double value;
53c0b746e5SOllivier Robert
54224ba2bdSOllivier Robert while (--argc && **++argv == '-' && isalpha((int)argv[0][1])) {
55c0b746e5SOllivier Robert switch (argv[0][1]) {
56c0b746e5SOllivier Robert case 'i':
57c0b746e5SOllivier Robert incremental++;
58c0b746e5SOllivier Robert break;
59c0b746e5SOllivier Robert case 'n':
60c0b746e5SOllivier Robert ntpunits++;
61c0b746e5SOllivier Robert break;
62c0b746e5SOllivier Robert default:
63c0b746e5SOllivier Robert fprintf(stderr, USAGE);
64c0b746e5SOllivier Robert exit(1);
65c0b746e5SOllivier Robert }
66c0b746e5SOllivier Robert }
67c0b746e5SOllivier Robert
689c2daa00SOllivier Robert #ifdef HAVE_SYS_SYSSGI_H
69c0b746e5SOllivier Robert if (syssgi(SGI_GETTIMETRIM, &timetrim) < 0) {
70c0b746e5SOllivier Robert perror("syssgi");
71c0b746e5SOllivier Robert exit(2);
72c0b746e5SOllivier Robert }
739c2daa00SOllivier Robert #endif
749c2daa00SOllivier Robert #ifdef HAVE_SYS_SYSTUNE_H
759c2daa00SOllivier Robert if (systune(SYSTUNE_GET, "timetrim", &timetrim) < 0) {
769c2daa00SOllivier Robert perror("systune");
779c2daa00SOllivier Robert exit(2);
789c2daa00SOllivier Robert }
799c2daa00SOllivier Robert #endif
80c0b746e5SOllivier Robert
81c0b746e5SOllivier Robert if (argc == 0) {
82c0b746e5SOllivier Robert if (ntpunits)
83224ba2bdSOllivier Robert fprintf(stdout, "%0.5f\n", SGITONTP(timetrim));
84c0b746e5SOllivier Robert else
85c0b746e5SOllivier Robert fprintf(stdout, "%ld\n", timetrim);
86c0b746e5SOllivier Robert } else if (argc != 1) {
87c0b746e5SOllivier Robert fprintf(stderr, USAGE);
88c0b746e5SOllivier Robert exit(1);
89c0b746e5SOllivier Robert } else {
90c0b746e5SOllivier Robert value = strtod(argv[0], &rem);
91c0b746e5SOllivier Robert if (*rem != '\0') {
92c0b746e5SOllivier Robert fprintf(stderr, USAGE);
93c0b746e5SOllivier Robert exit(1);
94c0b746e5SOllivier Robert }
95c0b746e5SOllivier Robert if (ntpunits)
96c0b746e5SOllivier Robert value = NTPTOSGI(value);
97c0b746e5SOllivier Robert if (incremental)
98c0b746e5SOllivier Robert timetrim += value;
99c0b746e5SOllivier Robert else
100c0b746e5SOllivier Robert timetrim = value;
1019c2daa00SOllivier Robert #ifdef HAVE_SYS_SYSSGI_H
102c0b746e5SOllivier Robert if (syssgi(SGI_SETTIMETRIM, timetrim) < 0) {
103c0b746e5SOllivier Robert perror("syssgi");
104c0b746e5SOllivier Robert exit(2);
105c0b746e5SOllivier Robert }
1069c2daa00SOllivier Robert #endif
1079c2daa00SOllivier Robert #ifdef HAVE_SYS_SYSTUNE_H
1089c2daa00SOllivier Robert if (systune(SYSTUNE_SET, "timer", "timetrim", &timetrim) < 0) {
1099c2daa00SOllivier Robert perror("systune");
1109c2daa00SOllivier Robert exit(2);
1119c2daa00SOllivier Robert }
1129c2daa00SOllivier Robert #endif
113c0b746e5SOllivier Robert }
114224ba2bdSOllivier Robert return 0;
115c0b746e5SOllivier Robert }
116c0b746e5SOllivier Robert #endif
117