Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Split initdb.c main() code into multiple functions, for easier
authorBruce Momjian <bruce@momjian.us>
Fri, 30 Nov 2012 21:45:08 +0000 (16:45 -0500)
committerBruce Momjian <bruce@momjian.us>
Fri, 30 Nov 2012 21:45:08 +0000 (16:45 -0500)
maintenance.

src/bin/initdb/initdb.c

index 0aa1e800d4808e15ccee097a269e14c361132b0e..402504b25783a787ea6de9775c0b6a53efea3c45 100644 (file)
@@ -144,6 +144,7 @@ static char infoversion[100];
 static bool caught_signal = false;
 static bool output_failed = false;
 static int output_errno = 0;
+static char *pgdata_native;
 
 /* defaults */
 static int n_connections = 10;
@@ -172,6 +173,27 @@ static char *authwarning = NULL;
 static const char *boot_options = "-F";
 static const char *backend_options = "--single -F -O -c search_path=pg_catalog -c exit_on_error=true";
 
+#ifdef WIN32
+char      *restrict_env;
+#endif
+const char *subdirs[] = {
+   "global",
+   "pg_xlog",
+   "pg_xlog/archive_status",
+   "pg_clog",
+   "pg_notify",
+   "pg_serial",
+   "pg_snapshots",
+   "pg_subtrans",
+   "pg_twophase",
+   "pg_multixact/members",
+   "pg_multixact/offsets",
+   "base",
+   "base/1",
+   "pg_tblspc",
+   "pg_stat_tmp"
+};
+
 
 /* path to 'initdb' binary directory */
 static char bin_path[MAXPGPATH];
@@ -227,6 +249,15 @@ static bool check_locale_name(int category, const char *locale,
 static bool check_locale_encoding(const char *locale, int encoding);
 static void setlocales(void);
 static void usage(const char *progname);
+void get_restricted_token(void);
+void setup_pgdata(void);
+void setup_bin_paths(const char *argv0);
+void setup_data_file_paths(void);
+void setup_locale_encoding(void);
+void setup_signals_and_umask(void);
+void setup_text_search(void);
+void process(const char *argv0);
+
 
 #ifdef WIN32
 static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo);
@@ -2823,242 +2854,9 @@ check_need_password(const char *authmethodlocal, const char *authmethodhost)
    }
 }
 
-int
-main(int argc, char *argv[])
+void
+get_restricted_token(void)
 {
-   /*
-    * options with no short version return a low integer, the rest return
-    * their short version value
-    */
-   static struct option long_options[] = {
-       {"pgdata", required_argument, NULL, 'D'},
-       {"encoding", required_argument, NULL, 'E'},
-       {"locale", required_argument, NULL, 1},
-       {"lc-collate", required_argument, NULL, 2},
-       {"lc-ctype", required_argument, NULL, 3},
-       {"lc-monetary", required_argument, NULL, 4},
-       {"lc-numeric", required_argument, NULL, 5},
-       {"lc-time", required_argument, NULL, 6},
-       {"lc-messages", required_argument, NULL, 7},
-       {"no-locale", no_argument, NULL, 8},
-       {"text-search-config", required_argument, NULL, 'T'},
-       {"auth", required_argument, NULL, 'A'},
-       {"auth-local", required_argument, NULL, 10},
-       {"auth-host", required_argument, NULL, 11},
-       {"pwprompt", no_argument, NULL, 'W'},
-       {"pwfile", required_argument, NULL, 9},
-       {"username", required_argument, NULL, 'U'},
-       {"help", no_argument, NULL, '?'},
-       {"version", no_argument, NULL, 'V'},
-       {"debug", no_argument, NULL, 'd'},
-       {"show", no_argument, NULL, 's'},
-       {"noclean", no_argument, NULL, 'n'},
-       {"nosync", no_argument, NULL, 'N'},
-       {"xlogdir", required_argument, NULL, 'X'},
-       {NULL, 0, NULL, 0}
-   };
-
-   int         c,
-               i,
-               ret;
-   int         option_index;
-   char       *effective_user;
-   char       *pgdenv;         /* PGDATA value gotten from and sent to
-                                * environment */
-   char        bin_dir[MAXPGPATH];
-   char       *pg_data_native;
-   int         user_enc;
-
-#ifdef WIN32
-   char       *restrict_env;
-#endif
-   static const char *subdirs[] = {
-       "global",
-       "pg_xlog",
-       "pg_xlog/archive_status",
-       "pg_clog",
-       "pg_notify",
-       "pg_serial",
-       "pg_snapshots",
-       "pg_subtrans",
-       "pg_twophase",
-       "pg_multixact/members",
-       "pg_multixact/offsets",
-       "base",
-       "base/1",
-       "pg_tblspc",
-       "pg_stat_tmp"
-   };
-
-   progname = get_progname(argv[0]);
-   set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("initdb"));
-
-   if (argc > 1)
-   {
-       if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
-       {
-           usage(progname);
-           exit(0);
-       }
-       if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
-       {
-           puts("initdb (PostgreSQL) " PG_VERSION);
-           exit(0);
-       }
-   }
-
-   /* process command-line options */
-
-   while ((c = getopt_long(argc, argv, "dD:E:L:nNU:WA:sT:X:", long_options, &option_index)) != -1)
-   {
-       switch (c)
-       {
-           case 'A':
-               authmethodlocal = authmethodhost = pg_strdup(optarg);
-
-               /*
-                * When ident is specified, use peer for local connections.
-                * Mirrored, when peer is specified, use ident for TCP/IP
-                * connections.
-                */
-               if (strcmp(authmethodhost, "ident") == 0)
-                   authmethodlocal = "peer";
-               else if (strcmp(authmethodlocal, "peer") == 0)
-                   authmethodhost = "ident";
-               break;
-           case 10:
-               authmethodlocal = pg_strdup(optarg);
-               break;
-           case 11:
-               authmethodhost = pg_strdup(optarg);
-               break;
-           case 'D':
-               pg_data = pg_strdup(optarg);
-               break;
-           case 'E':
-               encoding = pg_strdup(optarg);
-               break;
-           case 'W':
-               pwprompt = true;
-               break;
-           case 'U':
-               username = pg_strdup(optarg);
-               break;
-           case 'd':
-               debug = true;
-               printf(_("Running in debug mode.\n"));
-               break;
-           case 'n':
-               noclean = true;
-               printf(_("Running in noclean mode.  Mistakes will not be cleaned up.\n"));
-               break;
-           case 'N':
-               do_sync = false;
-               break;
-           case 'L':
-               share_path = pg_strdup(optarg);
-               break;
-           case 1:
-               locale = pg_strdup(optarg);
-               break;
-           case 2:
-               lc_collate = pg_strdup(optarg);
-               break;
-           case 3:
-               lc_ctype = pg_strdup(optarg);
-               break;
-           case 4:
-               lc_monetary = pg_strdup(optarg);
-               break;
-           case 5:
-               lc_numeric = pg_strdup(optarg);
-               break;
-           case 6:
-               lc_time = pg_strdup(optarg);
-               break;
-           case 7:
-               lc_messages = pg_strdup(optarg);
-               break;
-           case 8:
-               locale = "C";
-               break;
-           case 9:
-               pwfilename = pg_strdup(optarg);
-               break;
-           case 's':
-               show_setting = true;
-               break;
-           case 'T':
-               default_text_search_config = pg_strdup(optarg);
-               break;
-           case 'X':
-               xlog_dir = pg_strdup(optarg);
-               break;
-           default:
-               /* getopt_long already emitted a complaint */
-               fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
-                       progname);
-               exit(1);
-       }
-   }
-
-
-   /*
-    * Non-option argument specifies data directory as long as it wasn't
-    * already specified with -D / --pgdata
-    */
-   if (optind < argc && strlen(pg_data) == 0)
-   {
-       pg_data = pg_strdup(argv[optind]);
-       optind++;
-   }
-
-   if (optind < argc)
-   {
-       fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
-               progname, argv[optind]);
-       fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
-               progname);
-       exit(1);
-   }
-
-   if (pwprompt && pwfilename)
-   {
-       fprintf(stderr, _("%s: password prompt and password file cannot be specified together\n"), progname);
-       exit(1);
-   }
-
-   check_authmethod_unspecified(&authmethodlocal);
-   check_authmethod_unspecified(&authmethodhost);
-
-   check_authmethod_valid(authmethodlocal, auth_methods_local, "local");
-   check_authmethod_valid(authmethodhost, auth_methods_host, "host");
-
-   check_need_password(authmethodlocal, authmethodhost);
-
-   if (strlen(pg_data) == 0)
-   {
-       pgdenv = getenv("PGDATA");
-       if (pgdenv && strlen(pgdenv))
-       {
-           /* PGDATA found */
-           pg_data = pg_strdup(pgdenv);
-       }
-       else
-       {
-           fprintf(stderr,
-                   _("%s: no data directory specified\n"
-                     "You must identify the directory where the data for this database system\n"
-                     "will reside.  Do this with either the invocation option -D or the\n"
-                     "environment variable PGDATA.\n"),
-                   progname);
-           exit(1);
-       }
-   }
-
-   pg_data_native = pg_data;
-   canonicalize_path(pg_data);
-
 #ifdef WIN32
    /*
     * Before we execute another program, make sure that we are running with a
@@ -3101,6 +2899,35 @@ main(int argc, char *argv[])
        }
    }
 #endif
+}
+
+void
+setup_pgdata(void)
+{
+   char       *pgdata_get_env, *pgdata_set_env;
+
+   if (strlen(pg_data) == 0)
+   {
+       pgdata_get_env = getenv("PGDATA");
+       if (pgdata_get_env && strlen(pgdata_get_env))
+       {
+           /* PGDATA found */
+           pg_data = pg_strdup(pgdata_get_env);
+       }
+       else
+       {
+           fprintf(stderr,
+                   _("%s: no data directory specified\n"
+                     "You must identify the directory where the data for this database system\n"
+                     "will reside.  Do this with either the invocation option -D or the\n"
+                     "environment variable PGDATA.\n"),
+                   progname);
+           exit(1);
+       }
+   }
+
+   pgdata_native = pg_strdup(pg_data);
+   canonicalize_path(pg_data);
 
    /*
     * we have to set PGDATA for postgres rather than pass it on the command
@@ -3108,16 +2935,23 @@ main(int argc, char *argv[])
     * need quotes otherwise on Windows because paths there are most likely to
     * have embedded spaces.
     */
-   pgdenv = pg_malloc(8 + strlen(pg_data));
-   sprintf(pgdenv, "PGDATA=%s", pg_data);
-   putenv(pgdenv);
+   pgdata_set_env = pg_malloc(8 + strlen(pg_data));
+   sprintf(pgdata_set_env, "PGDATA=%s", pg_data);
+   putenv(pgdata_set_env);
+}
+
+
+void
+setup_bin_paths(const char *argv0)
+{
+   int ret;
 
-   if ((ret = find_other_exec(argv[0], "postgres", PG_BACKEND_VERSIONSTR,
+   if ((ret = find_other_exec(argv0, "postgres", PG_BACKEND_VERSIONSTR,
                               backend_exec)) < 0)
    {
        char        full_path[MAXPGPATH];
 
-       if (find_my_exec(argv[0], full_path) < 0)
+       if (find_my_exec(argv0, full_path) < 0)
            strlcpy(full_path, progname, sizeof(full_path));
 
        if (ret == -1)
@@ -3153,63 +2987,15 @@ main(int argc, char *argv[])
    }
 
    canonicalize_path(share_path);
+}
 
-   effective_user = get_id();
-   if (strlen(username) == 0)
-       username = effective_user;
-
-   set_input(&bki_file, "postgres.bki");
-   set_input(&desc_file, "postgres.description");
-   set_input(&shdesc_file, "postgres.shdescription");
-   set_input(&hba_file, "pg_hba.conf.sample");
-   set_input(&ident_file, "pg_ident.conf.sample");
-   set_input(&conf_file, "postgresql.conf.sample");
-   set_input(&conversion_file, "conversion_create.sql");
-   set_input(&dictionary_file, "snowball_create.sql");
-   set_input(&info_schema_file, "information_schema.sql");
-   set_input(&features_file, "sql_features.txt");
-   set_input(&system_views_file, "system_views.sql");
-
-   set_info_version();
-
-   if (show_setting || debug)
-   {
-       fprintf(stderr,
-               "VERSION=%s\n"
-               "PGDATA=%s\nshare_path=%s\nPGPATH=%s\n"
-               "POSTGRES_SUPERUSERNAME=%s\nPOSTGRES_BKI=%s\n"
-               "POSTGRES_DESCR=%s\nPOSTGRES_SHDESCR=%s\n"
-               "POSTGRESQL_CONF_SAMPLE=%s\n"
-               "PG_HBA_SAMPLE=%s\nPG_IDENT_SAMPLE=%s\n",
-               PG_VERSION,
-               pg_data, share_path, bin_path,
-               username, bki_file,
-               desc_file, shdesc_file,
-               conf_file,
-               hba_file, ident_file);
-       if (show_setting)
-           exit(0);
-   }
-
-   check_input(bki_file);
-   check_input(desc_file);
-   check_input(shdesc_file);
-   check_input(hba_file);
-   check_input(ident_file);
-   check_input(conf_file);
-   check_input(conversion_file);
-   check_input(dictionary_file);
-   check_input(info_schema_file);
-   check_input(features_file);
-   check_input(system_views_file);
+void
+setup_locale_encoding(void)
+{
+   int         user_enc;
 
    setlocales();
 
-   printf(_("The files belonging to this database system will be owned "
-            "by user \"%s\".\n"
-            "This user must also own the server process.\n\n"),
-          effective_user);
-
    if (strcmp(lc_ctype, lc_collate) == 0 &&
        strcmp(lc_ctype, lc_time) == 0 &&
        strcmp(lc_ctype, lc_numeric) == 0 &&
@@ -3289,6 +3075,60 @@ main(int argc, char *argv[])
        !check_locale_encoding(lc_collate, user_enc))
        exit(1);                /* check_locale_encoding printed the error */
 
+}
+
+
+void
+setup_data_file_paths(void)
+{
+   set_input(&bki_file, "postgres.bki");
+   set_input(&desc_file, "postgres.description");
+   set_input(&shdesc_file, "postgres.shdescription");
+   set_input(&hba_file, "pg_hba.conf.sample");
+   set_input(&ident_file, "pg_ident.conf.sample");
+   set_input(&conf_file, "postgresql.conf.sample");
+   set_input(&conversion_file, "conversion_create.sql");
+   set_input(&dictionary_file, "snowball_create.sql");
+   set_input(&info_schema_file, "information_schema.sql");
+   set_input(&features_file, "sql_features.txt");
+   set_input(&system_views_file, "system_views.sql");
+
+   if (show_setting || debug)
+   {
+       fprintf(stderr,
+               "VERSION=%s\n"
+               "PGDATA=%s\nshare_path=%s\nPGPATH=%s\n"
+               "POSTGRES_SUPERUSERNAME=%s\nPOSTGRES_BKI=%s\n"
+               "POSTGRES_DESCR=%s\nPOSTGRES_SHDESCR=%s\n"
+               "POSTGRESQL_CONF_SAMPLE=%s\n"
+               "PG_HBA_SAMPLE=%s\nPG_IDENT_SAMPLE=%s\n",
+               PG_VERSION,
+               pg_data, share_path, bin_path,
+               username, bki_file,
+               desc_file, shdesc_file,
+               conf_file,
+               hba_file, ident_file);
+       if (show_setting)
+           exit(0);
+   }
+
+   check_input(bki_file);
+   check_input(desc_file);
+   check_input(shdesc_file);
+   check_input(hba_file);
+   check_input(ident_file);
+   check_input(conf_file);
+   check_input(conversion_file);
+   check_input(dictionary_file);
+   check_input(info_schema_file);
+   check_input(features_file);
+   check_input(system_views_file);
+}
+
+
+void
+setup_text_search(void)
+{
    if (strlen(default_text_search_config) == 0)
    {
        default_text_search_config = find_matching_ts_config(lc_ctype);
@@ -3318,14 +3158,12 @@ main(int argc, char *argv[])
    printf(_("The default text search configuration will be set to \"%s\".\n"),
           default_text_search_config);
 
-   printf("\n");
-
-   umask(S_IRWXG | S_IRWXO);
+}
 
-   /*
-    * now we are starting to do real work, trap signals so we can clean up
-    */
 
+void
+setup_signals_and_umask(void)
+{
    /* some of these are not valid on Windows */
 #ifdef SIGHUP
    pqsignal(SIGHUP, trapsig);
@@ -3345,6 +3183,18 @@ main(int argc, char *argv[])
    pqsignal(SIGPIPE, SIG_IGN);
 #endif
 
+   umask(S_IRWXG | S_IRWXO);
+}
+
+
+void
+process(const char *argv0)
+{
+   int i;
+   char        bin_dir[MAXPGPATH];
+
+   setup_signals_and_umask();
    switch (pg_check_dir(pg_data))
    {
        case 0:
@@ -3554,7 +3404,7 @@ main(int argc, char *argv[])
        fprintf(stderr, "%s", authwarning);
 
    /* Get directory specification used to start this executable */
-   strlcpy(bin_dir, argv[0], sizeof(bin_dir));
+   strlcpy(bin_dir, argv0, sizeof(bin_dir));
    get_parent_directory(bin_dir);
 
    printf(_("\nSuccess. You can now start the database server using:\n\n"
@@ -3562,9 +3412,223 @@ main(int argc, char *argv[])
             "or\n"
             "    %s%s%spg_ctl%s -D %s%s%s -l logfile start\n\n"),
       QUOTE_PATH, bin_dir, (strlen(bin_dir) > 0) ? DIR_SEP : "", QUOTE_PATH,
-          QUOTE_PATH, pg_data_native, QUOTE_PATH,
+          QUOTE_PATH, pgdata_native, QUOTE_PATH,
       QUOTE_PATH, bin_dir, (strlen(bin_dir) > 0) ? DIR_SEP : "", QUOTE_PATH,
-          QUOTE_PATH, pg_data_native, QUOTE_PATH);
+          QUOTE_PATH, pgdata_native, QUOTE_PATH);
+}
+
+
+int
+main(int argc, char *argv[])
+{
+   static struct option long_options[] = {
+       {"pgdata", required_argument, NULL, 'D'},
+       {"encoding", required_argument, NULL, 'E'},
+       {"locale", required_argument, NULL, 1},
+       {"lc-collate", required_argument, NULL, 2},
+       {"lc-ctype", required_argument, NULL, 3},
+       {"lc-monetary", required_argument, NULL, 4},
+       {"lc-numeric", required_argument, NULL, 5},
+       {"lc-time", required_argument, NULL, 6},
+       {"lc-messages", required_argument, NULL, 7},
+       {"no-locale", no_argument, NULL, 8},
+       {"text-search-config", required_argument, NULL, 'T'},
+       {"auth", required_argument, NULL, 'A'},
+       {"auth-local", required_argument, NULL, 10},
+       {"auth-host", required_argument, NULL, 11},
+       {"pwprompt", no_argument, NULL, 'W'},
+       {"pwfile", required_argument, NULL, 9},
+       {"username", required_argument, NULL, 'U'},
+       {"help", no_argument, NULL, '?'},
+       {"version", no_argument, NULL, 'V'},
+       {"debug", no_argument, NULL, 'd'},
+       {"show", no_argument, NULL, 's'},
+       {"noclean", no_argument, NULL, 'n'},
+       {"nosync", no_argument, NULL, 'N'},
+       {"xlogdir", required_argument, NULL, 'X'},
+       {NULL, 0, NULL, 0}
+   };
+
+   /*
+    * options with no short version return a low integer, the rest return
+    * their short version value
+    */
+   int         c;
+   int         option_index;
+   char       *effective_user;
+
+   progname = get_progname(argv[0]);
+   set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("initdb"));
+
+   if (argc > 1)
+   {
+       if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+       {
+           usage(progname);
+           exit(0);
+       }
+       if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+       {
+           puts("initdb (PostgreSQL) " PG_VERSION);
+           exit(0);
+       }
+   }
+
+   /* process command-line options */
+
+   while ((c = getopt_long(argc, argv, "dD:E:L:nNU:WA:sT:X:", long_options, &option_index)) != -1)
+   {
+       switch (c)
+       {
+           case 'A':
+               authmethodlocal = authmethodhost = pg_strdup(optarg);
+
+               /*
+                * When ident is specified, use peer for local connections.
+                * Mirrored, when peer is specified, use ident for TCP/IP
+                * connections.
+                */
+               if (strcmp(authmethodhost, "ident") == 0)
+                   authmethodlocal = "peer";
+               else if (strcmp(authmethodlocal, "peer") == 0)
+                   authmethodhost = "ident";
+               break;
+           case 10:
+               authmethodlocal = pg_strdup(optarg);
+               break;
+           case 11:
+               authmethodhost = pg_strdup(optarg);
+               break;
+           case 'D':
+               pg_data = pg_strdup(optarg);
+               break;
+           case 'E':
+               encoding = pg_strdup(optarg);
+               break;
+           case 'W':
+               pwprompt = true;
+               break;
+           case 'U':
+               username = pg_strdup(optarg);
+               break;
+           case 'd':
+               debug = true;
+               printf(_("Running in debug mode.\n"));
+               break;
+           case 'n':
+               noclean = true;
+               printf(_("Running in noclean mode.  Mistakes will not be cleaned up.\n"));
+               break;
+           case 'N':
+               do_sync = false;
+               break;
+           case 'L':
+               share_path = pg_strdup(optarg);
+               break;
+           case 1:
+               locale = pg_strdup(optarg);
+               break;
+           case 2:
+               lc_collate = pg_strdup(optarg);
+               break;
+           case 3:
+               lc_ctype = pg_strdup(optarg);
+               break;
+           case 4:
+               lc_monetary = pg_strdup(optarg);
+               break;
+           case 5:
+               lc_numeric = pg_strdup(optarg);
+               break;
+           case 6:
+               lc_time = pg_strdup(optarg);
+               break;
+           case 7:
+               lc_messages = pg_strdup(optarg);
+               break;
+           case 8:
+               locale = "C";
+               break;
+           case 9:
+               pwfilename = pg_strdup(optarg);
+               break;
+           case 's':
+               show_setting = true;
+               break;
+           case 'T':
+               default_text_search_config = pg_strdup(optarg);
+               break;
+           case 'X':
+               xlog_dir = pg_strdup(optarg);
+               break;
+           default:
+               /* getopt_long already emitted a complaint */
+               fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+                       progname);
+               exit(1);
+       }
+   }
+
+
+   /*
+    * Non-option argument specifies data directory as long as it wasn't
+    * already specified with -D / --pgdata
+    */
+   if (optind < argc && strlen(pg_data) == 0)
+   {
+       pg_data = pg_strdup(argv[optind]);
+       optind++;
+   }
+
+   if (optind < argc)
+   {
+       fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
+               progname, argv[optind]);
+       fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+               progname);
+       exit(1);
+   }
+
+   if (pwprompt && pwfilename)
+   {
+       fprintf(stderr, _("%s: password prompt and password file cannot be specified together\n"), progname);
+       exit(1);
+   }
+
+   check_authmethod_unspecified(&authmethodlocal);
+   check_authmethod_unspecified(&authmethodhost);
+
+   check_authmethod_valid(authmethodlocal, auth_methods_local, "local");
+   check_authmethod_valid(authmethodhost, auth_methods_host, "host");
+
+   check_need_password(authmethodlocal, authmethodhost);
+
+   get_restricted_token();
+
+   setup_pgdata();
+
+   setup_bin_paths(argv[0]);
+   
+   effective_user = get_id();
+   if (strlen(username) == 0)
+       username = effective_user;
+
+   printf(_("The files belonging to this database system will be owned "
+            "by user \"%s\".\n"
+            "This user must also own the server process.\n\n"),
+          effective_user);
+
+   set_info_version();
+
+   setup_data_file_paths();
+
+   setup_locale_encoding();
+
+   setup_text_search();
+   
+   printf("\n");
 
+   process(argv[0]);
+   
    return 0;
 }