diff --git a/src/server.c b/src/server.c index ce41d66..069e507 100644 --- a/src/server.c +++ b/src/server.c @@ -502,8 +502,39 @@ int patty_ax25_server_add_route(patty_ax25_server *server, return patty_ax25_route_table_add(server->routes, route); } -static int server_socket(patty_ax25_server *server, - int client) { +static int respond_accept(int client, + int ret, + int eno, + patty_ax25_addr *peer, + char *path) { + patty_ax25_call_accept_response response; + + memset(&response, '\0', sizeof(response)); + + response.ret = ret; + response.eno = eno; + + if (peer) { + memcpy(&response.peer, peer, sizeof(response.peer)); + } + + if (path) { + strncpy(response.path, path, sizeof(response.path)); + } + + return write(client, &response, sizeof(response)); +} + +static int respond_connect(int client, int ret, int eno) { + patty_ax25_call_connect_response response = { + .ret = ret, + .eno = eno + }; + + return write(client, &response, sizeof(response)); +} + +static int server_socket(patty_ax25_server *server, int client) { patty_ax25_call_socket_request request; patty_ax25_call_socket_response response; @@ -697,8 +728,6 @@ error_io: static int server_accept(patty_ax25_server *server, int client) { patty_ax25_call_accept_request request; - patty_ax25_call_accept_response response; - patty_ax25_sock *sock; if (read(client, &request, sizeof(request)) < 0) { @@ -706,16 +735,13 @@ static int server_accept(patty_ax25_server *server, } if ((sock = sock_by_fd(server->socks_by_fd, request.fd)) == NULL) { - response.ret = -1; - response.eno = EBADF; - goto error_sock_by_fd; } return 0; error_sock_by_fd: - return write(client, &response, sizeof(response)); + return respond_accept(client, -1, EBADF, NULL, NULL); error_io: return -1; @@ -724,7 +750,6 @@ error_io: static int server_connect(patty_ax25_server *server, int client) { patty_ax25_call_connect_request request; - patty_ax25_call_connect_response response; patty_ax25_sock *sock; patty_ax25_route *route; @@ -735,28 +760,15 @@ static int server_connect(patty_ax25_server *server, } if ((sock = sock_by_fd(server->socks_by_fd, request.fd)) == NULL) { - response.ret = -1; - response.eno = EBADF; - - goto error_sock_by_fd; + return respond_connect(client, -1, EBADF); } switch (sock->status) { case PATTY_AX25_SOCK_LISTENING: - response.ret = -1; - response.eno = EINVAL; - - goto error_invalid_status; - - break; + return respond_connect(client, -1, EINVAL); case PATTY_AX25_SOCK_ESTABLISHED: - response.ret = -1; - response.eno = EISCONN; - - goto error_invalid_status; - - break; + return respond_connect(client, -1, EISCONN); default: break; @@ -780,10 +792,7 @@ static int server_connect(patty_ax25_server *server, * configured. */ if (route == NULL) { - response.ret = -1; - response.eno = ENETDOWN; - - goto error_network_down; + return respond_connect(client, -1, ENETDOWN); } patty_ax25_sock_bind_if(sock, iface = route->iface); @@ -816,10 +825,7 @@ static int server_connect(patty_ax25_server *server, * parameters. */ if (patty_ax25_sock_send_xid(sock, PATTY_AX25_FRAME_COMMAND) < 0) { - response.ret = -1; - response.eno = errno; - - goto error_sock_send_xid; + return respond_connect(client, -1, errno); } /* @@ -829,12 +835,6 @@ static int server_connect(patty_ax25_server *server, */ return 0; -error_sock_send_xid: -error_network_down: -error_invalid_status: -error_sock_by_fd: - return write(client, &response, sizeof(response)); - error_client_save_by_sock: error_sock_save_remote: error_io: @@ -1157,7 +1157,6 @@ static int handle_sabm(patty_ax25_server *server, created = 0; patty_ax25_sock *local, *remote; - patty_ax25_call_accept_response response; if ((local = sock_by_addr(server->socks_local, &frame->dest)) == NULL) { @@ -1202,17 +1201,13 @@ static int handle_sabm(patty_ax25_server *server, fd_watch(server, remote->fd); - memset(&response, '\0', sizeof(response)); - memcpy(&response.peer, &frame->src, sizeof(patty_ax25_addr)); - memcpy(&response.path, &remote->path, sizeof(response.path)); - - if (write(client, &response, sizeof(response)) < 0) { - goto error_write; + if (respond_accept(client, 0, 0, &frame->src, remote->path) < 0) { + goto error_respond_accept; } return reply_ua(iface, frame, PATTY_AX25_FRAME_FINAL); -error_write: +error_respond_accept: error_sock_save: patty_ax25_sock_destroy(remote); @@ -1226,7 +1221,6 @@ static int handle_ua(patty_ax25_server *server, patty_ax25_sock *sock, patty_ax25_frame *frame) { int client; - patty_ax25_call_connect_response response; if (sock == NULL) { return reply_dm(iface, frame, PATTY_AX25_FRAME_FINAL); @@ -1258,16 +1252,8 @@ static int handle_ua(patty_ax25_server *server, fd_watch(server, sock->fd); - response.ret = 0; - response.eno = 0; + return respond_connect(client, 0, 0); - if (write(client, &response, sizeof(response)) < 0) { - goto error_write; - } - - return 0; - -error_write: error_sock_save: patty_ax25_sock_destroy(sock); @@ -1280,7 +1266,6 @@ static int handle_dm(patty_ax25_server *server, patty_ax25_sock *sock, patty_ax25_frame *frame) { int client; - patty_ax25_call_connect_response response; if (sock == NULL || sock->status != PATTY_AX25_SOCK_PENDING_CONNECT) { return 0; @@ -1290,18 +1275,10 @@ static int handle_dm(patty_ax25_server *server, goto error_client_by_sock; } - response.ret = -1; - response.eno = ECONNREFUSED; - patty_ax25_sock_reset(sock); - if (write(client, &response, sizeof(response)) < 0) { - goto error_write; - } + return respond_connect(client, -1, ECONNREFUSED); - return 0; - -error_write: error_client_by_sock: return -1; } @@ -1435,7 +1412,15 @@ static int handle_xid(patty_ax25_server *server, } if (patty_ax25_sock_params_set(remote, ¶ms) < 0) { - goto error_sock_params_set; + int client; + + if ((client = client_by_sock(server, remote)) < 0) { + goto error_client_by_sock; + } + + patty_ax25_sock_reset(remote); + + return respond_connect(client, -1, errno); } /* @@ -1483,7 +1468,9 @@ static int handle_xid(patty_ax25_server *server, patty_ax25_sock_upgrade(remote); if (patty_ax25_sock_params_set(remote, ¶ms) < 0) { - goto error_sock_params_set; + patty_ax25_sock_destroy(remote); + + return respond_accept(client, -1, errno, NULL, NULL); } save_reply_addr(remote, frame); @@ -1501,7 +1488,6 @@ reply_dm: error_sock_save: error_sock_new: error_client_by_sock: -error_sock_params_set: error_sock_upgrade: error_io: return -1;