2 * dpkg - main program for package management
3 * infodb.c - package control information database
5 * Copyright © 1995 Ian Jackson <ijackson@chiark.greenend.org.uk>
6 * Copyright © 2011-2014 Guillem Jover <guillem@debian.org>
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.
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.
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/>.
25 #include <sys/types.h>
32 #include <dpkg/i18n.h>
33 #include <dpkg/dpkg.h>
34 #include <dpkg/dpkg-db.h>
35 #include <dpkg/debug.h>
41 pkg_infodb_has_file(struct pkginfo *pkg, struct pkgbin *pkgbin,
47 filename = pkg_infodb_get_file(pkg, pkgbin, name);
48 if (lstat(filename, &stab) == 0)
50 else if (errno == ENOENT)
53 ohshite(_("unable to check existence of '%.250s'"), filename);
57 pkg_infodb_foreach(struct pkginfo *pkg, struct pkgbin *pkgbin,
58 pkg_infodb_file_func *func)
62 struct varbuf_state db_path_state;
63 struct varbuf db_path = VARBUF_INIT;
65 enum pkg_infodb_format db_format;
67 /* Make sure to always read and verify the format version. */
68 db_format = pkg_infodb_get_format();
70 if (pkgbin->multiarch == PKG_MULTIARCH_SAME &&
71 db_format == PKG_INFODB_FORMAT_MULTIARCH)
72 pkgname = pkgbin_name(pkg, pkgbin, pnaw_always);
74 pkgname = pkgbin_name(pkg, pkgbin, pnaw_never);
76 varbuf_add_str(&db_path, pkg_infodb_get_dir());
77 varbuf_add_char(&db_path, '/');
78 varbuf_end_str(&db_path);
79 varbuf_snapshot(&db_path, &db_path_state);
81 db_dir = opendir(db_path.buf);
83 ohshite(_("cannot read info directory"));
85 push_cleanup(cu_closedir, ~0, NULL, 0, 1, (void *)db_dir);
86 while ((db_de = readdir(db_dir)) != NULL) {
87 const char *filename, *filetype, *dot;
89 debug(dbg_veryverbose, "infodb foreach info file '%s'",
92 /* Ignore dotfiles, including ‘.’ and ‘..’. */
93 if (db_de->d_name[0] == '.')
96 /* Ignore anything odd. */
97 dot = strrchr(db_de->d_name, '.');
101 /* Ignore files from other packages. */
102 if (strlen(pkgname) != (size_t)(dot - db_de->d_name) ||
103 strncmp(db_de->d_name, pkgname, dot - db_de->d_name))
106 debug(dbg_stupidlyverbose, "infodb foreach file this pkg");
108 /* Skip past the full stop. */
111 varbuf_rollback(&db_path, &db_path_state);
112 varbuf_add_str(&db_path, db_de->d_name);
113 varbuf_end_str(&db_path);
114 filename = db_path.buf;
116 func(filename, filetype);
118 pop_cleanup(ehflag_normaltidy); /* closedir */
120 varbuf_destroy(&db_path);