^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* valid adjtimex test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * by: John Stultz <john.stultz@linaro.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * (C) Copyright Linaro 2015
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Licensed under the GPLv2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * This test validates adjtimex interface with valid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * and invalid test data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Usage: valid-adjtimex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * To build:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * $ gcc valid-adjtimex.c -o valid-adjtimex -lrt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * This program is free software: you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * it under the terms of the GNU General Public License as published by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * the Free Software Foundation, either version 2 of the License, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * (at your option) any later version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * This program is distributed in the hope that it will be useful,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * but WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <stdio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <time.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <sys/time.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <sys/timex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <unistd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include "../kselftest.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define NSEC_PER_SEC 1000000000LL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define USEC_PER_SEC 1000000LL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define ADJ_SETOFFSET 0x0100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include <sys/syscall.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) static int clock_adjtime(clockid_t id, struct timex *tx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) return syscall(__NR_clock_adjtime, id, tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) /* clear NTP time_status & time_state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) int clear_time_state(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) struct timex tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) tx.modes = ADJ_STATUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) tx.status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) ret = adjtimex(&tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define NUM_FREQ_VALID 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define NUM_FREQ_OUTOFRANGE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define NUM_FREQ_INVALID 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) long valid_freq[NUM_FREQ_VALID] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) -499<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) -450<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) -400<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) -350<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) -300<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) -250<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) -200<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) -150<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) -100<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) -75<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) -50<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) -25<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) -10<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) -5<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) -1<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) -1000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) 1<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) 5<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) 10<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) 25<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) 50<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) 75<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) 100<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) 150<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) 200<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) 250<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) 300<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) 350<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) 400<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) 450<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) 499<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) long outofrange_freq[NUM_FREQ_OUTOFRANGE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) -1000<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) -550<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 550<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 1000<<16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define LONG_MAX (~0UL>>1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define LONG_MIN (-LONG_MAX - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) long invalid_freq[NUM_FREQ_INVALID] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) LONG_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) LONG_MIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) int validate_freq(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct timex tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) int ret, pass = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) clear_time_state();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) memset(&tx, 0, sizeof(struct timex));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /* Set the leap second insert flag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) printf("Testing ADJ_FREQ... ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) fflush(stdout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) for (i = 0; i < NUM_FREQ_VALID; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) tx.modes = ADJ_FREQUENCY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) tx.freq = valid_freq[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) ret = adjtimex(&tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) printf("[FAIL]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) printf("Error: adjtimex(ADJ_FREQ, %ld - %ld ppm\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) valid_freq[i], valid_freq[i]>>16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) pass = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) tx.modes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) ret = adjtimex(&tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) if (tx.freq != valid_freq[i]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) printf("Warning: freq value %ld not what we set it (%ld)!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) tx.freq, valid_freq[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) for (i = 0; i < NUM_FREQ_OUTOFRANGE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) tx.modes = ADJ_FREQUENCY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) tx.freq = outofrange_freq[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) ret = adjtimex(&tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) printf("[FAIL]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) printf("Error: adjtimex(ADJ_FREQ, %ld - %ld ppm\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) outofrange_freq[i], outofrange_freq[i]>>16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) pass = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) tx.modes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) ret = adjtimex(&tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) if (tx.freq == outofrange_freq[i]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) printf("[FAIL]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) printf("ERROR: out of range value %ld actually set!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) tx.freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) pass = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) if (sizeof(long) == 8) { /* this case only applies to 64bit systems */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) for (i = 0; i < NUM_FREQ_INVALID; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) tx.modes = ADJ_FREQUENCY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) tx.freq = invalid_freq[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) ret = adjtimex(&tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) if (ret >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) printf("[FAIL]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) printf("Error: No failure on invalid ADJ_FREQUENCY %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) invalid_freq[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) pass = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) printf("[OK]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /* reset freq to zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) tx.modes = ADJ_FREQUENCY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) tx.freq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) ret = adjtimex(&tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) return pass;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) int set_offset(long long offset, int use_nano)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) struct timex tmx = {};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) tmx.modes = ADJ_SETOFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) if (use_nano) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) tmx.modes |= ADJ_NANO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) tmx.time.tv_sec = offset / NSEC_PER_SEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) tmx.time.tv_usec = offset % NSEC_PER_SEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) if (offset < 0 && tmx.time.tv_usec) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) tmx.time.tv_sec -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) tmx.time.tv_usec += NSEC_PER_SEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) tmx.time.tv_sec = offset / USEC_PER_SEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) tmx.time.tv_usec = offset % USEC_PER_SEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) if (offset < 0 && tmx.time.tv_usec) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) tmx.time.tv_sec -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) tmx.time.tv_usec += USEC_PER_SEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) ret = clock_adjtime(CLOCK_REALTIME, &tmx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) printf("(sec: %ld usec: %ld) ", tmx.time.tv_sec, tmx.time.tv_usec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) printf("[FAIL]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) int set_bad_offset(long sec, long usec, int use_nano)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) struct timex tmx = {};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) tmx.modes = ADJ_SETOFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) if (use_nano)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) tmx.modes |= ADJ_NANO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) tmx.time.tv_sec = sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) tmx.time.tv_usec = usec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) ret = clock_adjtime(CLOCK_REALTIME, &tmx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) if (ret >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) printf("Invalid (sec: %ld usec: %ld) did not fail! ", tmx.time.tv_sec, tmx.time.tv_usec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) printf("[FAIL]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) int validate_set_offset(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) printf("Testing ADJ_SETOFFSET... ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) fflush(stdout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) /* Test valid values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) if (set_offset(NSEC_PER_SEC - 1, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) if (set_offset(-NSEC_PER_SEC + 1, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) if (set_offset(-NSEC_PER_SEC - 1, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) if (set_offset(5 * NSEC_PER_SEC, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if (set_offset(-5 * NSEC_PER_SEC, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) if (set_offset(5 * NSEC_PER_SEC + NSEC_PER_SEC / 2, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) if (set_offset(-5 * NSEC_PER_SEC - NSEC_PER_SEC / 2, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) if (set_offset(USEC_PER_SEC - 1, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) if (set_offset(-USEC_PER_SEC + 1, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) if (set_offset(-USEC_PER_SEC - 1, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if (set_offset(5 * USEC_PER_SEC, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) if (set_offset(-5 * USEC_PER_SEC, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) if (set_offset(5 * USEC_PER_SEC + USEC_PER_SEC / 2, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) if (set_offset(-5 * USEC_PER_SEC - USEC_PER_SEC / 2, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) /* Test invalid values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) if (set_bad_offset(0, -1, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) if (set_bad_offset(0, -1, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) if (set_bad_offset(0, 2 * NSEC_PER_SEC, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) if (set_bad_offset(0, 2 * USEC_PER_SEC, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) if (set_bad_offset(0, NSEC_PER_SEC, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) if (set_bad_offset(0, USEC_PER_SEC, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) if (set_bad_offset(0, -NSEC_PER_SEC, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) if (set_bad_offset(0, -USEC_PER_SEC, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) printf("[OK]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) int main(int argc, char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) if (validate_freq())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) return ksft_exit_fail();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) if (validate_set_offset())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) return ksft_exit_fail();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) return ksft_exit_pass();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }