0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 #ifndef NSTDUTIL_H
0036 #define NSTDUTIL_H
0037
0038 #ifdef __cplusplus
0039 extern "C" {
0040 #endif
0041
0042 #include <ndrx_config.h>
0043 #include <stdint.h>
0044 #include <unistd.h>
0045 #include <exhash.h>
0046 #include <arpa/inet.h>
0047
0048
0049
0050
0051
0052 extern NDRX_API long ndrx_G_apiflags;
0053
0054
0055
0056
0057
0058
0059 #define NDRX_QENV_SUBST(t, p) strncpy(t, p, sizeof(t)-1);\
0060 t[sizeof(t)-1] = (char)0;\
0061 ndrx_str_env_subs_len(t, sizeof(t));
0062
0063
0064
0065
0066
0067
0068
0069
0070 #define NDRX_GROWLIST_ACCESS(LIST__, INDEX__, TYPE__) \
0071 (TYPE__*)(((char *)(LIST__)->mem) + (INDEX__) * (LIST__)->size)
0072
0073 #define NDRX_LOCALE_STOCK_DECSEP '.'
0074
0075
0076
0077
0078
0079 #define NDRX_ARGS_BOOL 1
0080 #define NDRX_ARGS_INT 2
0081 #define NDRX_ARGS_STRING 3
0082 #define NDRX_ARGS_CB 4
0083
0084
0085
0086 #define NDRX_STOR_KBYTE 1024
0087
0088
0089 #if EX_SIZEOF_LONG==4 && EX_SIZEOF_INT==4
0090
0091 # define htonll(x) htonl(x)
0092 # define ntohll(x) ntohl(x)
0093
0094 #else
0095
0096 #if __BIG_ENDIAN__
0097
0098 #ifndef htonll
0099 # define htonll(x) (x)
0100 #endif
0101
0102 #ifndef ntohll
0103 # define ntohll(x) (x)
0104 #endif
0105
0106 #else
0107 #ifndef htonll
0108 # define htonll(x) (((uint64_t)htonl( (x) & 0xFFFFFFFF) << 32) | htonl( (x) >> 32))
0109 #endif
0110 #ifndef ntohll
0111 # define ntohll(x) (((uint64_t)ntohl( (x) & 0xFFFFFFFF) << 32) | ntohl( (x) >> 32))
0112 #endif
0113 #endif
0114
0115 #endif
0116
0117
0118
0119
0120
0121
0122
0123 #define NDRX_LH_FLAG_ISUSED 0x0001
0124 #define NDRX_LH_FLAG_WASUSED 0x0002
0125
0126
0127
0128
0129
0130
0131 #define NDRX_STDF_TEST 0x00000001
0132
0133
0134
0135
0136
0137
0138
0139 #define NDRX_FSYNC_FSYNC 0x00000001
0140 #define NDRX_FSYNC_FSYNC_STR "fsync"
0141
0142 #define NDRX_FSYNC_FDATASYNC 0x00000002
0143 #define NDRX_FSYNC_FDATASYNC_STR "fdatasync"
0144
0145 #define NDRX_FSYNC_DSYNC 0x00000004
0146 #define NDRX_FSYNC_DSYNC_STR "dsync"
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158 #define NDRX_APIFLAGS_JSONESCAPE 0x00000001
0159 #define NDRX_APIFLAGS_JSONESCAPE_CODE "json_escape"
0160
0161
0162
0163
0164
0165 #define NDRX_APIFLAGS_UBFPTRPARSE 0x00000002
0166 #define NDRX_APIFLAGS_UBFPTRPARSE_CODE "ubf_ptrparse"
0167
0168
0169
0170
0171 #define NDRX_APIFLAGS_UBFDUPFIDOK 0x00000004
0172 #define NDRX_APIFLAGS_UBFDUPFIDOK_CODE "ubf_dupfidok"
0173
0174
0175
0176 #define NDRX_BPATH_MAX 5120
0177
0178
0179
0180 typedef struct longstrmap longstrmap_t;
0181 struct longstrmap
0182 {
0183 long from;
0184 char *to;
0185 };
0186
0187 typedef struct charstrmap charstrmap_t;
0188 struct charstrmap
0189 {
0190 long from;
0191 char *to;
0192 };
0193
0194
0195 typedef struct ndrx_growlist ndrx_growlist_t;
0196
0197 struct ndrx_growlist
0198 {
0199
0200 int itemsalloc;
0201
0202 int step;
0203
0204
0205 int maxindexused;
0206
0207
0208 size_t size;
0209
0210
0211 void *mem;
0212 };
0213
0214
0215
0216
0217
0218 typedef struct string_list string_list_t;
0219 struct string_list
0220 {
0221 char *qname;
0222 string_list_t *next;
0223 };
0224
0225
0226 typedef struct string_hash string_hash_t;
0227 struct string_hash
0228 {
0229 char *str;
0230 int cnt;
0231 EX_hash_handle hh;
0232 };
0233
0234
0235
0236
0237 typedef struct ndrx_intmap ndrx_intmap_t;
0238 struct ndrx_intmap
0239 {
0240 int key;
0241 int value;
0242 EX_hash_handle hh;
0243 };
0244
0245 typedef struct ndrx_args_loader ndrx_args_loader_t;
0246
0247 typedef int (*ndrx_args_cb_t)(ndrx_args_loader_t *arg, char *val,
0248 size_t valbufsz, void *obj, char *errbuf, size_t errbufsz);
0249
0250
0251
0252
0253 struct ndrx_args_loader
0254 {
0255 long offset;
0256 size_t elmsz;
0257 char* cname;
0258 int fld_type;
0259 int min_len;
0260 int max_len;
0261 double min_value;
0262 double max_value;
0263 ndrx_args_cb_t cb_get;
0264 ndrx_args_cb_t cb_set;
0265 };
0266
0267
0268
0269
0270
0271 typedef struct ndrx_lh_config ndrx_lh_config_t;
0272
0273
0274
0275
0276 struct ndrx_lh_config
0277 {
0278
0279 void **memptr;
0280
0281
0282 int elmmax;
0283
0284
0285 size_t elmsz;
0286
0287
0288 int (*p_key_hash)(ndrx_lh_config_t *conf, void *key_get, size_t key_len);
0289
0290
0291 int flags_offset;
0292
0293
0294 void (*p_key_debug)(ndrx_lh_config_t *conf, void *key_get, size_t key_len,
0295 char *dbg_out, size_t dbg_len);
0296
0297
0298 void (*p_val_debug)(ndrx_lh_config_t *conf, int idx, char *dbg_out, size_t dbg_len);
0299
0300
0301 int (*p_compare)(ndrx_lh_config_t *conf, void *key_get, size_t key_len, int idx);
0302 };
0303
0304
0305
0306
0307 typedef struct ndrx_stdcfgstr ndrx_stdcfgstr_t;
0308 struct ndrx_stdcfgstr
0309 {
0310 char key[128];
0311 char *value;
0312
0313 ndrx_stdcfgstr_t *next, *prev;
0314 };
0315
0316
0317 typedef unsigned char exuuid_t[16];
0318
0319
0320
0321
0322
0323 extern NDRX_API int ndrx_string_list_splitadd(string_list_t**list, char *string, char *sep);
0324 extern NDRX_API int ndrx_string_list_add(string_list_t**list, char *string);
0325 extern NDRX_API void ndrx_string_list_free(string_list_t* list);
0326
0327 extern NDRX_API void ndrx_growlist_init(ndrx_growlist_t *list, int step, size_t size);
0328 extern NDRX_API int ndrx_growlist_add(ndrx_growlist_t *list, void *item, int index);
0329 extern NDRX_API int ndrx_growlist_append(ndrx_growlist_t *list, void *item);
0330 extern NDRX_API void ndrx_growlist_free(ndrx_growlist_t *list);
0331 extern NDRX_API int ndrx_growlist_add_many(ndrx_growlist_t *list, void *item, int index, int count);
0332 extern NDRX_API int ndrx_growlist_append_many(ndrx_growlist_t *list, void *item, int count);
0333
0334 extern NDRX_API void ndrx_get_dt_local(long *p_date, long *p_time, long *p_usec);
0335 extern NDRX_API long ndrx_timespec_get_delta(struct timespec *stop, struct timespec *start);
0336 extern NDRX_API void ndrx_timespec_plus(struct timespec *due, long ms);
0337
0338 extern NDRX_API long ndrx_ceil(long x, long y);
0339 extern NDRX_API unsigned long long ndrx_utc_tstamp(void);
0340 extern NDRX_API unsigned long long ndrx_utc_tstamp_micro(void);
0341 extern NDRX_API char * ndrx_get_strtstamp_from_sec(int slot, long ts);
0342 extern NDRX_API unsigned long long ndrx_get_micro_resolution_for_sec(void);
0343 extern NDRX_API char * ndrx_str_env_subs(char * str);
0344 extern NDRX_API char * ndrx_str_env_subs_len(char * str, int buf_size);
0345 extern NDRX_API int ndrx_str_subs_context(char * str, int buf_size, char opensymb, char closesymb,
0346 void *data1, void *data2, void *data3, void *data4,
0347 int (*pf_get_data) (void *data1, void *data2, void *data3, void *data4,
0348 char *symbol, char *outbuf, long outbufsz));
0349 extern NDRX_API char *ndrx_str_replace(char *orig, char *rep, char *with);
0350 extern NDRX_API char *ndrx_strchr_repl (char *str, char from_char, char to_char);
0351 extern NDRX_API void ndrx_utc_tstamp2(long *t, long *tusec);
0352 extern NDRX_API int ndrx_utc_cmp(long *t1, long *tusec1, long *t2, long *tusec2);
0353 extern NDRX_API char * ndrx_get_strtstamp2(int slot, long t, long tusec);
0354 extern NDRX_API int ndrx_compare3(long a1, long a2, long a3, long b1, long b2, long b3);
0355 extern NDRX_API int ndrx_compare4(long a1, long a2, long a3, long a4, long b1, long b2, long b3, long b4);
0356
0357 extern NDRX_API char *ndrx_decode_num(long tt, int slot, int level, int levels);
0358 extern NDRX_API char *ndrx_decode_str(char *str, char *buf, int buf_sz);
0359 extern NDRX_API double ndrx_num_dec_parsecfg(char * str);
0360 extern NDRX_API double ndrx_num_time_parsecfg(char * str);
0361 extern NDRX_API char *ndrx_str_strip(char *haystack, char *needle);
0362 extern NDRX_API char* ndrx_str_rstrip(char* s, char *needle);
0363 extern NDRX_API char* ndrx_str_lstrip_ptr(char* s, char *needle);
0364 extern NDRX_API char *ndrx_str_fmtesc(char *dst, size_t dstsz, char *src);
0365
0366 extern NDRX_API int ndrx_isint(char *str);
0367 extern NDRX_API int ndrx_isempty(const char *s);
0368 extern NDRX_API int ndrx_nr_chars(char *str, char chkchar);
0369
0370 extern NDRX_API int ndrx_file_lock(int fd, int do_wait);
0371 extern NDRX_API int ndrx_file_unlock(int fd);
0372 extern NDRX_API int ndrx_file_exists(char *filename);
0373 extern NDRX_API int ndrx_file_touch(char *filename);
0374 extern NDRX_API int ndrx_file_regular(char *path);
0375 extern NDRX_API char * ndrx_fgets_stdin_strip(char *buf, int bufsz);
0376
0377 extern NDRX_API char * ndrx_get_executable_path(char * out_path, size_t bufsz,
0378 char * in_binary);
0379 extern NDRX_API int ndrx_get_cksum(char *file);
0380 extern NDRX_API ssize_t ndrx_getline(char **lineptr, size_t *n, FILE *stream);
0381 extern NDRX_API char * ndrx_memdup(char *org, size_t len);
0382 extern NDRX_API int ndrx_tokens_extract(char *str1, char *fmt, void *tokens,
0383 int tokens_elmsz, int len, int start_tok, int stop_tok);
0384 extern NDRX_API void ndrx_chomp(char *str);
0385 extern NDRX_API uint32_t ndrx_rotl32b (uint32_t x, uint32_t n);
0386 extern NDRX_API int ndrx_proc_get_line(int line_no, char *cmd, char *buf, int bufsz);
0387
0388 extern NDRX_API size_t ndrx_strnlen(char *str, size_t max);
0389
0390 extern NDRX_API double ndrx_atof(char *str);
0391
0392
0393 extern NDRX_API char *ndrx_dolongstrgmap(longstrmap_t *map, long val, long endval);
0394 extern NDRX_API char *ndrx_docharstrgmap(longstrmap_t *map, char val, char endval);
0395
0396
0397 extern NDRX_API uint64_t ndrx_gettid(void);
0398
0399
0400 extern NDRX_API int ndrx_bench_write_stats(double msgsize, double callspersec);
0401
0402
0403 extern NDRX_API void * ndrx_nstd_tls_get(void);
0404 extern NDRX_API int ndrx_nstd_tls_set(void *data);
0405 extern NDRX_API void ndrx_nstd_tls_free(void *data);
0406 extern NDRX_API void * ndrx_nstd_tls_new(int auto_destroy, int auto_set);
0407
0408
0409 extern NDRX_API long ndrx_platf_stack_get_size(void);
0410 extern NDRX_API void ndrx_platf_stack_set(void *pthread_custom_attr);
0411
0412
0413 extern NDRX_API unsigned long ndrx_Crc32_ComputeBuf( unsigned long inCrc32, const void *buf,
0414 size_t bufLen );
0415
0416
0417 extern NDRX_API char *ndrx_strsep(char **s1, char *s2);
0418
0419
0420 extern NDRX_API int ndrx_args_loader_get(ndrx_args_loader_t *args, void *obj,
0421 char *fldnm, char *value, int valuesz,
0422 char *errbuf, size_t errbufsz);
0423
0424
0425 extern NDRX_API int ndrx_args_loader_set(ndrx_args_loader_t *args, void *obj,
0426 char *fldnm, char *value,
0427 char *errbuf, size_t errbufsz);
0428
0429 extern NDRX_API int ndrx_args_confirm(char *arg);
0430
0431 extern NDRX_API int ndrx_file_gen_embed(char *in_fname, char *out_fname,
0432 char *out_suffix);
0433
0434
0435 extern NDRX_API int ndrx_storage_decode(char *bytesenc, long *outnrbytes);
0436 extern NDRX_API void ndrx_storage_encode(long bytes, char *outbuf, int outbufsz);
0437
0438 extern NDRX_API int ndrx_lh_position_get(ndrx_lh_config_t *conf,
0439 void *key_get, size_t key_len,
0440 int oflag, int *pos, int *have_value, char *key_typ);
0441
0442 extern NDRX_API ndrx_intmap_t *ndrx_intmap_find (ndrx_intmap_t ** hash, int key);
0443 extern NDRX_API ndrx_intmap_t * ndrx_intmap_add (ndrx_intmap_t ** hash, int key, int value);
0444 extern NDRX_API void ndrx_intmap_remove (ndrx_intmap_t ** hash);
0445
0446 extern NDRX_API FILE* ndrx_mkstemps(char *filetempl, int suffixlen, long flags);
0447 extern NDRX_API int ndrx_is_numberic(char *str);
0448
0449 extern NDRX_API void ndrx_read_silent(char *buf, size_t bufsz);
0450 extern NDRX_API int ndrx_get_password(char *msg, char *buf, size_t bufsz);
0451 extern NDRX_API void ndrx_str_trim_left_single(char *input, char symb);
0452 extern NDRX_API void ndrx_str_unescape(char *input, char *symbs);
0453 extern NDRX_API char *ndrx_strtokblk ( char *input, char *delimit, char *qotesymbs);
0454 extern NDRX_API int ndrx_str_valid_cid(char *str, int max_len);
0455 extern NDRX_API int ndrx_str_valid_alphanumeric_(char *str, int max_len);
0456 extern NDRX_API int ndrx_str_ends_with(char *str, char *needle);
0457 extern NDRX_API long ndrx_file_age(char *fname);
0458 extern NDRX_API char *ndrx_file_read(char *fname, size_t *bytes_loaded);
0459 extern NDRX_API int ndrx_chk_confirm(char *message, short is_confirmed);
0460
0461 extern NDRX_API void ndrx_stdcfgstr_free(ndrx_stdcfgstr_t* stdcfg);
0462 extern NDRX_API int ndrx_stdcfgstr_parse(const char *input, ndrx_stdcfgstr_t** parsed);
0463
0464 extern NDRX_API int ndrx_rand(void);
0465 extern NDRX_API void ndrx_rand_seedset(unsigned int *seed);
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475 extern NDRX_API void ndrx_strcpy_safe_dst(char *dest, const char *src, size_t dst_size);
0476 extern NDRX_API void ndrx_strncpy_eos(char *dest, const char *src, size_t n, size_t dst_size);
0477 extern NDRX_API void ndrx_strcat_s(char *dest, size_t dst_size, const char *src);
0478
0479
0480
0481 extern NDRX_API int ndrx_fsync_dsync(char *dir, long flags);
0482 extern NDRX_API int ndrx_fsync_fsync(FILE *file, long flags);
0483 extern NDRX_API int ndrx_fsync_parse(char *setting_str, long *flags);
0484 extern NDRX_API int ndrx_fadvise_donotneed(int fd, int offset);
0485
0486 extern NDRX_API void ndrx_cid_generate(unsigned char prefix, exuuid_t out);
0487
0488 extern NDRX_API int ndrx_realtime_get(struct timespec *tp);
0489 extern NDRX_API char * ndrx_basename(char *path);
0490 extern NDRX_API void ndrx_volatile_strcpy(volatile char *dest, const volatile char *src, size_t dest_size);
0491 extern NDRX_API void ndrx_volatile_memcy(volatile char *dest, const volatile char *src, size_t n);
0492 #ifdef __cplusplus
0493 }
0494 #endif
0495
0496 #endif
0497
0498