diff options
author | unknown <sasha@mysql.sashanet.com> | 2001-12-25 10:44:31 -0700 |
---|---|---|
committer | unknown <sasha@mysql.sashanet.com> | 2001-12-25 10:44:31 -0700 |
commit | 20aa6caa56670950d9430ca3a62c069ffe0bdd9d (patch) | |
tree | c9ea48d399d44ada92ee6686b50378791e01b648 | |
parent | b4556e050c79bf0cc38bf57d8397ef3b9a1c6ec2 (diff) | |
parent | 8a889d30c05e2bda375372d934e324a539245583 (diff) | |
download | mariadb-git-20aa6caa56670950d9430ca3a62c069ffe0bdd9d.tar.gz |
Merge work:/home/bk/mysql-4.0
into mysql.sashanet.com:/reiser-data/mysql-4.0-stable
BitKeeper/etc/ignore:
auto-union
-rw-r--r-- | .bzrignore | 1 | ||||
-rw-r--r-- | extra/Makefile.am | 2 | ||||
-rw-r--r-- | extra/mysql_install.c | 196 |
3 files changed, 196 insertions, 3 deletions
diff --git a/.bzrignore b/.bzrignore index b3c77022ecc..7c1105386e2 100644 --- a/.bzrignore +++ b/.bzrignore @@ -190,6 +190,7 @@ db-*.*.* dbug/user.t extra/comp_err extra/my_print_defaults +extra/mysql_install extra/perror extra/replace extra/resolve_stack_dump diff --git a/extra/Makefile.am b/extra/Makefile.am index ee6c2ba92f2..25633a386e2 100644 --- a/extra/Makefile.am +++ b/extra/Makefile.am @@ -18,7 +18,7 @@ INCLUDES = @MT_INCLUDES@ -I$(srcdir)/../include -I../include -I.. LDADD = @CLIENT_EXTRA_LDFLAGS@ ../mysys/libmysys.a \ ../dbug/libdbug.a ../strings/libmystrings.a bin_PROGRAMS = replace comp_err perror resolveip my_print_defaults \ -resolve_stack_dump +resolve_stack_dump mysql_install OMIT_DEPENDENCIES = pthread.h stdio.h __stdio.h stdlib.h __stdlib.h math.h\ __math.h time.h __time.h unistd.h __unistd.h types.h \ diff --git a/extra/mysql_install.c b/extra/mysql_install.c index dfd71895647..1fa62f35b7e 100644 --- a/extra/mysql_install.c +++ b/extra/mysql_install.c @@ -21,7 +21,7 @@ #define INSTALL_VERSION "1.0" #define DONT_USE_RAID -#include <global.h> +#include <my_global.h> #include <m_ctype.h> #include <my_sys.h> #include <m_string.h> @@ -29,13 +29,195 @@ #include <errno.h> #include <getopt.h> +#define ANSWERS_CHUNCK 32 + +int have_gui=0; + struct option long_options[] = { - {"help", no_argument, 0, 'h'}, + {"help", no_argument, 0, '?'}, {"version", no_argument, 0, 'V'}, {0, 0,0,0} }; +/* For now, not much exciting here, but we'll add more once + we add GUI support + */ +typedef struct +{ + FILE* out; + FILE* in; + const char* question; + int default_ind; + DYNAMIC_ARRAY answers; +} QUESTION_WIDGET; + +static void usage(); +static void die(const char* fmt, ...); +static void print_version(void); +static char get_answer_char(int ans_ind); +static int ask_user(const char* question,int default_ind, ...); +static void add_answer(QUESTION_WIDGET* w, const char* ans); +static void display_question(QUESTION_WIDGET* w); +static int init_question_widget(QUESTION_WIDGET* w, const char* question, + int default_ind); +static void end_question_widget(QUESTION_WIDGET* w); +static int get_answer(QUESTION_WIDGET* w); +static char answer_from_char(char c); +static void invalid_answer(QUESTION_WIDGET* w); + +enum {IMODE_STANDARD=0,IMODE_CUSTOM,IMODE_UPGRAGE} install_mode + = IMODE_STANDARD; + +static char get_answer_char(int ans_ind) +{ + return 'a' + ans_ind; +} + +static void invalid_answer(QUESTION_WIDGET* w) +{ + if (!have_gui) + { + fprintf(w->out, "ERROR: invalid answer, try again...\a\n"); + } +} + +static char answer_from_char(char c) +{ + return c - 'a'; +} + +static void die(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stderr, "%s: ", my_progname); + vfprintf(stderr, fmt, args); + fprintf(stderr, "\n"); + va_end(args); + exit(1); +} + +static void display_question(QUESTION_WIDGET* w) +{ + if (!have_gui) + { + uint i,num_answers=w->answers.elements; + DYNAMIC_ARRAY* answers = &w->answers; + fprintf(w->out,"\n%s\n\n",w->question); + + for (i=0; i<num_answers; i++) + { + char* ans; + get_dynamic(answers,(gptr)&ans,i); + fprintf(w->out,"%c - %s\n",get_answer_char(i),ans); + } + fprintf(w->out,"q - Abort Install/Upgrade\n\n"); + } +} + +static void add_answer(QUESTION_WIDGET* w, const char* ans) +{ + insert_dynamic(&w->answers,(gptr)&ans); +} + +static int init_question_widget(QUESTION_WIDGET* w, const char* question, + int default_ind) +{ + if (have_gui) + { + w->in = w->out = 0; + } + else + { + w->out = stdout; + w->in = stdin; + } + w->question = question; + w->default_ind = default_ind; + if (init_dynamic_array(&w->answers,sizeof(char*), + ANSWERS_CHUNCK,ANSWERS_CHUNCK)) + die("Out of memory"); + return 0; +} + +static void end_question_widget(QUESTION_WIDGET* w) +{ + delete_dynamic(&w->answers); +} + +static int get_answer(QUESTION_WIDGET* w) +{ + if (!have_gui) + { + char buf[32]; + int ind; + char c; + if (!fgets(buf,sizeof(buf),w->in)) + die("Failed fgets on input stream"); + switch ((c=tolower(*buf))) + { + case '\n': + return w->default_ind; + case 'q': + die("Install/Upgrade aborted"); + default: + ind = answer_from_char(c); + if (ind >= 0 && ind < (int)w->answers.elements) + return ind; + } + } + return -1; +} + +static int ask_user(const char* question,int default_ind, ...) +{ + va_list args; + char* opt; + QUESTION_WIDGET w; + int ans; + + va_start(args,default_ind); + init_question_widget(&w,question,default_ind); + for (;(opt=va_arg(args,char*));) + { + add_answer(&w,opt); + } + for (;;) + { + display_question(&w); + if ((ans = get_answer(&w)) >= 0) + break; + invalid_answer(&w); + } + end_question_widget(&w); + va_end(args); + return ans; +} + +static int parse_args(int argc, char **argv) +{ + int c, option_index = 0; + + while((c = getopt_long(argc, argv, "?V", + long_options, &option_index)) != EOF) + { + switch(c) + { + case 'V': + print_version(); + exit(0); + case '?': + usage(); + exit(0); + default: + usage(); + exit(1); + } + } + return 0; +} + static void print_version(void) { printf("%s Ver %s Distrib %s, for %s (%s)\n",my_progname,INSTALL_VERSION, @@ -55,6 +237,16 @@ static void usage() -V, --version Output version information and exit.\n"); } +int main(int argc, char** argv) +{ + MY_INIT(argv[0]); + parse_args(argc,argv); + install_mode = ask_user("Please select install/upgrade mode", + install_mode, "Standard Install", + "Custom Install", "Upgrade",0); + printf("mode=%d\n", install_mode); + return 0; +} |