diff --git a/include/patty/ax25/call.h b/include/patty/ax25/call.h index 03c7f4e..e1ba556 100644 --- a/include/patty/ax25/call.h +++ b/include/patty/ax25/call.h @@ -64,7 +64,7 @@ int patty_ax25_call_setsockopt(int server, */ typedef struct _patty_ax25_call_bind_request { int fd; - patty_ax25_addr peer; + patty_ax25_addr addr; } patty_ax25_call_bind_request; typedef struct _patty_ax25_call_bind_response { diff --git a/src/call.c b/src/call.c index c53fb60..fde3561 100644 --- a/src/call.c +++ b/src/call.c @@ -82,7 +82,7 @@ error_io: int patty_ax25_call_bind(int server, int fd, - patty_ax25_addr *peer) { + patty_ax25_addr *addr) { enum patty_ax25_call call = PATTY_AX25_CALL_BIND; patty_ax25_call_bind_request request = { @@ -91,7 +91,7 @@ int patty_ax25_call_bind(int server, patty_ax25_call_bind_response response; - memcpy(&request.peer, peer, sizeof(*peer)); + memcpy(&request.addr, addr, sizeof(*addr)); if (write(server, &call, sizeof(call)) < 0) { goto error_io; diff --git a/src/server.c b/src/server.c index 3d93b4f..9133112 100644 --- a/src/server.c +++ b/src/server.c @@ -624,6 +624,20 @@ static int server_bind(patty_ax25_server *server, goto error_sock_by_fd; } + if (sock->local.callsign[0] != '\0') { + response.ret = -1; + response.eno = EINVAL; + + goto error_bound; + } + + if (sock_by_addr(server->socks_local, &request.addr) != NULL) { + response.ret = -1; + response.eno = EADDRINUSE; + + goto error_exists; + } + switch (sock->status) { case PATTY_AX25_SOCK_LISTENING: case PATTY_AX25_SOCK_ESTABLISHED: @@ -636,12 +650,14 @@ static int server_bind(patty_ax25_server *server, break; } - memcpy(&sock->local, &request.peer, sizeof(request.peer)); + memcpy(&sock->local, &request.addr, sizeof(request.addr)); response.ret = 0; response.eno = 0; error_invalid_status: +error_exists: +error_bound: error_sock_by_fd: return write(client, &response, sizeof(response));