/*
- * Copyright (C) 1997-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2011 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/** \file client.c the client program used to connect to para_server */
#include <regex.h>
-#include <openssl/rc4.h>
+#include <stdbool.h>
#include "para.h"
#include "list.h"
#include "stdin.h"
#include "stdout.h"
#include "client.h"
+#include "buffer_tree.h"
#include "error.h"
INIT_CLIENT_ERRLISTS;
}
if (ct->status == CL_SENDING) {
stdin_set_defaults(&sit);
- sit.buf = para_malloc(sit.bufsize),
register_task(&sit.task);
- ct->inbuf = sit.buf;
- ct->in_loaded = &sit.loaded;
- ct->in_error = &sit.task.error;
t->error = -E_TASK_STARTED;
return;
}
if (ct->status == CL_RECEIVING) {
stdout_set_defaults(&sot);
- sot.bufp = &ct->buf;
- sot.loaded = &ct->loaded;
- sot.input_error = &ct->task.error;
register_task(&sot.task);
t->error = -E_TASK_STARTED;
return;
.status = "supervisor task"
};
-static int client_loglevel; /* loglevel */
+static int client_loglevel = LL_ERROR; /* loglevel */
INIT_STDERR_LOGGING(client_loglevel);
-
/**
* The client program to connect to para_server.
*
* \param argv Usual argument vector.
*
* It registers two tasks: The client task that communicates with para_server
- * and the standard out task that writes any output produced by the client task
- * to standard out.
+ * and the supervisor task that minitors whether the client task intends to
+ * read from stdin or write to stdout.
+ *
+ * Once it has been determined whether the client command corresponds to a
+ * stdin command (addmood, addimg, ..), either the stdin task or the stdout
+ * task is set up to replace the supervisor task.
*
* \return EXIT_SUCCESS or EXIT_FAILURE
*
- * \sa client_open(), stdout.c, stdout.h, para_client(1), para_server(1)
+ * \sa client_open(), stdin.c, stdout.c, para_client(1), para_server(1)
*/
int main(int argc, char *argv[])
{
init_random_seed_or_die();
s.default_timeout.tv_sec = 1;
s.default_timeout.tv_usec = 0;
- ret = client_open(argc, argv, &ct, &client_loglevel);
- if (ret < 0) /* can not use PARA_LOG here because ct is NULL */
- exit(EXIT_FAILURE);
+ /*
+ * We add buffer tree nodes for stdin and stdout even though
+ * only one of them will be needed. This simplifies the code
+ * a bit wrt. to the buffer tree setup.
+ */
+ sit.btrn = btr_new_node(&(struct btr_node_description)
+ EMBRACE(.name = "stdin"));
+ ret = client_open(argc, argv, &ct, &client_loglevel, sit.btrn, NULL);
+ if (ret < 0)
+ goto out;
+ sot.btrn = btr_new_node(&(struct btr_node_description)
+ EMBRACE(.name = "stdout", .parent = ct->btrn));
register_task(&svt);
ret = schedule(&s);
- if (ret < 0)
- PARA_ERROR_LOG("%s\n", para_strerror(-ret));
+out:
client_close(ct);
- return ret >= 0? EXIT_SUCCESS: EXIT_FAILURE;
+ btr_free_node(sit.btrn);
+ btr_free_node(sot.btrn);
+ if (ret < 0) {
+ /* can not use PARA_LOG here because ct is NULL */
+ fprintf(stderr, "%s\n", para_strerror(-ret));
+ return EXIT_FAILURE;
+ }
+ return EXIT_SUCCESS;
}