void MojoLog_initLogging(void) { const char *level = cmdlinestr("loglevel","MOJOSETUP_LOGLEVEL", DEFLOGLEV); const char *fname = cmdlinestr("log", "MOJOSETUP_LOG", NULL); if (strcmp(level, "nothing") == 0) MojoLog_logLevel = MOJOSETUP_LOG_NOTHING; else if (strcmp(level, "errors") == 0) MojoLog_logLevel = MOJOSETUP_LOG_ERRORS; else if (strcmp(level, "warnings") == 0) MojoLog_logLevel = MOJOSETUP_LOG_WARNINGS; else if (strcmp(level, "info") == 0) MojoLog_logLevel = MOJOSETUP_LOG_INFO; else if (strcmp(level, "debug") == 0) MojoLog_logLevel = MOJOSETUP_LOG_DEBUG; else // Unknown string gets everything...that'll teach you. MojoLog_logLevel = MOJOSETUP_LOG_EVERYTHING; if ((fname != NULL) && (strcmp(fname, "-") == 0)) logFile = MojoPlatform_stdout(); else if (fname != NULL) { const uint32 flags = MOJOFILE_WRITE|MOJOFILE_CREATE|MOJOFILE_TRUNCATE; const uint16 mode = MojoPlatform_defaultFilePerms(); logFile = MojoPlatform_open(fname, flags, mode); } // if } // MojoLog_initLogging
static boolean trySpawnTerminalGui(void) { if (cmdlinestr("notermspawn", "MOJOSETUP_NOTERMSPAWN", NULL) != NULL) return false; // we already spawned or the user is preventing it. if (MojoPlatform_istty()) // maybe we can spawn a terminal for stdio? return false; // We're a terminal already, no need to spawn one. logInfo("No usable GUI found. Trying to spawn a terminal..."); if (!MojoPlatform_spawnTerminal()) { logError("...Terminal spawning failed."); return false; } // if assert(MojoPlatform_istty()); return (MojoGui_initGuiPlugin() != NULL); } // trySpawnTerminalGui
static void trySwitchBinaries(void) { if (cmdlinestr("nobinswitch", "MOJOSETUP_NOBINSWITCH", NULL) != NULL) return; // we are already switched or the user is preventing it. setenv("MOJOSETUP_NOBINSWITCH", "1", 1); setenv("MOJOSETUP_BASE", GBaseArchivePath, 1); if (GBaseArchive->enumerate(GBaseArchive)) { const MojoArchiveEntry *entinfo; while ((entinfo = GBaseArchive->enumNext(GBaseArchive)) != NULL) { if (entinfo->type != MOJOARCHIVE_ENTRY_FILE) continue; if (strncmp(entinfo->filename, "arch/", 5) != 0) continue; trySwitchBinary(GBaseArchive); } // while } // if } // trySwitchBinaries
MojoArchive *MojoArchive_initBaseArchive(void) { char *basepath = NULL; const char *cmd = NULL; MojoInput *io = NULL; if (GBaseArchive != NULL) return GBaseArchive; // already initialized. if ((cmd = cmdlinestr("base", "MOJOSETUP_BASE", NULL)) != NULL) { char *real = MojoPlatform_realpath(cmd); if (real != NULL) { if (MojoPlatform_isdir(real)) GBaseArchive = MojoArchive_newFromDirectory(real); else { io = MojoInput_newFromFile(real); if (io != NULL) GBaseArchive = MojoArchive_newFromInput(io, real); } // else if (GBaseArchive != NULL) basepath = real; else free(real); } // if } // else if else { basepath = MojoPlatform_appBinaryPath(); if (basepath != NULL) { io = MojoInput_newFromFile(basepath); if (io != NULL) { // See if there's a MOJOBASE signature at the end of the // file. This means we appended an archive to the executable, // for a self-extracting installer. This method works with // any archive type, even if it wasn't specifically designed // to be appended. uint8 buf[8]; uint64 size = 0; const int64 flen = io->length(io) - 16; if ( (flen > 0) && (io->seek(io, flen)) && (io->read(io, buf, 8) == 8) && (memcmp(buf, "MOJOBASE", 8) == 0) && (MojoInput_readui64(io, &size)) && (size < flen) ) { MojoInput *newio; newio = MojoInput_newFromSubset(io, flen - size, flen); if (newio != NULL) io = newio; } // if GBaseArchive = MojoArchive_newFromInput(io, basepath); } // if if (GBaseArchive == NULL) { // Just use the same directory as the binary instead. char *ptr = strrchr(basepath, '/'); if (ptr != NULL) *ptr = '\0'; else { free(basepath); // oh well, try cwd. basepath = MojoPlatform_currentWorkingDir(); } // else GBaseArchive = MojoArchive_newFromDirectory(basepath); // !!! FIXME: failing this, maybe default.mojosetup? } // if } // if } // else if (GBaseArchive == NULL) { free(basepath); basepath = NULL; } // if GBaseArchivePath = basepath; return GBaseArchive; } // MojoArchive_initBaseArchive