I've prepared a patch for anna that will check if there are any udebs in the 
available packages list suitable for the running kernel version.
My goal was to allow the user to select another mirror if no valid udebs have 
been found.

I think this patch will also require the addition of a dialog for the 
retrievers to handle the new 'kernel_version' error situation.

Please check very carefully as my knowledge of both anna and C is very 
limited :-(

--- anna.c	2004-09-08 15:12:28.000000000 +0200
+++ anna_fjp.c	2004-09-08 17:28:57.000000000 +0200
@@ -79,24 +79,57 @@
     di_package *package, *status_package, **package_array, *test_package;
     di_slist_node *node, *node1, *node2;
     int reverse_depend=0;
+    bool kernel_packages_present = false;
 
     config_retriever();
 
-    *packages_allocator = di_system_packages_allocator_alloc();
-    *packages = get_packages(*packages_allocator);
+    while (!kernel_packages_present) {
+        *packages_allocator = di_system_packages_allocator_alloc();
+        *packages = get_packages(*packages_allocator);
+
+        while (*packages == NULL) {
+            int status=retriever_handle_error("packages");
+            di_log(DI_LOG_LEVEL_WARNING, "bad d-i Packages file");
+            if (status != 1) {
+                /* Failed to handle error. */
+                return 4;
+            }
+            else {
+                /* Error handled, retry. */
+                *packages_allocator = di_system_packages_allocator_alloc();
+                *packages = get_packages(*packages_allocator);
+            }
+        }
+    
+        /* Go through the available packages to see if it contains at least
+           one package that is valid for the subarchitecture and corresponds
+           to the kernel version we are running */
+        for (node = (*packages)->list.head; node; node = node->next) {
+            package = node->data;
+        
+            if (!di_system_package_check_subarchitecture(package, subarchitecture))
+                continue;
+            if (((di_system_package *)package)->kernel_version)
+            {
+                if (running_kernel && strcmp(running_kernel, ((di_system_package *)package)->kernel_version) == 0)
+                {
+                    /* Found one! So break out of the loop */
+                    kernel_packages_present = true;
+                    break;
+                }
+            }
+        }
 
-    while (*packages == NULL) {
-	int status=retriever_handle_error("packages");
-        di_log(DI_LOG_LEVEL_WARNING, "bad d-i Packages file");
-	if (status != 1) {
-	    /* Failed to handle error. */
-	    return 4;
-	}
-	else {
-            /* Error handled, retry. */
-            *packages_allocator = di_system_packages_allocator_alloc();
-            *packages = get_packages(*packages_allocator);
-	}
+        if (!kernel_packages_present) {
+            /* Maybe the priority of the question for netretriever on which release to use
+               should be raised here */
+            int status=retriever_handle_error("kernel_version");
+            di_log(DI_LOG_LEVEL_WARNING, "no packages for kernel in archive");
+            if (status != 1) {
+                /* Failed to handle error. */
+                return 4;
+            }
+        }
     }
 
     for (node = status->list.head; node; node = node->next) {
@@ -124,8 +157,13 @@
 
         if (package->type != di_package_type_real_package)
           continue;
-        if (is_installed(package, status))
-          continue;
+        if (is_installed(package, status)) {
+            /* Not sure if this is correct, but it seems logical to add this here.
+               Surely you don't want to deinstall already installed packages that
+               are at the correct version? */
+            package->status_want = di_package_status_want_hold;
+            continue;
+        }
         if (!di_system_package_check_subarchitecture(package, subarchitecture))
           continue;
 

Reply via email to