Commit 541804b30e03919a2cfadef7ab29546acc8f48dc
1 parent
37ed6f90
Dynamic memory allocation of device name (closes #11)
Showing
5 changed files
with
26 additions
and
26 deletions
src/modbus-private.h
| @@ -111,6 +111,7 @@ typedef struct _modbus_backend { | @@ -111,6 +111,7 @@ typedef struct _modbus_backend { | ||
| 111 | void (*close) (modbus_t *ctx); | 111 | void (*close) (modbus_t *ctx); |
| 112 | int (*flush) (modbus_t *ctx); | 112 | int (*flush) (modbus_t *ctx); |
| 113 | int (*select) (modbus_t *ctx, fd_set *rset, struct timeval *tv, int msg_length); | 113 | int (*select) (modbus_t *ctx, fd_set *rset, struct timeval *tv, int msg_length); |
| 114 | + void (*free) (modbus_t *ctx); | ||
| 114 | } modbus_backend_t; | 115 | } modbus_backend_t; |
| 115 | 116 | ||
| 116 | struct _modbus { | 117 | struct _modbus { |
src/modbus-rtu-private.h
| @@ -59,16 +59,8 @@ struct win32_ser { | @@ -59,16 +59,8 @@ struct win32_ser { | ||
| 59 | #endif /* _WIN32 */ | 59 | #endif /* _WIN32 */ |
| 60 | 60 | ||
| 61 | typedef struct _modbus_rtu { | 61 | typedef struct _modbus_rtu { |
| 62 | - /* Device: "/dev/ttyS0", "/dev/ttyUSB0" or "/dev/tty.USA19*" on Mac OS X for | ||
| 63 | - KeySpan USB<->Serial adapters this string had to be made bigger on OS X | ||
| 64 | - as the directory+file name was bigger than 19 bytes. Making it 67 bytes | ||
| 65 | - for now, but OS X does support 256 byte file names. May become a problem | ||
| 66 | - in the future. */ | ||
| 67 | -#if defined(__APPLE_CC__) | ||
| 68 | - char device[64]; | ||
| 69 | -#else | ||
| 70 | - char device[16]; | ||
| 71 | -#endif | 62 | + /* Device: "/dev/ttyS0", "/dev/ttyUSB0" or "/dev/tty.USA19*" on Mac OS X. */ |
| 63 | + char *device; | ||
| 72 | /* Bauds: 9600, 19200, 57600, 115200, etc */ | 64 | /* Bauds: 9600, 19200, 57600, 115200, etc */ |
| 73 | int baud; | 65 | int baud; |
| 74 | /* Data bit */ | 66 | /* Data bit */ |
src/modbus-rtu.c
| @@ -987,6 +987,12 @@ int _modbus_rtu_select(modbus_t *ctx, fd_set *rset, | @@ -987,6 +987,12 @@ int _modbus_rtu_select(modbus_t *ctx, fd_set *rset, | ||
| 987 | return s_rc; | 987 | return s_rc; |
| 988 | } | 988 | } |
| 989 | 989 | ||
| 990 | +void _modbus_rtu_free(modbus_t *ctx) { | ||
| 991 | + free(((modbus_rtu_t*)ctx->backend_data)->device); | ||
| 992 | + free(ctx->backend_data); | ||
| 993 | + free(ctx); | ||
| 994 | +} | ||
| 995 | + | ||
| 990 | const modbus_backend_t _modbus_rtu_backend = { | 996 | const modbus_backend_t _modbus_rtu_backend = { |
| 991 | _MODBUS_BACKEND_TYPE_RTU, | 997 | _MODBUS_BACKEND_TYPE_RTU, |
| 992 | _MODBUS_RTU_HEADER_LENGTH, | 998 | _MODBUS_RTU_HEADER_LENGTH, |
| @@ -1005,7 +1011,8 @@ const modbus_backend_t _modbus_rtu_backend = { | @@ -1005,7 +1011,8 @@ const modbus_backend_t _modbus_rtu_backend = { | ||
| 1005 | _modbus_rtu_connect, | 1011 | _modbus_rtu_connect, |
| 1006 | _modbus_rtu_close, | 1012 | _modbus_rtu_close, |
| 1007 | _modbus_rtu_flush, | 1013 | _modbus_rtu_flush, |
| 1008 | - _modbus_rtu_select | 1014 | + _modbus_rtu_select, |
| 1015 | + _modbus_rtu_free | ||
| 1009 | }; | 1016 | }; |
| 1010 | 1017 | ||
| 1011 | modbus_t* modbus_new_rtu(const char *device, | 1018 | modbus_t* modbus_new_rtu(const char *device, |
| @@ -1014,8 +1021,7 @@ modbus_t* modbus_new_rtu(const char *device, | @@ -1014,8 +1021,7 @@ modbus_t* modbus_new_rtu(const char *device, | ||
| 1014 | { | 1021 | { |
| 1015 | modbus_t *ctx; | 1022 | modbus_t *ctx; |
| 1016 | modbus_rtu_t *ctx_rtu; | 1023 | modbus_rtu_t *ctx_rtu; |
| 1017 | - size_t dest_size; | ||
| 1018 | - size_t ret_size; | 1024 | + size_t device_size; |
| 1019 | 1025 | ||
| 1020 | ctx = (modbus_t *) malloc(sizeof(modbus_t)); | 1026 | ctx = (modbus_t *) malloc(sizeof(modbus_t)); |
| 1021 | _modbus_init_common(ctx); | 1027 | _modbus_init_common(ctx); |
| @@ -1024,21 +1030,16 @@ modbus_t* modbus_new_rtu(const char *device, | @@ -1024,21 +1030,16 @@ modbus_t* modbus_new_rtu(const char *device, | ||
| 1024 | ctx->backend_data = (modbus_rtu_t *) malloc(sizeof(modbus_rtu_t)); | 1030 | ctx->backend_data = (modbus_rtu_t *) malloc(sizeof(modbus_rtu_t)); |
| 1025 | ctx_rtu = (modbus_rtu_t *)ctx->backend_data; | 1031 | ctx_rtu = (modbus_rtu_t *)ctx->backend_data; |
| 1026 | 1032 | ||
| 1027 | - dest_size = sizeof(ctx_rtu->device); | ||
| 1028 | - ret_size = strlcpy(ctx_rtu->device, device, dest_size); | ||
| 1029 | - if (ret_size == 0) { | 1033 | + device_size = sizeof(device); |
| 1034 | + if (device_size == 0) { | ||
| 1030 | fprintf(stderr, "The device string is empty\n"); | 1035 | fprintf(stderr, "The device string is empty\n"); |
| 1031 | modbus_free(ctx); | 1036 | modbus_free(ctx); |
| 1032 | errno = EINVAL; | 1037 | errno = EINVAL; |
| 1033 | return NULL; | 1038 | return NULL; |
| 1034 | } | 1039 | } |
| 1035 | 1040 | ||
| 1036 | - if (ret_size >= dest_size) { | ||
| 1037 | - fprintf(stderr, "The device string has been truncated\n"); | ||
| 1038 | - modbus_free(ctx); | ||
| 1039 | - errno = EINVAL; | ||
| 1040 | - return NULL; | ||
| 1041 | - } | 1041 | + ctx_rtu->device = (char *) malloc(device_size); |
| 1042 | + strcpy(ctx_rtu->device, device); | ||
| 1042 | 1043 | ||
| 1043 | ctx_rtu->baud = baud; | 1044 | ctx_rtu->baud = baud; |
| 1044 | if (parity == 'N' || parity == 'E' || parity == 'O') { | 1045 | if (parity == 'N' || parity == 'E' || parity == 'O') { |
src/modbus-tcp.c
| @@ -654,6 +654,11 @@ int _modbus_tcp_select(modbus_t *ctx, fd_set *rset, struct timeval *tv, int leng | @@ -654,6 +654,11 @@ int _modbus_tcp_select(modbus_t *ctx, fd_set *rset, struct timeval *tv, int leng | ||
| 654 | return s_rc; | 654 | return s_rc; |
| 655 | } | 655 | } |
| 656 | 656 | ||
| 657 | +void _modbus_tcp_free(modbus_t *ctx) { | ||
| 658 | + free(ctx->backend_data); | ||
| 659 | + free(ctx); | ||
| 660 | +} | ||
| 661 | + | ||
| 657 | const modbus_backend_t _modbus_tcp_backend = { | 662 | const modbus_backend_t _modbus_tcp_backend = { |
| 658 | _MODBUS_BACKEND_TYPE_TCP, | 663 | _MODBUS_BACKEND_TYPE_TCP, |
| 659 | _MODBUS_TCP_HEADER_LENGTH, | 664 | _MODBUS_TCP_HEADER_LENGTH, |
| @@ -672,7 +677,8 @@ const modbus_backend_t _modbus_tcp_backend = { | @@ -672,7 +677,8 @@ const modbus_backend_t _modbus_tcp_backend = { | ||
| 672 | _modbus_tcp_connect, | 677 | _modbus_tcp_connect, |
| 673 | _modbus_tcp_close, | 678 | _modbus_tcp_close, |
| 674 | _modbus_tcp_flush, | 679 | _modbus_tcp_flush, |
| 675 | - _modbus_tcp_select | 680 | + _modbus_tcp_select, |
| 681 | + _modbus_tcp_free | ||
| 676 | }; | 682 | }; |
| 677 | 683 | ||
| 678 | 684 | ||
| @@ -694,7 +700,8 @@ const modbus_backend_t _modbus_tcp_pi_backend = { | @@ -694,7 +700,8 @@ const modbus_backend_t _modbus_tcp_pi_backend = { | ||
| 694 | _modbus_tcp_pi_connect, | 700 | _modbus_tcp_pi_connect, |
| 695 | _modbus_tcp_close, | 701 | _modbus_tcp_close, |
| 696 | _modbus_tcp_flush, | 702 | _modbus_tcp_flush, |
| 697 | - _modbus_tcp_select | 703 | + _modbus_tcp_select, |
| 704 | + _modbus_tcp_free | ||
| 698 | }; | 705 | }; |
| 699 | 706 | ||
| 700 | modbus_t* modbus_new_tcp(const char *ip, int port) | 707 | modbus_t* modbus_new_tcp(const char *ip, int port) |
src/modbus.c
| @@ -1462,8 +1462,7 @@ void modbus_free(modbus_t *ctx) | @@ -1462,8 +1462,7 @@ void modbus_free(modbus_t *ctx) | ||
| 1462 | if (ctx == NULL) | 1462 | if (ctx == NULL) |
| 1463 | return; | 1463 | return; |
| 1464 | 1464 | ||
| 1465 | - free(ctx->backend_data); | ||
| 1466 | - free(ctx); | 1465 | + ctx->backend->free(ctx); |
| 1467 | } | 1466 | } |
| 1468 | 1467 | ||
| 1469 | void modbus_set_debug(modbus_t *ctx, int boolean) | 1468 | void modbus_set_debug(modbus_t *ctx, int boolean) |