blob: a08c0c708850065ee1ed489bb2c9653575c58a1e [file] [log] [blame]
/*
* Original author : tridge@samba.org, January 2002
*
* Copyright (c) 2005 Christophe Varoqui
* Copyright (c) 2005 Benjamin Marzinski, Redhat
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/poll.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <uxsock.h>
#include <memory.h>
#include <defaults.h>
#include <vector.h>
#include "cli.h"
static void print_reply(char *s)
{
if (isatty(1)) {
printf("%s", s);
return;
}
/* strip ANSI color markers */
while (*s != '\0') {
if ((*s == 0x1b) && (*(s+1) == '['))
while ((*s++ != 'm') && (*s != '\0')) {};
putchar(*s++);
}
}
/*
* process the client
*/
static void process(int fd)
{
char *line;
char *reply;
cli_init();
rl_readline_name = "multipathd";
rl_completion_entry_function = key_generator;
while ((line = readline("multipathd> "))) {
size_t len;
size_t llen = strlen(line);
if (!llen) {
free(line);
continue;
}
if (!strncmp(line, "exit", 4) && llen == 4)
break;
if (!strncmp(line, "quit", 4) && llen == 4)
break;
if (send_packet(fd, line, llen + 1) != 0) break;
if (recv_packet(fd, &reply, &len) != 0) break;
print_reply(reply);
if (line && *line)
add_history(line);
free(line);
FREE(reply);
}
}
static void process_req(int fd, char * inbuf)
{
char *reply;
size_t len;
if (send_packet(fd, inbuf, strlen(inbuf) + 1) != 0) {
printf("cannot send packet\n");
return;
}
if (recv_packet(fd, &reply, &len) != 0)
printf("error receiving packet\n");
else {
print_reply(reply);
FREE(reply);
}
}
/*
* entry point
*/
int uxclnt(char * inbuf)
{
int fd;
fd = ux_socket_connect(DEFAULT_SOCKET);
if (fd == -1) {
perror("ux_socket_connect");
exit(1);
}
if (inbuf)
process_req(fd, inbuf);
else
process(fd);
return 0;
}