diff options
Diffstat (limited to 'plugins/utils.c')
| -rw-r--r-- | plugins/utils.c | 180 |
1 files changed, 94 insertions, 86 deletions
diff --git a/plugins/utils.c b/plugins/utils.c index b4214c61..77d6a6f9 100644 --- a/plugins/utils.c +++ b/plugins/utils.c | |||
| @@ -23,13 +23,15 @@ | |||
| 23 | *****************************************************************************/ | 23 | *****************************************************************************/ |
| 24 | 24 | ||
| 25 | #include "common.h" | 25 | #include "common.h" |
| 26 | #include "utils.h" | 26 | #include "./utils.h" |
| 27 | #include "utils_base.h" | 27 | #include "utils_base.h" |
| 28 | #include <stdarg.h> | 28 | #include <stdarg.h> |
| 29 | #include <limits.h> | 29 | #include <limits.h> |
| 30 | #include <string.h> | 30 | #include <string.h> |
| 31 | #include <errno.h> | 31 | #include <errno.h> |
| 32 | 32 | ||
| 33 | #include <stdbool.h> | ||
| 34 | |||
| 33 | #include <arpa/inet.h> | 35 | #include <arpa/inet.h> |
| 34 | 36 | ||
| 35 | extern void print_usage (void); | 37 | extern void print_usage (void); |
| @@ -147,98 +149,107 @@ print_revision (const char *command_name, const char *revision) | |||
| 147 | command_name, revision, PACKAGE, VERSION); | 149 | command_name, revision, PACKAGE, VERSION); |
| 148 | } | 150 | } |
| 149 | 151 | ||
| 150 | int | 152 | bool is_numeric (char *number) { |
| 151 | is_numeric (char *number) | ||
| 152 | { | ||
| 153 | char tmp[1]; | 153 | char tmp[1]; |
| 154 | float x; | 154 | float x; |
| 155 | 155 | ||
| 156 | if (!number) | 156 | if (!number) |
| 157 | return FALSE; | 157 | return false; |
| 158 | else if (sscanf (number, "%f%c", &x, tmp) == 1) | 158 | else if (sscanf (number, "%f%c", &x, tmp) == 1) |
| 159 | return TRUE; | 159 | return true; |
| 160 | else | 160 | else |
| 161 | return FALSE; | 161 | return false; |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | int | 164 | bool is_positive (char *number) { |
| 165 | is_positive (char *number) | ||
| 166 | { | ||
| 167 | if (is_numeric (number) && atof (number) > 0.0) | 165 | if (is_numeric (number) && atof (number) > 0.0) |
| 168 | return TRUE; | 166 | return true; |
| 169 | else | 167 | else |
| 170 | return FALSE; | 168 | return false; |
| 171 | } | 169 | } |
| 172 | 170 | ||
| 173 | int | 171 | bool is_negative (char *number) { |
| 174 | is_negative (char *number) | ||
| 175 | { | ||
| 176 | if (is_numeric (number) && atof (number) < 0.0) | 172 | if (is_numeric (number) && atof (number) < 0.0) |
| 177 | return TRUE; | 173 | return true; |
| 178 | else | 174 | else |
| 179 | return FALSE; | 175 | return false; |
| 180 | } | 176 | } |
| 181 | 177 | ||
| 182 | int | 178 | bool is_nonnegative (char *number) { |
| 183 | is_nonnegative (char *number) | ||
| 184 | { | ||
| 185 | if (is_numeric (number) && atof (number) >= 0.0) | 179 | if (is_numeric (number) && atof (number) >= 0.0) |
| 186 | return TRUE; | 180 | return true; |
| 187 | else | 181 | else |
| 188 | return FALSE; | 182 | return false; |
| 189 | } | 183 | } |
| 190 | 184 | ||
| 191 | int | 185 | bool is_percentage (char *number) { |
| 192 | is_percentage (char *number) | ||
| 193 | { | ||
| 194 | int x; | 186 | int x; |
| 195 | if (is_numeric (number) && (x = atof (number)) >= 0 && x <= 100) | 187 | if (is_numeric (number) && (x = atof (number)) >= 0 && x <= 100) |
| 196 | return TRUE; | 188 | return true; |
| 197 | else | 189 | else |
| 198 | return FALSE; | 190 | return false; |
| 199 | } | 191 | } |
| 200 | 192 | ||
| 201 | int | 193 | bool is_percentage_expression (const char str[]) { |
| 202 | is_integer (char *number) | 194 | if (!str) { |
| 203 | { | 195 | return false; |
| 196 | } | ||
| 197 | |||
| 198 | size_t len = strlen(str); | ||
| 199 | |||
| 200 | if (str[len-1] != '%') { | ||
| 201 | return false; | ||
| 202 | } | ||
| 203 | |||
| 204 | char *foo = calloc(sizeof(char), len + 1); | ||
| 205 | |||
| 206 | if (!foo) { | ||
| 207 | die (STATE_UNKNOWN, _("calloc failed \n")); | ||
| 208 | } | ||
| 209 | |||
| 210 | strcpy(foo, str); | ||
| 211 | foo[len-1] = '\0'; | ||
| 212 | |||
| 213 | bool result = is_numeric(foo); | ||
| 214 | |||
| 215 | free(foo); | ||
| 216 | |||
| 217 | return result; | ||
| 218 | } | ||
| 219 | |||
| 220 | bool is_integer (char *number) { | ||
| 204 | long int n; | 221 | long int n; |
| 205 | 222 | ||
| 206 | if (!number || (strspn (number, "-0123456789 ") != strlen (number))) | 223 | if (!number || (strspn (number, "-0123456789 ") != strlen (number))) |
| 207 | return FALSE; | 224 | return false; |
| 208 | 225 | ||
| 209 | n = strtol (number, NULL, 10); | 226 | n = strtol (number, NULL, 10); |
| 210 | 227 | ||
| 211 | if (errno != ERANGE && n >= INT_MIN && n <= INT_MAX) | 228 | if (errno != ERANGE && n >= INT_MIN && n <= INT_MAX) |
| 212 | return TRUE; | 229 | return true; |
| 213 | else | 230 | else |
| 214 | return FALSE; | 231 | return false; |
| 215 | } | 232 | } |
| 216 | 233 | ||
| 217 | int | 234 | bool is_intpos (char *number) { |
| 218 | is_intpos (char *number) | ||
| 219 | { | ||
| 220 | if (is_integer (number) && atoi (number) > 0) | 235 | if (is_integer (number) && atoi (number) > 0) |
| 221 | return TRUE; | 236 | return true; |
| 222 | else | 237 | else |
| 223 | return FALSE; | 238 | return false; |
| 224 | } | 239 | } |
| 225 | 240 | ||
| 226 | int | 241 | bool is_intneg (char *number) { |
| 227 | is_intneg (char *number) | ||
| 228 | { | ||
| 229 | if (is_integer (number) && atoi (number) < 0) | 242 | if (is_integer (number) && atoi (number) < 0) |
| 230 | return TRUE; | 243 | return true; |
| 231 | else | 244 | else |
| 232 | return FALSE; | 245 | return false; |
| 233 | } | 246 | } |
| 234 | 247 | ||
| 235 | int | 248 | bool is_intnonneg (char *number) { |
| 236 | is_intnonneg (char *number) | ||
| 237 | { | ||
| 238 | if (is_integer (number) && atoi (number) >= 0) | 249 | if (is_integer (number) && atoi (number) >= 0) |
| 239 | return TRUE; | 250 | return true; |
| 240 | else | 251 | else |
| 241 | return FALSE; | 252 | return false; |
| 242 | } | 253 | } |
| 243 | 254 | ||
| 244 | /* | 255 | /* |
| @@ -246,19 +257,27 @@ is_intnonneg (char *number) | |||
| 246 | * On success the number will be written to the _target_ address, if _target_ is not set | 257 | * On success the number will be written to the _target_ address, if _target_ is not set |
| 247 | * to NULL. | 258 | * to NULL. |
| 248 | */ | 259 | */ |
| 249 | int is_int64(char *number, int64_t *target) { | 260 | bool is_int64(char *number, int64_t *target) { |
| 250 | errno = 0; | 261 | errno = 0; |
| 251 | uint64_t tmp = strtoll(number, NULL, 10); | 262 | char *endptr = { 0 }; |
| 263 | |||
| 264 | int64_t tmp = strtoll(number, &endptr, 10); | ||
| 252 | if (errno != 0) { | 265 | if (errno != 0) { |
| 266 | return false; | ||
| 267 | } | ||
| 268 | |||
| 269 | if (*endptr == '\0') { | ||
| 253 | return 0; | 270 | return 0; |
| 254 | } | 271 | } |
| 272 | |||
| 255 | if (tmp < INT64_MIN || tmp > INT64_MAX) { | 273 | if (tmp < INT64_MIN || tmp > INT64_MAX) { |
| 256 | return 0; | 274 | return false; |
| 257 | } | 275 | } |
| 276 | |||
| 258 | if (target != NULL) { | 277 | if (target != NULL) { |
| 259 | *target = tmp; | 278 | *target = tmp; |
| 260 | } | 279 | } |
| 261 | return 1; | 280 | return true; |
| 262 | } | 281 | } |
| 263 | 282 | ||
| 264 | /* | 283 | /* |
| @@ -266,40 +285,45 @@ int is_int64(char *number, int64_t *target) { | |||
| 266 | * On success the number will be written to the _target_ address, if _target_ is not set | 285 | * On success the number will be written to the _target_ address, if _target_ is not set |
| 267 | * to NULL. | 286 | * to NULL. |
| 268 | */ | 287 | */ |
| 269 | int is_uint64(char *number, uint64_t *target) { | 288 | bool is_uint64(char *number, uint64_t *target) { |
| 270 | errno = 0; | 289 | errno = 0; |
| 271 | uint64_t tmp = strtoll(number, NULL, 10); | 290 | char *endptr = { 0 }; |
| 291 | unsigned long long tmp = strtoull(number, &endptr, 10); | ||
| 292 | |||
| 272 | if (errno != 0) { | 293 | if (errno != 0) { |
| 273 | return 0; | 294 | return false; |
| 274 | } | 295 | } |
| 275 | if (tmp < 0 || tmp > UINT64_MAX) { | 296 | |
| 276 | return 0; | 297 | if (*endptr != '\0') { |
| 298 | return false; | ||
| 299 | } | ||
| 300 | |||
| 301 | if (tmp > UINT64_MAX) { | ||
| 302 | return false; | ||
| 277 | } | 303 | } |
| 304 | |||
| 278 | if (target != NULL) { | 305 | if (target != NULL) { |
| 279 | *target = tmp; | 306 | *target = (uint64_t)tmp; |
| 280 | } | 307 | } |
| 281 | return 1; | 308 | |
| 309 | return true; | ||
| 282 | } | 310 | } |
| 283 | 311 | ||
| 284 | int | 312 | bool is_intpercent (char *number) { |
| 285 | is_intpercent (char *number) | ||
| 286 | { | ||
| 287 | int i; | 313 | int i; |
| 288 | if (is_integer (number) && (i = atoi (number)) >= 0 && i <= 100) | 314 | if (is_integer (number) && (i = atoi (number)) >= 0 && i <= 100) |
| 289 | return TRUE; | 315 | return true; |
| 290 | else | 316 | else |
| 291 | return FALSE; | 317 | return false; |
| 292 | } | 318 | } |
| 293 | 319 | ||
| 294 | int | 320 | bool is_option (char *str) { |
| 295 | is_option (char *str) | ||
| 296 | { | ||
| 297 | if (!str) | 321 | if (!str) |
| 298 | return FALSE; | 322 | return false; |
| 299 | else if (strspn (str, "-") == 1 || strspn (str, "-") == 2) | 323 | else if (strspn (str, "-") == 1 || strspn (str, "-") == 2) |
| 300 | return TRUE; | 324 | return true; |
| 301 | else | 325 | else |
| 302 | return FALSE; | 326 | return false; |
| 303 | } | 327 | } |
| 304 | 328 | ||
| 305 | #ifdef NEED_GETTIMEOFDAY | 329 | #ifdef NEED_GETTIMEOFDAY |
| @@ -804,19 +828,3 @@ char *sperfdata_int (const char *label, | |||
| 804 | 828 | ||
| 805 | return data; | 829 | return data; |
| 806 | } | 830 | } |
| 807 | |||
| 808 | int | ||
| 809 | open_max (void) | ||
| 810 | { | ||
| 811 | errno = 0; | ||
| 812 | if (maxfd > 0) | ||
| 813 | return(maxfd); | ||
| 814 | |||
| 815 | if ((maxfd = sysconf (_SC_OPEN_MAX)) < 0) { | ||
| 816 | if (errno == 0) | ||
| 817 | maxfd = DEFAULT_MAXFD; /* it's indeterminate */ | ||
| 818 | else | ||
| 819 | die (STATE_UNKNOWN, _("sysconf error for _SC_OPEN_MAX\n")); | ||
| 820 | } | ||
| 821 | return(maxfd); | ||
| 822 | } | ||
