#include #include #include #include int patty_ax25_call_socket(int server, int type) { enum patty_ax25_call call = PATTY_AX25_CALL_SOCKET; patty_ax25_call_socket_request request = { type }; patty_ax25_call_socket_response response; if (write(server, &call, sizeof(call)) < 0) { goto error_io; } if (write(server, &request, sizeof(request)) < 0) { goto error_io; } if (read(server, &response, sizeof(response)) < 0) { goto error_io; } errno = response.eno; return response.ret; error_io: return -1; } int patty_ax25_call_bind(int server, int socket, patty_ax25_addr *peer) { enum patty_ax25_call call = PATTY_AX25_CALL_BIND; patty_ax25_call_bind_request request = { socket }; patty_ax25_call_bind_response response; memcpy(&request.peer, peer, sizeof(*peer)); if (write(server, &call, sizeof(call)) < 0) { goto error_io; } if (write(server, &request, sizeof(request)) < 0) { goto error_io; } if (read(server, &response, sizeof(response)) < 0) { goto error_io; } errno = response.eno; return response.ret; error_io: return -1; } int patty_ax25_call_listen(int server, int socket) { enum patty_ax25_call call = PATTY_AX25_CALL_LISTEN; patty_ax25_call_listen_request request = { socket }; patty_ax25_call_listen_response response; if (write(server, &call, sizeof(call)) < 0) { goto error_io; } if (write(server, &request, sizeof(request)) < 0) { goto error_io; } if (read(server, &response, sizeof(response)) < 0) { goto error_io; } errno = response.eno; return response.ret; error_io: return -1; } int patty_ax25_call_accept(int server, int socket, patty_ax25_addr *peer, char *path) { enum patty_ax25_call call = PATTY_AX25_CALL_ACCEPT; patty_ax25_call_accept_request request = { socket }; patty_ax25_call_accept_response response; if (write(server, &call, sizeof(call)) < 0) { goto error_io; } if (write(server, &request, sizeof(request)) < 0) { goto error_io; } if (read(server, &response, sizeof(response)) < 0) { goto error_io; } if (response.ret >= 0) { strncpy(path, response.path, PATTY_AX25_SOCK_PATH_SIZE); memcpy(peer, &response.peer, sizeof(*peer)); } errno = response.eno; return response.ret; error_io: return -1; } int patty_ax25_call_connect(int server, int socket, patty_ax25_addr *peer, char *path) { enum patty_ax25_call call = PATTY_AX25_CALL_CONNECT; patty_ax25_call_connect_request request = { socket }; patty_ax25_call_connect_response response; memcpy(&request.peer, peer, sizeof(*peer)); if (write(server, &call, sizeof(call)) < 0) { goto error_io; } if (write(server, &request, sizeof(request)) < 0) { goto error_io; } if (read(server, &response, sizeof(response)) < 0) { goto error_io; } if (response.ret >= 0) { strncpy(path, response.path, PATTY_AX25_SOCK_PATH_SIZE); } errno = response.eno; return response.ret; error_io: return -1; } int patty_ax25_call_close(int server, int socket) { enum patty_ax25_call call = PATTY_AX25_CALL_CLOSE; patty_ax25_call_close_request request = { socket }; patty_ax25_call_close_response response; if (write(server, &call, sizeof(call)) < 0) { goto error_io; } if (write(server, &request, sizeof(request)) < 0) { goto error_io; } if (read(server, &response, sizeof(response)) < 0) { goto error_io; } errno = response.eno; return response.ret; error_io: return -1; }