Skip to content

Commit 8689deb

Browse files
committed
Fix modbus connection flow on an atempt failure
1 parent 4f0e440 commit 8689deb

File tree

1 file changed

+31
-15
lines changed

1 file changed

+31
-15
lines changed

src/iface-modbus.c

+31-15
Original file line numberDiff line numberDiff line change
@@ -141,22 +141,11 @@ static modbus_t *create_ctx(const char *url)
141141
}
142142
}
143143

144-
static void destroy_ctx(modbus_t *ctx)
145-
{
146-
modbus_close(ctx);
147-
modbus_free(ctx);
148-
}
149-
150144
static void on_disconnected(struct l_io *io, void *user_data)
151145
{
152-
modbus_close(modbus_ctx);
153-
154146
if (disconn_cb)
155147
disconn_cb(user_data);
156148

157-
l_io_destroy(modbus_io);
158-
modbus_io = NULL;
159-
160149
if (connect_to)
161150
l_timeout_modify(connect_to, RECONNECT_TIMEOUT);
162151
}
@@ -165,20 +154,44 @@ static void attempt_connect(struct l_timeout *to, void *user_data)
165154
{
166155
l_debug("Trying to connect to Modbus");
167156

157+
/* Check and close if a connection is already up */
158+
if (modbus_get_socket(modbus_ctx) != -1)
159+
modbus_close(modbus_ctx);
160+
161+
/* Check and destroy if an IO is already allocated */
162+
if (modbus_io) {
163+
l_io_destroy(modbus_io);
164+
modbus_io = NULL;
165+
}
166+
168167
if (modbus_connect(modbus_ctx) < 0) {
169168
l_error("error connecting to Modbus: %s",
170169
modbus_strerror(errno));
171-
l_timeout_modify(to, RECONNECT_TIMEOUT);
172-
return;
170+
goto retry;
173171
}
174172

175173
modbus_io = l_io_new(modbus_get_socket(modbus_ctx));
174+
if (!modbus_io)
175+
goto connection_close;
176+
176177
if (!l_io_set_disconnect_handler(modbus_io, on_disconnected, NULL,
177-
NULL))
178+
NULL)) {
178179
l_error("Couldn't set Modbus disconnect handler");
180+
goto io_destroy;
181+
}
179182

180183
if (conn_cb)
181184
conn_cb(user_data);
185+
186+
return;
187+
188+
io_destroy:
189+
l_io_destroy(modbus_io);
190+
modbus_io = NULL;
191+
connection_close:
192+
modbus_close(modbus_ctx);
193+
retry:
194+
l_timeout_modify(to, RECONNECT_TIMEOUT);
182195
}
183196

184197
int iface_modbus_read_data(int reg_addr, int bit_offset, knot_value_type *out)
@@ -257,5 +270,8 @@ void iface_modbus_stop(void)
257270
connect_to = NULL;
258271

259272
l_io_destroy(modbus_io);
260-
destroy_ctx(modbus_ctx);
273+
modbus_io = NULL;
274+
275+
modbus_close(modbus_ctx);
276+
modbus_free(modbus_ctx);
261277
}

0 commit comments

Comments
 (0)