X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ffrontend%2Fconnection.c;h=ebc3b99332d92d0e929f51467edbc549f0088630;hb=8b8cbad198df077add16bf08cefc7a6d50058d7d;hp=6b359d347a9f14e3026ebcd6a6df37708eab7da7;hpb=6ae8a44475eef39fa376a657df581a52b5472697;p=sysdb.git diff --git a/src/frontend/connection.c b/src/frontend/connection.c index 6b359d3..ebc3b99 100644 --- a/src/frontend/connection.c +++ b/src/frontend/connection.c @@ -44,10 +44,14 @@ #include #include +#include +#include + #include #include #include +#include /* * private variables @@ -121,7 +125,7 @@ connection_init(sdb_object_t *obj, va_list ap) conn->read = conn_read; conn->write = conn_write; conn->finish = NULL; - conn->session = NULL; + conn->ssl_session = NULL; sock_fl = fcntl(conn->fd, F_GETFL); if (fcntl(conn->fd, F_SETFL, sock_fl | O_NONBLOCK)) { @@ -166,7 +170,18 @@ connection_destroy(sdb_object_t *obj) "(%zu byte%s left in buffer)", len, len == 1 ? "" : "s"); } - sdb_log(SDB_LOG_DEBUG, "frontend: Closing connection %s", obj->name); + if (conn->client_addr.ss_family == AF_UNIX) { + sdb_log(SDB_LOG_DEBUG, "frontend: Closing connection %s from peer %s", + obj->name, conn->username); + } + else { + char host[1024] = "", port[32] = ""; + getnameinfo((struct sockaddr *)&conn->client_addr, + conn->client_addr_len, host, sizeof(host), port, sizeof(port), + NI_NUMERICHOST | NI_NUMERICSERV); + sdb_log(SDB_LOG_DEBUG, "frontend: Closing connection %s from peer %s " + "at %s:%s", obj->name, conn->username, host, port); + } sdb_connection_close(conn); if (conn->username) @@ -276,13 +291,11 @@ command_handle(sdb_conn_t *conn) assert(conn && (conn->cmd != SDB_CONNECTION_IDLE)); assert(! conn->skip_len); - sdb_log(SDB_LOG_DEBUG, "frontend: Handling command %u (len: %u)", - conn->cmd, conn->cmd_len); - if (conn->cmd == SDB_CONNECTION_PING) status = sdb_connection_ping(conn); else if (conn->cmd == SDB_CONNECTION_STARTUP) status = sdb_fe_session_start(conn); + else if (conn->cmd == SDB_CONNECTION_QUERY) status = sdb_fe_query(conn); else if (conn->cmd == SDB_CONNECTION_FETCH) @@ -293,6 +306,10 @@ command_handle(sdb_conn_t *conn) status = sdb_fe_lookup(conn); else if (conn->cmd == SDB_CONNECTION_STORE) status = sdb_fe_store(conn); + + else if (conn->cmd == SDB_CONNECTION_SERVER_VERSION) + status = sdb_connection_server_version(conn); + else { sdb_log(SDB_LOG_WARNING, "frontend: Ignoring invalid command %#x", conn->cmd); @@ -410,6 +427,7 @@ sdb_conn_t * sdb_connection_accept(int fd, sdb_conn_setup_cb setup, void *user_data) { sdb_conn_t *conn; + const char *peer = "unknown"; if (fd < 0) return NULL; @@ -422,6 +440,22 @@ sdb_connection_accept(int fd, sdb_conn_setup_cb setup, void *user_data) sdb_object_deref(SDB_OBJ(conn)); return NULL; } + + if (conn->username) + peer = conn->username; + + if (conn->client_addr.ss_family == AF_UNIX) { + sdb_log(SDB_LOG_INFO, + "frontend: Accepted connection from peer %s", peer); + } + else { + char host[1024] = "", port[32] = ""; + getnameinfo((struct sockaddr *)&conn->client_addr, + conn->client_addr_len, host, sizeof(host), port, sizeof(port), + NI_NUMERICHOST | NI_NUMERICSERV); + sdb_log(SDB_LOG_INFO, "frontend: Accepted connection from " + "peer %s at %s:%s", peer, host, port); + } return conn; } /* sdb_connection_create */ @@ -514,5 +548,20 @@ sdb_connection_ping(sdb_conn_t *conn) return 0; } /* sdb_connection_ping */ +int +sdb_connection_server_version(sdb_conn_t *conn) +{ + char msg[sizeof(uint32_t) + strlen(SDB_VERSION_EXTRA) + 1]; + + if ((! conn) || (conn->cmd != SDB_CONNECTION_SERVER_VERSION)) + return -1; + + sdb_proto_marshal_int32(msg, sizeof(msg), (uint32_t)SDB_VERSION); + strncpy(msg + sizeof(uint32_t), SDB_VERSION_EXTRA, + sizeof(msg) - sizeof(uint32_t)); + sdb_connection_send(conn, SDB_CONNECTION_OK, (uint32_t)sizeof(msg), msg); + return 0; +} /* sdb_connection_server_version */ + /* vim: set tw=78 sw=4 ts=4 noexpandtab : */