diff options
author | unknown <petr@mysql.com> | 2005-03-01 01:59:37 +0300 |
---|---|---|
committer | unknown <petr@mysql.com> | 2005-03-01 01:59:37 +0300 |
commit | ad1c1e070cb446d26ab579769473184e5a09f9df (patch) | |
tree | d0a6b7686af0d978bf1a03413ea6f6e6b843bd04 /server-tools/instance-manager/parse_output.cc | |
parent | e99c035ffaf8c01bf4d848ddf10219103fc6a314 (diff) | |
parent | d4c2c74724b17d5f09f6f6bd110bb65258037722 (diff) | |
download | mariadb-git-ad1c1e070cb446d26ab579769473184e5a09f9df.tar.gz |
Merge pchardin@bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/cps/mysql/devel/im-fix-review
mysys/default.c:
Auto merged
Diffstat (limited to 'server-tools/instance-manager/parse_output.cc')
-rw-r--r-- | server-tools/instance-manager/parse_output.cc | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/server-tools/instance-manager/parse_output.cc b/server-tools/instance-manager/parse_output.cc new file mode 100644 index 00000000000..6fee0797395 --- /dev/null +++ b/server-tools/instance-manager/parse_output.cc @@ -0,0 +1,101 @@ +/* Copyright (C) 2004 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include "parse.h" + +#include <stdio.h> +#include <my_global.h> +#include <my_sys.h> +#include <string.h> + + +/* + Parse output of the given command + + SYNOPSYS + parse_output_and_get_value() + + command the command to execue with popen. + word the word to look for (usually an option name) + result the buffer to store the next word (option value) + result_len self-explanatory + + DESCRIPTION + + Parse output of the "command". Find the "word" and return the next one + + RETURN + 0 - ok + 1 - error occured +*/ + +int parse_output_and_get_value(const char *command, const char *word, + char *result, size_t result_len) +{ + FILE *output; + uint wordlen; + /* should be enought to store the string from the output */ + enum { MAX_LINE_LEN= 512 }; + char linebuf[MAX_LINE_LEN]; + + wordlen= strlen(word); + + if (!(output= popen(command, "r"))) + goto err; + + /* + We want fully buffered stream. We also want system to + allocate appropriate buffer. + */ + setvbuf(output, NULL, _IOFBF, 0); + + while (fgets(linebuf, sizeof(linebuf) - 1, output)) + { + uint lineword_len= 0; + char *linep= linebuf; + + linebuf[sizeof(linebuf) - 1]= '\0'; /* safety */ + + /* + Get the word, which might contain non-alphanumeric characters. (Usually + these are '/', '-' and '.' in the path expressions and filenames) + */ + get_word((const char **) &linep, &lineword_len, NONSPACE); + if (!strncmp(word, linep, wordlen)) + { + /* + If we have found the word, return the next one. This is usually + an option value. + */ + linep+= lineword_len; /* swallow the previous one */ + get_word((const char **) &linep, &lineword_len, NONSPACE); + if (result_len <= lineword_len) + goto err; + strncpy(result, linep, lineword_len); + result[lineword_len]= '\0'; + goto pclose; + } + } + +pclose: + /* we are not interested in the termination status */ + pclose(output); + + return 0; + +err: + return 1; +} |