diff --git a/src/client/sock.c b/src/client/sock.c
index 042dd63bd99a353764b8176289de65f5276730f8..533e9e31b62c16457f36ae1e844a450251c26c51 100644 (file)
--- a/src/client/sock.c
+++ b/src/client/sock.c
* 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"
struct sdb_client {
char *address;
int fd;
- _Bool eof;
+ bool eof;
};
/*
if (! username)
username = "";
- status = sdb_client_send(client, CONNECTION_STARTUP,
+ status = sdb_client_send(client, SDB_CONNECTION_STARTUP,
(uint32_t)strlen(username), username);
if (status < 0) {
char errbuf[1024];
buf = sdb_strbuf_create(64);
rstatus = 0;
status = sdb_client_recv(client, &rstatus, buf);
+ if ((status > 0) && (rstatus == SDB_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;
}
-
- if (rstatus != CONNECTION_OK) {
- sdb_client_close(client);
- sdb_strbuf_destroy(buf);
- sdb_log(SDB_LOG_ERR, "Access denied for user '%s'", username);
- return -((int)rstatus);
+ else if (client->eof)
+ sdb_log(SDB_LOG_ERR, "Encountered end-of-file while waiting "
+ "for server response");
+
+ if (rstatus == SDB_CONNECTION_ERROR) {
+ sdb_log(SDB_LOG_ERR, "Access denied for user '%s': %s",
+ username, sdb_strbuf_string(buf));
+ status = -((int)rstatus);
+ }
+ else if (rstatus != SDB_CONNECTION_OK) {
+ sdb_log(SDB_LOG_ERR, "Received unsupported authentication request "
+ "(status %d) during startup", (int)rstatus);
+ status = -((int)rstatus);
}
- return 0;
+
+ sdb_client_close(client);
+ sdb_strbuf_destroy(buf);
+ return (int)status;
} /* sdb_client_connect */
int
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)
{
return (ssize_t)total;
} /* sdb_client_recv */
-_Bool
+bool
sdb_client_eof(sdb_client_t *client)
{
if ((! client) || (client->fd < 0))