diff --git a/src/tools/sysdb/main.c b/src/tools/sysdb/main.c
index 991e1ffb6d8e744252309646f4741e67abfe901d..6e10e8d9fd87d937a3d668566f9f4fccf7bbcd7d 100644 (file)
--- a/src/tools/sysdb/main.c
+++ b/src/tools/sysdb/main.c
while (sdb_llist_iter_has_next(iter)) {
sdb_object_t *obj = sdb_llist_iter_get_next(iter);
- if (sdb_client_send(client, CONNECTION_QUERY,
+
+ if (sdb_client_send(client, SDB_CONNECTION_QUERY,
(uint32_t)strlen(obj->name), obj->name) <= 0) {
sdb_log(SDB_LOG_ERR, "Failed to send command '%s' to server",
obj->name);
status = 1;
break;
}
- if (sdb_command_print_reply(client)) {
- sdb_log(SDB_LOG_ERR, "Failed to read reply from server");
- status = 1;
- break;
+
+ /* Wait for server replies. We might get any number of log messages
+ * but eventually see the reply to the query, which is either DATA or
+ * ERROR. */
+ while (42) {
+ status = sdb_command_print_reply(client);
+ if (status < 0) {
+ sdb_log(SDB_LOG_ERR, "Failed to read reply from server");
+ break;
+ }
+
+ if ((status == SDB_CONNECTION_DATA)
+ || (status == SDB_CONNECTION_ERROR))
+ break;
+ if (status == SDB_CONNECTION_OK) {
+ /* pre 0.4 versions used OK instead of DATA */
+ sdb_log(SDB_LOG_WARNING, "Received unexpected OK status from "
+ "server in response to a QUERY (expected DATA); "
+ "assuming we're talking to an old server");
+ break;
+ }
}
+
+ if ((status != SDB_CONNECTION_OK) && (status != SDB_CONNECTION_DATA))
+ break; /* error */
}
sdb_llist_iter_destroy(iter);
main(int argc, char **argv)
{
const char *host = NULL;
- const char *user = NULL;
const char *homedir;
char hist_file[1024] = "";
host = optarg;
break;
case 'U':
- user = optarg;
+ input.user = optarg;
break;
case 'c':
if (! host)
host = DEFAULT_SOCKET;
- if (! user) {
- user = get_current_user();
- if (! user)
+ if (! input.user) {
+ input.user = get_current_user();
+ if (! input.user)
exit(1);
}
sdb_log(SDB_LOG_ERR, "Failed to create client object");
exit(1);
}
- if (sdb_client_connect(input.client, user)) {
+ if (sdb_client_connect(input.client, input.user)) {
sdb_log(SDB_LOG_ERR, "Failed to connect to SysDBd");
sdb_client_destroy(input.client);
exit(1);
int status = execute_commands(input.client, commands);
sdb_llist_destroy(commands);
sdb_client_destroy(input.client);
- exit(status);
+ if ((status != SDB_CONNECTION_OK) && (status != SDB_CONNECTION_DATA))
+ exit(1);
+ exit(0);
}
sdb_log(SDB_LOG_INFO, "SysDB client "SDB_CLIENT_VERSION_STRING
- SDB_CLIENT_VERSION_EXTRA"\n");
+ SDB_CLIENT_VERSION_EXTRA" (libsysdbclient %s%s)\n",
+ sdb_client_version_string(), sdb_client_version_extra());
using_history();
- if ((homedir = get_homedir(user))) {
+ if ((homedir = get_homedir(input.user))) {
snprintf(hist_file, sizeof(hist_file) - 1,
"%s/.sysdb_history", homedir);
hist_file[sizeof(hist_file) - 1] = '\0';
sdb_input_init(&input);
sdb_input_mainloop();
+ sdb_client_shutdown(input.client, SHUT_WR);
+ while (! sdb_client_eof(input.client)) {
+ /* wait for remaining data to arrive */
+ sdb_command_print_reply(input.client);
+ }
+
if (hist_file[0] != '\0') {
errno = 0;
if (write_history(hist_file)) {