On 64 bit systems, the integer 0 is 32 bits and the pointer 0 is 64 bits.
The upper 32 bits will not be cleared and the loop will never terminate.
Also add the RAZOR_SENTINEL __attribute__ ((__sentinel__(0))) on GCC4
so we catch where we get this wrong automatically.
This also fixes the new search functionality from James which was missed
in the merge.
* @package: a %razor_package
*
* Gets the next iteratr along with any vararg data.
- * The vararg must be terminated with zero.
+ * The vararg must be terminated with NULL.
*
* Example: razor_package_iterator_next (pi, package, RAZOR_DETAIL_NAME, &name, 0);
**/
assert (pi != NULL);
packages = pq->set->packages.data;
- while (razor_package_iterator_next(pi, &p, 0)) {
+ while (razor_package_iterator_next(pi, &p, NULL)) {
pq->count += pq->vector[p - packages] ^ 1;
pq->vector[p - packages] = 1;
}
assert (package != NULL);
pi = razor_package_iterator_create(set);
- while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_NAME, &name, 0)) {
+ while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_NAME, &name, NULL)) {
if (strcmp(package, name) == 0)
break;
}
* @package: a %razor_package
*
* Gets details about a package using a varg interface
- * The vararg must be terminated with zero.
+ * The vararg must be terminated with %NULL.
*
* Example: razor_package_get_details (set, package, RAZOR_DETAIL_URL, &url, 0);
**/
RAZOR_DETAIL_NAME, &name1,
RAZOR_DETAIL_VERSION, &version1,
RAZOR_DETAIL_ARCH, &arch1,
- 0);
+ NULL);
razor_package_iterator_next(pi2, &p2,
RAZOR_DETAIL_NAME, &name2,
RAZOR_DETAIL_VERSION, &version2,
RAZOR_DETAIL_ARCH, &arch2,
- 0);
+ NULL);
while (p1 || p2) {
if (p1 && p2) {
RAZOR_DETAIL_NAME, &name1,
RAZOR_DETAIL_VERSION, &version1,
RAZOR_DETAIL_ARCH, &arch1,
- 0);
+ NULL);
if (p2 != NULL && res >= 0)
razor_package_iterator_next(pi2, &p2,
RAZOR_DETAIL_NAME, &name2,
RAZOR_DETAIL_VERSION, &version2,
RAZOR_DETAIL_ARCH, &arch2,
- 0);
+ NULL);
}
razor_package_iterator_destroy(pi1);
#include <stdint.h>
+/* GCC sentinel */
+#if defined(__GNUC__) && __GNUC__ >= 4
+#define RAZOR_SENTINEL __attribute__ ((__sentinel__(0)));
+#else
+#define RAZOR_SENTINEL
+#endif
+
enum razor_repo_file_type {
RAZOR_REPO_FILE_MAIN,
RAZOR_REPO_FILE_DETAILS,
};
enum razor_detail_type {
- RAZOR_DETAIL_NAME = 1, /* 0 is the marker for the vararg */
+ RAZOR_DETAIL_NAME = 1, /* NULL (0 on 32 bit) is the sentinel */
RAZOR_DETAIL_VERSION,
RAZOR_DETAIL_ARCH,
RAZOR_DETAIL_SUMMARY,
razor_set_get_package(struct razor_set *set, const char *package);
void
-razor_package_get_details(struct razor_set *set, struct razor_package *package, ...);
+razor_package_get_details(struct razor_set *set,
+ struct razor_package *package, ...)
+ RAZOR_SENTINEL;
/**
const char *filename);
int razor_package_iterator_next(struct razor_package_iterator *pi,
- struct razor_package **package, ...);
+ struct razor_package **package, ...)
+ RAZOR_SENTINEL;
void razor_package_iterator_destroy(struct razor_package_iterator *pi);
struct razor_package_query *
razor_package_iterator_init_for_property(&pkg_iter, set, p);
while (razor_package_iterator_next(&pkg_iter, &pkg,
RAZOR_DETAIL_NAME, &n,
- RAZOR_DETAIL_VERSION, &v, 0)) {
+ RAZOR_DETAIL_VERSION, &v, NULL)) {
fprintf(stderr, "removing %s-%s\n", n, v);
razor_transaction_remove_package(trans, pkg);
}
razor_package_iterator_init_for_property(&pkg_iter, set, p);
while (razor_package_iterator_next(&pkg_iter, &pkg,
RAZOR_DETAIL_NAME, &name,
- RAZOR_DETAIL_VERSION, &version, 0)) {
+ RAZOR_DETAIL_VERSION, &version, NULL)) {
fprintf(stderr, "flagging %s-%s for providing %s matching %s %s\n",
name, version,
trans->system.set,
sp);
while (razor_package_iterator_next(&pkg_iter, &pkg,
- RAZOR_DETAIL_NAME, &name, 0)) {
+ RAZOR_DETAIL_NAME, &name, NULL)) {
fprintf(stderr, "updating %s because %s %s %s "
"isn't satisfied\n",
name, spi.pool + sp->name,
sp);
while (razor_package_iterator_next(&pkg_iter, &pkg,
RAZOR_DETAIL_NAME, &name,
- RAZOR_DETAIL_VERSION, &version, 0)) {
+ RAZOR_DETAIL_VERSION, &version, NULL)) {
fprintf(stderr, "updating %s %s because it "
"conflicts with %s\n",
name, version, spi.pool + sp->name);
while (razor_package_iterator_next(pi, &p,
RAZOR_DETAIL_NAME, &name,
- RAZOR_DETAIL_VERSION, &version, 0)) {
+ RAZOR_DETAIL_VERSION, &version, NULL)) {
if (!(trans->system.packages[p - spkgs] & TRANS_PACKAGE_UPDATE))
continue;
while (razor_package_iterator_next(pi, &p,
RAZOR_DETAIL_NAME, &name,
- RAZOR_DETAIL_VERSION, &version, 0)) {
+ RAZOR_DETAIL_VERSION, &version, NULL)) {
if (!(trans->upstream.packages[p - upkgs] & TRANS_PACKAGE_UPDATE))
continue;
while (razor_package_iterator_next(&pi, &pkg,
RAZOR_DETAIL_NAME, &name,
RAZOR_DETAIL_VERSION, &version,
- RAZOR_DETAIL_ARCH, &arch, 0))
+ RAZOR_DETAIL_ARCH, &arch, NULL))
fprintf(stderr, "%s is needed by %s-%s.%s\n",
&pool[rp->name],
name, version, arch);
while (razor_package_iterator_next(&pi, &pkg,
RAZOR_DETAIL_NAME, &name,
RAZOR_DETAIL_VERSION, &version,
- RAZOR_DETAIL_ARCH, &arch, 0))
+ RAZOR_DETAIL_ARCH, &arch, NULL))
fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n",
&pool[rp->name],
razor_property_relation_to_string(rp),
iter = razor_package_iterator_create(set);
pattern = argv[i];
count = 0;
- while (razor_package_iterator_next(iter, &package, RAZOR_DETAIL_NAME, &name, 0)) {
+ while (razor_package_iterator_next(iter, &package, RAZOR_DETAIL_NAME, &name, NULL)) {
if (fnmatch(pattern, name, 0) != 0)
continue;
while (razor_package_iterator_next(iter, &package,
RAZOR_DETAIL_NAME, &name,
RAZOR_DETAIL_VERSION, &version,
- RAZOR_DETAIL_ARCH, &arch, 0)) {
+ RAZOR_DETAIL_ARCH, &arch, NULL)) {
if (flags & LIST_PACKAGES_ONLY_NAMES)
printf("%s\n", name);
else
pi = razor_package_iterator_create(set);
while (razor_package_iterator_next(pi, &package,
- RAZOR_DETAIL_NAME, &name, 0)) {
+ RAZOR_DETAIL_NAME, &name, NULL)) {
if (pattern && fnmatch(pattern, name, 0) == 0) {
razor_transaction_update_package(trans, package);
matches++;
int matches = 0;
pi = razor_package_iterator_create(set);
- while (razor_package_iterator_next(pi, &package, RAZOR_DETAIL_NAME, &name, 0)) {
+ while (razor_package_iterator_next(pi, &package, RAZOR_DETAIL_NAME, &name, NULL)) {
if (pattern && fnmatch(pattern, name, 0) == 0) {
razor_transaction_remove_package(trans, package);
matches++;
while (razor_package_iterator_next(pi, &package,
RAZOR_DETAIL_NAME, &name,
RAZOR_DETAIL_VERSION, &version,
- RAZOR_DETAIL_ARCH, &arch, 0)) {
+ RAZOR_DETAIL_ARCH, &arch, NULL)) {
snprintf(url, sizeof url,
"%s/Packages/%s",
yum_url, rpm_filename(name, version, arch));
while (razor_package_iterator_next(pi, &package,
RAZOR_DETAIL_NAME, &name,
RAZOR_DETAIL_VERSION, &version,
- RAZOR_DETAIL_ARCH, &arch, 0)) {
+ RAZOR_DETAIL_ARCH, &arch, NULL)) {
printf("install %s-%s\n", name, version);
snprintf(file, sizeof file,
while (razor_package_iterator_next(pi, &package,
RAZOR_DETAIL_NAME, &name,
RAZOR_DETAIL_VERSION, &version,
- RAZOR_DETAIL_ARCH, &arch, 0)) {
+ RAZOR_DETAIL_ARCH, &arch, NULL)) {
if (pattern && fnmatch(pattern, name, 0) != 0)
continue;
while (razor_package_iterator_next(pi, &package,
RAZOR_DETAIL_NAME, &name,
RAZOR_DETAIL_VERSION, &version,
- RAZOR_DETAIL_ARCH, &arch, 0)) {
+ RAZOR_DETAIL_ARCH, &arch, NULL)) {
if (pattern && fnmatch(pattern, name, 0) != 0)
continue;
RAZOR_DETAIL_DESCRIPTION, &description,
RAZOR_DETAIL_URL, &url,
RAZOR_DETAIL_LICENSE, &license,
- 0);
+ NULL);
printf ("Name: %s\n", name);
printf ("Arch: %s\n", arch);
pi = razor_package_iterator_create(set);
while (razor_package_iterator_next(pi, &package,
- &name, &version, &arch)) {
+ RAZOR_DETAIL_NAME, &name,
+ RAZOR_DETAIL_VERSION, &version,
+ RAZOR_DETAIL_ARCH, &arch, NULL)) {
if (!fnmatch(pattern, name, 0))
printf("%s-%s.%s\n", name, version, arch);
else {
- razor_package_get_details (set, package, &summary,
- &description, &url,
- &license);
+ razor_package_get_details (set, package,
+ RAZOR_DETAIL_SUMMARY, &summary,
+ RAZOR_DETAIL_DESCRIPTION, &description,
+ RAZOR_DETAIL_URL, &url,
+ RAZOR_DETAIL_LICENSE, &license,
+ NULL);
if (!fnmatch(pattern, url, 0) ||
!fnmatch(pattern, summary, 0) ||
!fnmatch(pattern, description, 0))
pi = razor_package_iterator_create(set);
while (razor_package_iterator_next(pi, &package,
- RAZOR_DETAIL_NAME, &name, 0)) {
+ RAZOR_DETAIL_NAME, &name, NULL)) {
while (cmp = strcmp(argv[i], name), cmp < 0 && i < argc) {
fprintf(stderr, "error: package %s is not installed\n",
argv[i]);
RAZOR_DETAIL_DESCRIPTION, &description,
RAZOR_DETAIL_URL, &url,
RAZOR_DETAIL_LICENSE, &license,
- 0);
+ NULL);
printf("Name: %s\n", name);
printf("Arch: %s\n", arch);
while (razor_package_iterator_next(pi, &package,
RAZOR_DETAIL_NAME, &name,
RAZOR_DETAIL_VERSION, &version,
- RAZOR_DETAIL_ARCH, &arch, 0)) {
+ RAZOR_DETAIL_ARCH, &arch, NULL)) {
if (option_conflicts)
print_package_properties(set, package,
RAZOR_PROPERTY_CONFLICTS);
while (razor_package_iterator_next(pi, &package,
RAZOR_DETAIL_NAME, &name,
RAZOR_DETAIL_VERSION, &version,
- RAZOR_DETAIL_ARCH, &arch, 0)) {
+ RAZOR_DETAIL_ARCH, &arch, NULL)) {
printf("verify %s-%s.%s - not implemented\n",
name, version, arch);
}
add_command_line_packages(set, query, argc, argv);
pi = razor_package_query_finish(query);
- while (razor_package_iterator_next(pi, &package, 0))
+ while (razor_package_iterator_next(pi, &package, NULL))
razor_transaction_remove_package(trans, package);
razor_package_iterator_destroy(pi);
trans = razor_transaction_create(set, upstream);
pi = razor_package_iterator_create(upstream);
- while (razor_package_iterator_next(pi, &package, 0))
+ while (razor_package_iterator_next(pi, &package, NULL))
razor_transaction_install_package(trans, package);
razor_package_iterator_destroy(pi);
trans = razor_transaction_create(set, upstream);
pi = razor_package_iterator_create(upstream);
- while (razor_package_iterator_next(pi, &package, 0))
+ while (razor_package_iterator_next(pi, &package, NULL))
razor_transaction_update_package(trans, package);
razor_package_iterator_destroy(pi);