source: MondoRescue/branches/2.2.5/mindi-busybox/miscutils/adjtimex.c @ 1765

Last change on this file since 1765 was 1765, checked in by Bruno Cornec, 13 years ago

Update to busybox 1.7.2

File size: 2.9 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * adjtimex.c - read, and possibly modify, the Linux kernel `timex' variables.
4 *
5 * Originally written: October 1997
6 * Last hack: March 2001
7 * Copyright 1997, 2000, 2001 Larry Doolittle <LRDoolittle@lbl.gov>
8 *
9 * busyboxed 20 March 2001, Larry Doolittle <ldoolitt@recycle.lbl.gov>
10 *
11 * Licensed under GPLv2 or later, see file License in this tarball for details.
12 */
13
14#include "libbb.h"
15#include <sys/timex.h>
16
17static const struct {
18    int bit;
19    const char *name;
20} statlist[] = {
21    { STA_PLL,       "PLL"       },
22    { STA_PPSFREQ,   "PPSFREQ"   },
23    { STA_PPSTIME,   "PPSTIME"   },
24    { STA_FLL,       "FFL"       },
25    { STA_INS,       "INS"       },
26    { STA_DEL,       "DEL"       },
27    { STA_UNSYNC,    "UNSYNC"    },
28    { STA_FREQHOLD,  "FREQHOLD"  },
29    { STA_PPSSIGNAL, "PPSSIGNAL" },
30    { STA_PPSJITTER, "PPSJITTER" },
31    { STA_PPSWANDER, "PPSWANDER" },
32    { STA_PPSERROR,  "PPSERROR"  },
33    { STA_CLOCKERR,  "CLOCKERR"  },
34    { 0, NULL }
35};
36
37static const char *const ret_code_descript[] = {
38    "clock synchronized",
39    "insert leap second",
40    "delete leap second",
41    "leap second in progress",
42    "leap second has occurred",
43    "clock not synchronized"
44};
45
46int adjtimex_main(int argc, char **argv);
47int adjtimex_main(int argc, char **argv)
48{
49    enum {
50        OPT_quiet = 0x1
51    };
52    unsigned opt;
53    char *opt_o, *opt_f, *opt_p, *opt_t;
54    struct timex txc;
55    int i, ret, sep;
56    const char *descript;
57    txc.modes=0;
58
59    opt = getopt32(argv, "qo:f:p:t:",
60            &opt_o, &opt_f, &opt_p, &opt_t);
61    //if (opt & 0x1) // -q
62    if (opt & 0x2) { // -o
63        txc.offset = xatol(opt_o);
64        txc.modes |= ADJ_OFFSET_SINGLESHOT;
65    }
66    if (opt & 0x4) { // -f
67        txc.freq = xatol(opt_f);
68        txc.modes |= ADJ_FREQUENCY;
69    }
70    if (opt & 0x8) { // -p
71        txc.constant = xatol(opt_p);
72        txc.modes |= ADJ_TIMECONST;
73    }
74    if (opt & 0x10) { // -t
75        txc.tick = xatol(opt_t);
76        txc.modes |= ADJ_TICK;
77    }
78    if (argc != optind) { /* no valid non-option parameters */
79        bb_show_usage();
80    }
81
82    ret = adjtimex(&txc);
83
84    if (ret < 0) perror("adjtimex");
85
86    if (!(opt & OPT_quiet) && ret>=0) {
87        printf(
88            "    mode:         %d\n"
89            "-o  offset:       %ld\n"
90            "-f  frequency:    %ld\n"
91            "    maxerror:     %ld\n"
92            "    esterror:     %ld\n"
93            "    status:       %d ( ",
94        txc.modes, txc.offset, txc.freq, txc.maxerror,
95        txc.esterror, txc.status);
96
97        /* representative output of next code fragment:
98           "PLL | PPSTIME" */
99        sep=0;
100        for (i=0; statlist[i].name; i++) {
101            if (txc.status & statlist[i].bit) {
102                if (sep) fputs(" | ",stdout);
103                fputs(statlist[i].name,stdout);
104                sep=1;
105            }
106        }
107
108        descript = "error";
109        if (ret >= 0 && ret <= 5) descript = ret_code_descript[ret];
110        printf(" )\n"
111            "-p  timeconstant: %ld\n"
112            "    precision:    %ld\n"
113            "    tolerance:    %ld\n"
114            "-t  tick:         %ld\n"
115            "    time.tv_sec:  %ld\n"
116            "    time.tv_usec: %ld\n"
117            "    return value: %d (%s)\n",
118        txc.constant,
119        txc.precision, txc.tolerance, txc.tick,
120        (long)txc.time.tv_sec, (long)txc.time.tv_usec, ret, descript);
121    }
122    return (ret<0);
123}
Note: See TracBrowser for help on using the repository browser.