From 31afd2aaaeb76a12e232eab0fb6a550b73948737 Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Mon, 22 Jun 2020 10:50:15 +0200 Subject: Make struct cfg global and make the corresponding changes throughout --- rcon.c | 125 ++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 62 insertions(+), 63 deletions(-) (limited to 'rcon.c') diff --git a/rcon.c b/rcon.c index dc29364..0588da0 100644 --- a/rcon.c +++ b/rcon.c @@ -22,36 +22,6 @@ struct rcon { struct uring_task_buf tbuf; }; -static void -rcon_free(struct uring_task *task) -{ - struct rcon *rcon = container_of(task, struct rcon, task); - - assert_return(task); - - debug(DBG_RCON, "task %p, idle %p", task, rcon); - rcon->server->rcon = NULL; - xfree(rcon); -} - -void -rcon_refdump(struct rcon *rcon) -{ - assert_return_silent(rcon); - - uring_task_refdump(&rcon->task); -} - -void -rcon_delete(struct cfg *cfg, struct server *server) -{ - assert_return_silent(server->rcon); - - debug(DBG_RCON, "closing fd %i", server->rcon->task.fd); - uring_task_destroy(cfg, &server->rcon->task); - server->rcon = NULL; -} - static int32_t read_int(char **pos, size_t *len) { @@ -134,12 +104,12 @@ enum rcon_packet_type { }; static void -create_packet(struct cfg *cfg, struct rcon *rcon, int32_t reqid, +create_packet(struct rcon *rcon, int32_t reqid, enum rcon_packet_type type, const char *msg) { char *pos; - assert_return(cfg && rcon && !empty_str(msg)); + assert_return(rcon && !empty_str(msg)); /* Body */ pos = &rcon->tbuf.buf[4]; @@ -159,13 +129,13 @@ create_packet(struct cfg *cfg, struct rcon *rcon, int32_t reqid, } static int -packet_complete(struct cfg *cfg, struct uring_task *task, int res) +packet_complete(struct uring_task *task, int res) { char *pos; size_t len; int32_t plen; - assert_return(cfg && task, 0); + assert_return(task, 0); assert_task_alive_or(DBG_RCON, task, return -EINTR); pos = task->tbuf->buf; @@ -184,14 +154,14 @@ packet_complete(struct cfg *cfg, struct uring_task *task, int res) } static bool -rcon_read_packet(struct cfg *cfg, struct rcon *rcon, int32_t *id, +rcon_read_packet(struct rcon *rcon, int32_t *id, int32_t *type, char **rmsg) { char *pos; size_t len; int32_t plen; - assert_return(cfg && rcon && id && type && rmsg, false); + assert_return(rcon && id && type && rmsg, false); pos = rcon->tbuf.buf; len = rcon->tbuf.len; @@ -229,14 +199,14 @@ rcon_read_packet(struct cfg *cfg, struct rcon *rcon, int32_t *id, } static void -rcon_stop_reply(struct cfg *cfg, struct uring_task *task, int res) +rcon_stop_reply(struct uring_task *task, int res) { struct rcon *rcon = container_of(task, struct rcon, task); int32_t id; int32_t type; char *msg; - assert_return(cfg && task); + assert_return(task); assert_task_alive(DBG_RCON, task); if (res < 0) { @@ -245,7 +215,7 @@ rcon_stop_reply(struct cfg *cfg, struct uring_task *task, int res) } debug(DBG_RCON, "packet complete"); - rcon_read_packet(cfg, rcon, &id, &type, &msg); + rcon_read_packet(rcon, &id, &type, &msg); if (id != 2) { error("rcon stop failed - reply id (%" PRIi32 ")", id); @@ -258,36 +228,36 @@ rcon_stop_reply(struct cfg *cfg, struct uring_task *task, int res) verbose("rcon stop successful (%s)", msg); out: - uring_task_put(cfg, &rcon->task); + uring_task_put(&rcon->task); } static void -rcon_stop_sent(struct cfg *cfg, struct uring_task *task, int res) +rcon_stop_sent(struct uring_task *task, int res) { struct rcon *rcon = container_of(task, struct rcon, task); - assert_return(cfg && task); + assert_return(task); assert_task_alive(DBG_RCON, task); if (res < 0) { debug(DBG_RCON, "res: %i", res); - uring_task_put(cfg, &rcon->task); + uring_task_put(&rcon->task); return; } debug(DBG_RCON, "stop cmd sent"); - uring_tbuf_read_until(cfg, &rcon->task, packet_complete, rcon_stop_reply); + uring_tbuf_read_until(&rcon->task, packet_complete, rcon_stop_reply); } static void -rcon_login_reply(struct cfg *cfg, struct uring_task *task, int res) +rcon_login_reply(struct uring_task *task, int res) { struct rcon *rcon = container_of(task, struct rcon, task); int32_t id; int32_t type; char *msg; - assert_return(cfg && task); + assert_return(task); assert_task_alive(DBG_RCON, task); if (res < 0) { @@ -296,7 +266,7 @@ rcon_login_reply(struct cfg *cfg, struct uring_task *task, int res) } debug(DBG_RCON, "packet complete"); - rcon_read_packet(cfg, rcon, &id, &type, &msg); + rcon_read_packet(rcon, &id, &type, &msg); if (id != 1) { error("rcon login failed - unexpected reply id (%" PRIi32 ")", id); @@ -310,66 +280,95 @@ rcon_login_reply(struct cfg *cfg, struct uring_task *task, int res) } debug(DBG_RCON, "rcon login successful"); - create_packet(cfg, rcon, 2, RCON_PACKET_COMMAND, "stop"); - uring_tbuf_write(cfg, &rcon->task, rcon_stop_sent); + create_packet(rcon, 2, RCON_PACKET_COMMAND, "stop"); + uring_tbuf_write(&rcon->task, rcon_stop_sent); return; error: - uring_task_put(cfg, &rcon->task); + uring_task_put(&rcon->task); } static void -rcon_login_sent(struct cfg *cfg, struct uring_task *task, int res) +rcon_login_sent(struct uring_task *task, int res) { struct rcon *rcon = container_of(task, struct rcon, task); - assert_return(cfg && task); + assert_return(task); assert_task_alive(DBG_RCON, task); if (res < 0) { debug(DBG_RCON, "res: %i", res); - uring_task_put(cfg, &rcon->task); + uring_task_put(&rcon->task); return; } debug(DBG_RCON, "login sent"); - uring_tbuf_read_until(cfg, &rcon->task, packet_complete, rcon_login_reply); + uring_tbuf_read_until(&rcon->task, packet_complete, rcon_login_reply); } static void -rcon_connected_cb(struct cfg *cfg, struct connection *conn, bool connected) +rcon_connected_cb(struct connection *conn, bool connected) { struct rcon *rcon = container_of(conn, struct rcon, conn); - assert_return(cfg && conn); + assert_return(conn); assert_task_alive(DBG_RCON, &rcon->task); if (!connected) { error("rcon connection to remote server (%s) failed", rcon->server->name); - uring_task_put(cfg, &rcon->task); + uring_task_put(&rcon->task); return; } - create_packet(cfg, rcon, 1, RCON_PACKET_LOGIN, rcon->server->rcon_password); - uring_tbuf_write(cfg, &rcon->task, rcon_login_sent); + create_packet(rcon, 1, RCON_PACKET_LOGIN, rcon->server->rcon_password); + uring_tbuf_write(&rcon->task, rcon_login_sent); +} + +static void +rcon_free(struct uring_task *task) +{ + struct rcon *rcon = container_of(task, struct rcon, task); + + assert_return(task); + + debug(DBG_RCON, "task %p, idle %p", task, rcon); + xfree(rcon); +} + +void +rcon_refdump(struct rcon *rcon) +{ + assert_return_silent(rcon); + + uring_task_refdump(&rcon->task); +} + +void +rcon_delete(struct server *server) +{ + assert_return_silent(server->rcon); + + debug(DBG_RCON, "closing fd %i", server->rcon->task.fd); + uring_task_destroy(&server->rcon->task); + server->rcon = NULL; } void -rcon_init(struct cfg *cfg, struct server *server) +rcon_init(struct server *server) { struct rcon *rcon; - assert_return(cfg && server && !list_empty(&server->rcons) && !empty_str(server->rcon_password)); + assert_return(server && !server->rcon && !list_empty(&server->rcons) && !empty_str(server->rcon_password)); rcon = zmalloc(sizeof(*rcon)); if (!rcon) die("malloc: %m"); - uring_task_init(cfg, &rcon->task, "rcon", &server->task, rcon_free); + uring_task_init(&rcon->task, "rcon", &server->task, rcon_free); uring_task_set_buf(&rcon->task, &rcon->tbuf); rcon->server = server; server->rcon = rcon; - connect_any(cfg, &rcon->task, &server->rcons, &rcon->conn, rcon_connected_cb); + connect_any(&rcon->task, &server->rcons, &rcon->conn, rcon_connected_cb); } -- cgit v1.2.3