2 * libdpkg - Debian packaging suite library routines
3 * db-ctrl-access.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/fsys.h>
36 #include <dpkg/db-ctrl.h>
37 #include <dpkg/debug.h>
40 pkg_infodb_has_file(struct pkginfo
*pkg
, struct pkgbin
*pkgbin
,
46 filename
= pkg_infodb_get_file(pkg
, pkgbin
, name
);
47 if (lstat(filename
, &stab
) == 0)
49 else if (errno
== ENOENT
)
52 ohshite(_("unable to check existence of '%.250s'"), filename
);
56 pkg_infodb_foreach(struct pkginfo
*pkg
, struct pkgbin
*pkgbin
,
57 pkg_infodb_file_func
*func
)
61 struct varbuf_state db_path_state
;
62 struct varbuf db_path
= VARBUF_INIT
;
64 enum pkg_infodb_format db_format
;
66 /* Make sure to always read and verify the format version. */
67 db_format
= pkg_infodb_get_format();
69 if (pkgbin
->multiarch
== PKG_MULTIARCH_SAME
&&
70 db_format
== PKG_INFODB_FORMAT_MULTIARCH
)
71 pkgname
= pkgbin_name(pkg
, pkgbin
, pnaw_always
);
73 pkgname
= pkgbin_name(pkg
, pkgbin
, pnaw_never
);
75 varbuf_add_str(&db_path
, pkg_infodb_get_dir());
76 varbuf_add_char(&db_path
, '/');
77 varbuf_end_str(&db_path
);
78 varbuf_snapshot(&db_path
, &db_path_state
);
80 db_dir
= opendir(db_path
.buf
);
82 ohshite(_("cannot read info directory"));
84 push_cleanup(cu_closedir
, ~0, 1, (void *)db_dir
);
85 while ((db_de
= readdir(db_dir
)) != NULL
) {
86 const char *filename
, *filetype
, *dot
;
88 debug(dbg_veryverbose
, "infodb foreach info file '%s'",
91 /* Ignore dotfiles, including ‘.’ and ‘..’. */
92 if (db_de
->d_name
[0] == '.')
95 /* Ignore anything odd. */
96 dot
= strrchr(db_de
->d_name
, '.');
100 /* Ignore files from other packages. */
101 if (strlen(pkgname
) != (size_t)(dot
- db_de
->d_name
) ||
102 strncmp(db_de
->d_name
, pkgname
, dot
- db_de
->d_name
))
105 debug(dbg_stupidlyverbose
, "infodb foreach file this pkg");
107 /* Skip past the full stop. */
110 varbuf_rollback(&db_path
, &db_path_state
);
111 varbuf_add_str(&db_path
, db_de
->d_name
);
112 varbuf_end_str(&db_path
);
113 filename
= db_path
.buf
;
115 func(filename
, filetype
);
117 pop_cleanup(ehflag_normaltidy
); /* closedir */
119 varbuf_destroy(&db_path
);