#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
+#include <signal.h>
#include "fio.h"
#include "server.h"
int fd;
int state;
+ int skip_newline;
uint16_t argc;
char **argv;
static void remove_client(struct fio_client *client)
{
- dprint(FD_NET, "removed client <%s>\n", client->hostname);
+ dprint(FD_NET, "client: removed <%s>\n", client->hostname);
flist_del(&client->list);
nr_clients--;
static void __fio_client_add_cmd_option(struct fio_client *client,
const char *opt)
{
- client->argc++;
+ int index;
+
+ index = client->argc++;
client->argv = realloc(client->argv, sizeof(char *) * client->argc);
- client->argv[client->argc - 1] = strdup(opt);
+ client->argv[index] = strdup(opt);
+ dprint(FD_NET, "client: add cmd %d: %s\n", index, opt);
}
void fio_client_add_cmd_option(const char *hostname, const char *opt)
{
struct fio_client *client;
- dprint(FD_NET, "added client <%s>\n", hostname);
+ dprint(FD_NET, "client: added <%s>\n", hostname);
client = malloc(sizeof(*client));
memset(client, 0, sizeof(*client));
{
int fd;
- dprint(FD_NET, "connect to host %s\n", client->hostname);
+ dprint(FD_NET, "client: connect to host %s\n", client->hostname);
memset(&client->addr, 0, sizeof(client->addr));
client->addr.sin_family = AF_INET;
struct flist_head *entry;
struct fio_client *client;
+ dprint(FD_NET, "client: terminate clients\n");
+
flist_for_each(entry, &client_list) {
client = flist_entry(entry, struct fio_client, list);
static void sig_int(int sig)
{
+ dprint(FD_NET, "client: got sign %d\n", sig);
fio_clients_terminate();
}
static void probe_client(struct fio_client *client)
{
+ dprint(FD_NET, "client: send probe\n");
+
fio_net_send_simple_cmd(client->fd, FIO_NET_CMD_PROBE, 0);
handle_client(client, 1);
}
struct cmd_line_pdu *pdu;
int i, ret;
+ dprint(FD_NET, "client: send cmdline %d\n", client->argc);
+
pdu = malloc(sizeof(*pdu));
for (i = 0; i < client->argc; i++)
strcpy((char *) pdu->argv[i], client->argv[i]);
struct flist_head *entry, *tmp;
int ret;
+ dprint(FD_NET, "client: connect all\n");
+
client_signal_handler();
flist_for_each_safe(entry, tmp, &client_list) {
{
struct cmd_probe_pdu *probe = (struct cmd_probe_pdu *) cmd->payload;
- log_info("Probe: hostname=%s, fio ver %u.%u.%u\n", probe->hostname,
- probe->fio_major, probe->fio_minor, probe->fio_patch);
+ log_info("Probe: hostname=%s, be=%u, fio ver %u.%u.%u\n",
+ probe->hostname, probe->bigendian, probe->fio_major,
+ probe->fio_minor, probe->fio_patch);
}
static int handle_client(struct fio_client *client, int one)
struct fio_net_cmd *cmd;
int done = 0;
+ dprint(FD_NET, "client: handle %s\n", client->hostname);
+
while ((cmd = fio_net_recv_cmd(client->fd, 1)) != NULL) {
dprint(FD_NET, "%s: got cmd op %d\n", client->hostname,
cmd->opcode);
free(cmd);
done = 1;
break;
- case FIO_NET_CMD_TEXT:
- fprintf(f_out, "Client <%s>: ", client->hostname);
- fwrite(cmd->payload, cmd->pdu_len, 1, f_out);
+ case FIO_NET_CMD_TEXT: {
+ const char *buf = (const char *) cmd->payload;
+
+ if (!client->skip_newline)
+ fprintf(f_out, "Client <%s>: ", client->hostname);
+ fwrite(buf, cmd->pdu_len, 1, f_out);
fflush(f_out);
+ client->skip_newline = strchr(buf, '\n') == NULL;
free(cmd);
break;
+ }
case FIO_NET_CMD_TS:
handle_ts(cmd);
free(cmd);