Module Name: src Committed By: martin Date: Fri Jan 28 19:27:43 UTC 2022
Modified Files: src/usr.sbin/sysinst: main.c Log Message: Add an option to set the directory where we look for message catalogs. To generate a diff of this commit: cvs rdiff -u -r1.27 -r1.28 src/usr.sbin/sysinst/main.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/sysinst/main.c diff -u src/usr.sbin/sysinst/main.c:1.27 src/usr.sbin/sysinst/main.c:1.28 --- src/usr.sbin/sysinst/main.c:1.27 Sun Jan 31 22:45:46 2021 +++ src/usr.sbin/sysinst/main.c Fri Jan 28 19:27:43 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.27 2021/01/31 22:45:46 rillig Exp $ */ +/* $NetBSD: main.c,v 1.28 2022/01/28 19:27:43 martin Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -91,7 +91,7 @@ char dist_postfix[SSTRSIZE]; char dist_tgz_postfix[SSTRSIZE]; WINDOW *mainwin; -static void select_language(void); +static void select_language(const char*); __dead static void usage(void); __dead static void miscsighandler(int); static void ttysighandler(int); @@ -208,6 +208,7 @@ int main(int argc, char **argv) { int ch; + const char *msg_cat_dir = NULL; init(); @@ -223,7 +224,7 @@ main(int argc, char **argv) } /* argv processing */ - while ((ch = getopt(argc, argv, "Dr:f:C:" + while ((ch = getopt(argc, argv, "Dr:f:C:m:" #ifndef NO_PARTMAN "p" #endif @@ -243,6 +244,10 @@ main(int argc, char **argv) /* Define colors */ sscanf(optarg, "%u:%u", &clr_arg.bg, &clr_arg.fg); break; + case 'm': + /* set message catalog directory */ + msg_cat_dir = optarg; + break; #ifndef NO_PARTMAN case 'p': /* Partition tool */ @@ -296,7 +301,7 @@ main(int argc, char **argv) /* Ensure we have mountpoint for target filesystems */ mkdir(targetroot_mnt, S_IRWXU | S_IRGRP|S_IXGRP | S_IROTH|S_IXOTH); - select_language(); + select_language(msg_cat_dir); get_kb_encoding(); init_lang(); @@ -326,103 +331,123 @@ set_language(menudesc *m, void *arg) return 1; } +/* + * Search for sysinstmsg.* files in the given dir, collect + * their names and return the number of files found. + * fnames[0] is preallocated and duplicates are ignored. + */ +struct found_msgs { + char **lang_msg, **fnames; + int max_lang, num_lang; + +}; static void -select_language(void) +find_language_files(const char *path, struct found_msgs *res) { DIR *dir; struct dirent *dirent; - char **lang_msg, **fnames; - char prefix[PATH_MAX], fname[PATH_MAX]; - int max_lang = 16, num_lang = 0; + char fname[PATH_MAX]; const char *cp; - menu_ent *opt = 0; - int lang_menu = -1; - int lang; -#ifdef CATALOG_DIR - strcpy(prefix, CATALOG_DIR "/"); - dir = opendir(CATALOG_DIR); - if (!dir) { - strcpy(prefix, "./"); - dir = opendir("."); - } -#else - dir = opendir("."); - strcpy(prefix, "./"); -#endif + res->num_lang = 0; + dir = opendir(path); if (!dir) return; - lang_msg = malloc(max_lang * sizeof *lang_msg); - fnames = malloc(max_lang * sizeof *fnames); - if (!lang_msg || !fnames) - goto done; - - lang_msg[0] = strdup(msg_string(MSG_sysinst_message_language)); - fnames[0] = 0; - num_lang = 1; - while ((dirent = readdir(dir)) != 0) { if (memcmp(dirent->d_name, "sysinstmsgs.", 12)) continue; - strcpy(fname, prefix); + + if (res->num_lang == 0) + res->num_lang = 1; + strcpy(fname, path); + strcat(fname, "/"); strcat(fname, dirent->d_name); if (msg_file(fname)) continue; cp = msg_string(MSG_sysinst_message_language); - if (!strcmp(cp, lang_msg[0])) + if (!strcmp(cp, res->lang_msg[0])) continue; - if (num_lang == max_lang) { + if (res->num_lang == res->max_lang) { char **new; - max_lang *= 2; - new = realloc(lang_msg, max_lang * sizeof *lang_msg); + res->max_lang *= 2; + new = realloc(res->lang_msg, + res->max_lang * sizeof *res->lang_msg); if (!new) break; - lang_msg = new; - new = realloc(fnames, max_lang * sizeof *fnames); + res->lang_msg = new; + new = realloc(res->fnames, + res->max_lang * sizeof *res->fnames); if (!new) break; - fnames = new; + res->fnames = new; } - fnames[num_lang] = strdup(fname); - lang_msg[num_lang++] = strdup(cp); + res->fnames[res->num_lang] = strdup(fname); + res->lang_msg[res->num_lang++] = strdup(cp); } - msg_file(0); + closedir(dir); - dir = 0; +} + +static void +select_language(const char *msg_cat_path) +{ + struct found_msgs found; + menu_ent *opt = 0; + const char *cp; + int lang_menu = -1; + int lang; + + found.max_lang = 16; + found.num_lang = 0; + found.lang_msg = malloc(found.max_lang * sizeof *found.lang_msg); + found.fnames = malloc(found.max_lang * sizeof *found.fnames); + if (!found.lang_msg || !found.fnames) + goto done; + found.lang_msg[0] = strdup(msg_string(MSG_sysinst_message_language)); + found.fnames[0] = NULL; + + if (msg_cat_path != NULL) + find_language_files(msg_cat_path, &found); + if (found.num_lang == 0) + find_language_files(".", &found); +#ifdef CATALOG_DIR + if (found.num_lang == 0) + find_language_files(CATALOG_DIR, &found); +#endif + + msg_file(0); - if (num_lang == 1) + if (found.num_lang <= 1) goto done; - opt = calloc(num_lang, sizeof *opt); + opt = calloc(found.num_lang, sizeof *opt); if (!opt) goto done; - for (lang = 0; lang < num_lang; lang++) { - opt[lang].opt_name = lang_msg[lang]; + for (lang = 0; lang < found.num_lang; lang++) { + opt[lang].opt_name = found.lang_msg[lang]; opt[lang].opt_action = set_language; } - lang_menu = new_menu(NULL, opt, num_lang, -1, 12, 0, 0, MC_NOEXITOPT, - NULL, NULL, NULL, NULL, NULL); + lang_menu = new_menu(NULL, opt, found.num_lang, -1, 12, 0, 0, + MC_NOEXITOPT, NULL, NULL, NULL, NULL, NULL); if (lang_menu != -1) { msg_display(MSG_hello); - process_menu(lang_menu, fnames); + process_menu(lang_menu, found.fnames); } done: - if (dir) - closedir(dir); if (lang_menu != -1) free_menu(lang_menu); free(opt); - while (num_lang) { - free(lang_msg[--num_lang]); - free(fnames[num_lang]); + for (int i = 0; i < found.num_lang; i++) { + free(found.lang_msg[i]); + free(found.fnames[i]); } - free(lang_msg); - free(fnames); + free(found.lang_msg); + free(found.fnames); /* set locale according to selected language */ cp = msg_string(MSG_sysinst_message_locale); @@ -476,6 +501,7 @@ usage(void) "where:\n" "\t-D\n\t\trun in debug mode\n" "\t-f definition_file\n\t\toverride built-in defaults from file\n" + "\t-m msg_catalog_dir\n\t\tuse translation files from msg_catalog_dir\n" "\t-r release\n\t\toverride release name\n" "\t-C bg:fg\n\t\tuse different color scheme\n" #ifndef NO_PARTMAN