X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fclient%2Fsock.c;h=82a48a62534a6e0d0b00dee704e58cf821dc998c;hb=c51f1f224fd1ec05ca0045c15be8f7625aeb5cea;hp=042dd63bd99a353764b8176289de65f5276730f8;hpb=bcc0deb7ce9e8d135afe01ab0f09aab0c378d47c;p=sysdb.git diff --git a/src/client/sock.c b/src/client/sock.c index 042dd63..82a48a6 100644 --- a/src/client/sock.c +++ b/src/client/sock.c @@ -25,6 +25,10 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + #include "client/sock.h" #include "utils/error.h" #include "utils/strbuf.h" @@ -175,22 +179,33 @@ sdb_client_connect(sdb_client_t *client, const char *username) buf = sdb_strbuf_create(64); rstatus = 0; status = sdb_client_recv(client, &rstatus, buf); + if ((status > 0) && (rstatus == CONNECTION_OK)) { + sdb_strbuf_destroy(buf); + return 0; + } + if (status < 0) { char errbuf[1024]; - sdb_client_close(client); - sdb_strbuf_destroy(buf); sdb_log(SDB_LOG_ERR, "Failed to receive server response: %s", sdb_strerror(errno, errbuf, sizeof(errbuf))); - return (int)status; } + else if (client->eof) + sdb_log(SDB_LOG_ERR, "Encountered end-of-file while waiting " + "for server response"); - if (rstatus != CONNECTION_OK) { - sdb_client_close(client); - sdb_strbuf_destroy(buf); + if (rstatus == CONNECTION_ERROR) { sdb_log(SDB_LOG_ERR, "Access denied for user '%s'", username); - return -((int)rstatus); + status = -((int)rstatus); } - return 0; + else if (rstatus != CONNECTION_OK) { + sdb_log(SDB_LOG_ERR, "Received unsupported authentication request " + "(status %d) during startup", (int)rstatus); + status = -((int)rstatus); + } + + sdb_client_close(client); + sdb_strbuf_destroy(buf); + return (int)status; } /* sdb_client_connect */ int @@ -201,6 +216,22 @@ sdb_client_sockfd(sdb_client_t *client) return client->fd; } /* sdb_client_sockfd */ +int +sdb_client_shutdown(sdb_client_t *client, int how) +{ + if (! client) { + errno = ENOTSOCK; + return -1; + } + + if (client->fd < 0) { + errno = EBADF; + return -1; + } + + return shutdown(client->fd, how); +} /* sdb_client_shutdown */ + void sdb_client_close(sdb_client_t *client) {