I "volunteered" (:p) to hack in some support in anna for choosing which retriever to use. Seeing as my sister too is called Anna, I felt qualified enough for this ;) Attached is a patch. Seeing as I don't trust myself with proofreading and testing my own code, I'd be happy if someone could look it over.
Regards, Martin
diff -u -r1.2 Makefile --- Makefile 28 Mar 2002 19:30:35 -0000 1.2 +++ Makefile 25 Aug 2002 23:02:23 -0000 @@ -1,6 +1,7 @@ CFLAGS=-Wall -g -D_GNU_SOURCE OBJS=$(subst .c,.o,$(wildcard *.c)) BIN=anna +LIBS=-ldebconf ifdef DEBUG CFLAGS:=$(CFLAGS) -DDODEBUG diff -u -r1.7 anna.h --- anna.h 21 Dec 2000 22:28:53 -0000 1.7 +++ anna.h 25 Aug 2002 23:02:23 -0000 @@ -3,5 +3,9 @@ #define DOWNLOAD_DIR "/var/cache/anna" #define DPKG_UNPACK_COMMAND "udpkg --unpack" +#define ANNA_RETRIEVER "anna/retriever" +#define RETRIEVER_DIR "/usr/lib/debian-installer/retriever" +#define RETRIEVER_DIR_LEN 35 /* ick */ + int get_package (struct package_t *package, char *dest); struct package_t *get_packages (void); diff -u -r1.11 retriever.c --- retriever.c 25 Aug 2002 20:14:09 -0000 1.11 +++ retriever.c 25 Aug 2002 23:02:23 -0000 @@ -2,6 +2,10 @@ * Retriever interface code. */ +#include <cdebconf/debconfclient.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <dirent.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -9,10 +13,63 @@ #include "anna.h" /* Returns the filename of the retriever to use. */ -/* TODO: handle more than one, and don't hard-code. */ +/* TODO: error handling */ char *chosen_retriever (void) { - - return "/usr/lib/debian-installer/retriever/cdrom-retriever"; + static char *retriever = NULL; + + if (retriever == NULL) { + DIR *retrdir; + struct dirent *d_ent; + struct debconfclient *debconf; + int retstr_size = 1, fname_len; + char *ret_choices, *ret_default = NULL; + char *fname; + struct stat st; + + /* Find out which retrievers are available */ + retrdir = opendir(RETRIEVER_DIR); + ret_choices = malloc(1); + ret_choices[0] = '\0'; + while ((d_ent = readdir(retrdir)) != NULL) { + fname_len = strlen(d_ent->d_name); + fname = (char *)malloc(RETRIEVER_DIR_LEN + 1 + fname_len); + strcpy(fname, RETRIEVER_DIR "/"); + strcat(fname, d_ent->d_name); + stat(fname, &st); + free(fname); + if (S_ISREG(st.st_mode)) { + /* Should we check for x flag too? */ + retstr_size += fname_len + 2; + ret_choices = realloc(ret_choices, retstr_size); + strcat(ret_choices, d_ent->d_name); + strcat(ret_choices, ", "); + /* Pick the first one to be default :) */ + if (ret_default == NULL) + ret_default = strdup(d_ent->d_name); + } + } + closedir(retrdir); + if (retstr_size >= 3) + ret_choices[retstr_size-3] = '\0'; + + debconf = debconfclient_new(); + debconf->command(debconf, "TITLE", "Choose Retriever", NULL); + debconf->command(debconf, "SET", ANNA_RETRIEVER, ret_default, NULL); + debconf->command(debconf, "SUBST", ANNA_RETRIEVER, "RETRIEVER", ret_choices, NULL); + debconf->command(debconf, "SUBST", ANNA_RETRIEVER, "DEFAULT", ret_default, NULL); + debconf->command(debconf, "INPUT medium", ANNA_RETRIEVER, NULL); + debconf->command(debconf, "GO", NULL); + debconf->command(debconf, "GET", ANNA_RETRIEVER, NULL); + retriever = malloc(RETRIEVER_DIR_LEN + 1 + strlen(debconf->value)); + strcpy(retriever, RETRIEVER_DIR "/"); + strcat(retriever, debconf->value); + debconfclient_delete(debconf); + + free(ret_choices); + free(ret_default); + } + + return retriever; } /* Ask the chosen retriever to download a particular package to to dest. */ --- /dev/null 2002-07-08 21:14:29.000000000 +0200 +++ debian/templates 2002-08-25 23:59:23.000000000 +0200 @@ -0,0 +1,7 @@ +Template: anna/retriever +Type: select +Choices: ${RETRIEVER} +Default: ${DEFAULT} +Description: Choose the retriever to use. + The retriever is responsible for fetching the packages to be + installed.
signature.asc
Description: Detta =?ISO-8859-1?Q?=E4r?= en digitalt signeradmeddelandedel