diff --git a/src/client/sock.c b/src/client/sock.c
index 59c77873e08411b22a9c1e5a6a857a8e269210f5..b60bad45e2cf97d47d2c101513c030f4a27fff5e 100644 (file)
--- a/src/client/sock.c
+++ b/src/client/sock.c
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
* 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"
#include "client/sock.h"
#include "utils/error.h"
#include "utils/strbuf.h"
struct sdb_client {
char *address;
int fd;
struct sdb_client {
char *address;
int fd;
+ _Bool eof;
};
/*
};
/*
}
memset(client, 0, sizeof(*client));
client->fd = -1;
}
memset(client, 0, sizeof(*client));
client->fd = -1;
+ client->eof = 1;
client->address = strdup(address);
if (! client->address) {
client->address = strdup(address);
if (! client->address) {
if (client->fd < 0)
return -1;
if (client->fd < 0)
return -1;
+ client->eof = 0;
/* XXX */
if (! username)
/* XXX */
if (! username)
buf = sdb_strbuf_create(64);
rstatus = 0;
status = sdb_client_recv(client, &rstatus, buf);
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];
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)));
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) {
if (rstatus != CONNECTION_OK) {
- sdb_client_close(client);
- sdb_strbuf_destroy(buf);
sdb_log(SDB_LOG_ERR, "Access denied for user '%s'", username);
sdb_log(SDB_LOG_ERR, "Access denied for user '%s'", username);
- return -((int)rstatus);
+ status = -((int)rstatus);
}
}
- return 0;
+
+ sdb_client_close(client);
+ sdb_strbuf_destroy(buf);
+ return (int)status;
} /* sdb_client_connect */
int
} /* sdb_client_connect */
int
return client->fd;
} /* sdb_client_sockfd */
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)
{
void
sdb_client_close(sdb_client_t *client)
{
close(client->fd);
client->fd = -1;
close(client->fd);
client->fd = -1;
+ client->eof = 1;
} /* sdb_client_close */
ssize_t
} /* sdb_client_close */
ssize_t
continue;
return status;
}
continue;
return status;
}
- else if (! status) /* EOF */
+ else if (! status) {
+ client->eof = 1;
break;
break;
+ }
total += (size_t)status;
total += (size_t)status;
return (ssize_t)total;
} /* sdb_client_recv */
return (ssize_t)total;
} /* sdb_client_recv */
+_Bool
+sdb_client_eof(sdb_client_t *client)
+{
+ if ((! client) || (client->fd < 0))
+ return 1;
+ return client->eof;
+} /* sdb_client_eof */
+
/* vim: set tw=78 sw=4 ts=4 noexpandtab : */
/* vim: set tw=78 sw=4 ts=4 noexpandtab : */