elemy-utils 1.0.0
el_utils.h
Go to the documentation of this file.
1
12#ifndef EL_UTILS_H_
13#define EL_UTILS_H_
14
15#define _GNU_SOURCE
16
17#include <stdint.h>
18#include <stdbool.h>
19#include <byteswap.h>
20#include <unistd.h>
21#include <time.h> //struct timeval for modbus_t //for logging
22#include <malloc.h>
23#include <time.h>
24#include <linux/limits.h>
25#include <arpa/inet.h> //inet_ntop()
26#include <errno.h>
27#include <netdb.h>
28#include <stdio.h> //for logging
29#include <signal.h> //kill()
30#include <pthread.h>
31#include <sys/stat.h>
32#include <sys/types.h>
33#include <fcntl.h>
34#include <json-c/json.h>
35#include <stdarg.h>
36
37#ifdef IN_BUILD
38 //string exists during real build
39#else
40# pragma message ("in IDE")
41#endif
42
43#ifndef gettid
44#include <sys/syscall.h> /* Definition of SYS_* constants */
45#include <unistd.h> /* gettid() */
46//static inline pid_t gettid(void)
47//{
48// return syscall(SYS_gettid);
49//}
50#endif /* ifndef gettid */
51
52
53#include "elutils/pslist.h"
54#include "elutils/psl_ndx.h"
55
59//#ifdef MIPSEL_24KC
60//#pragma message "MIPSEL_24KC build"
61//#else
62//# include <sys/cdefs.h>
63//# define EL_DBG 1
64//#endif
69//#ifndef __BEGIN_DECLS
70//# if defined(__cplusplus)
71//# define __BEGIN_DECLS extern "C" {
72//# define __END_DECLS }
73//# else
74//# define __BEGIN_DECLS
75//# define __END_DECLS
76//# endif
77//#endif /* ifndef __BEGIN_DECLS */
78#include "elutils/c_decls.h"
79__BEGIN_DECLS /* till __END_DECLS */
80
82#define NAME_BUF_SZ_MAX (NAME_MAX + 1)
84#define UNUSED(x) (void)(x)
86#define PUT_ERR(ERR,ERRN) if (ERR) *ERR = ERRN
88#define ERROR_FD -1
89#define CLOSE_FD(FD) close(FD); FD = ERROR_FD
90
91#ifndef gettid
92#include <sys/syscall.h> /* Definition of SYS_* constants */
93#include <unistd.h> /* gettid() */
94//static inline pid_t gettid(void)
95//{
96// return syscall(SYS_gettid);
97//}
98#endif /* ifndef gettid */
99
100//time measure ----------------------------------------------------------------
101
102//#define EL_WRONG_PTR (void*)(-1LL)
103#define EL_WRONG_PTR (void*)(0)
104
105#ifndef NOERROR
106# define NOERROR (0)
107#endif
108
109//for static compiled array
110#ifndef ARRAY_SIZE
111# define ARRAY_SIZE(foo) (sizeof(foo)/sizeof(foo[0]))
112#endif
113
114//defines for big tens used with timeouts in nanoseconds in 'struct timespec'
115#define TENS_KILO 1000LL
116#define TENS_MEGA 1000000LL
117#define TENS_GIGA 1000000000LL
118
119//return ts2 - ts1 in nanosec//static inline pid_t gettid(void)
120//{
121// return syscall(SYS_gettid);
122//}
123
124static inline uint64_t timespec_diff(struct timespec *ts1, struct timespec *ts2)
125{
126 return ((uint64_t) ts2->tv_sec - (uint64_t) ts1->tv_sec) * TENS_GIGA + (uint64_t) ts2->tv_nsec - (uint64_t) ts1->tv_nsec;
127}
128
129static inline uint64_t get_time_nano(void)
130{
131 struct timespec ts;
132 clock_gettime(CLOCK_REALTIME, &ts);
133 return (uint64_t) ts.tv_sec * TENS_GIGA + (uint64_t) ts.tv_nsec;
134}
135
136#define EL_DBG 1
137
138#if EL_DBG > 0
139//date as //20221212010203.123456789 with nanosecs
140#ifndef MB_DBG
141#define MB_DBG(fmt, ...) do { \
142 struct timespec DBG_ts; \
143 clock_gettime(CLOCK_REALTIME, &DBG_ts); \
144 struct tm DBG_loc_time; \
145 \
146 localtime_r(&DBG_ts.tv_sec, &DBG_loc_time); \
147 char DBG_dt_str[16]; \
148 strftime(DBG_dt_str, 16, "%Y%m%d_%H%M%S", &DBG_loc_time); \
149 dprintf(STDERR_FILENO, "%s.%09lu [%i]%s(%s):%u:\t" fmt, DBG_dt_str, DBG_ts.tv_nsec, gettid(), __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
150 } while (0)
151
152#define MB_DBG_IMM(fmt, ...) do { \
153 struct timespec DBG_IMM_ts; \
154 clock_gettime(CLOCK_REALTIME, &DBG_IMM_ts); \
155 struct tm DBG_IMM_loc_time; \
156 \
157 localtime_r(&DBG_IMM_ts.tv_sec, &DBG_IMM_loc_time); \
158 char DBG_IMM_dt_str[16]; \
159 strftime(DBG_IMM_dt_str, 16, "%Y%m%d_%H%M%S", &DBG_IMM_loc_time); \
160 int DBG_IMM_def_tty = open("/dev/tty", O_RDWR); \
161 dprintf(DBG_IMM_def_tty, "%s.%09lu [%i]%s(%s):%u:\t" fmt, DBG_IMM_dt_str, DBG_IMM_ts.tv_nsec, gettid(), __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
162 close(DBG_IMM_def_tty); \
163 } while (0)
164
165#define MB_DUMP_BUF_SZ 120
166
167#define MB_DUMP_BUF(DATA_PTR, DATA_SZ, fmt, ...) \
168 do { \
169 void *DUMP_BUF_st_addr = DATA_PTR; \
170 int DUMP_BUF_i = 0, DUMP_BUF_j = 0, DUMP_BUF_buf_offs_char = 70; \
171 int DUMP_BUF_buf_offs = 0; \
172 char DUMP_BUF_t_buf[MB_DUMP_BUF_SZ]; \
173 MB_DBG(fmt, ## __VA_ARGS__); \
174 MB_DBG("address + 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 01234567 89abcdef\n"); \
175 MB_DBG("------------------------------------------------------------------- -----------------\n"); \
176 while (DUMP_BUF_i < DATA_SZ) { \
177 memset(DUMP_BUF_t_buf, 0x20, MB_DUMP_BUF_SZ); \
178 DUMP_BUF_buf_offs = 0; \
179 DUMP_BUF_j = 0; \
180 DUMP_BUF_buf_offs_char = 70; \
181 DUMP_BUF_buf_offs += snprintf(&DUMP_BUF_t_buf[DUMP_BUF_buf_offs], MB_DUMP_BUF_SZ - DUMP_BUF_buf_offs , "%16p ", DUMP_BUF_st_addr + DUMP_BUF_i); \
182 while (DUMP_BUF_i < DATA_SZ && DUMP_BUF_j < 16) { \
183 DUMP_BUF_buf_offs += snprintf(&DUMP_BUF_t_buf[DUMP_BUF_buf_offs], MB_DUMP_BUF_SZ - DUMP_BUF_buf_offs , " %02x", ((uint8_t*)DATA_PTR)[DUMP_BUF_i]); \
184 DUMP_BUF_t_buf[DUMP_BUF_buf_offs] = ' '; \
185 DUMP_BUF_t_buf[DUMP_BUF_buf_offs_char] = ((uint8_t*)DATA_PTR)[DUMP_BUF_i] < 0x20 || ((uint8_t*)DATA_PTR)[DUMP_BUF_i] > 0x7f? '.' : ((uint8_t*)DATA_PTR)[DUMP_BUF_i]; \
186 DUMP_BUF_i++; DUMP_BUF_j++; DUMP_BUF_buf_offs_char++; \
187 if ((DUMP_BUF_j & 0x7) == 0) { \
188 DUMP_BUF_buf_offs += snprintf(&DUMP_BUF_t_buf[DUMP_BUF_buf_offs], MB_DUMP_BUF_SZ - DUMP_BUF_buf_offs , " "); \
189 DUMP_BUF_t_buf[DUMP_BUF_buf_offs] = ' '; \
190 DUMP_BUF_buf_offs_char++; \
191 } \
192 } \
193 /*DUMP_BUF_buf_offs += snprintf(&DUMP_BUF_t_buf[DUMP_BUF_buf_offs], DUMP_BUF_SZ - DUMP_BUF_buf_offs , "\n");*/ \
194 /*DUMP_BUF_t_buf[DUMP_BUF_buf_offs++] = ' ';*/ \
195 /*DUMP_BUF_t_buf[DUMP_BUF_buf_offs++] = ' ';*/ \
196 /*DUMP_BUF_t_buf[DUMP_BUF_buf_offs++] = ' ';*/ \
197 DUMP_BUF_t_buf[DUMP_BUF_buf_offs_char++] = '\n'; \
198 DUMP_BUF_t_buf[DUMP_BUF_buf_offs_char++] = 0; \
199 MB_DBG("%s",DUMP_BUF_t_buf); \
200 DUMP_BUF_buf_offs = 0; \
201 DUMP_BUF_j = 0; \
202 } \
203 MB_DBG("===================================================================\n"); \
204 } while (0)
205#endif /* #ifndef MB_DBG */
206
207#else /* EL_DBG */
208# define MB_DBG(x, ...)
209# define MB_DUMP_BUF(DATA_PTR, DATA_SZ, fmt, ...)
210#endif /* EL_DBG */
211
212#define MB_DEBUG(DBG_FLAG,FMT, ...) if (DBG_FLAG) { \
213 MB_DBG(FMT, ## __VA_ARGS__); \
214 }
215
216#ifndef _HAVE_STRLCPY //strlcpy
217# define NO_HAVE_STRLCPY
218size_t strlcpy(char *dst, const char *src, size_t dstSize);
219#else
220# undef NO_HAVE_STRLCPY
221#endif
222
223#define MALLOC_ARG(ARG_IS, ERR) if (ARG_IS == NULL) {ARG_IS = malloc(sizeof(*ARG_IS)); if (ARG_IS == NULL) { if (ERR != NULL) { *ERR = errno; } return NULL; } }
224
225pthread_rwlockattr_t* el_get_rw_shared_attr(void);
226
231int set_stdin_nowait_cr(int nowait);
232void set_restore_stdin_cr(void);
233
234typedef void (*el_ctrlc_call_t)(void *ar);
235void el_set_ctrlc_exit(int ex);
236void el_set_ctrlc_param(void *arg);
238
239void termination_handler(int signum);
240void termination_sigaction(int signum, siginfo_t *siginfo, void *param);
241void set_termination_action(void);
242
243int get_serial_stat(int fd);
244void set_serial_stat(int fd, int serial);
248int get_serial_dtr(int fd);
249char* get_serial_dtr_s(int fd);
250int get_serial_dsr(int fd);
251char* get_serial_dsr_s(int fd);
252int get_serial_rts(int fd);
253char* get_serial_rts_s(int fd);
254int get_serial_cts(int fd);
255char* get_serial_cts_s(int fd);
256
257void show_serial_stat(int fd);
258
259void set_serial_stat_ln(int fd, int ln_bt, int val);
260#define SET_CD(FD, VAL) set_serial_stat_ln(FD, TIOCM_CD, VAL)
261#define SET_DTR(FD, VAL) set_serial_stat_ln(FD, TIOCM_DTR, VAL)
262#define SET_DSR(FD, VAL) set_serial_stat_ln(FD, TIOCM_LE, VAL)
263#define SET_RTS(FD, VAL) set_serial_stat_ln(FD, TIOCM_RTS, VAL)
264#define SET_CTS(FD, VAL) set_serial_stat_ln(FD, TIOCM_CTS, VAL)
265
266char** split_string(char *str, char delem, int *number);
267int cnt_splited_strings(char **ss);
268void dbg_string_list(char **string_list);
269
270char* get_family_name(int family);
271char* get_sock_type_name(int sock_type);
272
273typedef enum _IP_TYPES_T
274{
275 IT_NOT_IP = AF_UNSPEC, IT_IPV4 = AF_INET, IT_IPV6 = AF_INET6
277int validate_ip_addr(const char *ip_addr);
278
279int test_connect(struct addrinfo *ai_ptr, int *err);
280int test_bind(struct addrinfo *ai_ptr, int *err);
281
282typedef union _sau_t
283{
284 struct sockaddr *sa;
285 struct sockaddr_in *sin;
286 struct sockaddr_in6 *sin6;
287 struct sockaddr_storage *ss;
289
290typedef union _sau_static_t
291{
292 struct sockaddr sa;
293 struct sockaddr_in sin;
294 struct sockaddr_in6 sin6;
295 struct sockaddr_storage ss;
297
298void show_sa(struct sockaddr *sa, char *buf, int buf_sz);
299void show_ai_list(struct addrinfo *ai_list);
300
301struct addrinfo* tcp_get_addr_info(char *addr, char *service, int family, int slave, int *err); //struct addrinfo in #include <netdb.h>
302
303int max_sockadddr_sz(void);
304int conn_nonb(int fd, struct sockaddr *sa, int sa_len, uint64_t timeout, int *err);
305
306int check_rs_speed(int sp);
307
308//types and prototypes for configure TCP/RTU connection -------------------------
316typedef enum _CONN_ROLE_T
317{
320typedef enum _CONN_TYPE_T
321{
324
325typedef struct _conn_param_t
326{
327 char *id;
331 union
332 {
333 struct
334 {
335 char *node;
336 char *serv;
337 IP_TYPES_T ip_type; //IT_NOT_IP, IT_IPV4, IT_IPV6
342 struct
343 {
344 char *dev;
345 int speed;
346 //int err;
347 int cd;
348 int dtr;
349 int dsr;
350 int cts;
351 int rts;
353 };
355
356conn_params_t* parse_conn_params(char *params);
358int fill_sockaddr_sinx(conn_params_t *c_p, int *err);
359//types and prototypes for configure TCP/RTU connection ==============================
360
361#ifndef ARGP_KEY_ARG
362#define ARGP_KEY_ARG 0
363#define ARGP_KEY_ARGS 0x1000006
364#define ARGP_KEY_END 0x1000001
365#define ARGP_KEY_NO_ARGS 0x1000002
366#define ARGP_KEY_INIT 0x1000003
367#define ARGP_KEY_FINI 0x1000007
368#define ARGP_KEY_SUCCESS 0x1000004
369#define ARGP_KEY_ERROR 0x1000005
370#endif
371
372const char* argp_std_key_name(int par);
373
374int wait_read_fd(int fd, uint64_t timeout, int *err);
375int wait_write_fd(int fd, uint64_t timeout, int *err);
376
377int bytes_of_bits(int bits);
378
379char* conn_role_name(int cr);
380
381void setnonblocking(int sock);
382void set_fd_cloexec(int fd);
383int set_reuseaddr(int fd);
384
385#define DATA_STR_SZ (64)
386char* time64_to_str(uint64_t tm, char *buf);
387
388const char* ps_error_text(int error);
389
390int press_enter(char *msg, char *cmp_str);
391
392int file_check_exist(char *fl_name);
393int64_t file_fd_size(int fd);
394int64_t file_size(const char *filename);
395
396int parse_array(void *dst, void *src, int cnt, int sz);
397
402#define ARGP_FIRST_LONG_OPT (0x100)
403
407#define ARGP_PARAM_NOMEM(PCFG, VAR, MSG) \
408 do { if (VAR == NULL) { \
409 MB_DBG(" param error: " MSG); \
410 PCFG->err = 1; \
411 return ARGP_ERR_UNKNOWN; \
412 }} while (0)
413
414int pid_exist(pid_t pid);
415
416void* el_compare_mem_prepare(void *mem, int mem_sz);
417int el_compare_mem_do(void *mem, int mem_sz, void *copy);
418#define COMPARE_MEM_PREPARE(MEMAS) el_compare_mem_prepare(MEMAS, sizeof(MEMAS))
419#define COMPARE_MEM_DO(MEMAS, COPY) el_compare_mem_do(MEMAS, sizeof(*MEMAS), COPY)
420
421long ps_pagesize(void);
422
423typedef struct
424{
425 unsigned long size, resident, share, text, lib, data, dt;
426} statm_t;
427void read_off_memory_status(statm_t *result);
428#define MB_MEMORY_STATUS() do { statm_t stm = { 0 }; read_off_memory_status(&stm); \
429 MB_DBG("MemStat: virt %lu(%luk), resident %lu(%luk), share %lu(%luk), text %lu(%luk), lib %lu(%luk), data %lu(%luk), dt %lu(%luk)\n", \
430 stm.size, stm.size/1024, stm.resident, stm.resident/1024, stm.share, stm.share/1024, stm.text, stm.text/1024, \
431 stm.lib, stm.lib/1024, stm.data, stm.data/1024, stm.dt, stm.dt/1024); \
432} while (0)
433
434//MODBUS CRC16
435uint16_t modbus_crc16(uint8_t *buffer, uint16_t buffer_length);
436int ps_put_mem(char *file_name, void *mem_ptr, int mem_sz);
437char* get_n_bytes(const char *str, int pos, int cnt);
438
439char* find_free_name_num(char *name);
440
441//ryba fish
442//#pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
443//#pragma GCC diagnostic ignored "-Wformat="
444//comment: do ignored "-Wpointer-to-int-cast"
445//#pragma GCC diagnostic pop
446
453#define CHECK_GET_OBJ_STRING(FROM, NAME, OBJ, TARGET, FIELD, EXIT) \
454{ \
455 struct json_object *OBJ; \
456 if (!json_object_object_get_ex(FROM, NAME, &OBJ)) { \
457 MB_DBG("Cannot get '%s' object\n", NAME); \
458 goto EXIT; \
459 } \
460 if (json_object_get_type(OBJ) != json_type_string) { \
461 MB_DBG("Bad type of object '%s': '%s'\n", NAME, json_object_to_json_string(OBJ)); \
462 goto EXIT; \
463 } \
464 TARGET->FIELD = strdup(json_object_get_string(OBJ)); \
465 if (TARGET->FIELD == NULL) { \
466 goto EXIT; \
467 } \
468}
477#define CHECK_GET_OBJ_STRING_NULL(FROM, NAME, OBJ, TARGET, FIELD, EXIT) \
478{ \
479 TARGET->FIELD = NULL; \
480 struct json_object *OBJ; \
481 if (json_object_object_get_ex(FROM, NAME, &OBJ)) { \
482 if (json_object_get_type(OBJ) != json_type_string) { \
483 MB_DBG("Bad type of object '%s': '%s'\n", NAME, json_object_to_json_string(OBJ)); \
484 goto EXIT; \
485 } \
486 const char *t_str = json_object_get_string(OBJ); \
487 if (t_str == NULL) { \
488 TARGET->FIELD = NULL; \
489 } \
490 else { \
491 TARGET->FIELD = strdup(t_str); \
492 if (TARGET->FIELD == NULL) { \
493 MB_DBG("Can't dup '%s'\n", NAME); \
494 goto EXIT; \
495 } \
496 } \
497 } \
498}
499#define CHECK_GET_OBJ_INT(FROM, NAME, OBJ, TARGET, FIELD, EXIT) \
500{ \
501 struct json_object *OBJ; \
502 if (!json_object_object_get_ex(FROM, NAME, &OBJ)) { \
503 MB_DBG("Cannot get '%s' object\n", NAME); \
504 goto EXIT; \
505 } \
506 if (json_object_get_type(OBJ) != json_type_int) { \
507 MB_DBG("Bad type of object '%s': '%s'\n", NAME, json_object_to_json_string(OBJ)); \
508 goto EXIT; \
509 } \
510 TARGET->FIELD = json_object_get_int(OBJ); \
511}
512
513char* mk_indent(int level);
514void free_array(void **arr, int cnt);
515
516char* build_msg_with_prev(const char *prev_msg, const char *format, ...);
517
518#define BUILD_MSG_WITH_PREV(PREV, SHOW, FORMAT, ...) do { \
519 char *t_str = NULL; \
520 t_str = build_msg_with_prev(PREV, FORMAT, ## __VA_ARGS__); \
521 if (SHOW) { \
522 MB_DBG("%s\n", t_str); \
523 } \
524 if (PREV) free(PREV); \
525 if (err_msg) { \
526 *err_msg = t_str; \
527 } \
528 else { \
529 free(t_str); \
530 } \
531} while (0)
532
534#endif /* EL_UTILS_H_ */
#define __END_DECLS
Definition: c_decls.h:10
#define __BEGIN_DECLS
Definition: c_decls.h:9
int get_serial_cts(int fd)
Definition: el_utils.c:331
void show_sa(struct sockaddr *sa, char *buf, int buf_sz)
Definition: el_utils.c:601
long ps_pagesize(void)
Definition: el_utils.c:1716
void show_serial_stat(int fd)
Definition: el_utils.c:356
int ps_put_mem(char *file_name, void *mem_ptr, int mem_sz)
put memory to file
Definition: el_utils.c:1820
void * el_compare_mem_prepare(void *mem, int mem_sz)
Definition: el_utils.c:1672
struct addrinfo * tcp_get_addr_info(char *addr, char *service, int family, int slave, int *err)
Definition: el_utils.c:732
int get_serial_dtr(int fd)
Definition: el_utils.c:295
char * get_sock_type_name(int sock_type)
Definition: el_utils.c:483
void show_ai_list(struct addrinfo *ai_list)
Definition: el_utils.c:638
enum _CONN_ROLE_T CONN_ROLE_T
configure connection parameters
int wait_read_fd(int fd, uint64_t timeout, int *err)
wait ready for read
Definition: el_utils.c:1100
char * get_serial_cts_s(int fd)
Definition: el_utils.c:337
void set_fd_cloexec(int fd)
Definition: el_utils.c:1206
void set_termination_action(void)
Definition: el_utils.c:218
int conn_nonb(int fd, struct sockaddr *sa, int sa_len, uint64_t timeout, int *err)
Definition: el_utils.c:788
void set_serial_stat_ln(int fd, int ln_bt, int val)
Definition: el_utils.c:368
void el_set_ctrlc_call(el_ctrlc_call_t arg)
Definition: el_utils.c:198
int pid_exist(pid_t pid)
check existance process(thread) with pid
Definition: el_utils.c:1640
int get_serial_dsr(int fd)
Definition: el_utils.c:307
int set_reuseaddr(int fd)
Definition: el_utils.c:1213
char * get_family_name(int family)
return name of IPvX family
Definition: el_utils.c:472
void read_off_memory_status(statm_t *result)
Definition: el_utils.c:1755
enum _CONN_TYPE_T CONN_TYPE_T
void(* el_ctrlc_call_t)(void *ar)
Definition: el_utils.h:234
int64_t file_size(const char *filename)
Definition: el_utils.c:1590
char * conn_role_name(int cr)
Definition: el_utils.c:1173
int get_serial_stat(int fd)
Definition: el_utils.c:273
union _sau_static_t sau_static_t
int file_check_exist(char *fl_name)
check file
Definition: el_utils.c:1559
void termination_handler(int signum)
Definition: el_utils.c:167
conn_params_t * parse_conn_params(char *params)
parch string with connection parameters and fill struct conn_param_t
Definition: el_utils.c:884
int get_serial_rts(int fd)
Definition: el_utils.c:319
char * get_n_bytes(const char *str, int pos, int cnt)
malloc buf of cnt+1 bytes and cope there bytes from str+pos AS IS
Definition: el_utils.c:1846
int bytes_of_bits(int bits)
Definition: el_utils.c:1168
void free_array(void **arr, int cnt)
Definition: el_utils.c:1946
void setnonblocking(int sock)
Definition: el_utils.c:1192
const char * argp_std_key_name(int par)
Definition: el_utils.c:1070
int64_t file_fd_size(int fd)
Definition: el_utils.c:1580
char * get_serial_dsr_s(int fd)
Definition: el_utils.c:313
void el_set_ctrlc_param(void *arg)
Definition: el_utils.c:194
void el_set_ctrlc_exit(int ex)
if parameter != 0 set var to TRUE: on Ctrl-C exit. if == 0 dsont exit.
Definition: el_utils.c:190
int max_sockadddr_sz(void)
Definition: el_utils.c:778
#define TENS_GIGA
Definition: el_utils.h:117
int el_compare_mem_do(void *mem, int mem_sz, void *copy)
Definition: el_utils.c:1683
static uint64_t get_time_nano(void)
Definition: el_utils.h:129
void dbg_string_list(char **string_list)
show NULL terminated list (array) of strings
Definition: el_utils.c:455
_IP_TYPES_T
Definition: el_utils.h:274
@ IT_IPV4
Definition: el_utils.h:275
@ IT_NOT_IP
Definition: el_utils.h:275
@ IT_IPV6
Definition: el_utils.h:275
char ** split_string(char *str, char delem, int *number)
split string into words by delimeter, heading/trailing WhiteSpaces prohibited, possible empty words s...
Definition: el_utils.c:400
int fill_sockaddr_sinx(conn_params_t *c_p, int *err)
Definition: el_utils.c:1052
_CONN_TYPE_T
Definition: el_utils.h:321
@ CT_RTU
Definition: el_utils.h:322
@ CT_TCP
Definition: el_utils.h:322
int wait_write_fd(int fd, uint64_t timeout, int *err)
Definition: el_utils.c:1133
char * get_serial_dtr_s(int fd)
Definition: el_utils.c:301
int parse_array(void *dst, void *src, int cnt, int sz)
parse array of strings values into array of 'sz' size elements
Definition: el_utils.c:1601
union _sau_t sau_t
char * mk_indent(int level)
Definition: el_utils.c:1932
int validate_ip_addr(const char *ip_addr)
check is string is IPv4 or IPv6 or smth else
Definition: el_utils.c:520
int press_enter(char *msg, char *cmp_str)
Definition: el_utils.c:1523
int check_rs_speed(int sp)
Definition: el_utils.c:861
char * find_free_name_num(char *name)
Definition: el_utils.c:1875
struct _conn_param_t conn_params_t
char * time64_to_str(uint64_t tm, char *buf)
Definition: el_utils.c:1233
_CONN_ROLE_T
configure connection parameters
Definition: el_utils.h:317
@ CR_NOTHING
Definition: el_utils.h:318
@ CR_GATE
Definition: el_utils.h:318
@ CR_NODE
Definition: el_utils.h:318
@ CR_SLAVE
Definition: el_utils.h:318
@ CR_MASTER
Definition: el_utils.h:318
int test_bind(struct addrinfo *ai_ptr, int *err)
Definition: el_utils.c:570
void termination_sigaction(int signum, siginfo_t *siginfo, void *param)
Definition: el_utils.c:202
enum _IP_TYPES_T IP_TYPES_T
int test_connect(struct addrinfo *ai_ptr, int *err)
Definition: el_utils.c:546
void set_serial_stat(int fd, int serial)
Definition: el_utils.c:284
uint16_t modbus_crc16(uint8_t *buffer, uint16_t buffer_length)
Definition: el_utils.c:1795
char * get_serial_rts_s(int fd)
Definition: el_utils.c:325
const char * ps_error_text(int error)
Definition: el_utils.c:1252
static uint64_t timespec_diff(struct timespec *ts1, struct timespec *ts2)
Definition: el_utils.h:124
char * build_msg_with_prev(const char *prev_msg, const char *format,...)
Definition: el_utils.c:1956
int cnt_splited_strings(char **ss)
Definition: el_utils.c:438
size_t strlcpy(char *dst, const char *src, size_t dstSize)
Definition: el_utils.c:97
void free_conn_param(conn_params_t *c_p)
Definition: el_utils.c:1029
int set_stdin_nowait_cr(int nowait)
Definition: el_utils.c:127
pthread_rwlockattr_t * el_get_rw_shared_attr(void)
Definition: el_utils.c:63
void set_restore_stdin_cr(void)
Definition: el_utils.c:162
header library for kernel's like lists of any type structs
Definition: el_utils.h:326
struct _conn_param_t::@0::@3 rtu
int speed
serial device /dev/ttyS1, /dev/ttyUSB1
Definition: el_utils.h:345
int dtr
0,0x30,0x31 -->no change, set low, set HIGH
Definition: el_utils.h:348
sau_static_t sau
Definition: el_utils.h:340
int dsr
0,0x30,0x31 -->no change, set low, set HIGH
Definition: el_utils.h:349
CONN_ROLE_T cn_role
connection identificator
Definition: el_utils.h:328
int family
Definition: el_utils.h:338
int cts
0,0x30,0x31 -->no change, set low, set HIGH
Definition: el_utils.h:350
int cd
connection speed 9600, 57600, 115200
Definition: el_utils.h:347
int slave_id
connection role master?slave CR_MASTER/CR_SLAVE
Definition: el_utils.h:329
char * node
Definition: el_utils.h:335
int sa_len
Definition: el_utils.h:339
int rts
0,0x30,0x31 -->no change, set low, set HIGH
Definition: el_utils.h:351
CONN_TYPE_T cn_type
Definition: el_utils.h:330
char * dev
Definition: el_utils.h:344
struct _conn_param_t::@0::@2 tcp
IP_TYPES_T ip_type
service : "80", "http"
Definition: el_utils.h:337
char * id
Definition: el_utils.h:327
char * serv
node: "1.2.3.4", "::1", "mail.ru"
Definition: el_utils.h:336
Definition: el_utils.h:424
unsigned long data
Definition: el_utils.h:425
Definition: el_utils.h:291
struct sockaddr_in6 sin6
Definition: el_utils.h:294
struct sockaddr sa
Definition: el_utils.h:292
struct sockaddr_in sin
Definition: el_utils.h:293
struct sockaddr_storage ss
Definition: el_utils.h:295
Definition: el_utils.h:283
struct sockaddr_in6 * sin6
Definition: el_utils.h:286
struct sockaddr_storage * ss
Definition: el_utils.h:287
struct sockaddr_in * sin
Definition: el_utils.h:285
struct sockaddr * sa
Definition: el_utils.h:284