Formatted maxadmin.c
Formatted maxadmin.c according to the style guide.
This commit is contained in:
@ -70,9 +70,10 @@ static void DoSource(int so, char *cmd);
|
||||
static void DoUsage(const char*);
|
||||
static int isquit(char *buf);
|
||||
static void PrintVersion(const char *progname);
|
||||
static void read_inifile(char **hostname, char **port, char **user, char **passwd,int*);
|
||||
static void read_inifile(char **hostname, char **port, char **user, char **passwd, int*);
|
||||
|
||||
#ifdef HISTORY
|
||||
|
||||
static char *
|
||||
prompt(EditLine *el __attribute__((__unused__)))
|
||||
{
|
||||
@ -82,7 +83,8 @@ prompt(EditLine *el __attribute__((__unused__)))
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct option long_options[] = {
|
||||
static struct option long_options[] =
|
||||
{
|
||||
{"host", required_argument, 0, 'h'},
|
||||
{"user", required_argument, 0, 'u'},
|
||||
{"password", required_argument, 0, 'p'},
|
||||
@ -102,53 +104,59 @@ static struct option long_options[] = {
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
const char* vi = "vi";
|
||||
const char* emacs = "emacs";
|
||||
const char* vi = "vi";
|
||||
const char* emacs = "emacs";
|
||||
|
||||
int i, num, rv;
|
||||
int i, num, rv;
|
||||
#ifdef HISTORY
|
||||
char *buf;
|
||||
EditLine *el = NULL;
|
||||
Tokenizer *tok;
|
||||
History *hist;
|
||||
HistEvent ev;
|
||||
char *buf;
|
||||
EditLine *el = NULL;
|
||||
Tokenizer *tok;
|
||||
History *hist;
|
||||
HistEvent ev;
|
||||
#else
|
||||
char buf[1024];
|
||||
char buf[1024];
|
||||
#endif
|
||||
char *hostname = "localhost";
|
||||
char *port = "6603";
|
||||
char *user = "admin";
|
||||
char *passwd = NULL;
|
||||
int use_emacs = 0;
|
||||
int so;
|
||||
int option_index = 0;
|
||||
char c;
|
||||
char *hostname = "localhost";
|
||||
char *port = "6603";
|
||||
char *user = "admin";
|
||||
char *passwd = NULL;
|
||||
int use_emacs = 0;
|
||||
int so;
|
||||
int option_index = 0;
|
||||
char c;
|
||||
|
||||
read_inifile(&hostname, &port, &user, &passwd,&use_emacs);
|
||||
read_inifile(&hostname, &port, &user, &passwd, &use_emacs);
|
||||
|
||||
while ((c = getopt_long(argc, argv, "h:p:P:u:v?e",
|
||||
long_options, &option_index))
|
||||
>= 0)
|
||||
long_options, &option_index)) >= 0)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
switch (c) {
|
||||
case 'h':
|
||||
hostname = strdup(optarg);
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
passwd = strdup(optarg);
|
||||
break;
|
||||
|
||||
case 'P':
|
||||
port = strdup(optarg);
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
user = strdup(optarg);
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
PrintVersion(*argv);
|
||||
exit(EXIT_SUCCESS);
|
||||
|
||||
case 'e':
|
||||
use_emacs = 1;
|
||||
break;
|
||||
|
||||
case '?':
|
||||
DoUsage(*argv);
|
||||
exit(optopt ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
@ -161,30 +169,45 @@ char c;
|
||||
tcflag_t c_lflag;
|
||||
|
||||
if (tcgetattr(STDIN_FILENO, &tty_attr) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
c_lflag = tty_attr.c_lflag;
|
||||
tty_attr.c_lflag &= ~ICANON;
|
||||
tty_attr.c_lflag &= ~ECHO;
|
||||
|
||||
if (tcsetattr(STDIN_FILENO, 0, &tty_attr) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("Password: ");
|
||||
passwd = malloc(80);
|
||||
fgets(passwd, 80, stdin);
|
||||
|
||||
tty_attr.c_lflag = c_lflag;
|
||||
|
||||
if (tcsetattr(STDIN_FILENO, 0, &tty_attr) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
i = strlen(passwd);
|
||||
|
||||
if (i > 1)
|
||||
{
|
||||
passwd[i - 1] = '\0';
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if ((so = connectMaxScale(hostname, port)) == -1)
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!authMaxScale(so, user, passwd))
|
||||
{
|
||||
fprintf(stderr, "Failed to connect to MaxScale. "
|
||||
@ -192,17 +215,19 @@ char c;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (optind < argc) {
|
||||
if (optind < argc)
|
||||
{
|
||||
int i, len = 0;
|
||||
char *cmd;
|
||||
|
||||
for (i = optind; i < argc; i++) {
|
||||
for (i = optind; i < argc; i++)
|
||||
{
|
||||
len += strlen(argv[i]) + 1;
|
||||
}
|
||||
|
||||
cmd = malloc(len + (2 * argc)); // Allow for quotes
|
||||
strncpy(cmd, argv[optind],len + (2 * argc));
|
||||
for (i = optind +1; i < argc; i++)
|
||||
strncpy(cmd, argv[optind], len + (2 * argc));
|
||||
for (i = optind + 1; i < argc; i++)
|
||||
{
|
||||
strcat(cmd, " ");
|
||||
/* Arguments after the second are quoted to allow for names
|
||||
@ -215,13 +240,19 @@ char c;
|
||||
strcat(cmd, "\"");
|
||||
}
|
||||
else
|
||||
{
|
||||
strcat(cmd, argv[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (access(cmd, R_OK) == 0)
|
||||
{
|
||||
DoSource(so, cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
sendCommand(so, cmd);
|
||||
}
|
||||
|
||||
free(cmd);
|
||||
exit(0);
|
||||
@ -238,12 +269,16 @@ char c;
|
||||
/* Initialize editline */
|
||||
el = el_init(*argv, stdin, stdout, stderr);
|
||||
|
||||
if(use_emacs)
|
||||
if (use_emacs)
|
||||
{
|
||||
el_set(el, EL_EDITOR, emacs); /** Editor is emacs */
|
||||
}
|
||||
else
|
||||
{
|
||||
el_set(el, EL_EDITOR, vi); /* Default editor is vi */
|
||||
}
|
||||
el_set(el, EL_SIGNAL, 1); /* Handle signals gracefully */
|
||||
el_set(el, EL_PROMPT, prompt);/* Set the prompt function */
|
||||
el_set(el, EL_PROMPT, prompt); /* Set the prompt function */
|
||||
|
||||
/* Tell editline to use this history interface */
|
||||
el_set(el, EL_HIST, history, hist);
|
||||
@ -260,7 +295,7 @@ char c;
|
||||
*/
|
||||
el_source(el, NULL);
|
||||
|
||||
while ((buf = (char *)el_gets(el, &num)) != NULL && num != 0)
|
||||
while ((buf = (char *) el_gets(el, &num)) != NULL && num != 0)
|
||||
{
|
||||
#else
|
||||
while (printf("MaxScale> ") && fgets(buf, 1024, stdin) != NULL)
|
||||
@ -269,7 +304,9 @@ char c;
|
||||
#endif
|
||||
/* Strip trailing \n\r */
|
||||
for (i = num - 1; buf[i] == '\r' || buf[i] == '\n'; i--)
|
||||
{
|
||||
buf[i] = 0;
|
||||
}
|
||||
|
||||
#ifdef HISTORY
|
||||
el_line(el);
|
||||
@ -285,8 +322,10 @@ char c;
|
||||
#ifdef HISTORY
|
||||
for (rv = history(hist, &ev, H_LAST); rv != -1;
|
||||
rv = history(hist, &ev, H_PREV))
|
||||
{
|
||||
fprintf(stdout, "%4d %s\n",
|
||||
ev.num, ev.str);
|
||||
}
|
||||
#else
|
||||
fprintf(stderr, "History not supported in this version.\n");
|
||||
#endif
|
||||
@ -298,7 +337,9 @@ char c;
|
||||
/* Find the filename */
|
||||
ptr = &buf[strlen("source")];
|
||||
while (*ptr && isspace(*ptr))
|
||||
{
|
||||
ptr++;
|
||||
}
|
||||
|
||||
DoSource(so, ptr);
|
||||
}
|
||||
@ -330,9 +371,9 @@ char c;
|
||||
static int
|
||||
connectMaxScale(char *hostname, char *port)
|
||||
{
|
||||
struct sockaddr_in addr;
|
||||
int so;
|
||||
int keepalive = 1;
|
||||
struct sockaddr_in addr;
|
||||
int so;
|
||||
int keepalive = 1;
|
||||
|
||||
if ((so = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
@ -345,7 +386,8 @@ int keepalive = 1;
|
||||
addr.sin_family = AF_INET;
|
||||
setipaddress(&addr.sin_addr, hostname);
|
||||
addr.sin_port = htons(atoi(port));
|
||||
if (connect(so, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||||
|
||||
if (connect(so, (struct sockaddr *) &addr, sizeof(addr)) < 0)
|
||||
{
|
||||
char errbuf[STRERROR_BUFLEN];
|
||||
fprintf(stderr, "Unable to connect to MaxScale at %s, %s: %s\n",
|
||||
@ -353,14 +395,15 @@ int keepalive = 1;
|
||||
close(so);
|
||||
return -1;
|
||||
}
|
||||
if (setsockopt(so, SOL_SOCKET,
|
||||
SO_KEEPALIVE, &keepalive , sizeof(keepalive )))
|
||||
|
||||
if (setsockopt(so, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive)))
|
||||
{
|
||||
perror("setsockopt");
|
||||
}
|
||||
|
||||
return so;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set IP address in socket structure in_addr
|
||||
*
|
||||
@ -375,19 +418,21 @@ setipaddress(struct in_addr *a, char *p)
|
||||
struct addrinfo *ai = NULL, hint;
|
||||
int rc;
|
||||
struct sockaddr_in * res_addr;
|
||||
memset(&hint, 0, sizeof (hint));
|
||||
memset(&hint, 0, sizeof(hint));
|
||||
|
||||
hint.ai_socktype = SOCK_STREAM;
|
||||
hint.ai_flags = AI_CANONNAME;
|
||||
hint.ai_family = AF_INET;
|
||||
|
||||
if ((rc = getaddrinfo(p, NULL, &hint, &ai)) != 0) {
|
||||
if ((rc = getaddrinfo(p, NULL, &hint, &ai)) != 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* take the first one */
|
||||
if (ai != NULL) {
|
||||
res_addr = (struct sockaddr_in *)(ai->ai_addr);
|
||||
if (ai != NULL)
|
||||
{
|
||||
res_addr = (struct sockaddr_in *) (ai->ai_addr);
|
||||
memcpy(a, &res_addr->sin_addr, sizeof(struct in_addr));
|
||||
|
||||
freeaddrinfo(ai);
|
||||
@ -401,11 +446,15 @@ setipaddress(struct in_addr *a, char *p)
|
||||
h = gethostbyname(p);
|
||||
spinlock_release(&tmplock);
|
||||
|
||||
if (h == NULL) {
|
||||
if ((a->s_addr = inet_addr(p)) == -1) {
|
||||
if (h == NULL)
|
||||
{
|
||||
if ((a->s_addr = inet_addr(p)) == -1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
/* take the first one */
|
||||
memcpy(a, h->h_addr, h->h_length);
|
||||
|
||||
@ -426,16 +475,26 @@ setipaddress(struct in_addr *a, char *p)
|
||||
static int
|
||||
authMaxScale(int so, char *user, char *password)
|
||||
{
|
||||
char buf[20];
|
||||
char buf[20];
|
||||
|
||||
if (read(so, buf, 4) != 4)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
write(so, user, strlen(user));
|
||||
|
||||
if (read(so, buf, 8) != 8)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
write(so, password, strlen(password));
|
||||
|
||||
if (read(so, buf, 6) != 6)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return strncmp(buf, "FAILED", 6);
|
||||
}
|
||||
@ -453,19 +512,27 @@ char buf[20];
|
||||
static int
|
||||
sendCommand(int so, char *cmd)
|
||||
{
|
||||
char buf[80];
|
||||
int i, j, newline = 1;
|
||||
char buf[80];
|
||||
int i, j, newline = 1;
|
||||
|
||||
if (write(so, cmd, strlen(cmd)) == -1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
if ((i = read(so, buf, 80)) <= 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (j = 0; j < i; j++)
|
||||
{
|
||||
if (newline == 1 && buf[j] == 'O')
|
||||
{
|
||||
newline = 2;
|
||||
}
|
||||
else if ((newline == 2 && buf[j] == 'K' && j == i - 1) ||
|
||||
(j == i - 2 && buf[j] == 'O' && buf[j + 1] == 'K'))
|
||||
{
|
||||
@ -501,9 +568,9 @@ int i, j, newline = 1;
|
||||
static void
|
||||
DoSource(int so, char *file)
|
||||
{
|
||||
char *ptr, *pe;
|
||||
char line[132];
|
||||
FILE *fp;
|
||||
char *ptr, *pe;
|
||||
char line[132];
|
||||
FILE *fp;
|
||||
|
||||
if ((fp = fopen(file, "r")) == NULL)
|
||||
{
|
||||
@ -515,7 +582,7 @@ FILE *fp;
|
||||
while ((ptr = fgets(line, 132, fp)) != NULL)
|
||||
{
|
||||
/* Strip tailing newlines */
|
||||
pe = &ptr[strlen(ptr)-1];
|
||||
pe = &ptr[strlen(ptr) - 1];
|
||||
while (pe >= ptr && (*pe == '\r' || *pe == '\n'))
|
||||
{
|
||||
*pe = '\0';
|
||||
@ -524,7 +591,7 @@ FILE *fp;
|
||||
|
||||
if (*ptr != '#') /* Comment */
|
||||
{
|
||||
if (! sendCommand(so, ptr))
|
||||
if (!sendCommand(so, ptr))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@ -551,7 +618,8 @@ DoUsage(const char *progname)
|
||||
{
|
||||
PrintVersion(progname);
|
||||
printf("The MaxScale administrative and monitor client.\n\n");
|
||||
printf("Usage: %s [-u user] [-p password] [-h hostname] [-P port] [<command file> | <command>]\n\n", progname);
|
||||
printf("Usage: %s [-u user] [-p password] [-h hostname] [-P port] "
|
||||
"[<command file> | <command>]\n\n", progname);
|
||||
printf(" -u|--user=... The user name to use for the connection, default\n");
|
||||
printf(" is admin.\n");
|
||||
printf(" -p|--password=... The user password, if not given the password will\n");
|
||||
@ -575,14 +643,23 @@ DoUsage(const char *progname)
|
||||
static int
|
||||
isquit(char *buf)
|
||||
{
|
||||
char *ptr = buf;
|
||||
char *ptr = buf;
|
||||
|
||||
if (!buf)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (*ptr && isspace(*ptr))
|
||||
{
|
||||
ptr++;
|
||||
}
|
||||
|
||||
if (strncasecmp(ptr, "quit", 4) == 0 || strncasecmp(ptr, "exit", 4) == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -594,12 +671,17 @@ char *ptr = buf;
|
||||
static void
|
||||
rtrim(char *str)
|
||||
{
|
||||
char *ptr = str + strlen(str);
|
||||
char *ptr = str + strlen(str);
|
||||
|
||||
if (ptr > str) // step back from the terminating null
|
||||
{
|
||||
ptr--; // If the string has more characters
|
||||
}
|
||||
|
||||
while (ptr >= str && isspace(*ptr))
|
||||
{
|
||||
*ptr-- = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -614,47 +696,69 @@ char *ptr = str + strlen(str);
|
||||
static void
|
||||
read_inifile(char **hostname, char **port, char **user, char **passwd, int* editor)
|
||||
{
|
||||
char pathname[400];
|
||||
char *home, *brkt;
|
||||
char *name, *value;
|
||||
FILE *fp;
|
||||
char line[400];
|
||||
char pathname[400];
|
||||
char *home, *brkt;
|
||||
char *name, *value;
|
||||
FILE *fp;
|
||||
char line[400];
|
||||
|
||||
if ((home = getenv("HOME")) == NULL)
|
||||
{
|
||||
return;
|
||||
snprintf(pathname, 400, "%s/.maxadmin", home);
|
||||
}
|
||||
|
||||
snprintf(pathname, sizeof(pathname), "%s/.maxadmin", home);
|
||||
if ((fp = fopen(pathname, "r")) == NULL)
|
||||
{
|
||||
return;
|
||||
while (fgets(line, 400, fp) != NULL)
|
||||
}
|
||||
|
||||
while (fgets(line, sizeof(line), fp) != NULL)
|
||||
{
|
||||
rtrim(line);
|
||||
if (line[0] == 0)
|
||||
continue;
|
||||
if (line[0] == '#')
|
||||
if (line[0] == 0 || line[0] == '#')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
name = strtok_r(line, "=", &brkt);
|
||||
value = strtok_r(NULL, "=", &brkt);
|
||||
|
||||
if (name && value)
|
||||
{
|
||||
if (strcmp(name, "hostname") == 0)
|
||||
{
|
||||
*hostname = strdup(value);
|
||||
}
|
||||
else if (strcmp(name, "port") == 0)
|
||||
{
|
||||
*port = strdup(value);
|
||||
}
|
||||
else if (strcmp(name, "user") == 0)
|
||||
{
|
||||
*user = strdup(value);
|
||||
}
|
||||
else if (strcmp(name, "passwd") == 0)
|
||||
{
|
||||
*passwd = strdup(value);
|
||||
}
|
||||
else if (strcmp(name, "editor") == 0)
|
||||
{
|
||||
|
||||
if(strcmp(value,"vi") == 0)
|
||||
if (strcmp(value, "vi") == 0)
|
||||
{
|
||||
*editor = 0;
|
||||
else if(strcmp(value,"emacs") == 0)
|
||||
}
|
||||
else if (strcmp(value, "emacs") == 0)
|
||||
{
|
||||
*editor = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "WARNING: Unrecognised "
|
||||
"parameter '%s=%s' in .maxadmin file\n", name, value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "WARNING: Unrecognised "
|
||||
|
||||
Reference in New Issue
Block a user