From cceeb2d234d7535364b6974041836170c3f9c483 Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Thu, 21 Jan 2016 19:41:32 +0200 Subject: [PATCH] Formatted maxadmin.c Formatted maxadmin.c according to the style guide. --- client/maxadmin.c | 964 +++++++++++++++++++++++++--------------------- 1 file changed, 534 insertions(+), 430 deletions(-) diff --git a/client/maxadmin.c b/client/maxadmin.c index 2fce7b55d..b406c66ba 100644 --- a/client/maxadmin.c +++ b/client/maxadmin.c @@ -22,11 +22,11 @@ * @verbatim * Revision History * - * Date Who Description - * 13/06/14 Mark Riddoch Initial implementation - * 15/06/14 Mark Riddoch Addition of source command - * 26/06/14 Mark Riddoch Fix issue with final OK split across - * multiple reads + * Date Who Description + * 13/06/14 Mark Riddoch Initial implementation + * 15/06/14 Mark Riddoch Addition of source command + * 26/06/14 Mark Riddoch Fix issue with final OK split across + * multiple reads * * @endverbatim */ @@ -70,374 +70,433 @@ 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__))) { - static char prompt[] = "MaxScale> "; + static char prompt[] = "MaxScale> "; - return prompt; + return prompt; } #endif -static struct option long_options[] = { - {"host", required_argument, 0, 'h'}, - {"user", required_argument, 0, 'u'}, - {"password", required_argument, 0, 'p'}, - {"port", required_argument, 0, 'P'}, - {"version", no_argument, 0, 'v'}, - {"help", no_argument, 0, '?'}, - {"emacs", no_argument, 0, 'e'}, - {0, 0, 0, 0} +static struct option long_options[] = +{ + {"host", required_argument, 0, 'h'}, + {"user", required_argument, 0, 'u'}, + {"password", required_argument, 0, 'p'}, + {"port", required_argument, 0, 'P'}, + {"version", no_argument, 0, 'v'}, + {"help", no_argument, 0, '?'}, + {"emacs", no_argument, 0, 'e'}, + {0, 0, 0, 0} }; /** * The main for the maxadmin client * - * @param argc Number of arguments - * @param argv The command line arguments + * @param argc Number of arguments + * @param argv The command line arguments */ 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) + while ((c = getopt_long(argc, argv, "h:p:P:u:v?e", + 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); - } - } + case 'h': + hostname = strdup(optarg); + break; - if (passwd == NULL) - { - struct termios tty_attr; - tcflag_t c_lflag; - - if (tcgetattr(STDIN_FILENO, &tty_attr) < 0) - return -1; + case 'p': + passwd = strdup(optarg); + break; - c_lflag = tty_attr.c_lflag; - tty_attr.c_lflag &= ~ICANON; - tty_attr.c_lflag &= ~ECHO; + case 'P': + port = strdup(optarg); + break; - if (tcsetattr(STDIN_FILENO, 0, &tty_attr) < 0) - return -1; + case 'u': + user = strdup(optarg); + break; - printf("Password: "); - passwd = malloc(80); - fgets(passwd, 80, stdin); + case 'v': + PrintVersion(*argv); + exit(EXIT_SUCCESS); - 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"); - } + case 'e': + use_emacs = 1; + break; - if ((so = connectMaxScale(hostname, port)) == -1) - exit(1); - if (!authMaxScale(so, user, passwd)) - { - fprintf(stderr, "Failed to connect to MaxScale. " - "Incorrect username or password.\n"); - exit(1); - } + case '?': + DoUsage(*argv); + exit(optopt ? EXIT_FAILURE : EXIT_SUCCESS); + } + } - if (optind < argc) { - int i, len = 0; - char *cmd; + if (passwd == NULL) + { + struct termios tty_attr; + tcflag_t c_lflag; - for (i = optind; i < argc; i++) { - len += strlen(argv[i]) + 1; - } + if (tcgetattr(STDIN_FILENO, &tty_attr) < 0) + { + return -1; + } - cmd = malloc(len + (2 * argc)); // Allow for quotes - 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 - * that contain white space - */ - if (i - optind > 1) - { - strcat(cmd, "\""); - strcat(cmd, argv[i]); - strcat(cmd, "\""); - } - else - strcat(cmd, argv[i]); - } + c_lflag = tty_attr.c_lflag; + tty_attr.c_lflag &= ~ICANON; + tty_attr.c_lflag &= ~ECHO; - if (access(cmd, R_OK) == 0) - DoSource(so, cmd); - else - sendCommand(so, cmd); + if (tcsetattr(STDIN_FILENO, 0, &tty_attr) < 0) + { + return -1; + } - free(cmd); - exit(0); - } + printf("Password: "); + passwd = malloc(80); + fgets(passwd, 80, stdin); - (void) setlocale(LC_CTYPE, ""); + 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. " + "Incorrect username or password.\n"); + exit(1); + } + + if (optind < argc) + { + int i, len = 0; + char *cmd; + + 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++) + { + strcat(cmd, " "); + /* Arguments after the second are quoted to allow for names + * that contain white space + */ + if (i - optind > 1) + { + strcat(cmd, "\""); + strcat(cmd, argv[i]); + strcat(cmd, "\""); + } + else + { + strcat(cmd, argv[i]); + } + } + + if (access(cmd, R_OK) == 0) + { + DoSource(so, cmd); + } + else + { + sendCommand(so, cmd); + } + + free(cmd); + exit(0); + } + + (void) setlocale(LC_CTYPE, ""); #ifdef HISTORY - hist = history_init(); /* Init the builtin history */ - /* Remember 100 events */ - history(hist, &ev, H_SETSIZE, 100); + hist = history_init(); /* Init the builtin history */ + /* Remember 100 events */ + history(hist, &ev, H_SETSIZE, 100); - tok = tok_init(NULL); /* Initialize the tokenizer */ + tok = tok_init(NULL); /* Initialize the tokenizer */ - /* Initialize editline */ - el = el_init(*argv, stdin, stdout, stderr); + /* Initialize editline */ + el = el_init(*argv, stdin, stdout, stderr); - if(use_emacs) - el_set(el, EL_EDITOR, emacs); /** Editor is 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_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 */ - /* Tell editline to use this history interface */ - el_set(el, EL_HIST, history, hist); + /* Tell editline to use this history interface */ + el_set(el, EL_HIST, history, hist); - /* - * Bind j, k in vi command mode to previous and next line, instead - * of previous and next history. - */ - el_set(el, EL_BIND, "-a", "k", "ed-prev-line", NULL); - el_set(el, EL_BIND, "-a", "j", "ed-next-line", NULL); + /* + * Bind j, k in vi command mode to previous and next line, instead + * of previous and next history. + */ + el_set(el, EL_BIND, "-a", "k", "ed-prev-line", NULL); + el_set(el, EL_BIND, "-a", "j", "ed-next-line", NULL); - /* - * Source the user's defaults file. - */ - el_source(el, NULL); + /* + * Source the user's defaults file. + */ + 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) - { - num = strlen(buf); + while (printf("MaxScale> ") && fgets(buf, 1024, stdin) != NULL) + { + num = strlen(buf); #endif - /* Strip trailing \n\r */ - for (i = num - 1; buf[i] == '\r' || buf[i] == '\n'; i--) - buf[i] = 0; + /* Strip trailing \n\r */ + for (i = num - 1; buf[i] == '\r' || buf[i] == '\n'; i--) + { + buf[i] = 0; + } #ifdef HISTORY - el_line(el); - history(hist, &ev, H_ENTER, buf); + el_line(el); + history(hist, &ev, H_ENTER, buf); #endif - if (isquit(buf)) - { - break; - } - else if (!strcasecmp(buf, "history")) - { + if (isquit(buf)) + { + break; + } + else if (!strcasecmp(buf, "history")) + { #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); + 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"); + fprintf(stderr, "History not supported in this version.\n"); #endif - } - else if (!strncasecmp(buf, "source", 6)) - { - char *ptr; + } + else if (!strncasecmp(buf, "source", 6)) + { + char *ptr; - /* Find the filename */ - ptr = &buf[strlen("source")]; - while (*ptr && isspace(*ptr)) - ptr++; + /* Find the filename */ + ptr = &buf[strlen("source")]; + while (*ptr && isspace(*ptr)) + { + ptr++; + } - DoSource(so, ptr); - } - else if (*buf) - { - if (!sendCommand(so, buf)) - { - return 0; - } - } - } + DoSource(so, ptr); + } + else if (*buf) + { + if (!sendCommand(so, buf)) + { + return 0; + } + } + } #ifdef HISTORY - el_end(el); - tok_end(tok); - history_end(hist); + el_end(el); + tok_end(tok); + history_end(hist); #endif - close(so); - return 0; + close(so); + return 0; } /** * Connect to the MaxScale server * - * @param hostname The hostname to connect to - * @param port The port to use for the connection - * @return The connected socket or -1 on error + * @param hostname The hostname to connect to + * @param port The port to use for the connection + * @return The connected socket or -1 on error */ 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) - { - char errbuf[STRERROR_BUFLEN]; - fprintf(stderr, "Unable to create socket: %s\n", - strerror_r(errno, errbuf, sizeof(errbuf))); - return -1; - } - memset(&addr, 0, sizeof addr); - 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) - { - char errbuf[STRERROR_BUFLEN]; - fprintf(stderr, "Unable to connect to MaxScale at %s, %s: %s\n", - hostname, port, strerror_r(errno, errbuf, sizeof(errbuf))); - close(so); - return -1; - } - if (setsockopt(so, SOL_SOCKET, - SO_KEEPALIVE, &keepalive , sizeof(keepalive ))) - perror("setsockopt"); + if ((so = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + char errbuf[STRERROR_BUFLEN]; + fprintf(stderr, "Unable to create socket: %s\n", + strerror_r(errno, errbuf, sizeof(errbuf))); + return -1; + } + memset(&addr, 0, sizeof addr); + addr.sin_family = AF_INET; + setipaddress(&addr.sin_addr, hostname); + addr.sin_port = htons(atoi(port)); - return so; + 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", + hostname, port, strerror_r(errno, errbuf, sizeof(errbuf))); + close(so); + return -1; + } + + if (setsockopt(so, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive))) + { + perror("setsockopt"); + } + + return so; } - /** * Set IP address in socket structure in_addr * - * @param a Pointer to a struct in_addr into which the address is written - * @param p The hostname to lookup - * @return 1 on success, 0 on failure + * @param a Pointer to a struct in_addr into which the address is written + * @param p The hostname to lookup + * @return 1 on success, 0 on failure */ static int setipaddress(struct in_addr *a, char *p) { #ifdef __USE_POSIX - struct addrinfo *ai = NULL, hint; - int rc; - struct sockaddr_in * res_addr; - memset(&hint, 0, sizeof (hint)); + struct addrinfo *ai = NULL, hint; + int rc; + struct sockaddr_in * res_addr; + memset(&hint, 0, sizeof(hint)); - hint.ai_socktype = SOCK_STREAM; - hint.ai_flags = AI_CANONNAME; - hint.ai_family = AF_INET; + hint.ai_socktype = SOCK_STREAM; + hint.ai_flags = AI_CANONNAME; + hint.ai_family = AF_INET; - if ((rc = getaddrinfo(p, NULL, &hint, &ai)) != 0) { - return 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); - memcpy(a, &res_addr->sin_addr, sizeof(struct in_addr)); + /* take the first one */ + if (ai != NULL) + { + res_addr = (struct sockaddr_in *) (ai->ai_addr); + memcpy(a, &res_addr->sin_addr, sizeof(struct in_addr)); - freeaddrinfo(ai); + freeaddrinfo(ai); - return 1; - } + return 1; + } #else - struct hostent *h; + struct hostent *h; - spinlock_acquire(&tmplock); - h = gethostbyname(p); - spinlock_release(&tmplock); - - if (h == NULL) { - if ((a->s_addr = inet_addr(p)) == -1) { - return 0; - } - } else { - /* take the first one */ - memcpy(a, h->h_addr, h->h_length); + spinlock_acquire(&tmplock); + h = gethostbyname(p); + spinlock_release(&tmplock); - return 1; - } + if (h == NULL) + { + if ((a->s_addr = inet_addr(p)) == -1) + { + return 0; + } + } + else + { + /* take the first one */ + memcpy(a, h->h_addr, h->h_length); + + return 1; + } #endif - return 0; + return 0; } /** * Perform authentication using the maxscaled protocol conventions * - * @param so The socket connected to MaxScale - * @param user The username to authenticate - * @param password The password to authenticate with - * @return Non-zero of succesful authentication + * @param so The socket connected to MaxScale + * @param user The username to authenticate + * @param password The password to authenticate with + * @return Non-zero of succesful authentication */ 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; + if (read(so, buf, 4) != 4) + { + return 0; + } - return strncmp(buf, "FAILED", 6); + 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); } /** @@ -446,101 +505,109 @@ char buf[20]; * * Input terminates with a line containing just the text OK * - * @param so The socket connect to MaxScale - * @param cmd The command to send - * @return 0 if the connection was closed + * @param so The socket connect to MaxScale + * @param cmd The command to send + * @return 0 if the connection was closed */ 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) || + 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')) - { - return 1; - } - else if (newline == 2) - { - putchar('O'); - putchar(buf[j]); - newline = 0; - } - else if (buf[j] == '\n' || buf[j] == '\r') - { - putchar(buf[j]); - newline = 1; - } - else - { - putchar(buf[j]); - newline = 0; - } - } - } - return 1; + { + return 1; + } + else if (newline == 2) + { + putchar('O'); + putchar(buf[j]); + newline = 0; + } + else if (buf[j] == '\n' || buf[j] == '\r') + { + putchar(buf[j]); + newline = 1; + } + else + { + putchar(buf[j]); + newline = 0; + } + } + } + return 1; } /** * Read a file of commands and send them to MaxScale * - * @param so The socket connected to MaxScale - * @param file The filename + * @param so The socket connected to MaxScale + * @param file The filename */ 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) - { - fprintf(stderr, "Unable to open command file '%s'.\n", - file); - return; - } + if ((fp = fopen(file, "r")) == NULL) + { + fprintf(stderr, "Unable to open command file '%s'.\n", + file); + return; + } - while ((ptr = fgets(line, 132, fp)) != NULL) - { - /* Strip tailing newlines */ - pe = &ptr[strlen(ptr)-1]; - while (pe >= ptr && (*pe == '\r' || *pe == '\n')) - { - *pe = '\0'; - pe--; - } + while ((ptr = fgets(line, 132, fp)) != NULL) + { + /* Strip tailing newlines */ + pe = &ptr[strlen(ptr) - 1]; + while (pe >= ptr && (*pe == '\r' || *pe == '\n')) + { + *pe = '\0'; + pe--; + } - if (*ptr != '#') /* Comment */ - { - if (! sendCommand(so, ptr)) - { - break; - } - } - } - fclose(fp); - return; + if (*ptr != '#') /* Comment */ + { + if (!sendCommand(so, ptr)) + { + break; + } + } + } + fclose(fp); + return; } /** * Print version information */ -static void -PrintVersion(const char *progname) +static void +PrintVersion(const char *progname) { - printf("%s Version %s\n", progname, MAXSCALE_VERSION); + printf("%s Version %s\n", progname, MAXSCALE_VERSION); } /** @@ -549,124 +616,161 @@ PrintVersion(const char *progname) static void 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] [ | ]\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"); - printf(" be prompted for interactively\n"); - printf(" -h|--hostname=... The maxscale host to connecto to. The default is\n"); - printf(" localhost\n"); - printf(" -P|--port=... The port to use for the connection, the default\n"); - printf(" port is 6603.\n"); - printf(" -v|--version print version information and exit\n"); - printf(" -?|--help Print this help text.\n"); - printf("Any remaining arguments are treated as MaxScale commands or a file\n"); - printf("containing commands to execute.\n"); + PrintVersion(progname); + printf("The MaxScale administrative and monitor client.\n\n"); + printf("Usage: %s [-u user] [-p password] [-h hostname] [-P port] " + "[ | ]\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"); + printf(" be prompted for interactively\n"); + printf(" -h|--hostname=... The maxscale host to connecto to. The default is\n"); + printf(" localhost\n"); + printf(" -P|--port=... The port to use for the connection, the default\n"); + printf(" port is 6603.\n"); + printf(" -v|--version print version information and exit\n"); + printf(" -?|--help Print this help text.\n"); + printf("Any remaining arguments are treated as MaxScale commands or a file\n"); + printf("containing commands to execute.\n"); } /** * Check command to see if it is a quit command * - * @param buf The command buffer - * @return Non-zero if the command should cause maxadmin to quit + * @param buf The command buffer + * @return Non-zero if the command should cause maxadmin to quit */ 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; + if (!buf) + { + return 0; + } + + while (*ptr && isspace(*ptr)) + { + ptr++; + } + + if (strncasecmp(ptr, "quit", 4) == 0 || strncasecmp(ptr, "exit", 4) == 0) + { + return 1; + } + + return 0; } /** * Trim whitespace from the right hand end of the string * - * @param str String to trim + * @param str String to trim */ 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; + if (ptr > str) // step back from the terminating null + { + ptr--; // If the string has more characters + } + + while (ptr >= str && isspace(*ptr)) + { + *ptr-- = 0; + } } /** * Read defaults for hostname, port, user and password from * the .maxadmin file in the users home directory. * - * @param hostname Pointer the hostname to be updated - * @param port Pointer to the port to be updated - * @param user Pointer to the user to be updated - * @param passwd Pointer to the password to be updated + * @param hostname Pointer the hostname to be updated + * @param port Pointer to the port to be updated + * @param user Pointer to the user to be updated + * @param passwd Pointer to the password to be updated */ 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); - if ((fp = fopen(pathname, "r")) == NULL) - return; - while (fgets(line, 400, fp) != NULL) - { - rtrim(line); - if (line[0] == 0) - continue; - if (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 ((home = getenv("HOME")) == NULL) + { + return; + } + + snprintf(pathname, sizeof(pathname), "%s/.maxadmin", home); + if ((fp = fopen(pathname, "r")) == NULL) + { + return; + } + + while (fgets(line, sizeof(line), fp) != NULL) + { + rtrim(line); + 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) { - - if(strcmp(value,"vi") == 0) - *editor = 0; - else if(strcmp(value,"emacs") == 0) - *editor = 1; - else - fprintf(stderr, "WARNING: Unrecognised " - "parameter '%s=%s' in .maxadmin file\n", name, value); + *hostname = strdup(value); } - else - { - fprintf(stderr, "WARNING: Unrecognised " - "parameter '%s' in .maxadmin file\n", name); - } - } - else - { - fprintf(stderr, "WARNING: Expected name=value " - "parameters in .maxadmin file but found " - "'%s'.\n", line); - } - } - fclose(fp); + 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) + { + *editor = 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 " + "parameter '%s' in .maxadmin file\n", name); + } + } + else + { + fprintf(stderr, "WARNING: Expected name=value " + "parameters in .maxadmin file but found " + "'%s'.\n", line); + } + } + fclose(fp); }