int main(void) { char cwd[1024], *path, *path2, *ctx = tal_strdup(NULL, "ctx"); plan_tests(15); if (!getcwd(cwd, sizeof(cwd))) abort(); unlink("run-canon-link"); rmdir("run-canon-foo"); if (mkdir("run-canon-foo", 0700) != 0) abort(); if (symlink("run-canon-foo", "run-canon-link") != 0) abort(); path = path_canon(ctx, "run-canon-foo"); ok1(tal_parent(path) == ctx); ok1(strends(path, "run-canon-foo")); ok1(strstarts(path, cwd)); ok1(path[strlen(cwd)] == PATH_SEP); ok1(strlen(path) == strlen(cwd) + 1 + strlen("run-canon-foo")); tal_free(path); ok1(!path_canon(ctx, take(NULL))); ok1(tal_first(ctx) == NULL); /* Test take doesn't leak. */ ok1(tal_first(ctx) == NULL); path = path_canon(ctx, take(tal_strdup(ctx, "run-canon-foo"))); ok1(strends(path, "run-canon-foo")); ok1(strstarts(path, cwd)); ok1(path[strlen(cwd)] == PATH_SEP); ok1(strlen(path) == strlen(cwd) + 1 + strlen("run-canon-foo")); ok1(tal_first(ctx) == path && tal_next(path) == NULL); path2 = path_canon(ctx, "run-canon-link"); ok1(streq(path2, path)); unlink("run-canon-link"); if (symlink(".", "run-canon-link") != 0) abort(); path = path_canon(ctx, "run-canon-link"); ok1(streq(path, cwd)); tal_free(ctx); return exit_status(); }
void mdb_set_ipath(const char *path) { if (mdb.m_ipath != NULL) mdb_path_free(mdb.m_ipath, mdb.m_ipathlen); path = path_canon(mdb.m_ipathstr, path); mdb.m_ipath = mdb_path_alloc(path, &mdb.m_ipathlen); }
void mdb_set_lpath(const char *path) { if (mdb.m_lpath != NULL) mdb_path_free(mdb.m_lpath, mdb.m_lpathlen); path = path_canon(mdb.m_lpathstr, path); mdb.m_lpath = mdb_path_alloc(path, &mdb.m_lpathlen); #ifdef _KMDB kmdb_module_path_set(mdb.m_lpath, mdb.m_lpathlen); #endif }
tal_free(files); } struct manifest *get_manifest(const void *ctx, const char *dir) { struct manifest *m; char *canon_dir; unsigned int len; struct list_head *list; if (!manifests) { manifests = tal(NULL, struct htable_manifest); htable_manifest_init(manifests); } canon_dir = path_canon(ctx, dir); if (!canon_dir) err(1, "Getting canonical version of directory %s", dir); m = htable_manifest_get(manifests, canon_dir); if (m) return m; m = tal_linkable(tal(NULL, struct manifest)); m->info_file = NULL; m->compiled[COMPILE_NORMAL] = m->compiled[COMPILE_NOFEAT] = NULL; m->dir = tal_steal(m, canon_dir); list_head_init(&m->c_files); list_head_init(&m->h_files); list_head_init(&m->api_tests); list_head_init(&m->run_tests);
void rwSettings(bool writing) { LOGDEB1(("rwSettings: write %d\n", int(writing))); if (writing && !havereadsettings) return; QSettings settings("Recoll.org", "recoll"); SETTING_RW(prefs.mainwidth, "/Recoll/geometry/width", Int, 0); SETTING_RW(prefs.mainheight, "/Recoll/geometry/height", Int, 0); SETTING_RW(prefs.pvwidth, "/Recoll/geometry/pvwidth", Int, 0); SETTING_RW(prefs.pvheight, "/Recoll/geometry/pvheight", Int, 0); SETTING_RW(prefs.toolArea, "/Recoll/geometry/toolArea", Int, 0); SETTING_RW(prefs.resArea, "/Recoll/geometry/resArea", Int, 0); SETTING_RW(prefs.ssearchTyp, "/Recoll/prefs/simpleSearchTyp", Int, 3); SETTING_RW(prefs.startWithAdvSearchOpen, "/Recoll/prefs/startWithAdvSearchOpen", Bool, false); SETTING_RW(prefs.previewHtml, "/Recoll/prefs/previewHtml", Bool, true); QString advSearchClauses; QString ascdflt; if (writing) { for (vector<int>::iterator it = prefs.advSearchClauses.begin(); it != prefs.advSearchClauses.end(); it++) { char buf[20]; sprintf(buf, "%d ", *it); advSearchClauses += QString::fromUtf8(buf); } } SETTING_RW(advSearchClauses, "/Recoll/prefs/adv/clauseList", String, ascdflt); if (!writing) { list<string> clauses; stringToStrings((const char *)advSearchClauses.toUtf8(), clauses); for (list<string>::iterator it = clauses.begin(); it != clauses.end(); it++) { prefs.advSearchClauses.push_back(atoi(it->c_str())); } } SETTING_RW(prefs.ssearchOnWS, "/Recoll/prefs/reslist/autoSearchOnWS", Bool, false); SETTING_RW(prefs.ssearchNoComplete, "/Recoll/prefs/ssearch/noComplete", Bool, false); SETTING_RW(prefs.ssearchAsYouType, "/Recoll/prefs/ssearch/asYouType", Bool, false); SETTING_RW(prefs.filterCtlStyle, "/Recoll/prefs/filterCtlStyle", Int, 0); SETTING_RW(prefs.ssearchAutoPhrase, "/Recoll/prefs/ssearchAutoPhrase", Bool, true); SETTING_RW(prefs.ssearchAutoPhraseThreshPC, "/Recoll/prefs/ssearchAutoPhraseThreshPC", Double, 2.0); SETTING_RW(prefs.respagesize, "/Recoll/prefs/reslist/pagelen", Int, 8); SETTING_RW(prefs.collapseDuplicates, "/Recoll/prefs/reslist/collapseDuplicates", Bool, false); SETTING_RW(prefs.showResultsAsTable, "/Recoll/prefs/showResultsAsTable", Bool, false); SETTING_RW(prefs.maxhltextmbs, "/Recoll/prefs/preview/maxhltextmbs", Int, 3); SETTING_RW(prefs.previewPlainPre, "/Recoll/prefs/preview/plainPre", Int, PrefsPack::PP_PREWRAP); SETTING_RW(prefs.qtermcolor, "/Recoll/prefs/qtermcolor", String, "blue"); if (!writing && prefs.qtermcolor == "") prefs.qtermcolor = "blue"; // Abstract snippet separator SETTING_RW(prefs.abssep, "/Recoll/prefs/reslist/abssep", String,"…"); if (!writing && prefs.abssep == "") prefs.abssep = "…"; SETTING_RW(prefs.reslistdateformat, "/Recoll/prefs/reslist/dateformat", String," %Y-%m-%d %H:%M:%S %z"); if (!writing && prefs.reslistdateformat == "") prefs.reslistdateformat = " %Y-%m-%d %H:%M:%S %z"; prefs.creslistdateformat = (const char*)prefs.reslistdateformat.toUtf8(); SETTING_RW(prefs.reslistfontfamily, "/Recoll/prefs/reslist/fontFamily", String, ""); SETTING_RW(prefs.reslistfontsize, "/Recoll/prefs/reslist/fontSize", Int, 10); QString rlfDflt = QString::fromUtf8(prefs.dfltResListFormat); if (writing) { if (prefs.reslistformat.compare(rlfDflt)) { settings.setValue("/Recoll/prefs/reslist/format", prefs.reslistformat); } else { settings.remove("/Recoll/prefs/reslist/format"); } } else { prefs.reslistformat = settings.value("/Recoll/prefs/reslist/format", rlfDflt).toString(); prefs.creslistformat = qs2utf8s(prefs.reslistformat); } SETTING_RW(prefs.reslistheadertext, "/Recoll/prefs/reslist/headertext", String, ""); SETTING_RW(prefs.qssFile, "/Recoll/prefs/stylesheet", String, ""); SETTING_RW(prefs.snipCssFile, "/Recoll/prefs/snippets/cssfile", String, ""); SETTING_RW(prefs.queryStemLang, "/Recoll/prefs/query/stemLang", String, "english"); SETTING_RW(prefs.useDesktopOpen, "/Recoll/prefs/useDesktopOpen", Bool, true); SETTING_RW(prefs.keepSort, "/Recoll/prefs/keepSort", Bool, false); SETTING_RW(prefs.sortField, "/Recoll/prefs/sortField", String, ""); SETTING_RW(prefs.sortActive, "/Recoll/prefs/sortActive", Bool, false); SETTING_RW(prefs.sortDesc, "/Recoll/prefs/query/sortDesc", Bool, 0); if (!writing) { // Handle transition from older prefs which did not store sortColumn // (Active always meant sort by date). if (prefs.sortActive && prefs.sortField.isNull()) prefs.sortField = "mtime"; } SETTING_RW(prefs.queryBuildAbstract, "/Recoll/prefs/query/buildAbstract", Bool, true); SETTING_RW(prefs.queryReplaceAbstract, "/Recoll/prefs/query/replaceAbstract", Bool, false); SETTING_RW(prefs.syntAbsLen, "/Recoll/prefs/query/syntAbsLen", Int, 250); SETTING_RW(prefs.syntAbsCtx, "/Recoll/prefs/query/syntAbsCtx", Int, 4); SETTING_RW(prefs.autoSuffs, "/Recoll/prefs/query/autoSuffs", String, ""); SETTING_RW(prefs.autoSuffsEnable, "/Recoll/prefs/query/autoSuffsEnable", Bool, false); SETTING_RW(prefs.termMatchType, "/Recoll/prefs/query/termMatchType", Int, 0); // This is not really the current program version, just a value to // be used in case we have incompatible changes one day SETTING_RW(prefs.rclVersion, "/Recoll/prefs/rclVersion", Int, 1009); // Ssearch combobox history list if (writing) { settings.setValue("/Recoll/prefs/query/ssearchHistory", prefs.ssearchHistory); } else { prefs.ssearchHistory = settings.value("/Recoll/prefs/query/ssearchHistory").toStringList(); } // Ignored file types (advanced search) if (writing) { settings.setValue("/Recoll/prefs/query/asearchIgnFilTyps", prefs.asearchIgnFilTyps); } else { prefs.asearchIgnFilTyps = settings.value("/Recoll/prefs/query/asearchIgnFilTyps").toStringList(); } // Field list for the restable if (writing) { settings.setValue("/Recoll/prefs/query/restableFields", prefs.restableFields); } else { prefs.restableFields = settings.value("/Recoll/prefs/query/restableFields").toStringList(); if (prefs.restableFields.empty()) { prefs.restableFields.push_back("date"); prefs.restableFields.push_back("title"); prefs.restableFields.push_back("filename"); prefs.restableFields.push_back("author"); prefs.restableFields.push_back("url"); } } // restable col widths QString rtcw; if (writing) { for (vector<int>::iterator it = prefs.restableColWidths.begin(); it != prefs.restableColWidths.end(); it++) { char buf[20]; sprintf(buf, "%d ", *it); rtcw += QString::fromUtf8(buf); } } SETTING_RW(rtcw, "/Recoll/prefs/query/restableWidths", String, "83 253 132 172 130 "); if (!writing) { vector<string> widths; stringToStrings((const char *)rtcw.toUtf8(), widths); for (vector<string>::iterator it = widths.begin(); it != widths.end(); it++) { prefs.restableColWidths.push_back(atoi(it->c_str())); } } SETTING_RW(prefs.fileTypesByCats, "/Recoll/prefs/query/asearchFilTypByCat", Bool, false); SETTING_RW(prefs.showTrayIcon, "/Recoll/prefs/showTrayIcon", Bool, false); SETTING_RW(prefs.closeToTray, "/Recoll/prefs/closeToTray", Bool, false); if (g_dynconf == 0) { // Happens return; } // The extra databases settings. These are stored as a list of // xapian directory names, encoded in base64 to avoid any // binary/charset conversion issues. There are 2 lists for all // known dbs and active (searched) ones. // When starting up, we also add from the RECOLL_EXTRA_DBS environment // variable. // This are stored inside the dynamic configuration file (aka: history), // as they are likely to depend on RECOLL_CONFDIR. if (writing) { g_dynconf->eraseAll(allEdbsSk); for (list<string>::const_iterator it = prefs.allExtraDbs.begin(); it != prefs.allExtraDbs.end(); it++) { g_dynconf->enterString(allEdbsSk, *it); } g_dynconf->eraseAll(actEdbsSk); for (list<string>::const_iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end(); it++) { g_dynconf->enterString(actEdbsSk, *it); } } else { prefs.allExtraDbs = g_dynconf->getStringList(allEdbsSk); const char *cp; if ((cp = getenv("RECOLL_EXTRA_DBS")) != 0) { vector<string> dbl; stringToTokens(cp, dbl, ":"); for (vector<string>::iterator dit = dbl.begin(); dit != dbl.end(); dit++) { string dbdir = path_canon(*dit); path_catslash(dbdir); if (std::find(prefs.allExtraDbs.begin(), prefs.allExtraDbs.end(), dbdir) != prefs.allExtraDbs.end()) continue; bool stripped; if (!Rcl::Db::testDbDir(dbdir, &stripped)) { LOGERR(("Not a xapian index: [%s]\n", dbdir.c_str())); continue; } if (stripped != o_index_stripchars) { LOGERR(("Incompatible character stripping: [%s]\n", dbdir.c_str())); continue; } prefs.allExtraDbs.push_back(dbdir); } } // Get the remembered "active external indexes": prefs.activeExtraDbs = g_dynconf->getStringList(actEdbsSk); // Clean up the list: remove directories which are not // actually there: useful for removable volumes. for (list<string>::iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end();) { bool stripped; if (!Rcl::Db::testDbDir(*it, &stripped) || stripped != o_index_stripchars) { LOGINFO(("Not a Xapian index or char stripping differs: [%s]\n", it->c_str())); it = prefs.activeExtraDbs.erase(it); } else { it++; } } // Get active db directives from the environment. This can only add to // the remembered and cleaned up list const char *cp4Act; if ((cp4Act = getenv("RECOLL_ACTIVE_EXTRA_DBS")) != 0) { vector<string> dbl; stringToTokens(cp4Act, dbl, ":"); for (vector<string>::iterator dit = dbl.begin(); dit != dbl.end(); dit++) { string dbdir = path_canon(*dit); path_catslash(dbdir); if (std::find(prefs.activeExtraDbs.begin(), prefs.activeExtraDbs.end(), dbdir) != prefs.activeExtraDbs.end()) continue; bool strpd; if (!Rcl::Db::testDbDir(dbdir, &strpd) || strpd != o_index_stripchars) { LOGERR(("Not a Xapian dir or diff. char stripping: [%s]\n", dbdir.c_str())); continue; } prefs.activeExtraDbs.push_back(dbdir); } //for } //if } #if 0 { list<string>::const_iterator it; fprintf(stderr, "All extra Dbs:\n"); for (it = prefs.allExtraDbs.begin(); it != prefs.allExtraDbs.end(); it++) { fprintf(stderr, " [%s]\n", it->c_str()); } fprintf(stderr, "Active extra Dbs:\n"); for (it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end(); it++) { fprintf(stderr, " [%s]\n", it->c_str()); } } #endif const string asbdSk = "asearchSbd"; if (writing) { while (prefs.asearchSubdirHist.size() > 20) prefs.asearchSubdirHist.pop_back(); g_dynconf->eraseAll(asbdSk); for (QStringList::iterator it = prefs.asearchSubdirHist.begin(); it != prefs.asearchSubdirHist.end(); it++) { g_dynconf->enterString(asbdSk, (const char *)((*it).toUtf8())); } } else { list<string> tl = g_dynconf->getStringList(asbdSk); for (list<string>::iterator it = tl.begin(); it != tl.end(); it++) prefs.asearchSubdirHist.push_front(QString::fromUtf8(it->c_str())); } if (!writing) havereadsettings = true; }