String the offline root path from the file_name in file_hash_get_file_owner().
[oweals/opkg-lede.git] / libopkg / pkg_hash.c
index 5b4fe4ba0376a66d53be6d69a92f58dfed106d9c..f72ed26e52fc3845e9f29f1c1911605d3dd37cd6 100644 (file)
    General Public License for more details.
 */
 
-#include "includes.h"
-#include <errno.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
+#include <stdio.h>
 
 #include "hash_table.h"
 #include "pkg.h"
@@ -28,6 +24,8 @@
 #include "pkg_hash.h"
 #include "pkg_parse.h"
 #include "opkg_utils.h"
+#include "sprintf_alloc.h"
+#include "file_util.h"
 #include "libbb/libbb.h"
 
 void
@@ -107,10 +105,10 @@ pkg_hash_add_from_file(const char *file_name,
                        continue;
                }
 
-               if (!pkg->architecture) {
+               if (!pkg->architecture || !pkg->arch_priority) {
                        char *version_str = pkg_version_str_alloc(pkg);
-                       opkg_msg(ERROR, "Package %s version %s has no "
-                                       "architecture specified, ignoring.\n",
+                       opkg_msg(NOTICE, "Package %s version %s has no "
+                                       "valid architecture, ignoring.\n",
                                        pkg->name, version_str);
                        free(version_str);
                        continue;
@@ -126,6 +124,65 @@ pkg_hash_add_from_file(const char *file_name,
        return ret;
 }
 
+/*
+ * Load in feed files from the cached "src" and/or "src/gz" locations.
+ */
+int
+pkg_hash_load_feeds(void)
+{
+       pkg_src_list_elt_t *iter;
+       pkg_src_t *src;
+       char *list_file, *lists_dir;
+
+       opkg_msg(INFO, "\n");
+
+       lists_dir = conf->restrict_to_default_dest ?
+               conf->default_dest->lists_dir : conf->lists_dir;
+
+       for (iter = void_list_first(&conf->pkg_src_list); iter;
+                       iter = void_list_next(&conf->pkg_src_list, iter)) {
+
+               src = (pkg_src_t *)iter->data;
+
+               sprintf_alloc(&list_file, "%s/%s", lists_dir, src->name);
+
+               if (file_exists(list_file)) {
+                       if (pkg_hash_add_from_file(list_file, src, NULL, 0)) {
+                               free(list_file);
+                               return -1;
+                       }
+               }
+               free(list_file);
+       }
+
+       return 0;
+}
+
+/*
+ * Load in status files from the configured "dest"s.
+ */
+int
+pkg_hash_load_status_files(void)
+{
+       pkg_dest_list_elt_t *iter;
+       pkg_dest_t *dest;
+
+       opkg_msg(INFO, "\n");
+
+       for (iter = void_list_first(&conf->pkg_dest_list); iter;
+                       iter = void_list_next(&conf->pkg_dest_list, iter)) {
+       
+               dest = (pkg_dest_t *)iter->data;
+
+               if (file_exists(dest->status_file_name)) {
+                       if (pkg_hash_add_from_file(dest->status_file_name, NULL, dest, 1))
+                               return -1;
+               }
+       }
+
+       return 0;
+}
+
 static abstract_pkg_t *
 abstract_pkg_fetch_by_name(const char * pkg_name)
 {
@@ -566,7 +623,14 @@ hash_insert_pkg(pkg_t *pkg, int set_status)
 pkg_t *
 file_hash_get_file_owner(const char *file_name)
 {
-       return hash_table_get(&conf->file_hash, file_name); 
+       if (conf->offline_root) {
+               unsigned int len = strlen(conf->offline_root);
+               if (strncmp(file_name, conf->offline_root, len) == 0) {
+                       file_name += len;
+               }
+       }
+
+       return hash_table_get(&conf->file_hash, file_name);
 }
 
 void