Streamline responding to accept(), connect() calls
Changes: * Implement and use respond_accept() and respond_connect() convenience methods instead of stack allocating response objects, populating them, and using write() to send them to the client * When receiving XID frames in response to either an accept() or connect() call, respond to the client if any of the parameters sent from the peer are not compatible with a socket or interface, with the appropriate errno value
This commit is contained in:
parent
1a87ac3858
commit
971fc2c375
1 changed files with 56 additions and 70 deletions
126
src/server.c
126
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;
|
||||
|
|
Loading…
Add table
Reference in a new issue