Formatted maxadmin.c

Formatted maxadmin.c according to the style guide.
This commit is contained in:
Markus Makela
2016-01-21 19:41:32 +02:00
parent 608924beba
commit cceeb2d234

View File

@ -70,9 +70,10 @@ static void DoSource(int so, char *cmd);
static void DoUsage(const char*); static void DoUsage(const char*);
static int isquit(char *buf); static int isquit(char *buf);
static void PrintVersion(const char *progname); 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'},
@ -102,53 +104,59 @@ static struct option long_options[] = {
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
const char* vi = "vi"; const char* vi = "vi";
const char* emacs = "emacs"; const char* emacs = "emacs";
int i, num, rv; int i, num, rv;
#ifdef HISTORY #ifdef HISTORY
char *buf; char *buf;
EditLine *el = NULL; EditLine *el = NULL;
Tokenizer *tok; Tokenizer *tok;
History *hist; History *hist;
HistEvent ev; HistEvent ev;
#else #else
char buf[1024]; char buf[1024];
#endif #endif
char *hostname = "localhost"; char *hostname = "localhost";
char *port = "6603"; char *port = "6603";
char *user = "admin"; char *user = "admin";
char *passwd = NULL; char *passwd = NULL;
int use_emacs = 0; int use_emacs = 0;
int so; int so;
int option_index = 0; int option_index = 0;
char c; 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,17 +215,19 @@ 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;
} }
cmd = malloc(len + (2 * argc)); // Allow for quotes cmd = malloc(len + (2 * argc)); // Allow for quotes
strncpy(cmd, argv[optind],len + (2 * argc)); strncpy(cmd, argv[optind], len + (2 * argc));
for (i = optind +1; i < argc; i++) for (i = optind + 1; i < argc; i++)
{ {
strcat(cmd, " "); strcat(cmd, " ");
/* Arguments after the second are quoted to allow for names /* Arguments after the second are quoted to allow for names
@ -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);
@ -238,12 +269,16 @@ char c;
/* Initialize editline */ /* Initialize editline */
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 */
/* Tell editline to use this history interface */ /* Tell editline to use this history interface */
el_set(el, EL_HIST, history, hist); el_set(el, EL_HIST, history, hist);
@ -260,7 +295,7 @@ char c;
*/ */
el_source(el, NULL); 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 #else
while (printf("MaxScale> ") && fgets(buf, 1024, stdin) != NULL) while (printf("MaxScale> ") && fgets(buf, 1024, stdin) != NULL)
@ -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);
} }
@ -330,9 +371,9 @@ char c;
static int static int
connectMaxScale(char *hostname, char *port) connectMaxScale(char *hostname, char *port)
{ {
struct sockaddr_in addr; struct sockaddr_in addr;
int so; int so;
int keepalive = 1; int keepalive = 1;
if ((so = socket(AF_INET, SOCK_STREAM, 0)) < 0) if ((so = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{ {
@ -345,7 +386,8 @@ 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];
fprintf(stderr, "Unable to connect to MaxScale at %s, %s: %s\n", fprintf(stderr, "Unable to connect to MaxScale at %s, %s: %s\n",
@ -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
* *
@ -375,19 +418,21 @@ setipaddress(struct in_addr *a, char *p)
struct addrinfo *ai = NULL, hint; struct addrinfo *ai = NULL, hint;
int rc; int rc;
struct sockaddr_in * res_addr; struct sockaddr_in * res_addr;
memset(&hint, 0, sizeof (hint)); memset(&hint, 0, sizeof(hint));
hint.ai_socktype = SOCK_STREAM; hint.ai_socktype = SOCK_STREAM;
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));
freeaddrinfo(ai); freeaddrinfo(ai);
@ -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);
@ -426,16 +475,26 @@ setipaddress(struct in_addr *a, char *p)
static int static int
authMaxScale(int so, char *user, char *password) 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);
} }
@ -453,19 +512,27 @@ char buf[20];
static int static int
sendCommand(int so, char *cmd) sendCommand(int so, char *cmd)
{ {
char buf[80]; 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'))
{ {
@ -501,9 +568,9 @@ int i, j, newline = 1;
static void static void
DoSource(int so, char *file) DoSource(int so, char *file)
{ {
char *ptr, *pe; char *ptr, *pe;
char line[132]; char line[132];
FILE *fp; FILE *fp;
if ((fp = fopen(file, "r")) == NULL) if ((fp = fopen(file, "r")) == NULL)
{ {
@ -515,7 +582,7 @@ FILE *fp;
while ((ptr = fgets(line, 132, fp)) != NULL) while ((ptr = fgets(line, 132, fp)) != NULL)
{ {
/* Strip tailing newlines */ /* Strip tailing newlines */
pe = &ptr[strlen(ptr)-1]; pe = &ptr[strlen(ptr) - 1];
while (pe >= ptr && (*pe == '\r' || *pe == '\n')) while (pe >= ptr && (*pe == '\r' || *pe == '\n'))
{ {
*pe = '\0'; *pe = '\0';
@ -524,7 +591,7 @@ FILE *fp;
if (*ptr != '#') /* Comment */ if (*ptr != '#') /* Comment */
{ {
if (! sendCommand(so, ptr)) if (!sendCommand(so, ptr))
{ {
break; break;
} }
@ -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");
@ -575,14 +643,23 @@ DoUsage(const char *progname)
static int static int
isquit(char *buf) 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;
} }
@ -594,12 +671,17 @@ char *ptr = buf;
static void static void
rtrim(char *str) 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;
}
} }
/** /**
@ -614,47 +696,69 @@ char *ptr = str + strlen(str);
static void static void
read_inifile(char **hostname, char **port, char **user, char **passwd, int* editor) read_inifile(char **hostname, char **port, char **user, char **passwd, int* editor)
{ {
char pathname[400]; char pathname[400];
char *home, *brkt; char *home, *brkt;
char *name, *value; char *name, *value;
FILE *fp; 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 "