X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=miscutils%2Fadjtimex.c;h=534364a69a0725b2e53a5a714057f92f9d03c622;hb=3dfe0ae5a8c4f3a75f61df157db157ac0e044a51;hp=02b6e89b0f47b7dfba78b8e77e34097c5889b480;hpb=6f93277f56f97852d6e4e937ef758df0cce7b8ef;p=oweals%2Fbusybox.git diff --git a/miscutils/adjtimex.c b/miscutils/adjtimex.c index 02b6e89b0..534364a69 100644 --- a/miscutils/adjtimex.c +++ b/miscutils/adjtimex.c @@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /* * adjtimex.c - read, and possibly modify, the Linux kernel `timex' variables. * @@ -5,165 +6,152 @@ * Last hack: March 2001 * Copyright 1997, 2000, 2001 Larry Doolittle * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License (Version 2, - * June 1991) as published by the Free Software Foundation. At the - * time of writing, that license was published by the FSF with the URL - * http://www.gnu.org/copyleft/gpl.html, and is incorporated herein by - * reference. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * This adjtimex(1) is very similar in intent to adjtimex(8) by Steven - * Dick and Jim Van Zandt - * (see http://metalab.unc.edu/pub/Linux/system/admin/time/adjtimex*). - * That version predates this one, and is _much_ bigger and more - * featureful. My independently written version was very similar to - * Steven's from the start, because they both follow the kernel timex - * structure. I further tweaked this version to be equivalent to Steven's - * where possible, but I don't like getopt_long, so the actual usage - * syntax is incompatible. - * - * Amazingly enough, my Red Hat 5.2 sys/timex (and sub-includes) - * don't actually give a prototype for adjtimex(2), so building - * this code (with -Wall) gives a warning. Later versions of - * glibc fix this issue. - * - * This program is too simple for a Makefile, just build with: - * gcc -Wall -O adjtimex.c -o adjtimex - * * busyboxed 20 March 2001, Larry Doolittle - * It will autosense if it is built in a busybox environment, based - * on the BB_VER preprocessor macro. + * + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ -#include -#include -#include -#include -#include -#ifdef BB_VER -#include "busybox.h" -#endif - -static struct {int bit; char *name;} statlist[] = { - { STA_PLL, "PLL" }, - { STA_PPSFREQ, "PPSFREQ" }, - { STA_PPSTIME, "PPSTIME" }, - { STA_FLL, "FFL" }, - { STA_INS, "INS" }, - { STA_DEL, "DEL" }, - { STA_UNSYNC, "UNSYNC" }, - { STA_FREQHOLD, "FREQHOLD" }, - { STA_PPSSIGNAL, "PPSSIGNAL" }, - { STA_PPSJITTER, "PPSJITTER" }, - { STA_PPSWANDER, "PPSWANDER" }, - { STA_PPSERROR, "PPSERROR" }, - { STA_CLOCKERR, "CLOCKERR" }, - { 0, NULL } }; - -static char *ret_code_descript[] = { - "clock synchronized", - "insert leap second", - "delete leap second", - "leap second in progress", - "leap second has occurred", - "clock not synchronized" }; +//usage:#define adjtimex_trivial_usage +//usage: "[-q] [-o OFF] [-f FREQ] [-p TCONST] [-t TICK]" +//usage:#define adjtimex_full_usage "\n\n" +//usage: "Read or set kernel time variables. See adjtimex(2)\n" +//usage: "\n -q Quiet" +//usage: "\n -o OFF Time offset, microseconds" +//usage: "\n -f FREQ Frequency adjust, integer kernel units (65536 is 1ppm)" +//usage: "\n -t TICK Microseconds per tick, usually 10000" +//usage: "\n (positive -t or -f values make clock run faster)" +//usage: "\n -p TCONST" -#ifdef BB_VER -#define main adjtimex_main +#include "libbb.h" +#ifdef __BIONIC__ +# include #else -void usage(char *prog) -{ - fprintf(stderr, - "Usage: %s [ -q ] [ -o offset ] [ -f frequency ] [ -p timeconstant ] [ -t tick ]\n", - prog); -} -#define show_usage() usage(argv[0]) +# include #endif -int main(int argc, char ** argv) +static const uint16_t statlist_bit[] = { + STA_PLL, + STA_PPSFREQ, + STA_PPSTIME, + STA_FLL, + STA_INS, + STA_DEL, + STA_UNSYNC, + STA_FREQHOLD, + STA_PPSSIGNAL, + STA_PPSJITTER, + STA_PPSWANDER, + STA_PPSERROR, + STA_CLOCKERR, + 0 +}; +static const char statlist_name[] = + "PLL" "\0" + "PPSFREQ" "\0" + "PPSTIME" "\0" + "FFL" "\0" + "INS" "\0" + "DEL" "\0" + "UNSYNC" "\0" + "FREQHOLD" "\0" + "PPSSIGNAL" "\0" + "PPSJITTER" "\0" + "PPSWANDER" "\0" + "PPSERROR" "\0" + "CLOCKERR" +; + +static const char ret_code_descript[] = + "clock synchronized" "\0" + "insert leap second" "\0" + "delete leap second" "\0" + "leap second in progress" "\0" + "leap second has occurred" "\0" + "clock not synchronized" +; + +int adjtimex_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int adjtimex_main(int argc UNUSED_PARAM, char **argv) { + enum { + OPT_quiet = 0x1 + }; + unsigned opt; + char *opt_o, *opt_f, *opt_p, *opt_t; struct timex txc; - int quiet=0; - int c, i, ret, sep; - char *descript; - txc.modes=0; - for (;;) { - c = getopt( argc, argv, "qo:f:p:t:"); - if (c == EOF) break; - switch (c) { - case 'q': - quiet=1; - break; - case 'o': - txc.offset = atoi(optarg); - txc.modes |= ADJ_OFFSET_SINGLESHOT; - break; - case 'f': - txc.freq = atoi(optarg); - txc.modes |= ADJ_FREQUENCY; - break; - case 'p': - txc.constant = atoi(optarg); - txc.modes |= ADJ_TIMECONST; - break; - case 't': - txc.tick = atoi(optarg); - txc.modes |= ADJ_TICK; - break; - default: - show_usage(); - exit(1); - } + int i, ret; + const char *descript; + + opt_complementary = "=0"; /* no valid non-option parameters */ + opt = getopt32(argv, "qo:f:p:t:", + &opt_o, &opt_f, &opt_p, &opt_t); + txc.modes = 0; + //if (opt & 0x1) // -q + if (opt & 0x2) { // -o + txc.offset = xatol(opt_o); + txc.modes |= ADJ_OFFSET_SINGLESHOT; + } + if (opt & 0x4) { // -f + txc.freq = xatol(opt_f); + txc.modes |= ADJ_FREQUENCY; } - if (argc != optind) { /* no valid non-option parameters */ - show_usage(); - exit(1); + if (opt & 0x8) { // -p + txc.constant = xatol(opt_p); + txc.modes |= ADJ_TIMECONST; + } + if (opt & 0x10) { // -t + txc.tick = xatol(opt_t); + txc.modes |= ADJ_TICK; } ret = adjtimex(&txc); - if (ret < 0) perror("adjtimex"); - - if (!quiet && ret>=0) { + if (ret < 0) { + bb_perror_nomsg_and_die(); + } + + if (!(opt & OPT_quiet)) { + const char *sep; + const char *name; + printf( " mode: %d\n" - "-o offset: %ld\n" - "-f frequency: %ld\n" + "-o offset: %ld us\n" + "-f freq.adjust: %ld (65536 = 1ppm)\n" " maxerror: %ld\n" " esterror: %ld\n" - " status: %d ( ", + " status: %d (", txc.modes, txc.offset, txc.freq, txc.maxerror, txc.esterror, txc.status); /* representative output of next code fragment: - "PLL | PPSTIME" */ - sep=0; - for (i=0; statlist[i].name; i++) { - if (txc.status & statlist[i].bit) { - if (sep) fputs(" | ",stdout); - fputs(statlist[i].name,stdout); - sep=1; + * "PLL | PPSTIME" + */ + name = statlist_name; + sep = ""; + for (i = 0; statlist_bit[i]; i++) { + if (txc.status & statlist_bit[i]) { + printf("%s%s", sep, name); + sep = " | "; } + name += strlen(name) + 1; } descript = "error"; - if (ret >= 0 && ret <= 5) descript = ret_code_descript[ret]; - printf(" )\n" + if (ret <= 5) + descript = nth_string(ret_code_descript, ret); + printf(")\n" "-p timeconstant: %ld\n" - " precision: %ld\n" + " precision: %ld us\n" " tolerance: %ld\n" - "-t tick: %ld\n" + "-t tick: %ld us\n" " time.tv_sec: %ld\n" " time.tv_usec: %ld\n" " return value: %d (%s)\n", txc.constant, txc.precision, txc.tolerance, txc.tick, - txc.time.tv_sec, txc.time.tv_usec, ret, descript); + (long)txc.time.tv_sec, (long)txc.time.tv_usec, ret, descript); } - return (ret<0); + + return 0; }