Commit 0111030d authored by sasha@mysql.sashanet.com's avatar sasha@mysql.sashanet.com
Browse files

Merge work:/home/bk/mysql-4.0

into mysql.sashanet.com:/reiser-data/mysql-4.0-stable
parents ffb356ad 24918973
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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 \
+194 −2
Original line number Diff line number Diff line
@@ -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;
}