void pkg_blank(struct pkginfo *pkg) { pkg->status = stat_notinstalled; pkg->eflag = eflag_ok; pkg->want = want_unknown; pkg->priority = pri_unknown; pkg->otherpriority = NULL; pkg->section = NULL; dpkg_version_blank(&pkg->configversion); pkg->files = NULL; pkg->clientdata = NULL; pkg->trigaw.head = NULL; pkg->trigaw.tail = NULL; pkg->othertrigaw_head = NULL; pkg->trigpend_head = NULL; pkgbin_blank(&pkg->installed); pkgbin_blank(&pkg->available); /* The architectures are reset here (instead of in pkgbin_blank), * because they are part of the package specification, and needed * for selections. */ pkg->installed.arch = dpkg_arch_get(arch_none); pkg->installed.multiarch = multiarch_no; pkg->available.arch = dpkg_arch_get(arch_none); pkg->available.multiarch = multiarch_no; }
void pkgbin_blank(struct pkgbin *pkgbin) { pkgbin->essential = false; pkgbin->depends = NULL; pkgbin->pkgname_archqual = NULL; pkgbin->description = NULL; pkgbin->maintainer = NULL; pkgbin->source = NULL; pkgbin->installedsize = NULL; pkgbin->bugs = NULL; pkgbin->origin = NULL; dpkg_version_blank(&pkgbin->version); pkgbin->conffiles = NULL; pkgbin->arbs = NULL; }
int cmpversions(const char *const *argv) { struct relationinfo { const char *string; /* These values are exit status codes, so 0 = true, 1 = false. */ int if_lesser, if_equal, if_greater; int if_none_a, if_none_both, if_none_b; }; static const struct relationinfo relationinfos[]= { /* < = > !a!2!b */ { "le", 0,0,1, 0,0,1 }, { "lt", 0,1,1, 0,1,1 }, { "eq", 1,0,1, 1,0,1 }, { "ne", 0,1,0, 0,1,0 }, { "ge", 1,0,0, 1,0,0 }, { "gt", 1,1,0, 1,1,0 }, /* These treat an empty version as later than any version. */ { "le-nl", 0,0,1, 1,0,0 }, { "lt-nl", 0,1,1, 1,1,0 }, { "ge-nl", 1,0,0, 0,0,1 }, { "gt-nl", 1,1,0, 0,1,1 }, /* For compatibility with dpkg control file syntax. */ { "<", 0,0,1, 0,0,1 }, { "<=", 0,0,1, 0,0,1 }, { "<<", 0,1,1, 0,1,1 }, { "=", 1,0,1, 1,0,1 }, { ">", 1,0,0, 1,0,0 }, { ">=", 1,0,0, 1,0,0 }, { ">>", 1,1,0, 1,1,0 }, { NULL } }; const struct relationinfo *rip; struct dpkg_version a, b; struct dpkg_error err; int r; if (!argv[0] || !argv[1] || !argv[2] || argv[3]) badusage(_("--compare-versions takes three arguments:" " <version> <relation> <version>")); for (rip=relationinfos; rip->string && strcmp(rip->string,argv[1]); rip++); if (!rip->string) badusage(_("--compare-versions bad relation")); if (*argv[0] && strcmp(argv[0],"<unknown>")) { if (parseversion(&a, argv[0], &err) < 0) { if (err.type == DPKG_MSG_WARN) warning(_("version '%s' has bad syntax: %s"), argv[0], err.str); else ohshit(_("version '%s' has bad syntax: %s"), argv[0], err.str); dpkg_error_destroy(&err); } } else { dpkg_version_blank(&a); } if (*argv[2] && strcmp(argv[2],"<unknown>")) { if (parseversion(&b, argv[2], &err) < 0) { if (err.type == DPKG_MSG_WARN) warning(_("version '%s' has bad syntax: %s"), argv[2], err.str); else ohshit(_("version '%s' has bad syntax: %s"), argv[2], err.str); dpkg_error_destroy(&err); } } else { dpkg_version_blank(&b); } if (!dpkg_version_is_informative(&a)) { if (dpkg_version_is_informative(&b)) return rip->if_none_a; else return rip->if_none_both; } else if (!dpkg_version_is_informative(&b)) { return rip->if_none_b; } r = dpkg_version_compare(&a, &b); debug(dbg_general,"cmpversions a=`%s' b=`%s' r=%d", versiondescribe(&a,vdew_always), versiondescribe(&b,vdew_always), r); if (r > 0) return rip->if_greater; else if (r < 0) return rip->if_lesser; else return rip->if_equal; }