24#include <linux/limits.h>
34#include <json-c/json.h>
40# pragma message ("in IDE")
44#include <sys/syscall.h>
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
89#define CLOSE_FD(FD) close(FD); FD = ERROR_FD
92#include <sys/syscall.h>
103#define EL_WRONG_PTR (void*)(0)
111# define ARRAY_SIZE(foo) (sizeof(foo)/sizeof(foo[0]))
115#define TENS_KILO 1000LL
116#define TENS_MEGA 1000000LL
117#define TENS_GIGA 1000000000LL
124static inline uint64_t
timespec_diff(
struct timespec *ts1,
struct timespec *ts2)
126 return ((uint64_t) ts2->tv_sec - (uint64_t) ts1->tv_sec) *
TENS_GIGA + (uint64_t) ts2->tv_nsec - (uint64_t) ts1->tv_nsec;
132 clock_gettime(CLOCK_REALTIME, &ts);
133 return (uint64_t) ts.tv_sec *
TENS_GIGA + (uint64_t) ts.tv_nsec;
141#define MB_DBG(fmt, ...) do { \
142 struct timespec DBG_ts; \
143 clock_gettime(CLOCK_REALTIME, &DBG_ts); \
144 struct tm DBG_loc_time; \
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__); \
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; \
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); \
165#define MB_DUMP_BUF_SZ 120
167#define MB_DUMP_BUF(DATA_PTR, DATA_SZ, fmt, ...) \
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; \
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++; \
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; \
203 MB_DBG("===================================================================\n"); \
208# define MB_DBG(x, ...)
209# define MB_DUMP_BUF(DATA_PTR, DATA_SZ, fmt, ...)
212#define MB_DEBUG(DBG_FLAG,FMT, ...) if (DBG_FLAG) { \
213 MB_DBG(FMT, ## __VA_ARGS__); \
217# define NO_HAVE_STRLCPY
218size_t strlcpy(
char *dst,
const char *src,
size_t dstSize);
220# undef NO_HAVE_STRLCPY
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; } }
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)
280int test_bind(
struct addrinfo *ai_ptr,
int *err);
287 struct sockaddr_storage *
ss;
295 struct sockaddr_storage
ss;
298void show_sa(
struct sockaddr *sa,
char *buf,
int buf_sz);
301struct addrinfo*
tcp_get_addr_info(
char *addr,
char *service,
int family,
int slave,
int *err);
304int conn_nonb(
int fd,
struct sockaddr *sa,
int sa_len, uint64_t timeout,
int *err);
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
385#define DATA_STR_SZ (64)
396int parse_array(
void *dst,
void *src,
int cnt,
int sz);
402#define ARGP_FIRST_LONG_OPT (0x100)
407#define ARGP_PARAM_NOMEM(PCFG, VAR, MSG) \
408 do { if (VAR == NULL) { \
409 MB_DBG(" param error: " MSG); \
411 return ARGP_ERR_UNKNOWN; \
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)
425 unsigned long size, resident, share, text, lib,
data, dt;
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); \
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);
453#define CHECK_GET_OBJ_STRING(FROM, NAME, OBJ, TARGET, FIELD, EXIT) \
455 struct json_object *OBJ; \
456 if (!json_object_object_get_ex(FROM, NAME, &OBJ)) { \
457 MB_DBG("Cannot get '%s' object\n", NAME); \
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)); \
464 TARGET->FIELD = strdup(json_object_get_string(OBJ)); \
465 if (TARGET->FIELD == NULL) { \
477#define CHECK_GET_OBJ_STRING_NULL(FROM, NAME, OBJ, TARGET, FIELD, EXIT) \
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)); \
486 const char *t_str = json_object_get_string(OBJ); \
487 if (t_str == NULL) { \
488 TARGET->FIELD = NULL; \
491 TARGET->FIELD = strdup(t_str); \
492 if (TARGET->FIELD == NULL) { \
493 MB_DBG("Can't dup '%s'\n", NAME); \
499#define CHECK_GET_OBJ_INT(FROM, NAME, OBJ, TARGET, FIELD, EXIT) \
501 struct json_object *OBJ; \
502 if (!json_object_object_get_ex(FROM, NAME, &OBJ)) { \
503 MB_DBG("Cannot get '%s' object\n", NAME); \
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)); \
510 TARGET->FIELD = json_object_get_int(OBJ); \
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__); \
522 MB_DBG("%s\n", t_str); \
524 if (PREV) free(PREV); \
#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
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