static int fts_cmp(const FTSENT **p, const FTSENT **q) { int ret; unsigned short info_p, info_q; info_p = (*p)->fts_info; info_q = (*q)->fts_info; /* error file comes first */ if (info_p == FTS_ERR) return -1; else if (info_q == FTS_ERR) return 1; else if (info_p == FTS_NS || info_q == FTS_NS) { if (info_q != FTS_NS) return -1; else if (info_p != FTS_NS) return 1; ret = cmp_lexico(*p, *q); /* reverse the order if -r specified */ if (!f_reverse) return ret; else return -ret; } /* sort by different options */ if (f_sortmtime) ret = cmp_time(*p, *q); else if (f_sortsize) ret = cmp_size(*p, *q); else ret = cmp_lexico(*p, *q); if (!f_reverse) return ret; else return -ret; }
const_iterator largest_range() const { return std::max_element( begin(), end(), cmp_size() ); }
/* check filesystem against extra mtree data if available, * NOT guaranteed to catch db/filesystem discrepencies */ static int check_file_properties(alpm_pkg_t *pkg) { char path[PATH_MAX], *rel; int ret = 0; size_t space; struct archive *mtree = alpm_pkg_mtree_open(pkg); struct archive_entry *entry; if(!mtree) { pu_ui_warn("%s: mtree data not available (%s)", alpm_pkg_get_name(pkg), strerror(errno)); return require_mtree; } strncpy(path, alpm_option_get_root(handle), PATH_MAX); rel = path + strlen(path); space = PATH_MAX - (rel - path); while(alpm_pkg_mtree_next(pkg, mtree, &entry) == ARCHIVE_OK) { const char *ppath = archive_entry_pathname(entry); const char *fpath; struct stat buf; if(strncmp("./", ppath, 2) == 0) { ppath += 2; } if(strcmp(ppath, ".INSTALL") == 0) { if((fpath = get_db_path(pkg, "install")) == NULL) { continue; } } else if(strcmp(ppath, ".CHANGELOG") == 0) { if((fpath = get_db_path(pkg, "changelog")) == NULL) { continue; } } else if(ppath[0] == '.') { continue; } else if(skip_noextract && match_noextract(handle, ppath)) { continue; } else { strncpy(rel, ppath, space); fpath = path; } if(lstat(fpath, &buf) != 0) { if(errno == ENOENT) { eprintf("%s: '%s' missing file\n", alpm_pkg_get_name(pkg), fpath); } else { pu_ui_warn("%s: '%s' read error (%s)", alpm_pkg_get_name(pkg), fpath, strerror(errno)); } ret = 1; continue; } if(cmp_type(pkg, fpath, entry, &buf) != 0) { ret = 1; } if(skip_noupgrade && match_noupgrade(handle, ppath)) { continue; } if(cmp_mode(pkg, fpath, entry, &buf) != 0) { ret = 1; } if(cmp_uid(pkg, fpath, entry, &buf) != 0) { ret = 1; } if(cmp_gid(pkg, fpath, entry, &buf) != 0) { ret = 1; } if(skip_backups && match_backup(pkg, ppath)) { continue; } if(S_ISLNK(buf.st_mode) && S_ISLNK(archive_entry_mode(entry))) { if(cmp_target(pkg, fpath, entry) != 0) { ret = 1; } } if(!S_ISDIR(buf.st_mode)) { if(cmp_mtime(pkg, fpath, entry, &buf) != 0) { ret = 1; } if(!S_ISLNK(buf.st_mode)) { /* always fails for directories and symlinks */ if(cmp_size(pkg, fpath, entry, &buf) != 0) { ret = 1; } } } } alpm_pkg_mtree_close(pkg, mtree); if(!quiet && !ret) { eprintf("%s: all files match mtree\n", alpm_pkg_get_name(pkg)); } return ret; }