summaryrefslogtreecommitdiffstats
path: root/libopkg/opkg.c
diff options
context:
space:
mode:
Diffstat (limited to 'libopkg/opkg.c')
-rw-r--r--libopkg/opkg.c113
1 files changed, 84 insertions, 29 deletions
diff --git a/libopkg/opkg.c b/libopkg/opkg.c
index 630b243..9f63812 100644
--- a/libopkg/opkg.c
+++ b/libopkg/opkg.c
@@ -45,10 +45,32 @@ struct _opkg_t
__FILE__, __LINE__, __PRETTY_FUNCTION__, # expr); abort (); }
#define progress(d, p) d.percentage = p; if (progress_callback) progress_callback (opkg, &d, user_data);
-#define OLD_PKG_TO_NEW(pkg) opkg_package_new_with_values (pkg->name, pkg->version, pkg->architecture, pkg->description, pkg->tags, pkg->url, (pkg->size ? atoi (pkg->size) : 0), (pkg->state_status == SS_INSTALLED));
+#define SSTRCMP(x,y) (x && y) ? strcmp (x, y) : 0
/** Private Functions ***/
+static opkg_package_t*
+old_pkg_to_new (pkg_t *old)
+{
+ opkg_package_t *new;
+
+ new = opkg_package_new ();
+
+#define sstrdup(x) (x) ? strdup (x) : NULL;
+
+ new->name = sstrdup (old->name);
+ new->version = pkg_version_str_alloc (old);
+ new->architecture = sstrdup (old->architecture);
+ new->repository = sstrdup (old->src->name);
+ new->description = sstrdup (old->description);
+ new->tags = sstrdup (old->tags);
+ new->url = sstrdup (old->url);
+
+ new->size = (old->size) ? atoi (old->size) : 0;
+ new->installed = (old->state_status == SS_INSTALLED);
+
+ return new;
+}
static int
opkg_configure_packages(opkg_conf_t *conf, char *pkg_name)
@@ -143,28 +165,6 @@ opkg_package_new ()
return p;
}
-opkg_package_t *
-opkg_package_new_with_values (const char *name, const char *version,
- const char *arch, const char *desc, const char *tags, const char *url, int size, int installed)
-{
- opkg_package_t *package;
- package = opkg_package_new ();
-
-#define sstrdup(x) (x) ? strdup (x) : NULL;
-
- package->name = sstrdup (name);
- package->version = sstrdup (version);
- package->architecture = sstrdup (arch);
- package->description = sstrdup (desc);
- package->tags = sstrdup (tags);
- package->url = sstrdup (url);
-
- package->size = size;
- package->installed = (installed != 0);
-
- return package;
-}
-
void
opkg_package_free (opkg_package_t *p)
{
@@ -376,7 +376,7 @@ opkg_install_package (opkg_t *opkg, const char *package_name, opkg_progress_call
return 1;
}
pdata.action = OPKG_INSTALL;
- pdata.package = OLD_PKG_TO_NEW (new);
+ pdata.package = old_pkg_to_new (new);
progress (pdata, 0);
@@ -441,7 +441,7 @@ opkg_remove_package (opkg_t *opkg, const char *package_name, opkg_progress_callb
}
pdata.action = OPKG_REMOVE;
- pdata.package = OLD_PKG_TO_NEW (pkg);
+ pdata.package = old_pkg_to_new (pkg);
progress (pdata, 0);
@@ -515,7 +515,7 @@ opkg_upgrade_package (opkg_t *opkg, const char *package_name, opkg_progress_call
}
pdata.action = OPKG_INSTALL;
- pdata.package = OLD_PKG_TO_NEW (pkg);
+ pdata.package = old_pkg_to_new (pkg);
progress (pdata, 0);
opkg_upgrade_pkg (opkg->conf, pkg);
@@ -550,7 +550,7 @@ opkg_upgrade_all (opkg_t *opkg, opkg_progress_callback_t progress_callback, void
{
pkg = installed->pkgs[i];
- pdata.package = OLD_PKG_TO_NEW (pkg);
+ pdata.package = old_pkg_to_new (pkg);
progress (pdata, 99 * i / installed->len);
opkg_package_free (pdata.package);
@@ -759,7 +759,7 @@ opkg_list_packages (opkg_t *opkg, opkg_package_callback_t callback, void *user_d
pkg = all->pkgs[i];
- package = OLD_PKG_TO_NEW (pkg);
+ package = old_pkg_to_new (pkg);
callback (opkg, package, user_data);
}
@@ -800,7 +800,7 @@ opkg_list_upgradable_packages (opkg_t *opkg, opkg_package_callback_t callback, v
if (cmp < 0)
{
- package = OLD_PKG_TO_NEW (new);
+ package = old_pkg_to_new (new);
callback (opkg, package, user_data);
}
}
@@ -810,3 +810,58 @@ opkg_list_upgradable_packages (opkg_t *opkg, opkg_package_callback_t callback, v
return 0;
}
+opkg_package_t*
+opkg_find_package (opkg_t *opkg, const char *name, const char *ver, const char *arch, const char *repo)
+{
+ pkg_vec_t *all;
+ opkg_package_t *package = NULL;
+ int i;
+#define sstrcmp(x,y) (x && y) ? strcmp (x, y) : 0
+
+ opkg_assert (opkg);
+
+ all = pkg_vec_alloc ();
+ pkg_hash_fetch_available (&opkg->conf->pkg_hash, all);
+ for (i = 0; i < all->len; i++)
+ {
+ pkg_t *pkg;
+ char *pkgv;
+
+ pkg = all->pkgs[i];
+
+ /* check name */
+ if (sstrcmp (pkg->name, name))
+ continue;
+
+ /* check version */
+ pkgv = pkg_version_str_alloc (pkg);
+ if (sstrcmp (pkgv, ver))
+ {
+ free (pkgv);
+ continue;
+ }
+ free (pkgv);
+
+ /* check architecture */
+ if (arch)
+ {
+ if (sstrcmp (pkg->architecture, arch))
+ continue;
+ }
+
+ /* check repository */
+ if (repo)
+ {
+ if (sstrcmp (pkg->src->name, repo))
+ continue;
+ }
+
+ /* match found */
+ package = old_pkg_to_new (pkg);
+ break;
+ }
+
+ pkg_vec_free (all);
+
+ return package;
+}