libexplain  1.4.D001
libexplain/buffer/timex.c
Go to the documentation of this file.
00001 /*
00002  * libexplain - Explain errno values returned by libc functions
00003  * Copyright (C) 2009-2011, 2013 Peter Miller
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU Lesser General Public License as
00007  * published by the Free Software Foundation; either version 3 of the
00008  * License, or (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Lesser General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU Lesser General Public License
00016  * along with this program. If not, see <http://www.gnu.org/licenses/>.
00017  */
00018 
00019 #include <libexplain/ac/sys/timex.h>
00020 
00021 #include <libexplain/buffer/timex.h>
00022 #include <libexplain/buffer/pointer.h>
00023 #include <libexplain/is_efault.h>
00024 #include <libexplain/parse_bits.h>
00025 #include <libexplain/sizeof.h>
00026 
00027 
00028 #ifdef HAVE_SYS_TIMEX_H
00029 
00030 static void
00031 explain_buffer_timex_mode(explain_string_buffer_t *sb, int mode)
00032 {
00033     static const struct explain_parse_bits_table_t table[] =
00034     {
00035 #ifdef ADJ_OFFSET
00036         { "ADJ_OFFSET", ADJ_OFFSET },
00037 #endif
00038 #ifdef ADJ_FREQUENCY
00039         { "ADJ_FREQUENCY", ADJ_FREQUENCY },
00040 #endif
00041 #ifdef ADJ_MAXERROR
00042         { "ADJ_MAXERROR", ADJ_MAXERROR },
00043 #endif
00044 #ifdef ADJ_ESTERROR
00045         { "ADJ_ESTERROR", ADJ_ESTERROR },
00046 #endif
00047 #ifdef ADJ_STATUS
00048         { "ADJ_STATUS", ADJ_STATUS },
00049 #endif
00050 #ifdef ADJ_TIMECONST
00051         { "ADJ_TIMECONST", ADJ_TIMECONST },
00052 #endif
00053 #ifdef ADJ_TICK
00054         { "ADJ_TICK", ADJ_TICK },
00055 #endif
00056 #ifdef MOD_OFFSET
00057         { "MOD_OFFSET", MOD_OFFSET },
00058 #endif
00059 #ifdef MOD_FREQUENCY
00060         { "MOD_FREQUENCY", MOD_FREQUENCY },
00061 #endif
00062 #ifdef MOD_MAXERROR
00063         { "MOD_MAXERROR", MOD_MAXERROR },
00064 #endif
00065 #ifdef MOD_ESTERROR
00066         { "MOD_ESTERROR", MOD_ESTERROR },
00067 #endif
00068 #ifdef MOD_STATUS
00069         { "MOD_STATUS", MOD_STATUS },
00070 #endif
00071 #ifdef MOD_TIMECONST
00072         { "MOD_TIMECONST", MOD_TIMECONST },
00073 #endif
00074 #ifdef MOD_PSSMAX
00075         { "MOD_PSSMAX", MOD_PSSMAX },
00076 #endif
00077 #ifdef MOD_TAI
00078         { "MOD_TAI", MOD_TAI },
00079 #endif
00080 #ifdef MOD_MICRO
00081         { "MOD_MICRO", MOD_MICRO },
00082 #endif
00083 #ifdef MOD_NANO
00084         { "MOD_NANO", MOD_NANO },
00085 #endif
00086 #ifdef MOD_CLKA
00087         { "MOD_CLKA", MOD_CLKA },
00088 #endif
00089 #ifdef MOD_CLKB
00090         { "MOD_CLKB", MOD_CLKB },
00091 #endif
00092     };
00093 
00094 #ifdef ADJ_OFFSET_SINGLESHOT
00095     if (mode == ADJ_OFFSET_SINGLESHOT)
00096         explain_string_buffer_puts(sb, "ADJ_OFFSET_SINGLESHOT");
00097     else
00098 #endif
00099 #ifdef ADJ_OFFSET_SS_READ
00100     if (mode == ADJ_OFFSET_SS_READ)
00101         explain_string_buffer_puts(sb, "ADJ_OFFSET_SS_READ");
00102     else
00103 #endif
00104         explain_parse_bits_print(sb, mode, table, SIZEOF(table));
00105 }
00106 
00107 
00108 static void
00109 explain_buffer_timex_status(explain_string_buffer_t *sb, int status)
00110 {
00111     static const struct explain_parse_bits_table_t table[] =
00112     {
00113         { "STA_PLL", STA_PLL },
00114         { "STA_PPSFREQ", STA_PPSFREQ },
00115         { "STA_PPSTIME", STA_PPSTIME },
00116         { "STA_FLL", STA_FLL },
00117         { "STA_INS", STA_INS },
00118         { "STA_DEL", STA_DEL },
00119         { "STA_UNSYNC", STA_UNSYNC },
00120         { "STA_FREQHOLD", STA_FREQHOLD },
00121         { "STA_PPSSIGNAL", STA_PPSSIGNAL },
00122         { "STA_PPSJITTER", STA_PPSJITTER },
00123         { "STA_PPSWANDER", STA_PPSWANDER },
00124         { "STA_PPSERROR", STA_PPSERROR },
00125         { "STA_CLOCKERR", STA_CLOCKERR },
00126 #ifdef STA_NANO
00127         { "STA_NANO", STA_NANO },
00128 #endif
00129 #ifdef STA_MODE
00130         { "STA_MODE", STA_MODE },
00131 #endif
00132 #ifdef STA_CLK
00133         { "STA_CLK", STA_CLK },
00134 #endif
00135     };
00136 
00137     explain_parse_bits_print(sb, status, table, SIZEOF(table));
00138 }
00139 
00140 #endif
00141 
00142 
00143 void
00144 explain_buffer_timex(explain_string_buffer_t *sb,
00145     const struct timex *data)
00146 {
00147 #ifdef HAVE_SYS_TIMEX_H
00148     if (explain_is_efault_pointer(data, sizeof(*data)))
00149     {
00150         explain_buffer_pointer(sb, data);
00151         return;
00152     }
00153 
00154     explain_string_buffer_puts(sb, "{ modes = ");
00155     explain_buffer_timex_mode(sb, data->modes);
00156 #ifdef ADJ_OFFSET_SINGLESHOT
00157     if (data->modes == ADJ_OFFSET_SINGLESHOT)
00158     {
00159         explain_string_buffer_printf(sb, ", offset = %ld", (long)data->offset);
00160     }
00161     else
00162 #endif
00163 #ifdef ADJ_OFFSET_SS_READ
00164     if (data->modes == ADJ_OFFSET_SS_READ)
00165     {
00166         /* do nothing more */
00167     }
00168     else
00169 #endif
00170     {
00171 #if !defined(ADJ_OFFSET) && defined(MOD_OFFSET)
00172 #define ADJ_OFFSET MOD_OFFSET
00173 #endif
00174 #ifdef ADJ_OFFSET
00175         if (data->modes & ADJ_OFFSET)
00176         {
00177             explain_string_buffer_printf
00178             (
00179                 sb,
00180                 ", offset = %ld",
00181                 (long)data->offset
00182             );
00183         }
00184 #endif
00185 #if !defined(ADJ_FREQUENCY) && defined(MOD_FREQUENCY)
00186 #define ADJ_FREQUENCY MOD_FREQUENCY
00187 #endif
00188 #ifdef ADJ_FREQUENCY
00189         if (data->modes & ADJ_FREQUENCY)
00190         {
00191             explain_string_buffer_printf
00192             (
00193                 sb,
00194                 ", freq = %ld",
00195                 (long)data->freq
00196             );
00197         }
00198 #endif
00199 #if !defined(ADJ_MAXERROR) && defined(MOD_MAXERROR)
00200 #define ADJ_MAXERROR MOD_MAXERROR
00201 #endif
00202 #ifdef ADJ_MAXERROR
00203         if (data->modes & ADJ_MAXERROR)
00204         {
00205             explain_string_buffer_printf
00206             (
00207                 sb,
00208                 ", maxerror = %ld",
00209                 (long)data->maxerror
00210             );
00211         }
00212 #endif
00213 #if !defined(ADJ_ESTERROR) && defined(MOD_ESTERROR)
00214 #define ADJ_ESTERROR MOD_ESTERROR
00215 #endif
00216 #ifdef ADJ_ESTERROR
00217         if (data->modes & ADJ_ESTERROR)
00218         {
00219             explain_string_buffer_printf
00220             (
00221                 sb,
00222                 ", esterror = %ld",
00223                 (long)data->esterror
00224             );
00225         }
00226 #endif
00227 #if !defined(ADJ_STATUS) && defined(MOD_STATUS)
00228 #define ADJ_STATUS MOD_STATUS
00229 #endif
00230 #ifdef ADJ_STATUS
00231         if (data->modes & ADJ_STATUS)
00232         {
00233             explain_string_buffer_puts(sb, ", status = ");
00234             explain_buffer_timex_status(sb, data->status);
00235         }
00236 #endif
00237 #if !defined(ADJ_TIMECONST) && defined(MOD_TIMECONST)
00238 #define ADJ_TIMECONST MOD_TIMECONST
00239 #endif
00240 #ifdef ADJ_TIMECONST
00241         if (data->modes & ADJ_TIMECONST)
00242         {
00243             explain_string_buffer_printf
00244             (
00245                 sb,
00246                 ", constant = %ld",
00247                 (long)data->constant
00248             );
00249         }
00250 #endif
00251 #ifdef ADJ_TICK
00252         if (data->modes & ADJ_TICK)
00253         {
00254             explain_string_buffer_printf
00255             (
00256                 sb,
00257                 ", tick = %ld",
00258                 (long)data->tick
00259             );
00260         }
00261 #endif
00262     }
00263     explain_string_buffer_puts(sb, " }");
00264 #else
00265     explain_buffer_pointer(sb, data);
00266 #endif
00267 }
00268 
00269 
00270 /* vim: set ts=8 sw=4 et : */