libexplain
1.4.D001
|
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 : */