[multipathd] add "quit" cli command
[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 /*
28  * process the client 
29  */
30 static void process(int fd)
31 {
32         char *line;
33         char *reply;
34
35         cli_init();
36         rl_readline_name = "multipathd";
37         rl_completion_entry_function = key_generator;
38         while ((line = readline("multipathd> "))) {
39                 size_t len;
40                 size_t llen = strlen(line);
41
42                 if (!llen) {
43                         free(line);
44                         continue;
45                 }
46                 if (!strncmp(line, "exit", 4) && llen == 4)
47                         break;
48                 if (!strncmp(line, "quit", 4) && llen == 4)
49                         break;
50
51                 if (send_packet(fd, line, llen + 1) != 0) break;
52                 if (recv_packet(fd, &reply, &len) != 0) break;
53
54                 printf("%s", reply);
55
56                 if (line && *line)
57                         add_history(line);
58
59                 free(line);
60                 FREE(reply);
61         }
62 }
63
64 static void process_req(int fd, char * inbuf)
65 {
66         char *reply;
67         size_t len;
68
69         send_packet(fd, inbuf, strlen(inbuf) + 1);
70         recv_packet(fd, &reply, &len);
71
72         printf("%s", reply);
73         FREE(reply);
74 }
75         
76 /*
77  * entry point
78  */
79 int uxclnt(char * inbuf)
80 {
81         int fd;
82
83         fd = ux_socket_connect(DEFAULT_SOCKET);
84         if (fd == -1) {
85                 perror("ux_socket_connect");
86                 exit(1);
87         }
88
89         if (inbuf)
90                 process_req(fd, inbuf);
91         else
92                 process(fd);
93         
94         return 0;
95 }