Update man page for multipath -r
[platform/upstream/multipath-tools.git] / multipathd / uxclnt.c
1 /*
2  * Original author : tridge@samba.org, January 2002
3  *
4  * Copyright (c) 2005 Christophe Varoqui
5  * Copyright (c) 2005 Benjamin Marzinski, Redhat
6  */
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <unistd.h>
10 #include <stdarg.h>
11 #include <fcntl.h>
12 #include <sys/ioctl.h>
13 #include <sys/types.h>
14 #include <sys/socket.h>
15 #include <sys/un.h>
16 #include <sys/poll.h>
17 #include <readline/readline.h>
18 #include <readline/history.h>
19
20 #include <uxsock.h>
21 #include <memory.h>
22 #include <defaults.h>
23
24 #include <vector.h>
25 #include "cli.h"
26
27 static void print_reply(char *s)
28 {
29         if (isatty(1)) {
30                 printf("%s", s);
31                 return;
32         }
33         /* strip ANSI color markers */
34         while (*s != '\0') {
35                 if ((*s == 0x1b) && (*(s+1) == '['))
36                         while ((*s++ != 'm') && (*s != '\0')) {};
37                 putchar(*s++);
38         }
39 }
40 /*
41  * process the client
42  */
43 static void process(int fd)
44 {
45         char *line;
46         char *reply;
47
48         cli_init();
49         rl_readline_name = "multipathd";
50         rl_completion_entry_function = key_generator;
51         while ((line = readline("multipathd> "))) {
52                 size_t len;
53                 size_t llen = strlen(line);
54
55                 if (!llen) {
56                         free(line);
57                         continue;
58                 }
59                 if (!strncmp(line, "exit", 4) && llen == 4)
60                         break;
61                 if (!strncmp(line, "quit", 4) && llen == 4)
62                         break;
63
64                 if (send_packet(fd, line, llen + 1) != 0) break;
65                 if (recv_packet(fd, &reply, &len) != 0) break;
66
67                 print_reply(reply);
68
69                 if (line && *line)
70                         add_history(line);
71
72                 free(line);
73                 FREE(reply);
74         }
75 }
76
77 static void process_req(int fd, char * inbuf)
78 {
79         char *reply;
80         size_t len;
81
82         if (send_packet(fd, inbuf, strlen(inbuf) + 1) != 0) {
83                 printf("cannot send packet\n");
84                 return;
85         }
86         if (recv_packet(fd, &reply, &len) != 0)
87                 printf("error receiving packet\n");
88         else {
89                 printf("%s", reply);
90                 FREE(reply);
91         }
92 }
93
94 /*
95  * entry point
96  */
97 int uxclnt(char * inbuf)
98 {
99         int fd;
100
101         fd = ux_socket_connect(DEFAULT_SOCKET);
102         if (fd == -1) {
103                 perror("ux_socket_connect");
104                 exit(1);
105         }
106
107         if (inbuf)
108                 process_req(fd, inbuf);
109         else
110                 process(fd);
111
112         return 0;
113 }