Branch data Line data Source code
1 : : /* 2 : : * libdpkg - Debian packaging suite library routines 3 : : * db-ctrl-access.c - package control information database 4 : : * 5 : : * Copyright © 1995 Ian Jackson <ijackson@chiark.greenend.org.uk> 6 : : * Copyright © 2011-2014 Guillem Jover <guillem@debian.org> 7 : : * 8 : : * This is free software; you can redistribute it and/or modify 9 : : * it under the terms of the GNU General Public License as published by 10 : : * the Free Software Foundation; either version 2 of the License, or 11 : : * (at your option) any later version. 12 : : * 13 : : * This is distributed in the hope that it will be useful, 14 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 : : * GNU General Public License for more details. 17 : : * 18 : : * You should have received a copy of the GNU General Public License 19 : : * along with this program. If not, see <https://www.gnu.org/licenses/>. 20 : : */ 21 : : 22 : : #include <config.h> 23 : : #include <compat.h> 24 : : 25 : : #include <sys/types.h> 26 : : #include <sys/stat.h> 27 : : 28 : : #include <errno.h> 29 : : #include <dirent.h> 30 : : #include <unistd.h> 31 : : 32 : : #include <dpkg/i18n.h> 33 : : #include <dpkg/dpkg.h> 34 : : #include <dpkg/dpkg-db.h> 35 : : #include <dpkg/fsys.h> 36 : : #include <dpkg/db-ctrl.h> 37 : : #include <dpkg/debug.h> 38 : : 39 : : bool 40 : 0 : pkg_infodb_has_file(struct pkginfo *pkg, struct pkgbin *pkgbin, 41 : : const char *name) 42 : : { 43 : : const char *filename; 44 : : struct stat stab; 45 : : 46 : 0 : filename = pkg_infodb_get_file(pkg, pkgbin, name); 47 [ # # ]: 0 : if (lstat(filename, &stab) == 0) 48 : 0 : return true; 49 [ # # ]: 0 : else if (errno == ENOENT) 50 : 0 : return false; 51 : : else 52 : 0 : ohshite(_("unable to check existence of '%.250s'"), filename); 53 : : } 54 : : 55 : : void 56 : 0 : pkg_infodb_foreach(struct pkginfo *pkg, struct pkgbin *pkgbin, 57 : : pkg_infodb_file_func *func) 58 : : { 59 : : DIR *db_dir; 60 : : struct dirent *db_de; 61 : : struct varbuf_state db_path_state; 62 : 0 : struct varbuf db_path = VARBUF_INIT; 63 : : const char *pkgname; 64 : : enum pkg_infodb_format db_format; 65 : : 66 : : /* Make sure to always read and verify the format version. */ 67 : 0 : db_format = pkg_infodb_get_format(); 68 : : 69 [ # # # # ]: 0 : if (pkgbin->multiarch == PKG_MULTIARCH_SAME && 70 : : db_format == PKG_INFODB_FORMAT_MULTIARCH) 71 : 0 : pkgname = pkgbin_name(pkg, pkgbin, pnaw_always); 72 : : else 73 : 0 : pkgname = pkgbin_name(pkg, pkgbin, pnaw_never); 74 : : 75 : 0 : varbuf_add_dir(&db_path, pkg_infodb_get_dir()); 76 : 0 : varbuf_end_str(&db_path); 77 : 0 : varbuf_snapshot(&db_path, &db_path_state); 78 : : 79 : 0 : db_dir = opendir(db_path.buf); 80 [ # # ]: 0 : if (!db_dir) 81 : 0 : ohshite(_("cannot read info directory")); 82 : : 83 : 0 : push_cleanup(cu_closedir, ~0, 1, (void *)db_dir); 84 [ # # ]: 0 : while ((db_de = readdir(db_dir)) != NULL) { 85 : : const char *filename, *filetype, *dot; 86 : : 87 : 0 : debug(dbg_veryverbose, "infodb foreach info file '%s'", 88 : 0 : db_de->d_name); 89 : : 90 : : /* Ignore dotfiles, including ‘.’ and ‘..’. */ 91 [ # # ]: 0 : if (db_de->d_name[0] == '.') 92 : 0 : continue; 93 : : 94 : : /* Ignore anything odd. */ 95 : 0 : dot = strrchr(db_de->d_name, '.'); 96 [ # # ]: 0 : if (dot == NULL) 97 : 0 : continue; 98 : : 99 : : /* Ignore files from other packages. */ 100 [ # # ]: 0 : if (strlen(pkgname) != (size_t)(dot - db_de->d_name) || 101 [ # # ]: 0 : strncmp(db_de->d_name, pkgname, dot - db_de->d_name)) 102 : 0 : continue; 103 : : 104 : 0 : debug(dbg_stupidlyverbose, "infodb foreach file this pkg"); 105 : : 106 : : /* Skip past the full stop. */ 107 : 0 : filetype = dot + 1; 108 : : 109 : 0 : varbuf_rollback(&db_path_state); 110 : 0 : varbuf_add_str(&db_path, db_de->d_name); 111 : 0 : varbuf_end_str(&db_path); 112 : 0 : filename = db_path.buf; 113 : : 114 : 0 : func(filename, filetype); 115 : : } 116 : 0 : pop_cleanup(ehflag_normaltidy); /* closedir */ 117 : : 118 : 0 : varbuf_destroy(&db_path); 119 : 0 : }