void loadLanguage(void) { char *filename; int fd, hash, rc; char * key = getenv("LANGKEY"); if (strings) { free(strings), strings = NULL; numStrings = allocedStrings = 0; } /* english requires no files */ if (!strcmp(key, "en")) return; checked_asprintf(&filename, "/tmp/translation/%s.tr", key); rc = unpack_archive_file("/etc/loader.tr", "/tmp/translation"); if (rc != ARCHIVE_OK || access("/tmp/translation", R_OK) == -1) { newtWinMessage("Error", "OK", "Cannot get translation file %s.\n", filename); return; } fd = open(filename, O_RDONLY); if (fd < 0) { newtWinMessage("Error", "OK", "Failed to open /tmp/translation: %m\n"); free(filename); return; } while (read(fd, &hash, 4) == 4) { if (allocedStrings == numStrings) { allocedStrings += 10; strings = realloc(strings, sizeof(*strings) * allocedStrings); } strings[numStrings].hash = ntohl(hash); rc = read(fd, &strings[numStrings].length, 2); strings[numStrings].length = ntohs(strings[numStrings].length); strings[numStrings].str = malloc(strings[numStrings].length + 1); rc = read(fd, strings[numStrings].str, strings[numStrings].length); strings[numStrings].str[strings[numStrings].length] = '\0'; numStrings++; } close(fd); free(filename); int translation_dir_fd = open("/tmp/translation", O_RDONLY); recursiveRemove(translation_dir_fd); close(translation_dir_fd); rmdir("/tmp/translation"); qsort(strings, numStrings, sizeof(*strings), aStringCmp); }
int kickstartFromBD(char *kssrc) { int rc; char *p, *np = NULL, *r = NULL, *tmpstr, *ksdev, *kspath, *biosksdev; logMessage(INFO, "getting kickstart file from biosdrive"); /* format is bd:[device]:/path/to/ks.cfg */ /* split of pieces */ tmpstr = strdup(kssrc); p = strchr(tmpstr, ':'); if (p) np = strchr(p+1, ':'); if (!p || !np) { logMessage(WARNING, "Format of command line is ks=bd:device:/path/to/ks.cfg"); free(tmpstr); return 1; } *np = '\0'; kspath = np+1; r = strchr(p+1,'p'); if(!r){ logMessage(INFO, "Format of biosdisk is 80p1"); free(tmpstr); return 1; } *r = '\0'; biosksdev = getBiosDisk((p + 1)); if(!biosksdev){ startNewt(); newtWinMessage(_("Error"), _("OK"), _("Cannot find hard drive for BIOS disk %s"), p + 1); return 1; } ksdev = malloc(strlen(biosksdev) + 3); sprintf(ksdev, "%s%s", biosksdev, r + 1); logMessage(INFO, "Loading ks from device %s on path %s", ksdev, kspath); if ((rc=getKickstartFromBlockDevice(ksdev, kspath))) { if (rc == 3) { startNewt(); newtWinMessage(_("Error"), _("OK"), _("Cannot find kickstart file on hard drive.")); } return 1; } return 0; }
void loadKickstartModule(struct loaderData_s * loaderData, int argc, char **argv) { gchar *opts = NULL; gchar *module = NULL; gchar **args = NULL, **remaining = NULL; gboolean rc; GOptionContext *optCon = g_option_context_new(NULL); GError *optErr = NULL; GOptionEntry ksDeviceOptions[] = { { "opts", 0, 0, G_OPTION_ARG_STRING, &opts, NULL, NULL }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, NULL }, { NULL }, }; g_option_context_set_help_enabled(optCon, FALSE); g_option_context_add_main_entries(optCon, ksDeviceOptions, NULL); if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) { startNewt(); newtWinMessage(_("Kickstart Error"), _("OK"), _("Bad argument to device kickstart method " "command: %s"), optErr->message); g_error_free(optErr); g_option_context_free(optCon); return; } g_option_context_free(optCon); if ((remaining != NULL) && (g_strv_length(remaining) == 1)) { module = remaining[0]; } if (!module) { startNewt(); newtWinMessage(_("Kickstart Error"), _("OK"), _("A module name must be specified for " "the kickstart device command.")); return; } if (opts) { args = g_strsplit(opts, " ", 0); } rc = mlLoadModule(module, args); g_strfreev(args); return; }
void setKickstartUrl(struct loaderData_s * loaderData, int argc, char ** argv) { char *url = NULL, *substr = NULL; poptContext optCon; int rc; struct poptOption ksUrlOptions[] = { { "url", '\0', POPT_ARG_STRING, &url, 0, NULL, NULL }, { 0, 0, 0, 0, 0, 0, 0 } }; logMessage(INFO, "kickstartFromUrl"); optCon = poptGetContext(NULL, argc, (const char **) argv, ksUrlOptions, 0); if ((rc = poptGetNextOpt(optCon)) < -1) { startNewt(); newtWinMessage(_("Kickstart Error"), _("OK"), _("Bad argument to Url kickstart method " "command %s: %s"), poptBadOption(optCon, POPT_BADOPTION_NOALIAS), poptStrerror(rc)); return; } if (!url) { newtWinMessage(_("Kickstart Error"), _("OK"), _("Must supply a --url argument to Url kickstart method.")); return; } /* determine install type */ if (strstr(url, "http://") || strstr(url, "ftp://")) loaderData->method = METHOD_URL; else { newtWinMessage(_("Kickstart Error"), _("OK"), _("Unknown Url method %s"), url); return; } substr = strstr(url, ".img"); if (!substr || (substr && *(substr+4) != '\0')) { loaderData->instRepo = strdup(url); } else { if ((loaderData->stage2Data = calloc(sizeof(struct urlInstallData *), 1)) == NULL) return; ((struct urlInstallData *)loaderData->stage2Data)->url = url; } logMessage(INFO, "results of url ks, url %s", url); }
static void loadLanguageList(void) { char * file = "/etc/lang-table"; FILE * f; char line[256]; char name[256], key[256], font[256], code[256], keyboard[256], timezone[256]; int lineNum = 0; wcwidth(0); f = fopen(file, "r"); if (!f) { newtWinMessage(_("Error"), _("OK"), "cannot open %s: %m", file); return; } while (fgets(line, sizeof(line), f)) { lineNum++; languages = realloc(languages, sizeof(*languages) * (numLanguages + 1)); if (sscanf(line, "%[^\t]\t%[^\t]\t%[^\t]\t%[^\t]\t%[^\t]\t%[^\t]\n", name, key, font, code, keyboard, timezone) != 6) { printf("bad line %d in lang-table", lineNum); logMessage(WARNING, "bad line %d in lang-table", lineNum); } else { languages[numLanguages].lang = strdup(name); languages[numLanguages].key = strdup(key); languages[numLanguages].font = strdup(font); languages[numLanguages].lc_all = strdup(code); languages[numLanguages++].keyboard = strdup(keyboard); } } fclose(f); }
static int loadSingleUrlImage(struct iurlinfo * ui, char * file, char * dest, char * mntpoint, char * device, int silentErrors) { int fd; int rc = 0; char * newFile = NULL; char filepath[1024]; char *ehdrs = NULL; snprintf(filepath, sizeof(filepath), "%s", file); if (ui->protocol == URL_METHOD_HTTP) { ehdrs = (char *) malloc(24+strlen(VERSION)); sprintf(ehdrs, "User-Agent: anaconda/%s\r\n", VERSION); } fd = urlinstStartTransfer(ui, filepath, ehdrs); if (fd == -2) { if (ehdrs) free (ehdrs); return 2; } if (fd < 0) { /* file not found */ newFile = alloca(strlen(filepath) + 20); sprintf(newFile, "disc1/%s", filepath); fd = urlinstStartTransfer(ui, newFile, ehdrs); if (ehdrs) free (ehdrs); if (fd == -2) return 2; if (fd < 0) { if (!silentErrors) newtWinMessage(_("Error"), _("OK"), _("Unable to retrieve %s://%s/%s/%s."), (ui->protocol == URL_METHOD_FTP ? "ftp" : "http"), ui->address, ui->prefix, filepath); return 2; } } if (dest != NULL) { rc = copyFileAndLoopbackMount(fd, dest, device, mntpoint); } urlinstFinishTransfer(ui, fd); if (newFile) { newFile = malloc(strlen(ui->prefix) + 20); sprintf(newFile, "%s/disc1", ui->prefix); free(ui->prefix); ui->prefix = newFile; } return rc; }
/* Used by mountCdromStage2() */ static void wrongCDMessage(void) { char *buf = sdupprintf(_("The %s CD was not found " "in any of your CDROM drives. Please insert " "the %s CD and press %s to retry."), getProductName(), getProductName(), _("OK")); newtWinMessage(_("Error"), _("OK"), buf, _("OK")); free(buf); }
void setKickstartHD(struct loaderData_s * loaderData, int argc, char ** argv) { char *p; gchar *biospart = NULL, *partition = NULL, *dir = NULL; GOptionContext *optCon = g_option_context_new(NULL); GError *optErr = NULL; GOptionEntry ksHDOptions[] = { { "biospart", 0, 0, G_OPTION_ARG_STRING, &biospart, NULL, NULL }, { "partition", 0, 0, G_OPTION_ARG_STRING, &partition, NULL, NULL }, { "dir", 0, 0, G_OPTION_ARG_STRING, &dir, NULL, NULL }, { NULL }, }; logMessage(INFO, "kickstartFromHD"); g_option_context_set_help_enabled(optCon, FALSE); g_option_context_add_main_entries(optCon, ksHDOptions, NULL); if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) { startNewt(); newtWinMessage(_("Kickstart Error"), _("OK"), _("Bad argument to HD kickstart method " "command: %s"), optErr->message); g_error_free(optErr); g_option_context_free(optCon); return; } g_option_context_free(optCon); if (biospart) { char * dev; p = strchr(biospart,'p'); if(!p){ logMessage(ERROR, "Bad argument for --biospart"); return; } *p = '\0'; dev = getBiosDisk(biospart); if (dev == NULL) { logMessage(ERROR, "Unable to location BIOS partition %s", biospart); return; } partition = malloc(strlen(dev) + strlen(p + 1) + 2); sprintf(partition, "%s%s", dev, p + 1); } loaderData->method = METHOD_HD; loaderData->stage2Data = calloc(sizeof(struct hdInstallData *), 1); if (partition) ((struct hdInstallData *)loaderData->stage2Data)->partition = partition; if (dir) ((struct hdInstallData *)loaderData->stage2Data)->directory = dir; logMessage(INFO, "results of hd ks, partition is %s, dir is %s", partition, dir); }
int probeisdncard(void) { int c; char message[STRING_SIZE]; char commandstring[STRING_SIZE]; char moduleparams[STRING_SIZE] = ""; struct keyvalue *kv = initkeyvalues(); int result = -1; if (!(readkeyvalues(kv, CONFIG_ROOT "isdn/settings"))) { freekeyvalues(kv); errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]); return -1; } findkey(kv, "MODULE_PARAMS", moduleparams); c = 1; while (cards[c].name) { sprintf(message, ctr[TR_CHECKING_FOR], cards[c].name); /* * For USB ISDN.... * just check /proc/bus/usb/devices for our supported device */ if (cards[c].type == 100) { if (probeusbisdncard("Vendor=0483 ProdID=481")) sprintf(commandstring, "/sbin/modprobe hisax_st5481 protocol=1 %s", moduleparams); else goto CONTINUE; } else { sprintf(commandstring, "/sbin/modprobe hisax type=%d protocol=1 %s", cards[c].type, moduleparams); } if (runcommandwithstatus(commandstring, message) == 0) { mysystem("/etc/ppp/isdn-cleanup"); sprintf(message, ctr[TR_DETECTED], cards[c].name); newtWinMessage(TITLE, ctr[TR_OK], message); result = cards[c].type; goto EXIT; } CONTINUE: c++; } errorbox(ctr[TR_UNABLE_TO_FIND_AN_ISDN_CARD]); EXIT: freekeyvalues(kv); return result; }
static void foo ( const char * psz ) { int i; int n; for (i = 0; i < 10; i ++) { n = i; } newtWinMessage("Title", "Button", (char *) psz); }
static VALUE rb_ext_Screen_WinMessage(VALUE self, VALUE args) { if (RARRAY_LEN(args) < 3) { rb_raise(rb_eArgError, "3 arguments required"); } else { newtWinMessage(StringValuePtr(RARRAY_PTR(args)[0]), StringValuePtr(RARRAY_PTR(args)[1]), StringValuePtr(RARRAY_PTR(args)[2])); } return Qnil; }
void setKickstartNfs(struct loaderData_s * loaderData, int argc, char ** argv) { char * host = NULL, * dir = NULL, * mountOpts = NULL; char *substr = NULL; poptContext optCon; int rc; struct poptOption ksNfsOptions[] = { { "server", '\0', POPT_ARG_STRING, &host, 0, NULL, NULL }, { "dir", '\0', POPT_ARG_STRING, &dir, 0, NULL, NULL }, { "opts", '\0', POPT_ARG_STRING, &mountOpts, 0, NULL, NULL}, { 0, 0, 0, 0, 0, 0, 0 } }; logMessage(INFO, "kickstartFromNfs"); optCon = poptGetContext(NULL, argc, (const char **) argv, ksNfsOptions, 0); if ((rc = poptGetNextOpt(optCon)) < -1) { startNewt(); newtWinMessage(_("Kickstart Error"), _("OK"), _("Bad argument to NFS kickstart method " "command %s: %s"), poptBadOption(optCon, POPT_BADOPTION_NOALIAS), poptStrerror(rc)); return; } if (!host || !dir) { logMessage(ERROR, "host and directory for nfs kickstart not specified"); return; } loaderData->method = METHOD_NFS; substr = strstr(dir, ".img"); if (!substr || (substr && *(substr+4) != '\0')) { if (asprintf(&(loaderData->instRepo), "nfs:%s:%s", host, dir) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } logMessage(INFO, "results of nfs, host is %s, dir is %s, opts are '%s'", host, dir, mountOpts); } else { loaderData->stage2Data = calloc(sizeof(struct nfsInstallData *), 1); ((struct nfsInstallData *)loaderData->stage2Data)->host = host; ((struct nfsInstallData *)loaderData->stage2Data)->directory = dir; ((struct nfsInstallData *)loaderData->stage2Data)->mountOpts = mountOpts; logMessage(INFO, "results of nfs, host is %s, dir is %s, opts are '%s'", ((struct nfsInstallData *) loaderData->stage2Data)->host, ((struct nfsInstallData *) loaderData->stage2Data)->directory, ((struct nfsInstallData *) loaderData->stage2Data)->mountOpts); } }
int kickstartFromRemovable(char *kssrc) { struct device ** devices; char *p, *kspath; int i, rc; logMessage(INFO, "doing kickstart from removable media"); devices = getDevices(DEVICE_DISK); /* usb can take some time to settle, even with the various hacks we * have in place. some systems use portable USB CD-ROM drives, try to * make sure there really isn't one before bailing. */ for (i = 0; !devices && i < 10; ++i) { logMessage(INFO, "sleeping to wait for a USB disk"); sleep(2); devices = getDevices(DEVICE_DISK); } if (!devices) { logMessage(ERROR, "no disks"); return 1; } for (i = 0; devices[i]; i++) { if (devices[i]->priv.removable == 1) { logMessage(INFO, "first removable media is %s", devices[i]->device); break; } } if (!devices[i] || (devices[i]->priv.removable == 0)) { logMessage(ERROR, "no removable devices"); return 1; } /* format is floppy:[/path/to/ks.cfg] */ kspath = ""; p = strchr(kssrc, ':'); if (p) kspath = p + 1; if (!p || strlen(kspath) < 1) kspath = "/ks.cfg"; if ((rc=getKickstartFromBlockDevice(devices[i]->device, kspath))) { if (rc == 3) { startNewt(); newtWinMessage(_("Error"), _("OK"), _("Cannot find ks.cfg on removable media.")); } return 1; } return 0; }
static int loadSingleUrlImage(struct iurlinfo * ui, char *path, char * dest, char * mntpoint, char * device, int silentErrors) { int fd; int rc = 0; char *ehdrs = NULL; long long size; struct progressCBdata *data = NULL; if (ui->protocol == URL_METHOD_HTTP) { char *arch = getProductArch(); char *name = getProductName(); if (asprintf(&ehdrs, "User-Agent: anaconda/%s\r\n" "X-Anaconda-Architecture: %s\r\n" "X-Anaconda-System-Release: %s\r\n", VERSION, arch, name) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } } fd = urlinstStartTransfer(ui, path, ehdrs, &data, &size); if (fd == -2) { if (ehdrs) free (ehdrs); return 2; } else if (fd < 0) { if (!silentErrors) { newtWinMessage(_("Error"), _("OK"), _("Unable to retrieve %s://%s%s."), (ui->protocol == URL_METHOD_FTP ? "ftp" : "http"), ui->address, path); } if (ehdrs) free (ehdrs); return 2; } if (dest != NULL) { rc = copyFileAndLoopbackMount(fd, dest, device, mntpoint, progressCallback, data, size); } urlinstFinishTransfer(ui, fd, &data); return rc; }
int kickstartFromCD(char *kssrc) { int rc, i; char *p, *kspath; struct device ** devices; logMessage(INFO, "getting kickstart file from first CDROM"); devices = probeDevices(CLASS_CDROM, BUS_UNSPEC, 0); /* usb can take some time to settle, even with the various hacks we * have in place. some systems use portable USB CD-ROM drives, try to * make sure there really isn't one before bailing */ for (i = 0; !devices && i < 10; ++i) { logMessage(DEBUGLVL, "sleeping to wait for a USB CD-ROM"); sleep(2); devices = probeDevices(CLASS_CDROM, BUS_UNSPEC, 0); } if (!devices) { logMessage(ERROR, "No CDROM devices found!"); return 1; } /* format is cdrom:[/path/to/ks.cfg] */ kspath = ""; p = strchr(kssrc, ':'); if (p) kspath = p + 1; if (!p || strlen(kspath) < 1) kspath = "/ks.cfg"; for (i=0; devices[i]; i++) { if (!devices[i]->device) continue; rc = getKickstartFromBlockDevice(devices[i]->device, kspath); if (rc == 0) return 0; } startNewt(); newtWinMessage(_("Error"), _("OK"), _("Cannot find kickstart file on CDROM.")); return 1; }
int password(char *user) { char message[STRING_SIZE]; char password[STRING_SIZE]; char commandstring[STRING_SIZE]; char *tmpstring; if (!strcmp(user, "root")) { strcpy(message, gettext("TR_ENTER_ROOT_PASSWORD")); } else if (!strcmp(user, "admin")) { /* workaround gcc warning, there is really 2 %s there */ tmpstring = strdup(gettext("TR_ENTER_ADMIN_PASSWORD")); snprintf(message, STRING_SIZE, tmpstring, NAME, NAME); free(tmpstring); } else if (!strcmp(user, "backup")) { strcpy(message, gettext("TR_ENTER_BACKUP_PASSWORD")); } else if (!strcmp(user, "dial")) { strcpy(message, gettext("TR_ENTER_DIAL_PASSWORD")); } else { return FAILURE; } if (getpassword(password, message) == SUCCESS) { if (!strcmp(user, "admin") || !strcmp(user, "dial")) { snprintf(commandstring, STRING_SIZE, "/usr/sbin/htpasswd -m -b /var/ipcop/auth/users %s '%s'", user, password); } else { snprintf(commandstring, STRING_SIZE, "/bin/echo '%s:%s' | /usr/sbin/chpasswd", user, password); } if (mysystemhidden(commandstring)) { snprintf(message, STRING_SIZE, "%s %s", gettext("TR_PROBLEM_SETTING_PASSWORD_FOR"), user); newtWinMessage(get_title(), gettext("TR_OK"), message); return FAILURE; } } return SUCCESS; }
/** * nmt_newt_message_dialog: * @message: a printf()-style message format * @...: arguments * * Displays the given message in a dialog box with a single "OK" * button, and returns after the user clicks "OK". */ void nmt_newt_message_dialog (const char *message, ...) { va_list ap; char *msg, *msg_lc, *ok_lc; va_start (ap, message); msg = g_strdup_vprintf (message, ap); va_end (ap); msg_lc = nmt_newt_locale_from_utf8 (msg); ok_lc = nmt_newt_locale_from_utf8 (_("OK")); newtWinMessage (NULL, ok_lc, "%s", msg_lc); g_free (ok_lc); g_free (msg_lc); g_free (msg); }
/* choice is the index of the chosen language in languages */ static int setupLanguage(int choice, int forced) { char * buf; int i; logMessage(DEBUGLVL, "going to set language to %s", languages[choice].lc_all); /* load the language only if it is displayable. if they're using * a serial console or iSeries vioconsole, we hope it's smart enough */ if ((strcmp(languages[choice].font, "latarcyrheb-sun16") && !FL_SERIAL(flags) && !FL_VIRTPCONSOLE(flags) && !isVioConsole())) { if (forced == 1) return 0; newtWinMessage("Language Unavailable", "OK", "%s display is unavailable in text mode. The " "installation will continue in English until the " "display of %s is possible.", languages[choice].lang, languages[choice].lang); setLangEnv(english); return 0; } setLangEnv (choice); /* clear out top line */ buf = alloca(80); for (i=0; i < 80; i++) buf[i] = ' '; newtDrawRootText(0, 0, buf); char *fmt = FL_RESCUE(flags) ? _(topLineWelcomeRescue) : _(topLineWelcome); if (asprintf(&buf, fmt, getProductName(), getProductArch()) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } newtDrawRootText(0, 0, buf); free(buf); newtPopHelpLine(); newtPushHelpLine(_(bottomHelpLine)); return 0; }
int kickstartFromHD(char *kssrc) { int rc; char *p, *np = NULL, *tmpstr, *ksdev, *kspath; logMessage(INFO, "getting kickstart file from harddrive"); /* format is hd:[device]:/path/to/ks.cfg */ /* split up pieces */ tmpstr = strdup(kssrc); p = strchr(tmpstr, ':'); if (p) np = strchr(p+1, ':'); /* no second colon, assume its the old format of */ /* hd:[device]/path/to/ks.cfg */ /* this format is bad however because some devices have '/' in them! */ if (!np) np = strchr(p+1, '/'); if (!p || !np) { logMessage(WARNING, "Format of command line is ks=hd:[device]:/path/to/ks.cfg"); free(tmpstr); return 1; } *np = '\0'; ksdev = p+1; kspath = np+1; logMessage(INFO, "Loading ks from device %s on path %s", ksdev, kspath); if ((rc=getKickstartFromBlockDevice(ksdev, kspath))) { if (rc == 3) { startNewt(); newtWinMessage(_("Error"), _("OK"), _("Cannot find kickstart file on hard drive.")); } return 1; } return 0; }
void setKickstartNfs(struct loaderData_s * loaderData, int argc, char ** argv) { char * host = NULL, * dir = NULL, * mountOpts = NULL; poptContext optCon; int rc; struct poptOption ksNfsOptions[] = { { "server", '\0', POPT_ARG_STRING, &host, 0, NULL, NULL }, { "dir", '\0', POPT_ARG_STRING, &dir, 0, NULL, NULL }, { "opts", '\0', POPT_ARG_STRING, &mountOpts, 0, NULL, NULL}, { 0, 0, 0, 0, 0, 0, 0 } }; logMessage(INFO, "kickstartFromNfs"); optCon = poptGetContext(NULL, argc, (const char **) argv, ksNfsOptions, 0); if ((rc = poptGetNextOpt(optCon)) < -1) { startNewt(); newtWinMessage(_("Kickstart Error"), _("OK"), _("Bad argument to NFS kickstart method " "command %s: %s"), poptBadOption(optCon, POPT_BADOPTION_NOALIAS), poptStrerror(rc)); return; } if (!host || !dir) { logMessage(ERROR, "host and directory for nfs kickstart not specified"); return; } loaderData->method = METHOD_NFS; loaderData->methodData = calloc(sizeof(struct nfsInstallData *), 1); if (host) ((struct nfsInstallData *)loaderData->methodData)->host = host; if (dir) ((struct nfsInstallData *)loaderData->methodData)->directory = dir; if (mountOpts) ((struct nfsInstallData *)loaderData->methodData)->mountOpts = mountOpts; logMessage(INFO, "results of nfs, host is %s, dir is %s, opts are '%s'", host, dir, mountOpts); }
static void setShutdown(struct loaderData_s * loaderData, int argc, char ** argv) { gint eject = 0, reboot = 0, halt = 0, poweroff = 0; GOptionContext *optCon = g_option_context_new(NULL); GError *optErr = NULL; GOptionEntry ksOptions[] = { { "eject", 'e', 0, G_OPTION_ARG_INT, &eject, NULL, NULL }, { "reboot", 'r', 0, G_OPTION_ARG_INT, &reboot, NULL, NULL }, { "halt", 'h', 0, G_OPTION_ARG_INT, &halt, NULL, NULL }, { "poweroff", 'p', 0, G_OPTION_ARG_INT, &poweroff, NULL, NULL }, { NULL }, }; g_option_context_set_help_enabled(optCon, FALSE); g_option_context_add_main_entries(optCon, ksOptions, NULL); if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) { startNewt(); newtWinMessage(_("Kickstart Error"), _("OK"), _("Bad argument to shutdown kickstart method " "command: %s"), optErr->message); g_error_free(optErr); g_option_context_free(optCon); return; } g_option_context_free(optCon); if (FL_NOKILL(flags)) { flags |= LOADER_FLAGS_HALT; } else { if (poweroff) flags |= LOADER_FLAGS_POWEROFF; if ((!poweroff && !reboot) || (halt)) flags |= LOADER_FLAGS_HALT; } }
int main(int argc, char *argv[]) { int choice; char *sections[14]; /* need to fill this out AFTER knowing lang */ int rc; struct keyvalue *kv; char selectedshortlang[STRING_SIZE] = "en"; int autook = 0; int doreboot = 0; struct stat statbuf; memset(&statbuf, 0, sizeof(struct stat)); /* Log file/terminal stuff. */ if (argc >= 2) logname = argv[1]; else logname = strdup("/root/setup.log"); if (!(flog = fopen(logname, "w+"))) { printf("Couldn't open log terminal\n"); return 1; } /* Engage auto operation (run through 'normal' selections automatically) */ if (argc >= 3) { if (strlen(argv[2]) == 12 && strncmp(argv[2], "firstInstall", 12) == 0) { /* This execution only follows the installer; outgoing rules are cleared */ automode = 1; } else if (strlen(argv[2]) == 15 && strncmp(argv[2], "networkingOnly", 15) == 0) { /* This execution only runs during bootup when the NICs have changed */ automode = 2; } else { /* All other values mean generic auto mode during normal operation */ automode = 3; } } fprintf(flog, "Setup program started.\n"); kv = initkeyvalues(); if (!(readkeyvalues(kv, CONFIG_ROOT "main/settings"))) { printf("Smoothwall is not properly installed.\n"); return 1; } findkey(kv, "LANGUAGE", selectedshortlang); ctr = english_tr; newtInit(); newtCls(); newtDrawRootText(0, 0, TITLE " -- http://smoothwall.org/"); newtPushHelpLine(ctr[TR_HELPLINE]); if (automode == 0) { /* Admin selects each menu item individually */ sections[0] = ctr[TR_RESTORE_CONFIGURATION]; sections[1] = ctr[TR_KEYBOARD_MAPPING]; sections[2] = ctr[TR_TIMEZONE]; sections[3] = ctr[TR_HOSTNAME]; sections[4] = ctr[TR_WEB_PROXY]; sections[5] = ctr[TR_DEFAULT_SECURITY_LEVEL]; sections[6] = ctr[TR_ISDN_CONFIGURATION]; sections[7] = ctr[TR_ADSL_CONFIGURATION]; sections[8] = ctr[TR_NETWORKING]; sections[9] = ctr[TR_DHCP_SERVER_CONFIGURATION], sections[10] = ctr[TR_ROOT_PASSWORD]; sections[11] = ctr[TR_SETUP_PASSWORD]; sections[12] = ctr[TR_ADMIN_PASSWORD]; sections[13] = NULL; usbfail = 1; if (!stat("/proc/bus/usb/devices", &statbuf)) usbfail = 0; if (usbfail) fprintf(flog, "USB HCI not detected.\n"); else fprintf(flog, "USB HCI detected.\n"); choice = 0; for (;;) { rc = newtWinMenu(ctr[TR_SECTION_MENU], ctr[TR_SELECT_THE_ITEM], 50, 5, 5, 8, sections, &choice, ctr[TR_OK], ctr[TR_QUIT], NULL); if (rc == 2) break; switch (choice) { case 0: handlerestore(); break; case 1: handlekeymap(); break; case 2: handletimezone(); break; case 3: handlehostname(); break; case 4: handlewebproxy(); break; case 5: handledefaults(); break; case 6: handleisdn(); break; case 7: handleadsl(); break; case 8: handlenetworking(); break; case 9: handledhcp(); break; case 10: handlerootpassword(); break; case 11: handlesetuppassword(); break; case 12: handleadminpassword(); break; default: break; } } } else if (automode == 2) { /* Admin specified networkingOnly as the third arg */ /* This happens when the NIC change and rc.sysint runs setup */ handlenetworking(); autook = 2; } else { /* automode is 1 (firstInstall) or 3 (generic) */ usbfail = 1; if (newtWinChoice(ctr[TR_RESTORE_CONFIGURATION], ctr[TR_NO], ctr[TR_YES], ctr[TR_RESTORE_LONG]) != 1) { if (!(handlerestore())) goto EXIT; } if (!(handlekeymap())) goto EXIT; if (!(handletimezone())) goto EXIT; if (!(handlehostname())) goto EXIT; if (!(handledefaults())) goto EXIT; if (!(handlenetworking())) goto EXIT; if (!performedrestore) { choice = 0; for (;;) { sections[0] = ctr[TR_WEB_PROXY]; sections[1] = ctr[TR_ISDN_CONFIGURATION]; sections[2] = ctr[TR_ADSL_CONFIGURATION]; sections[3] = ctr[TR_DHCP_SERVER_CONFIGURATION], sections[4] = NULL; rc = newtWinMenu(ctr[TR_SECTION_MENU], ctr[TR_SELECT_THE_ITEM], 50, 5, 5, 8, sections, &choice, ctr[TR_OK], ctr[TR_FINISHED], NULL); if (rc == 2) break; switch (choice) { case 0: handlewebproxy(); break; case 1: handleisdn(); break; case 2: handleadsl(); break; case 3: handledhcp(); break; default: break; } } } if (!(handleadminpassword())) goto EXIT; if (!(handlerootpassword())) goto EXIT; autook = 1; } EXIT: if (automode == 1 || automode == 3) { if (autook) newtWinMessage("", ctr[TR_OK], ctr[TR_SETUP_FINISHED]); else newtWinMessage(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_SETUP_NOT_COMPLETE]); } else if (automode == 2) { if (autook == 2) { fprintf(flog, "Setup program ended.\n"); fflush(flog); fclose(flog); newtFinished(); return 0; } else { return -1; } } else { if (rebootrequired) { if (newtWinChoice("", ctr[TR_YES], ctr[TR_NO], ctr[TR_DO_YOU_WANT_TO_REBOOT]) != 2) { doreboot = 1; } } } fprintf(flog, "Setup program ended.\n"); fflush(flog); fclose(flog); newtFinished(); if (doreboot) system("/sbin/shutdown -r now"); return 0; }
int networkmenu(struct keyvalue *ethernetkv) { int rc; char driver[STRING_SIZE] = ""; char driveroptions[STRING_SIZE] = ""; struct keyvalue *kv = initkeyvalues(); int result = 0; char commandstring[STRING_SIZE]; char address[STRING_SIZE], netmask[STRING_SIZE]; int done; char description[1000]; char message[1000]; char cardinfo[STRING_SIZE]; char mac[STRING_SIZE]; int c = 0; done = 0; c = 0; while (!done) { rc = newtWinTernary(ctr[TR_CONFIGURE_NETWORKING], ctr[TR_PROBE], ctr[TR_SELECT], ctr[TR_CANCEL], ctr[TR_CONFIGURE_NETWORKING_LONG]); if (rc == 0 || rc == 1) { probecards(driver, driveroptions, &c); if (!strlen(driver)) errorbox(ctr[TR_PROBE_FAILED]); else { findnicdescription(driver, description); if ((getnicmac(mac, sizeof(mac), "eth0"))) /* If MAC found put it at the end of nic description. */ snprintf(cardinfo, STRING_SIZE, "%s [%s]", description, mac); else /* MAC lookup failed so just display nic description. */ snprintf(cardinfo, STRING_SIZE, "%s", description); sprintf(message, ctr[TR_FOUND_NIC], cardinfo); newtWinMessage(TITLE, ctr[TR_OK], message); } } else if (rc == 2) choosecards(driver, driveroptions); else done = 1; if (strlen(driver)) done = 1; } if (!strlen(driver)) goto EXIT; /* Default is a GREEN nic only. */ /* Smoothie is not untarred yet, so we have to delay actually writing the * settings till later. */ replacekeyvalue(ethernetkv, "CONFIG_TYPE", "0"); replacekeyvalue(ethernetkv, "GREEN_DRIVER", driver); replacekeyvalue(ethernetkv, "GREEN_DRIVER_OPTIONS", driveroptions); replacekeyvalue(ethernetkv, "GREEN_DEV", "eth0"); replacekeyvalue(ethernetkv, "GREEN_DISPLAYDRIVER", driver); if (!(changeaddress(ethernetkv, "GREEN", 0, ""))) goto EXIT; strcpy(address, ""); findkey(ethernetkv, "GREEN_ADDRESS", address); strcpy(netmask, ""); findkey(ethernetkv, "GREEN_NETMASK", netmask); snprintf(commandstring, STRING_SIZE, "/bin/ifconfig eth0 %s netmask %s up", address, netmask); if (mysystem(commandstring)) { errorbox(ctr[TR_INTERFACE_FAILED_TO_COME_UP]); goto EXIT; } result = 1; EXIT: freekeyvalues(kv); return result; }
void loadLanguage (char * file) { char filename[200]; gzFile stream; int fd, hash, rc; char * key = getenv("LANGKEY"); if (strings) { free(strings), strings = NULL; numStrings = allocedStrings = 0; } /* english requires no files */ if (!strcmp(key, "en")) return; if (!file) { file = filename; sprintf(filename, "/etc/loader.tr"); } stream = gunzip_open(file); if (!stream) { newtWinMessage("Error", "OK", "Translation for %s is not available. " "The Installation will proceed in English.", key); return ; } sprintf(filename, "%s.tr", key); rc = installCpioFile(stream, filename, "/tmp/translation", 1); gunzip_close(stream); if (rc || access("/tmp/translation", R_OK)) { newtWinMessage("Error", "OK", "Cannot get translation file %s.\n", filename); return; } fd = open("/tmp/translation", O_RDONLY); if (fd < 0) { newtWinMessage("Error", "OK", "Failed to open /tmp/translation: %m\n"); return; } while (read(fd, &hash, 4) == 4) { if (allocedStrings == numStrings) { allocedStrings += 10; strings = realloc(strings, sizeof(*strings) * allocedStrings); } strings[numStrings].hash = ntohl(hash); rc = read(fd, &strings[numStrings].length, 2); strings[numStrings].length = ntohs(strings[numStrings].length); strings[numStrings].str = malloc(strings[numStrings].length + 1); rc = read(fd, strings[numStrings].str, strings[numStrings].length); strings[numStrings].str[strings[numStrings].length] = '\0'; numStrings++; } close(fd); unlink("/tmp/translation"); qsort(strings, numStrings, sizeof(*strings), aStringCmp); }
int urlMainSetupPanel(struct iurlinfo * ui, urlprotocol protocol, char * doSecondarySetup) { newtComponent form, okay, cancel, siteEntry, dirEntry; newtComponent answer, text; newtComponent cb = NULL; char * site, * dir; char * reflowedText = NULL; int width, height; newtGrid entryGrid, buttons, grid; char * chptr; char * buf = NULL; if (ui->address) { site = ui->address; dir = ui->prefix; } else { site = ""; dir = ""; } if (ui->login || ui->password || ui->proxy || ui->proxyPort) *doSecondarySetup = '*'; else *doSecondarySetup = ' '; buttons = newtButtonBar(_("OK"), &okay, _("Back"), &cancel, NULL); switch (protocol) { case URL_METHOD_FTP: buf = sdupprintf(_(netServerPrompt), _("FTP"), getProductName()); reflowedText = newtReflowText(buf, 47, 5, 5, &width, &height); free(buf); break; case URL_METHOD_HTTP: buf = sdupprintf(_(netServerPrompt), _("Web"), getProductName()); reflowedText = newtReflowText(buf, 47, 5, 5, &width, &height); free(buf); break; #ifdef ROCKS case URL_METHOD_HTTPS: buf = sdupprintf(_(netServerPrompt), "Secure Web", getProductName()); reflowedText = newtReflowText(buf, 47, 5, 5, &width, &height); free(buf); break; #endif /* ROCKS */ } text = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP); newtTextboxSetText(text, reflowedText); free(reflowedText); siteEntry = newtEntry(22, 8, site, 24, (const char **) &site, NEWT_ENTRY_SCROLL); dirEntry = newtEntry(22, 9, dir, 24, (const char **) &dir, NEWT_ENTRY_SCROLL); entryGrid = newtCreateGrid(2, 2); newtGridSetField(entryGrid, 0, 0, NEWT_GRID_COMPONENT, newtLabel(-1, -1, (protocol == URL_METHOD_FTP) ? _("FTP site name:") : _("Web site name:")), 0, 0, 1, 0, NEWT_ANCHOR_LEFT, 0); newtGridSetField(entryGrid, 0, 1, NEWT_GRID_COMPONENT, newtLabel(-1, -1, sdupprintf(_("%s directory:"), getProductName())), 0, 0, 1, 0, NEWT_ANCHOR_LEFT, 0); newtGridSetField(entryGrid, 1, 0, NEWT_GRID_COMPONENT, siteEntry, 0, 0, 0, 0, 0, 0); newtGridSetField(entryGrid, 1, 1, NEWT_GRID_COMPONENT, dirEntry, 0, 0, 0, 0, 0, 0); grid = newtCreateGrid(1, 4); newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text, 0, 0, 0, 1, 0, 0); newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, entryGrid, 0, 0, 0, 1, 0, 0); if (protocol == URL_METHOD_FTP) { cb = newtCheckbox(3, 11, _("Use non-anonymous ftp"), *doSecondarySetup, NULL, doSecondarySetup); newtGridSetField(grid, 0, 2, NEWT_GRID_COMPONENT, cb, 0, 0, 0, 1, NEWT_ANCHOR_LEFT, 0); } newtGridSetField(grid, 0, 3, NEWT_GRID_SUBGRID, buttons, 0, 0, 0, 0, 0, NEWT_GRID_FLAG_GROWX); newtGridWrappedWindow(grid, (protocol == URL_METHOD_FTP) ? _("FTP Setup") : _("HTTP Setup")); form = newtForm(NULL, NULL, 0); newtGridAddComponentsToForm(grid, form, 1); do { answer = newtRunForm(form); if (answer != cancel) { if (!strlen(site)) { newtWinMessage(_("Error"), _("OK"), _("You must enter a server name.")); continue; } if (!strlen(dir)) { newtWinMessage(_("Error"), _("OK"), _("You must enter a directory.")); continue; } if (!addrToIp(site)) { newtWinMessage(_("Unknown Host"), _("OK"), _("%s is not a valid hostname."), site); continue; } } break; } while (1); if (answer == cancel) { newtFormDestroy(form); newtPopWindow(); return LOADER_BACK; } if (ui->address) free(ui->address); ui->address = strdup(site); if (ui->prefix) free(ui->prefix); /* add a slash at the start of the dir if it is missing */ if (*dir != '/') { if (asprintf(&(ui->prefix), "/%s", dir) == -1) ui->prefix = strdup(dir); } else { ui->prefix = strdup(dir); } /* Get rid of trailing /'s */ chptr = ui->prefix + strlen(ui->prefix) - 1; while (chptr > ui->prefix && *chptr == '/') chptr--; chptr++; *chptr = '\0'; if (*doSecondarySetup != '*') { if (ui->login) free(ui->login); if (ui->password) free(ui->password); if (ui->proxy) free(ui->proxy); if (ui->proxyPort) free(ui->proxyPort); ui->login = ui->password = ui->proxy = ui->proxyPort = NULL; } ui->protocol = protocol; newtFormDestroy(form); newtPopWindow(); return 0; }
int doMediaCheck(char *file, char *descr) { struct progressCBdata data; newtComponent t, f, scale, label; int rc; int dlen; int llen; char tmpstr[1024]; if (access(file, R_OK) < 0) { newtWinMessage(_("Error"), _("OK"), _("Unable to find install image " "%s"), file); return -1; } if (descr) snprintf(tmpstr, sizeof(tmpstr), _("Checking \"%s\"..."), descr); else snprintf(tmpstr, sizeof(tmpstr), _("Checking media now...")); dlen = strlen(tmpstr); if (dlen > 65) dlen = 65; newtCenteredWindow(dlen+8, 6, _("Media Check")); t = newtTextbox(1, 1, dlen+4, 3, NEWT_TEXTBOX_WRAP); newtTextboxSetText(t, tmpstr); llen = strlen(tmpstr); label = newtLabel(llen+1, 1, "-"); f = newtForm(NULL, NULL, 0); newtFormAddComponent(f, t); scale = newtScale(3, 3, dlen, 100); newtFormAddComponent(f, scale); newtDrawForm(f); newtRefresh(); data.scale = scale; data.label = label; rc = mediaCheckFile(file, progressCallback, &data); newtFormDestroy(f); newtPopWindow(); if (rc == -1) { logMessage(WARNING, "mediacheck: %s (%s) has no checksum info", file, descr); newtWinMessage(_("Error"), _("OK"), _("Unable to read the disc checksum from the " "primary volume descriptor. This probably " "means the disc was created without adding the " "checksum.")); } else if (rc == 0) { logMessage(ERROR, "mediacheck: %s (%s) FAILED", file, descr); newtWinMessage(_("Error"), _("OK"), _("The image which was just tested has errors. " "This could be due to a " "corrupt download or a bad disc. " "If applicable, please clean the disc " "and try again. If this test continues to fail you " "should not continue the install.")); } else if (rc > 0) { logMessage(INFO, "mediacheck: %s (%s) PASSED", file, descr); newtWinMessage(_("Success"), _("OK"), _("The image which was just tested was successfully " "verified. It should be OK to install from this " "media. Note that not all media/drive errors can " "be detected by the media check.")); } return rc; }
char * mountNfsImage(struct installMethod * method, char * location, struct loaderData_s * loaderData) { char * host = NULL; char * directory = NULL; char * mountOpts = NULL; char * fullPath = NULL; char * url = NULL; enum { NFS_STAGE_NFS, NFS_STAGE_MOUNT, NFS_STAGE_DONE, NFS_STAGE_UPDATES } stage = NFS_STAGE_NFS; int rc; /* JKFIXME: ASSERT -- we have a network device setup when we get here */ while (stage != NFS_STAGE_DONE) { switch (stage) { case NFS_STAGE_NFS: logMessage(INFO, "going to do nfsGetSetup"); if (loaderData->method == METHOD_NFS && loaderData->stage2Data) { host = ((struct nfsInstallData *)loaderData->stage2Data)->host; directory = ((struct nfsInstallData *)loaderData->stage2Data)->directory; if (((struct nfsInstallData *) loaderData->stage2Data)->mountOpts == NULL) { mountOpts = strdup("ro"); } else { if (asprintf(&mountOpts, "ro,%s", ((struct nfsInstallData *) loaderData->stage2Data)->mountOpts) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } } logMessage(INFO, "host is %s, dir is %s, opts are '%s'", host, directory, mountOpts); if (!host || !directory) { logMessage(ERROR, "missing host or directory specification"); if (loaderData->inferredStage2) loaderData->invalidRepoParam = 1; loaderData->method = -1; break; } else { host = strdup(host); directory = strdup(directory); } } else { char *substr, *tmp; if (nfsGetSetup(&host, &directory) == LOADER_BACK) return NULL; /* If the user-provided URL points at a repo instead of a * stage2 image, fix that up now. */ substr = strstr(directory, ".img"); if (!substr || (substr && *(substr+4) != '\0')) { if (asprintf(&(loaderData->instRepo), "nfs:%s:%s", host, directory) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } if (asprintf(&tmp, "nfs:%s:%s/images/install.img", host, directory) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } setStage2LocFromCmdline(tmp, loaderData); free(host); free(directory); free(tmp); continue; } loaderData->invalidRepoParam = 1; } stage = NFS_STAGE_MOUNT; break; case NFS_STAGE_MOUNT: { char *buf; if (asprintf(&fullPath, "%s:%.*s", host, (int) (strrchr(directory, '/')-directory), directory) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } logMessage(INFO, "mounting nfs path %s", fullPath); if (FL_TESTING(flags)) { stage = NFS_STAGE_DONE; break; } stage = NFS_STAGE_NFS; if (!doPwMount(fullPath, "/mnt/stage2", "nfs", mountOpts, NULL)) { if (asprintf(&buf, "/mnt/stage2/%s", strrchr(directory, '/')) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } if (!access(buf, R_OK)) { logMessage(INFO, "can access %s", buf); rc = mountStage2(buf); if (rc == 0) { stage = NFS_STAGE_UPDATES; if (asprintf(&url, "nfs:%s:%s", host, directory) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } free(buf); break; } else { logMessage(WARNING, "unable to mount %s", buf); free(buf); break; } } else { logMessage(WARNING, "unable to access %s", buf); free(buf); umount("/mnt/stage2"); } } else { newtWinMessage(_("Error"), _("OK"), _("That directory could not be mounted from " "the server.")); if (loaderData->method >= 0) loaderData->method = -1; if (loaderData->inferredStage2) loaderData->invalidRepoParam = 1; break; } if (asprintf(&buf, _("That directory does not seem to " "contain a %s installation image."), getProductName()) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } newtWinMessage(_("Error"), _("OK"), buf); free(buf); if (loaderData->method >= 0) loaderData->method = -1; if (loaderData->inferredStage2) loaderData->invalidRepoParam = 1; break; } case NFS_STAGE_UPDATES: { char *buf; if (asprintf(&buf, "%.*s/RHupdates", (int) (strrchr(fullPath, '/')-fullPath), fullPath) == -1) { logMessage(CRITICAL, "%s: %d: %m", __func__, __LINE__); abort(); } logMessage(INFO, "mounting nfs path %s for updates", buf); if (!doPwMount(buf, "/tmp/update-disk", "nfs", mountOpts, NULL)) { logMessage(INFO, "Using RHupdates/ for NFS install"); copyDirectory("/tmp/update-disk", "/tmp/updates", NULL, NULL); umount("/tmp/update-disk"); unlink("/tmp/update-disk"); } else { logMessage(INFO, "No RHupdates/ directory found, skipping"); } stage = NFS_STAGE_DONE; break; } case NFS_STAGE_DONE: break; } } free(host); free(directory); if (fullPath) free(fullPath); return url; }
int main(int argc, char *argv[]) { int choice; char *sections[13]; /* need to fill this out AFTER knowing lang */ int rc; struct keyvalue *kv; char selectedshortlang[STRING_SIZE] = "en"; int autook = 0; int doreboot = 0; struct stat statbuf; memset(&statbuf, 0, sizeof(struct stat)); /* Log file/terminal stuff. */ if (argc >= 2) logname = argv[1]; else logname = strdup("/root/setup.log"); if (!(flog = fopen(logname, "w+"))) { printf("Couldn't open log terminal\n"); return 1; } if (argc >= 3) automode = 1; fprintf(flog, "Setup program started.\n"); kv = initkeyvalues(); if (!(readkeyvalues(kv, CONFIG_ROOT "main/settings"))) { printf("SmoothWall is not properly installed.\n"); return 1; } findkey(kv, "LANGUAGE", selectedshortlang); ctr = english_tr; newtInit(); newtCls(); newtDrawRootText(0, 0, " SmoothWall Express 3.0 -- http://smoothwall.org/"); newtPushHelpLine(ctr[TR_HELPLINE]); if (automode == 0) { sections[0] = ctr[TR_RESTORE_CONFIGURATION]; sections[1] = ctr[TR_KEYBOARD_MAPPING]; sections[2] = ctr[TR_HOSTNAME]; sections[3] = ctr[TR_WEB_PROXY]; sections[4] = ctr[TR_DEFAULT_SECURITY_LEVEL]; sections[5] = ctr[TR_ISDN_CONFIGURATION]; sections[6] = ctr[TR_ADSL_CONFIGURATION]; sections[7] = ctr[TR_NETWORKING]; sections[8] = ctr[TR_DHCP_SERVER_CONFIGURATION], sections[9] = ctr[TR_ROOT_PASSWORD]; sections[10] = ctr[TR_SETUP_PASSWORD]; sections[11] = ctr[TR_ADMIN_PASSWORD]; sections[12] = NULL; usbfail = 1; if (!stat("/proc/bus/usb/devices", &statbuf)) usbfail = 0; if (usbfail) fprintf(flog, "USB HCI not detected.\n"); else fprintf(flog, "USB HCI detected.\n"); choice = 0; for (;;) { rc = newtWinMenu(ctr[TR_SECTION_MENU], ctr[TR_SELECT_THE_ITEM], 50, 5, 5, 8, sections, &choice, ctr[TR_OK], ctr[TR_QUIT], NULL); if (rc == 2) break; switch (choice) { case 0: handlerestore(); break; case 1: handlekeymap(); break; case 2: handlehostname(); break; case 3: handlewebproxy(); break; case 4: handledefaults(); break; case 5: handleisdn(); break; case 6: handleadsl(); break; case 7: handlenetworking(); break; case 8: handledhcp(); break; case 9: handlerootpassword(); break; case 10: handlesetuppassword(); break; case 11: handleadminpassword(); break; default: break; } } } else { usbfail = 1; if (!stat("/proc/bus/usb/devices", &statbuf)) usbfail = 0; if (newtWinChoice(TITLE, ctr[TR_NO], ctr[TR_YES], ctr[TR_RESTORE_LONG]) != 1) { if (!(handlerestore())) goto EXIT; } if (!(handlekeymap())) goto EXIT; if (!(handlehostname())) goto EXIT; if (!(handledefaults())) goto EXIT; if (!(handlenetworking())) goto EXIT; if (!performedrestore) { choice = 0; for (;;) { sections[0] = ctr[TR_WEB_PROXY]; sections[1] = ctr[TR_ISDN_CONFIGURATION]; sections[2] = ctr[TR_ADSL_CONFIGURATION]; sections[3] = ctr[TR_DHCP_SERVER_CONFIGURATION], sections[4] = NULL; rc = newtWinMenu(ctr[TR_SECTION_MENU], ctr[TR_SELECT_THE_ITEM], 50, 5, 5, 8, sections, &choice, ctr[TR_OK], ctr[TR_FINISHED], NULL); if (rc == 2) break; switch (choice) { case 0: handlewebproxy(); break; case 1: handleisdn(); break; case 2: handleadsl(); break; case 3: handledhcp(); break; default: break; } } } if (!(handleadminpassword())) goto EXIT; if (!(handlerootpassword())) goto EXIT; autook = 1; } EXIT: if (automode != 0) { if (autook) newtWinMessage(TITLE, ctr[TR_OK], ctr[TR_SETUP_FINISHED]); else newtWinMessage(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_SETUP_NOT_COMPLETE]); } else { if (rebootrequired) { if (newtWinChoice(TITLE, ctr[TR_YES], ctr[TR_NO], ctr[TR_DO_YOU_WANT_TO_REBOOT]) != 2) { doreboot = 1; } } } fprintf(flog, "Setup program ended.\n"); fflush(flog); fclose(flog); newtFinished(); if (doreboot) system("/sbin/shutdown -r now"); return 0; }
int ksReadCommands(char * cmdFile) { int fd; char * buf; struct stat sb; char * start, * end, * chptr; char oldch; int line = 0; gint argc = 0; gchar **argv = NULL; GError *optErr = NULL; int inSection = 0; /* in a section such as %post, %pre or %packages */ struct ksCommandNames * cmd; int commandsAlloced = 5; if ((fd = open(cmdFile, O_RDONLY)) < 0) { startNewt(); newtWinMessage(_("Kickstart Error"), _("OK"), _("Error opening kickstart file %s: %m"), cmdFile); return LOADER_ERROR; } fstat(fd, &sb); buf = alloca(sb.st_size + 1); if (read(fd, buf, sb.st_size) != sb.st_size) { startNewt(); newtWinMessage(_("Kickstart Error"), _("OK"), _("Error reading contents of kickstart file %s: %m"), cmdFile); close(fd); return LOADER_ERROR; } close(fd); buf[sb.st_size] = '\0'; commands = malloc(sizeof(*commands) * commandsAlloced); start = buf; while (*start && !inSection) { line++; if (!(end = strchr(start, '\n'))) end = start + strlen(start); oldch = *end; *end = '\0'; while (*start && isspace(*start)) start++; chptr = end - 1; while (chptr > start && isspace(*chptr)) chptr--; if (isspace(*chptr)) *chptr = '\0'; else *(chptr + 1) = '\0'; if (!*start || *start == '#' || !strncmp(start, "%include", 8)) { /* keep parsing the file */ } else if (*start == '%') { /* assumed - anything starting with %something is a section */ inSection = 1; #ifdef STACKI } else if (!*start || *start == '<') { /* do nothing */ /* this makes anaconda ignore our XML statements in the */ /* kickstart file */ ; #endif } else if (*chptr == '\\') { /* JKFIXME: this should be handled better, but at least we * won't segfault now */ } else { if (!g_shell_parse_argv(start, &argc, &argv, &optErr) && argc) { newtWinMessage(_("Kickstart Error"), _("OK"), _("Error in %s on line %d of kickstart " "file %s."), argv[0], line, cmdFile); g_error_free(optErr); } else if (!argc) { newtWinMessage(_("Kickstart Error"), _("OK"), _("Missing options on line %d of kickstart " "file %s."), line, cmdFile); } else { for (cmd = ksTable; cmd->name; cmd++) if (!strcmp(cmd->name, argv[0])) break; if (cmd->name) { if (numCommands == commandsAlloced) { commandsAlloced += 5; commands = realloc(commands, sizeof(*commands) * commandsAlloced); } commands[numCommands].code = cmd->code; commands[numCommands].argc = argc; commands[numCommands].argv = argv; numCommands++; } } } if (oldch) start = end + 1; else start = end; } return 0; }
int changedrivers(void) { struct keyvalue *kv = initkeyvalues(); char message[1000]; char temp[STRING_SIZE]; int configtype; int rc; int c; int needcards, sofarallocated, nictocheck, countofcards, toallocate; char *green = "GREEN"; char *orange = "ORANGE"; char *purple = "PURPLE"; char *red = "RED"; char *sections[6]; int choice; char nexteth[STRING_SIZE]; int abort; char currentdriver[STRING_SIZE], currentdriveroptions[STRING_SIZE]; char displaydriver[STRING_SIZE]; char cardinfo[STRING_SIZE]; char mac[STRING_SIZE]; int driverc = 0; if (!(readkeyvalues(kv, CONFIG_ROOT "ethernet/settings"))) { freekeyvalues(kv); errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]); return 0; } strcpy(temp, "0"); findkey(kv, "CONFIG_TYPE", temp); configtype = atol(temp); runcommandwithstatus("/etc/rc.d/rc.netaddress.down", ctr[TR_PUSHING_NETWORK_DOWN]); /* Blank them so the rc.netaddress.up dosnt get confused. */ replacekeyvalue(kv, "GREEN_DEV", ""); replacekeyvalue(kv, "ORANGE_DEV", ""); replacekeyvalue(kv, "PURPLE_DEV", ""); replacekeyvalue(kv, "RED_DEV", ""); if (configtype == 0) needcards = 1; else if (configtype == 1 || configtype == 2 || configtype == 4) needcards = 2; else if (configtype == 3 || configtype == 5 || configtype == 6) needcards = 3; else needcards = 4; /* This is the green card. */ sofarallocated = 0; nictocheck = 0; countofcards = countcards(); strcpy(displaydriver, ""); strcpy(currentdriver, ""); abort = 0; driverc = 0; /* Keep going till all cards are got, or they give up. */ while (sofarallocated < needcards && !abort) { /* This is how many cards were added by the last module. */ toallocate = countofcards - nictocheck; while (!abort && toallocate > 0 && nictocheck < countofcards && sofarallocated < needcards) { findnicdescription(displaydriver, temp); /* Get device name, eth%d is hard coded. */ sprintf(nexteth, "eth%d", nictocheck); /* Get MAC address. */ if (getnicmac(mac, STRING_SIZE, nexteth)) /* If MAC found put at the end of NIC description. */ snprintf(cardinfo, STRING_SIZE, "%s [%s]", temp, mac); else /* MAC lookup failed so just display NIC description. */ snprintf(cardinfo, STRING_SIZE, "%s", temp); sprintf(message, ctr[TR_UNCLAIMED_DRIVER], cardinfo); c = 0; choice = 0; strcpy(temp, ""); findkey(kv, "GREEN_DEV", temp); if (CONFIG_TYPE_GREEN(configtype) &&!strlen(temp)) sections[c++] = green; strcpy(temp, ""); findkey(kv, "ORANGE_DEV", temp); if (CONFIG_TYPE_ORANGE(configtype) && !strlen(temp)) sections[c++] = orange; strcpy(temp, ""); findkey(kv, "PURPLE_DEV", temp); if (CONFIG_TYPE_PURPLE(configtype) && !strlen(temp)) sections[c++] = purple; strcpy(temp, ""); findkey(kv, "RED_DEV", temp); if (CONFIG_TYPE_RED(configtype) && !strlen(temp)) sections[c++] = red; sections[c] = NULL; rc = newtWinMenu(ctr[TR_CARD_ASSIGNMENT], message, 50, 5, 5, 6, sections, &choice, ctr[TR_OK], ctr[TR_SKIP], ctr[TR_CANCEL], NULL); if (rc == 0 || rc == 1) { /* Now we see which iface needs its settings changed. */ if (strcmp(sections[choice], green) == 0) { replacekeyvalue(kv, "GREEN_DEV", nexteth); replacekeyvalue(kv, "GREEN_DRIVER", currentdriver); replacekeyvalue(kv, "GREEN_DRIVER_OPTIONS", currentdriveroptions); replacekeyvalue(kv, "GREEN_DISPLAYDRIVER", displaydriver); sofarallocated++; nictocheck++; toallocate--; strcpy(currentdriver, ""); strcpy(currentdriveroptions, ""); } if (strcmp(sections[choice], orange) == 0) { replacekeyvalue(kv, "ORANGE_DEV", nexteth); replacekeyvalue(kv, "ORANGE_DRIVER", currentdriver); replacekeyvalue(kv, "ORANGE_DRIVER_OPTIONS", currentdriveroptions); replacekeyvalue(kv, "ORANGE_DISPLAYDRIVER", displaydriver); sofarallocated++; nictocheck++; toallocate--; strcpy(currentdriver, ""); strcpy(currentdriveroptions, ""); } if (strcmp(sections[choice], purple) == 0) { replacekeyvalue(kv, "PURPLE_DEV", nexteth); replacekeyvalue(kv, "PURPLE_DRIVER", currentdriver); replacekeyvalue(kv, "PURPLE_DRIVER_OPTIONS", currentdriveroptions); replacekeyvalue(kv, "PURPLE_DISPLAYDRIVER", displaydriver); sofarallocated++; nictocheck++; toallocate--; strcpy(currentdriver, ""); strcpy(currentdriveroptions, ""); } if (strcmp(sections[choice], red) == 0) { replacekeyvalue(kv, "RED_DEV", nexteth); replacekeyvalue(kv, "RED_DRIVER", currentdriver); replacekeyvalue(kv, "RED_DRIVER_OPTIONS", currentdriveroptions); replacekeyvalue(kv, "RED_DISPLAYDRIVER", displaydriver); sofarallocated++; nictocheck++; toallocate--; strcpy(currentdriver, ""); strcpy(currentdriveroptions, ""); } } else if (rc == 2) { nictocheck++; } else if (rc == 3) { // Cancelled? Then abort abort = 1; } // Reached the end of the cards? Abort if (nictocheck >= countofcards) abort=1; // Run out of cards to allocate? Abort if (toallocate == 0) abort=1; // Got enough cards? Break and finish if (sofarallocated == needcards) break; } } if (sofarallocated >= needcards) { newtWinMessage(ctr[TR_CARD_ASSIGNMENT], ctr[TR_OK], ctr[TR_ALL_CARDS_SUCCESSFULLY_ALLOCATED]); } else errorbox(ctr[TR_NOT_ENOUGH_CARDS_WERE_ALLOCATED]); writekeyvalues(kv, CONFIG_ROOT "ethernet/settings"); freekeyvalues(kv); netaddresschange = 1; return 1; }