009e5cbe668678359600ea0effa49db6811ee735
[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
47                 if (send_packet(fd, line, llen + 1) != 0) break;
48                 if (recv_packet(fd, &reply, &len) != 0) break;
49
50                 printf("%s", reply);
51
52                 if (line && *line)
53                         add_history(line);
54
55                 free(line);
56                 FREE(reply);
57         }
58 }
59
60 static void process_req(int fd, char * inbuf)
61 {
62         char *reply;
63         size_t len;
64
65         send_packet(fd, inbuf, strlen(inbuf) + 1);
66         recv_packet(fd, &reply, &len);
67
68         printf("%s", reply);
69         FREE(reply);
70 }
71         
72 /*
73  * entry point
74  */
75 int uxclnt(char * inbuf)
76 {
77         int fd;
78
79         fd = ux_socket_connect(DEFAULT_SOCKET);
80         if (fd == -1) {
81                 perror("ux_socket_connect");
82                 exit(1);
83         }
84
85         if (inbuf)
86                 process_req(fd, inbuf);
87         else
88                 process(fd);
89         
90         return 0;
91 }