/* * Original author : tridge@samba.org, January 2002 * * Copyright (c) 2005 Christophe Varoqui * Copyright (c) 2005 Benjamin Marzinski, Redhat */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mpath_cmd.h" #include "uxsock.h" #include "memory.h" #include "defaults.h" #include "vector.h" #include "cli.h" #include "uxclnt.h" static void print_reply(char *s) { if (!s) return; 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++); } } static int need_quit(char *str, size_t len) { char *ptr, *start; size_t trimed_len = len; for (ptr = str; trimed_len && isspace(*ptr); trimed_len--, ptr++) ; start = ptr; for (ptr = str + len - 1; trimed_len && isspace(*ptr); trimed_len--, ptr--) ; if ((trimed_len == 4 && !strncmp(start, "exit", 4)) || (trimed_len == 4 && !strncmp(start, "quit", 4))) return 1; return 0; } /* * process the client */ static void process(int fd, unsigned int timeout) { char *line; char *reply; int ret; cli_init(); rl_readline_name = "multipathd"; rl_completion_entry_function = key_generator; while ((line = readline("multipathd> "))) { size_t llen = strlen(line); if (!llen) { free(line); continue; } if (need_quit(line, llen)) break; if (send_packet(fd, line) != 0) break; ret = recv_packet(fd, &reply, timeout); if (ret != 0) break; print_reply(reply); if (line && *line) add_history(line); free(line); FREE(reply); } } static int process_req(int fd, char * inbuf, unsigned int timeout) { char *reply; int ret; if (send_packet(fd, inbuf) != 0) { printf("cannot send packet\n"); return 1; } ret = recv_packet(fd, &reply, timeout); if (ret < 0) { if (ret == -ETIMEDOUT) printf("timeout receiving packet\n"); else printf("error %d receiving packet\n", ret); return 1; } else { printf("%s", reply); ret = (strcmp(reply, "fail\n") == 0); FREE(reply); return ret; } } /* * entry point */ int uxclnt(char * inbuf, unsigned int timeout) { int fd, ret = 0; fd = mpath_connect(); if (fd == -1) exit(1); if (inbuf) ret = process_req(fd, inbuf, timeout); else process(fd, timeout); mpath_disconnect(fd); return ret; }