Formatted maxadmin.c
Formatted maxadmin.c according to the style guide.
This commit is contained in:
@ -73,6 +73,7 @@ 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
|
#ifdef HISTORY
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
prompt(EditLine *el __attribute__((__unused__)))
|
prompt(EditLine *el __attribute__((__unused__)))
|
||||||
{
|
{
|
||||||
@ -82,7 +83,8 @@ prompt(EditLine *el __attribute__((__unused__)))
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] =
|
||||||
|
{
|
||||||
{"host", required_argument, 0, 'h'},
|
{"host", required_argument, 0, 'h'},
|
||||||
{"user", required_argument, 0, 'u'},
|
{"user", required_argument, 0, 'u'},
|
||||||
{"password", required_argument, 0, 'p'},
|
{"password", required_argument, 0, 'p'},
|
||||||
@ -127,28 +129,34 @@ 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",
|
while ((c = getopt_long(argc, argv, "h:p:P:u:v?e",
|
||||||
long_options, &option_index))
|
long_options, &option_index)) >= 0)
|
||||||
>= 0)
|
{
|
||||||
|
switch (c)
|
||||||
{
|
{
|
||||||
switch (c) {
|
|
||||||
case 'h':
|
case 'h':
|
||||||
hostname = strdup(optarg);
|
hostname = strdup(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'p':
|
case 'p':
|
||||||
passwd = strdup(optarg);
|
passwd = strdup(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'P':
|
case 'P':
|
||||||
port = strdup(optarg);
|
port = strdup(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'u':
|
case 'u':
|
||||||
user = strdup(optarg);
|
user = strdup(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'v':
|
case 'v':
|
||||||
PrintVersion(*argv);
|
PrintVersion(*argv);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
|
|
||||||
case 'e':
|
case 'e':
|
||||||
use_emacs = 1;
|
use_emacs = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '?':
|
case '?':
|
||||||
DoUsage(*argv);
|
DoUsage(*argv);
|
||||||
exit(optopt ? EXIT_FAILURE : EXIT_SUCCESS);
|
exit(optopt ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||||
@ -161,30 +169,45 @@ char c;
|
|||||||
tcflag_t c_lflag;
|
tcflag_t c_lflag;
|
||||||
|
|
||||||
if (tcgetattr(STDIN_FILENO, &tty_attr) < 0)
|
if (tcgetattr(STDIN_FILENO, &tty_attr) < 0)
|
||||||
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
c_lflag = tty_attr.c_lflag;
|
c_lflag = tty_attr.c_lflag;
|
||||||
tty_attr.c_lflag &= ~ICANON;
|
tty_attr.c_lflag &= ~ICANON;
|
||||||
tty_attr.c_lflag &= ~ECHO;
|
tty_attr.c_lflag &= ~ECHO;
|
||||||
|
|
||||||
if (tcsetattr(STDIN_FILENO, 0, &tty_attr) < 0)
|
if (tcsetattr(STDIN_FILENO, 0, &tty_attr) < 0)
|
||||||
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
printf("Password: ");
|
printf("Password: ");
|
||||||
passwd = malloc(80);
|
passwd = malloc(80);
|
||||||
fgets(passwd, 80, stdin);
|
fgets(passwd, 80, stdin);
|
||||||
|
|
||||||
tty_attr.c_lflag = c_lflag;
|
tty_attr.c_lflag = c_lflag;
|
||||||
|
|
||||||
if (tcsetattr(STDIN_FILENO, 0, &tty_attr) < 0)
|
if (tcsetattr(STDIN_FILENO, 0, &tty_attr) < 0)
|
||||||
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
i = strlen(passwd);
|
i = strlen(passwd);
|
||||||
|
|
||||||
if (i > 1)
|
if (i > 1)
|
||||||
|
{
|
||||||
passwd[i - 1] = '\0';
|
passwd[i - 1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((so = connectMaxScale(hostname, port)) == -1)
|
if ((so = connectMaxScale(hostname, port)) == -1)
|
||||||
|
{
|
||||||
exit(1);
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (!authMaxScale(so, user, passwd))
|
if (!authMaxScale(so, user, passwd))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to connect to MaxScale. "
|
fprintf(stderr, "Failed to connect to MaxScale. "
|
||||||
@ -192,11 +215,13 @@ char c;
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (optind < argc) {
|
if (optind < argc)
|
||||||
|
{
|
||||||
int i, len = 0;
|
int i, len = 0;
|
||||||
char *cmd;
|
char *cmd;
|
||||||
|
|
||||||
for (i = optind; i < argc; i++) {
|
for (i = optind; i < argc; i++)
|
||||||
|
{
|
||||||
len += strlen(argv[i]) + 1;
|
len += strlen(argv[i]) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,13 +240,19 @@ char c;
|
|||||||
strcat(cmd, "\"");
|
strcat(cmd, "\"");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
strcat(cmd, argv[i]);
|
strcat(cmd, argv[i]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (access(cmd, R_OK) == 0)
|
if (access(cmd, R_OK) == 0)
|
||||||
|
{
|
||||||
DoSource(so, cmd);
|
DoSource(so, cmd);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
sendCommand(so, cmd);
|
sendCommand(so, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
free(cmd);
|
free(cmd);
|
||||||
exit(0);
|
exit(0);
|
||||||
@ -239,9 +270,13 @@ char c;
|
|||||||
el = el_init(*argv, stdin, stdout, stderr);
|
el = el_init(*argv, stdin, stdout, stderr);
|
||||||
|
|
||||||
if (use_emacs)
|
if (use_emacs)
|
||||||
|
{
|
||||||
el_set(el, EL_EDITOR, emacs); /** Editor is emacs */
|
el_set(el, EL_EDITOR, emacs); /** Editor is emacs */
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
el_set(el, EL_EDITOR, vi); /* Default editor is vi */
|
el_set(el, EL_EDITOR, vi); /* Default editor is vi */
|
||||||
|
}
|
||||||
el_set(el, EL_SIGNAL, 1); /* Handle signals gracefully */
|
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 */
|
||||||
|
|
||||||
@ -269,7 +304,9 @@ char c;
|
|||||||
#endif
|
#endif
|
||||||
/* Strip trailing \n\r */
|
/* Strip trailing \n\r */
|
||||||
for (i = num - 1; buf[i] == '\r' || buf[i] == '\n'; i--)
|
for (i = num - 1; buf[i] == '\r' || buf[i] == '\n'; i--)
|
||||||
|
{
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HISTORY
|
#ifdef HISTORY
|
||||||
el_line(el);
|
el_line(el);
|
||||||
@ -285,8 +322,10 @@ char c;
|
|||||||
#ifdef HISTORY
|
#ifdef HISTORY
|
||||||
for (rv = history(hist, &ev, H_LAST); rv != -1;
|
for (rv = history(hist, &ev, H_LAST); rv != -1;
|
||||||
rv = history(hist, &ev, H_PREV))
|
rv = history(hist, &ev, H_PREV))
|
||||||
|
{
|
||||||
fprintf(stdout, "%4d %s\n",
|
fprintf(stdout, "%4d %s\n",
|
||||||
ev.num, ev.str);
|
ev.num, ev.str);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
fprintf(stderr, "History not supported in this version.\n");
|
fprintf(stderr, "History not supported in this version.\n");
|
||||||
#endif
|
#endif
|
||||||
@ -298,7 +337,9 @@ char c;
|
|||||||
/* Find the filename */
|
/* Find the filename */
|
||||||
ptr = &buf[strlen("source")];
|
ptr = &buf[strlen("source")];
|
||||||
while (*ptr && isspace(*ptr))
|
while (*ptr && isspace(*ptr))
|
||||||
|
{
|
||||||
ptr++;
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
DoSource(so, ptr);
|
DoSource(so, ptr);
|
||||||
}
|
}
|
||||||
@ -345,6 +386,7 @@ int keepalive = 1;
|
|||||||
addr.sin_family = AF_INET;
|
addr.sin_family = AF_INET;
|
||||||
setipaddress(&addr.sin_addr, hostname);
|
setipaddress(&addr.sin_addr, hostname);
|
||||||
addr.sin_port = htons(atoi(port));
|
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];
|
char errbuf[STRERROR_BUFLEN];
|
||||||
@ -353,14 +395,15 @@ int keepalive = 1;
|
|||||||
close(so);
|
close(so);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (setsockopt(so, SOL_SOCKET,
|
|
||||||
SO_KEEPALIVE, &keepalive , sizeof(keepalive )))
|
if (setsockopt(so, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive)))
|
||||||
|
{
|
||||||
perror("setsockopt");
|
perror("setsockopt");
|
||||||
|
}
|
||||||
|
|
||||||
return so;
|
return so;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set IP address in socket structure in_addr
|
* Set IP address in socket structure in_addr
|
||||||
*
|
*
|
||||||
@ -381,12 +424,14 @@ setipaddress(struct in_addr *a, char *p)
|
|||||||
hint.ai_flags = AI_CANONNAME;
|
hint.ai_flags = AI_CANONNAME;
|
||||||
hint.ai_family = AF_INET;
|
hint.ai_family = AF_INET;
|
||||||
|
|
||||||
if ((rc = getaddrinfo(p, NULL, &hint, &ai)) != 0) {
|
if ((rc = getaddrinfo(p, NULL, &hint, &ai)) != 0)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* take the first one */
|
/* take the first one */
|
||||||
if (ai != NULL) {
|
if (ai != NULL)
|
||||||
|
{
|
||||||
res_addr = (struct sockaddr_in *) (ai->ai_addr);
|
res_addr = (struct sockaddr_in *) (ai->ai_addr);
|
||||||
memcpy(a, &res_addr->sin_addr, sizeof(struct in_addr));
|
memcpy(a, &res_addr->sin_addr, sizeof(struct in_addr));
|
||||||
|
|
||||||
@ -401,11 +446,15 @@ setipaddress(struct in_addr *a, char *p)
|
|||||||
h = gethostbyname(p);
|
h = gethostbyname(p);
|
||||||
spinlock_release(&tmplock);
|
spinlock_release(&tmplock);
|
||||||
|
|
||||||
if (h == NULL) {
|
if (h == NULL)
|
||||||
if ((a->s_addr = inet_addr(p)) == -1) {
|
{
|
||||||
|
if ((a->s_addr = inet_addr(p)) == -1)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
/* take the first one */
|
/* take the first one */
|
||||||
memcpy(a, h->h_addr, h->h_length);
|
memcpy(a, h->h_addr, h->h_length);
|
||||||
|
|
||||||
@ -429,13 +478,23 @@ authMaxScale(int so, char *user, char *password)
|
|||||||
char buf[20];
|
char buf[20];
|
||||||
|
|
||||||
if (read(so, buf, 4) != 4)
|
if (read(so, buf, 4) != 4)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
write(so, user, strlen(user));
|
write(so, user, strlen(user));
|
||||||
|
|
||||||
if (read(so, buf, 8) != 8)
|
if (read(so, buf, 8) != 8)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
write(so, password, strlen(password));
|
write(so, password, strlen(password));
|
||||||
|
|
||||||
if (read(so, buf, 6) != 6)
|
if (read(so, buf, 6) != 6)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return strncmp(buf, "FAILED", 6);
|
return strncmp(buf, "FAILED", 6);
|
||||||
}
|
}
|
||||||
@ -457,15 +516,23 @@ char buf[80];
|
|||||||
int i, j, newline = 1;
|
int i, j, newline = 1;
|
||||||
|
|
||||||
if (write(so, cmd, strlen(cmd)) == -1)
|
if (write(so, cmd, strlen(cmd)) == -1)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if ((i = read(so, buf, 80)) <= 0)
|
if ((i = read(so, buf, 80)) <= 0)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (j = 0; j < i; j++)
|
for (j = 0; j < i; j++)
|
||||||
{
|
{
|
||||||
if (newline == 1 && buf[j] == 'O')
|
if (newline == 1 && buf[j] == 'O')
|
||||||
|
{
|
||||||
newline = 2;
|
newline = 2;
|
||||||
|
}
|
||||||
else if ((newline == 2 && buf[j] == 'K' && j == i - 1) ||
|
else if ((newline == 2 && buf[j] == 'K' && j == i - 1) ||
|
||||||
(j == i - 2 && buf[j] == 'O' && buf[j + 1] == 'K'))
|
(j == i - 2 && buf[j] == 'O' && buf[j + 1] == 'K'))
|
||||||
{
|
{
|
||||||
@ -551,7 +618,8 @@ DoUsage(const char *progname)
|
|||||||
{
|
{
|
||||||
PrintVersion(progname);
|
PrintVersion(progname);
|
||||||
printf("The MaxScale administrative and monitor client.\n\n");
|
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(" -u|--user=... The user name to use for the connection, default\n");
|
||||||
printf(" is admin.\n");
|
printf(" is admin.\n");
|
||||||
printf(" -p|--password=... The user password, if not given the password will\n");
|
printf(" -p|--password=... The user password, if not given the password will\n");
|
||||||
@ -578,11 +646,20 @@ isquit(char *buf)
|
|||||||
char *ptr = buf;
|
char *ptr = buf;
|
||||||
|
|
||||||
if (!buf)
|
if (!buf)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
while (*ptr && isspace(*ptr))
|
while (*ptr && isspace(*ptr))
|
||||||
|
{
|
||||||
ptr++;
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
if (strncasecmp(ptr, "quit", 4) == 0 || strncasecmp(ptr, "exit", 4) == 0)
|
if (strncasecmp(ptr, "quit", 4) == 0 || strncasecmp(ptr, "exit", 4) == 0)
|
||||||
|
{
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -597,10 +674,15 @@ rtrim(char *str)
|
|||||||
char *ptr = str + strlen(str);
|
char *ptr = str + strlen(str);
|
||||||
|
|
||||||
if (ptr > str) // step back from the terminating null
|
if (ptr > str) // step back from the terminating null
|
||||||
|
{
|
||||||
ptr--; // If the string has more characters
|
ptr--; // If the string has more characters
|
||||||
|
}
|
||||||
|
|
||||||
while (ptr >= str && isspace(*ptr))
|
while (ptr >= str && isspace(*ptr))
|
||||||
|
{
|
||||||
*ptr-- = 0;
|
*ptr-- = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read defaults for hostname, port, user and password from
|
* Read defaults for hostname, port, user and password from
|
||||||
@ -621,40 +703,62 @@ FILE *fp;
|
|||||||
char line[400];
|
char line[400];
|
||||||
|
|
||||||
if ((home = getenv("HOME")) == NULL)
|
if ((home = getenv("HOME")) == NULL)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
snprintf(pathname, 400, "%s/.maxadmin", home);
|
}
|
||||||
|
|
||||||
|
snprintf(pathname, sizeof(pathname), "%s/.maxadmin", home);
|
||||||
if ((fp = fopen(pathname, "r")) == NULL)
|
if ((fp = fopen(pathname, "r")) == NULL)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
while (fgets(line, 400, fp) != NULL)
|
}
|
||||||
|
|
||||||
|
while (fgets(line, sizeof(line), fp) != NULL)
|
||||||
{
|
{
|
||||||
rtrim(line);
|
rtrim(line);
|
||||||
if (line[0] == 0)
|
if (line[0] == 0 || line[0] == '#')
|
||||||
continue;
|
{
|
||||||
if (line[0] == '#')
|
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
name = strtok_r(line, "=", &brkt);
|
name = strtok_r(line, "=", &brkt);
|
||||||
value = strtok_r(NULL, "=", &brkt);
|
value = strtok_r(NULL, "=", &brkt);
|
||||||
|
|
||||||
if (name && value)
|
if (name && value)
|
||||||
{
|
{
|
||||||
if (strcmp(name, "hostname") == 0)
|
if (strcmp(name, "hostname") == 0)
|
||||||
|
{
|
||||||
*hostname = strdup(value);
|
*hostname = strdup(value);
|
||||||
|
}
|
||||||
else if (strcmp(name, "port") == 0)
|
else if (strcmp(name, "port") == 0)
|
||||||
|
{
|
||||||
*port = strdup(value);
|
*port = strdup(value);
|
||||||
|
}
|
||||||
else if (strcmp(name, "user") == 0)
|
else if (strcmp(name, "user") == 0)
|
||||||
|
{
|
||||||
*user = strdup(value);
|
*user = strdup(value);
|
||||||
|
}
|
||||||
else if (strcmp(name, "passwd") == 0)
|
else if (strcmp(name, "passwd") == 0)
|
||||||
|
{
|
||||||
*passwd = strdup(value);
|
*passwd = strdup(value);
|
||||||
|
}
|
||||||
else if (strcmp(name, "editor") == 0)
|
else if (strcmp(name, "editor") == 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (strcmp(value, "vi") == 0)
|
if (strcmp(value, "vi") == 0)
|
||||||
|
{
|
||||||
*editor = 0;
|
*editor = 0;
|
||||||
|
}
|
||||||
else if (strcmp(value, "emacs") == 0)
|
else if (strcmp(value, "emacs") == 0)
|
||||||
|
{
|
||||||
*editor = 1;
|
*editor = 1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
fprintf(stderr, "WARNING: Unrecognised "
|
fprintf(stderr, "WARNING: Unrecognised "
|
||||||
"parameter '%s=%s' in .maxadmin file\n", name, value);
|
"parameter '%s=%s' in .maxadmin file\n", name, value);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf(stderr, "WARNING: Unrecognised "
|
fprintf(stderr, "WARNING: Unrecognised "
|
||||||
|
|||||||
Reference in New Issue
Block a user