void getselections(const char *const *argv) { struct pkg_array array; struct pkginfo *pkg; const char *thisarg; int i, found; modstatdb_init(admindir,msdbrw_readonly); pkg_array_init_from_db(&array); pkg_array_sort(&array, pkg_sorter_by_name); if (!*argv) { for (i = 0; i < array.n_pkgs; i++) { pkg = array.pkgs[i]; if (pkg->status == stat_notinstalled) continue; getsel1package(pkg); } } else { while ((thisarg= *argv++)) { found= 0; for (i = 0; i < array.n_pkgs; i++) { pkg = array.pkgs[i]; if (fnmatch(thisarg,pkg->name,0)) continue; getsel1package(pkg); found++; } if (!found) fprintf(stderr,_("No packages found matching %s.\n"),thisarg); } } m_output(stdout, _("<standard output>")); m_output(stderr, _("<standard error>")); pkg_array_destroy(&array); }
/** * @brief Initialize dpkg and load packages into memory */ void dpkg_setup(struct pkg_array *packages) { dpkg_set_progname("osquery"); push_error_context(); dpkg_db_set_dir("/var/lib/dpkg/"); modstatdb_init(); modstatdb_open(msdbrw_readonly); pkg_array_init_from_db(packages); pkg_array_sort(packages, pkg_sorter); }
static void pkg_files_optimize_load(struct pkg_array *array) { struct statfs fs; int i; /* Get the filesystem block size. */ if (statfs(pkg_infodb_get_dir(), &fs) < 0) return; /* Sort packages by the physical location of their list files, so that * scanning them later will minimize disk drive head movements. */ for (i = 0; i < array->n_pkgs; i++) { struct pkginfo *pkg = array->pkgs[i]; struct { struct fiemap fiemap; struct fiemap_extent extent; } fm; const char *listfile; int fd; ensure_package_clientdata(pkg); if (pkg->status == stat_notinstalled || pkg->clientdata->listfile_phys_offs != 0) continue; pkg->clientdata->listfile_phys_offs = -1; listfile = pkg_infodb_get_file(pkg, &pkg->installed, LISTFILE); fd = open(listfile, O_RDONLY); if (fd < 0) continue; memset(&fm, 0, sizeof(fm)); fm.fiemap.fm_start = 0; fm.fiemap.fm_length = fs.f_bsize; fm.fiemap.fm_flags = 0; fm.fiemap.fm_extent_count = 1; if (ioctl(fd, FS_IOC_FIEMAP, (unsigned long)&fm) == 0) pkg->clientdata->listfile_phys_offs = fm.fiemap.fm_extents[0].fe_physical; close(fd); } pkg_array_sort(array, pkg_sorter_by_listfile_phys_offs); }
int audit(const char *const *argv) { const struct audit_problem *problem; struct pkg_array array; bool head_running = false; int i; modstatdb_open(msdbrw_readonly); if (!*argv) pkg_array_init_from_db(&array); else pkg_array_init_from_names(&array, pkg_array_mapper, (const char **)argv); pkg_array_sort(&array, pkg_sorter_by_nonambig_name_arch); for (problem = audit_problems; problem->check; problem++) { bool head = false; for (i = 0; i < array.n_pkgs; i++) { struct pkginfo *pkg = array.pkgs[i]; if (!problem->check(pkg, problem)) continue; if (!head_running) { if (modstatdb_is_locked()) puts(_( "Another process has locked the database for writing, and might currently be\n" "modifying it, some of the following problems might just be due to that.\n")); head_running = true; } if (!head) { fputs(gettext(problem->explanation), stdout); head = true; } describebriefly(pkg); } if (head) putchar('\n'); } pkg_array_destroy(&array); m_output(stdout, _("<standard output>")); return 0; }
int getselections(const char *const *argv) { struct pkg_array array; struct pkginfo *pkg; const char *thisarg; int i, found; modstatdb_open(msdbrw_readonly); pkg_array_init_from_db(&array); pkg_array_sort(&array, pkg_sorter_by_nonambig_name_arch); if (!*argv) { for (i = 0; i < array.n_pkgs; i++) { pkg = array.pkgs[i]; if (pkg->status == PKG_STAT_NOTINSTALLED) continue; getsel1package(pkg); } } else { while ((thisarg= *argv++)) { struct pkg_spec pkgspec; found= 0; pkg_spec_init(&pkgspec, PKG_SPEC_PATTERNS | PKG_SPEC_ARCH_WILDCARD); pkg_spec_parse(&pkgspec, thisarg); for (i = 0; i < array.n_pkgs; i++) { pkg = array.pkgs[i]; if (!pkg_spec_match_pkg(&pkgspec, pkg, &pkg->installed)) continue; getsel1package(pkg); found++; } if (!found) notice(_("no packages found matching %s"), thisarg); pkg_spec_destroy(&pkgspec); } } m_output(stdout, _("<standard output>")); m_output(stderr, _("<standard error>")); pkg_array_destroy(&array); return 0; }