X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=miscutils%2Fadjtimex.c;h=c1718e9094fec5054a5c2a47acae45cf39d3bfb3;hb=9b70f197b4dd5be47c5d0d4479525efe012964ee;hp=47af1a5d2e0ae2abcb607d62a008d6d9d3568848;hpb=67b23e6043d8e2b30b0bf3bc105b8583c2a26db5;p=oweals%2Fbusybox.git diff --git a/miscutils/adjtimex.c b/miscutils/adjtimex.c index 47af1a5d2..c1718e909 100644 --- a/miscutils/adjtimex.c +++ b/miscutils/adjtimex.c @@ -1,6 +1,6 @@ /* vi: set sw=4 ts=4: */ /* - * adjtimex.c - read, and possibly modify, the Linux kernel `timex' variables. + * adjtimex.c - read, and possibly modify, the Linux kernel 'timex' variables. * * Originally written: October 1997 * Last hack: March 2001 @@ -8,41 +8,81 @@ * * busyboxed 20 March 2001, Larry Doolittle * - * Licensed under GPLv2 or later, see file License in this tarball for details. + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ +//config:config ADJTIMEX +//config: bool "adjtimex (4.5 kb)" +//config: default y +//config: select PLATFORM_LINUX +//config: help +//config: Adjtimex reads and optionally sets adjustment parameters for +//config: the Linux clock adjustment algorithm. -#include "busybox.h" -#include -#include -#include -#include -#include - -static const struct {int bit; const 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 const char * const ret_code_descript[] = { - "clock synchronized", - "insert leap second", - "delete leap second", - "leap second in progress", - "leap second has occurred", - "clock not synchronized" }; - -int adjtimex_main(int argc, char **argv) +//applet:IF_ADJTIMEX(APPLET_NOFORK(adjtimex, adjtimex, BB_DIR_SBIN, BB_SUID_DROP, adjtimex)) + +//kbuild:lib-$(CONFIG_ADJTIMEX) += adjtimex.o + +//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" + +#include "libbb.h" +#ifdef __BIONIC__ +# include +#else +# include +#endif + +static const uint16_t statlist_bit[] ALIGN2 = { + 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[] ALIGN1 = + "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[] ALIGN1 = + "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 @@ -50,72 +90,88 @@ int adjtimex_main(int argc, char **argv) unsigned opt; char *opt_o, *opt_f, *opt_p, *opt_t; struct timex txc; - int i, ret, sep; + int ret; const char *descript; - txc.modes=0; - opt = getopt32(argc, argv, "qo:f:p:t:", - &opt_o, &opt_f, &opt_p, &opt_t); + memset(&txc, 0, sizeof(txc)); + + opt = getopt32(argv, "^" "qo:f:p:t:" + "\0" "=0"/*no valid non-option args*/, + &opt_o, &opt_f, &opt_p, &opt_t + ); //if (opt & 0x1) // -q if (opt & 0x2) { // -o - txc.offset = atoi(opt_o); + txc.offset = xatol(opt_o); txc.modes |= ADJ_OFFSET_SINGLESHOT; } if (opt & 0x4) { // -f - txc.freq = atoi(opt_f); + txc.freq = xatol(opt_f); txc.modes |= ADJ_FREQUENCY; } if (opt & 0x8) { // -p - txc.constant = atoi(opt_p); + txc.constant = xatol(opt_p); txc.modes |= ADJ_TIMECONST; } if (opt & 0x10) { // -t - txc.tick = atoi(opt_t); + txc.tick = xatol(opt_t); txc.modes |= ADJ_TICK; } - if (argc != optind) { /* no valid non-option parameters */ - bb_show_usage(); - } + + /* It's NOFORK applet because the code is very simple: + * just some printf. No opens, no allocs. + * If you need to make it more complex, feel free to downgrade to NOEXEC + */ ret = adjtimex(&txc); + if (ret < 0) + bb_perror_nomsg_and_die(); - if (ret < 0) perror("adjtimex"); + if (!(opt & OPT_quiet)) { + const char *sep; + const char *name; + int i; - if (!(opt & OPT_quiet) && ret>=0) { 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 ( ", - txc.modes, txc.offset, txc.freq, txc.maxerror, - txc.esterror, txc.status); + " 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, - (long)txc.time.tv_sec, (long)txc.time.tv_usec, ret, descript); + txc.constant, + txc.precision, txc.tolerance, txc.tick, + (long)txc.time.tv_sec, (long)txc.time.tv_usec, + ret, descript + ); } - return (ret<0); + + return 0; }