Back to home page

Enduro/X

 
 

    


0001 /**
0002  * @brief NDR 'standard' common utilites
0003  *   Enduro Execution system platform library
0004  *
0005  * @file nstdutil.h
0006  */
0007 /* -----------------------------------------------------------------------------
0008  * Enduro/X Middleware Platform for Distributed Transaction Processing
0009  * Copyright (C) 2009-2016, ATR Baltic, Ltd. All Rights Reserved.
0010  * Copyright (C) 2017-2023, Mavimax, Ltd. All Rights Reserved.
0011  * This software is released under one of the following licenses:
0012  * AGPL (with Java and Go exceptions) or Mavimax's license for commercial use.
0013  * See LICENSE file for full text.
0014  * -----------------------------------------------------------------------------
0015  * AGPL license:
0016  *
0017  * This program is free software; you can redistribute it and/or modify it under
0018  * the terms of the GNU Affero General Public License, version 3 as published
0019  * by the Free Software Foundation;
0020  *
0021  * This program is distributed in the hope that it will be useful, but WITHOUT ANY
0022  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
0023  * PARTICULAR PURPOSE. See the GNU Affero General Public License, version 3
0024  * for more details.
0025  *
0026  * You should have received a copy of the GNU Affero General Public License along 
0027  * with this program; if not, write to the Free Software Foundation, Inc.,
0028  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
0029  *
0030  * -----------------------------------------------------------------------------
0031  * A commercial use license is available from Mavimax, Ltd
0032  * contact@mavimax.com
0033  * -----------------------------------------------------------------------------
0034  */
0035 #ifndef NSTDUTIL_H
0036 #define NSTDUTIL_H
0037 
0038 #ifdef  __cplusplus
0039 extern "C" {
0040 #endif
0041 /*---------------------------Includes-----------------------------------*/
0042 #include <ndrx_config.h>
0043 #include <stdint.h>
0044 #include <unistd.h>
0045 #include <exhash.h>
0046 #include <arpa/inet.h>
0047 /*---------------------------Externs------------------------------------*/
0048     
0049 /**
0050  * Low level API configuration flags
0051  */
0052 extern NDRX_API long ndrx_G_apiflags;
0053 
0054 /*---------------------------Macros-------------------------------------*/
0055     
0056 /**
0057  * Quick env subst. via static buffer
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  * Access the GROWLIST element by index and cast to the type
0066  * @param LIST__ pointer to growlist
0067  * @param INDEX__ index to be accessed
0068  * @param TYPE__ pointer type
0069  */
0070 #define NDRX_GROWLIST_ACCESS(LIST__, INDEX__, TYPE__) \
0071     (TYPE__*)(((char *)(LIST__)->mem) + (INDEX__) * (LIST__)->size)
0072             
0073 #define NDRX_LOCALE_STOCK_DECSEP        '.'    /**< default decimal seperator */
0074     
0075 /**
0076  * @defgroup argsgrp Value types for ndrx_args_ functions
0077  * @{
0078  */
0079 #define NDRX_ARGS_BOOL                  1     /**< boolean type               */
0080 #define NDRX_ARGS_INT                   2     /**< integer type               */
0081 #define NDRX_ARGS_STRING            3     /**< string type                */
0082 #define NDRX_ARGS_CB                    4     /**< callback type              */
0083 /** @} */ /* end of argsgrp */
0084     
0085     
0086 #define NDRX_STOR_KBYTE                 1024    /**< number of bytes in KB    */
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  * Linear hashing flags, used for short data type
0120  * @defgroup linhash Linear hashing value flags
0121  * @{
0122  */    
0123 #define NDRX_LH_FLAG_ISUSED         0x0001  /**< Entry is used              */
0124 #define NDRX_LH_FLAG_WASUSED        0x0002  /**< Entry was used but now free*/
0125 /** @} */ /* end of linhash */
0126     
0127     
0128 /**
0129  * Test mode is used...
0130  */
0131 #define NDRX_STDF_TEST              0x00000001  /**< This is test mode      */
0132 
0133 
0134 /**
0135  * File syncing config / library
0136  * @defgroup fsync
0137  * @{
0138  */    
0139 #define NDRX_FSYNC_FSYNC            0x00000001  /**< Sync mode fsync     */
0140 #define NDRX_FSYNC_FSYNC_STR        "fsync"     /**< config keyword      */
0141     
0142 #define NDRX_FSYNC_FDATASYNC        0x00000002  /**< Sync mode fdatasync */
0143 #define NDRX_FSYNC_FDATASYNC_STR    "fdatasync" /**< config keyword      */
0144 
0145 #define NDRX_FSYNC_DSYNC            0x00000004  /**< Sync folders        */
0146 #define NDRX_FSYNC_DSYNC_STR        "dsync"     /**< config keyword      */
0147 /** @} */ /* end of fsync */
0148 
0149     
0150 /**
0151  * Enduro/X base system API flags
0152  * Maybe used ATMI/UBF and standard library configuration.
0153  * @defgroup apiflags
0154  * @{
0155  */    
0156     
0157 /** Escape JSON strings to handler invalid UTF-8 */
0158 #define NDRX_APIFLAGS_JSONESCAPE        0x00000001
0159 #define NDRX_APIFLAGS_JSONESCAPE_CODE   "json_escape" /**< config flag code   */
0160 
0161 /** 
0162  * Shall UBF pointers be parsed by Bextread() and Bread()
0163  * for safety reasons, by default this is off
0164  */
0165 #define NDRX_APIFLAGS_UBFPTRPARSE        0x00000002
0166 #define NDRX_APIFLAGS_UBFPTRPARSE_CODE   "ubf_ptrparse" /**< parse BFLD_PTR */
0167 
0168 /**
0169  * Duplicate UBF field ID OK at build phase.
0170  */
0171 #define NDRX_APIFLAGS_UBFDUPFIDOK        0x00000004
0172 #define NDRX_APIFLAGS_UBFDUPFIDOK_CODE   "ubf_dupfidok" /**< Check duplicat field id */
0173  
0174 /** @} */ /* end of apiflags */
0175     
0176 #define NDRX_BPATH_MAX      5120    /**< seems org PATH_MAX might be too short */
0177 /*---------------------------Enums--------------------------------------*/
0178 /*---------------------------Typedefs-----------------------------------*/
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 /** Keeps the growing list */
0195 typedef struct ndrx_growlist ndrx_growlist_t;
0196 /** Linear array growing support structure */
0197 struct ndrx_growlist
0198 {
0199     /** number of items allocated */
0200     int itemsalloc;
0201     /** allocate increment step */
0202     int step;
0203     
0204     /** Maximum index used by add function, -1 if not added any elm */
0205     int maxindexused;
0206     
0207     /** elm size */
0208     size_t size;
0209     
0210     /** memory pointer alloc/realloc */
0211     void *mem;
0212 };
0213 
0214 
0215 /**
0216  * List of posix queues
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;    /**< count the number of times added */
0231     EX_hash_handle hh;
0232 };
0233 
0234 /**
0235  * Enduro/X integer mapping table
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  * This is arguments parser and loader for mapped structures
0252  */
0253 struct ndrx_args_loader
0254 {
0255     long    offset;             /**< field offset                           */
0256     size_t  elmsz;              /**< element size                           */
0257     char*   cname;              /**< field name                             */
0258     int     fld_type;           /**< field type, see  EXF_*                 */
0259     int     min_len;            /**< string min len                         */
0260     int     max_len;            /**< string max len                         */
0261     double  min_value;          /**< minimum value for field                */
0262     double  max_value;          /**< maximum value for the field            */
0263     ndrx_args_cb_t cb_get;      /**< getter callback                        */
0264     ndrx_args_cb_t cb_set;      /**< setter callback                        */
0265 };
0266 
0267 
0268 /**
0269  * Linear memory hash
0270  */
0271 typedef struct ndrx_lh_config ndrx_lh_config_t;
0272 
0273 /**
0274  * Linear hashing config
0275  */
0276 struct ndrx_lh_config
0277 {
0278     /** memory pointer */
0279     void **memptr;
0280     
0281     /** Max number of elements */
0282     int elmmax;
0283     
0284     /** Element size */
0285     size_t elmsz;
0286     
0287     /** Key hash func */
0288     int (*p_key_hash)(ndrx_lh_config_t *conf, void *key_get, size_t key_len);
0289     
0290     /** Flags (short type) offset in element */
0291     int  flags_offset;
0292     
0293     /** Key hash func   */
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     /** Value debug     */
0298     void (*p_val_debug)(ndrx_lh_config_t *conf, int idx, char *dbg_out, size_t dbg_len);
0299     
0300     /** Compare value at index, ret 0 if equals */
0301     int (*p_compare)(ndrx_lh_config_t *conf, void *key_get, size_t key_len, int idx);
0302 };
0303 
0304 /**
0305  * Handler of parsed standard settings
0306  */
0307 typedef struct ndrx_stdcfgstr ndrx_stdcfgstr_t;
0308 struct ndrx_stdcfgstr
0309 {
0310     char key[128];  /**< shall not we defined larger keys... */
0311     char *value;
0312     /* DL with the settings loaded... */
0313     ndrx_stdcfgstr_t *next, *prev;
0314 };
0315 
0316 /** For our cluster-id generator */
0317 typedef unsigned char exuuid_t[16];
0318 
0319 /*---------------------------Globals------------------------------------*/
0320 /*---------------------------Statics------------------------------------*/
0321 /*---------------------------Prototypes---------------------------------*/
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 /* Mapping functions: */
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 /* Threading functions */
0397 extern NDRX_API uint64_t ndrx_gettid(void);
0398 
0399 /* Internal testing */
0400 extern NDRX_API int ndrx_bench_write_stats(double msgsize, double callspersec);
0401 
0402 /* Standard library TLS: */
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 /* Platform: */
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 /* String handling, where macros does not work: */
0468 
0469 /**
0470  * This is string handling functions, use of macros prefered
0471  * @defgroup stringops stirng handling funcs
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 /** @} */ /* end of stringops */
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 
0485 extern NDRX_API void ndrx_cid_generate(unsigned char prefix, exuuid_t out);
0486 
0487 extern NDRX_API int ndrx_realtime_get(struct timespec *tp);
0488 extern NDRX_API char * ndrx_basename(char *path);
0489 extern NDRX_API void ndrx_volatile_strcpy(volatile char *dest, const volatile char *src, size_t dest_size);
0490 extern NDRX_API void ndrx_volatile_memcy(volatile char *dest, const volatile char *src, size_t n);
0491 #ifdef  __cplusplus
0492 }
0493 #endif
0494 
0495 #endif  /* NSTDUTIL_H */
0496 
0497 /* vim: set ts=4 sw=4 et smartindent: */