Package: quinn-diff Version: 0.67 Severity: normal Tags: patch quinn-diff should support architecture wildcards just as support for them have been implemented in dpkg and sbuild.
Here's a patch that will allow quinn-diff to support a Packages-arch-specific that has entries that include architecture wildcards. -- System Information: Debian Release: squeeze/sid APT prefers unstable APT policy: (500, 'unstable'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 2.6.31-1-amd64 (SMP w/2 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Versions of packages quinn-diff depends on: ii libc6 2.10.2-2 GNU C Library: Shared libraries ii libglib2.0-0 2.22.3-1 The GLib library of C routines Versions of packages quinn-diff recommends: ii debianutils 3.2.2 Miscellaneous utilities specific t ii lftp 4.0.2-1 Sophisticated command-line FTP/HTT quinn-diff suggests no packages. -- no debconf information
diff --git a/src/utils.c b/src/utils.c index 3cbd674..08e7ffa 100644 --- a/src/utils.c +++ b/src/utils.c @@ -287,20 +287,322 @@ xstrdup (const char *s) boolean in_arch_list(const char *arch_list, const char *arch) { - char **archs; - int i; - - if ((archs = g_strsplit(arch_list," ",0)) != NULL) + /* Overview of strings to match: + * any + * <cpu> + * any-any + * any-<cpu> + * <kernel>-any + * <kernel>-<cpu> + * any-any-any + * any-any-<cpu> + * any-<kernel>-any + * any-<kernel>-<cpu> + * <system>-any-any + * <system>-any-<cpu> + * <system>-<kernel>-any + * <system>-<kernel>-<cpu> + */ + + char *archs = strdup(arch_list); + char *archtok = strtok(archs, " "); + + while (archtok != NULL) + { + /* Traditional comparison. Search for exact strings or "any" + * any + * <cpu> + * any-any + * <kernel>-<cpu> + * any-any-any + * <system>-<kernel>-<cpu> + */ + if (!strcmp(archtok,arch) || !strcmp(archtok,"any") || + !strcmp(archtok,"any-any") || !strcmp(archtok,"any-any-any")) { - for ( i = 0 ; archs[i] ; i++ ) - { - if (!strcmp(archs[i],arch)) - { - g_strfreev(archs); - return TRUE; - } - } - g_strfreev(archs); + free(archs); + return TRUE; + } + + /* Match from variable 'arch' with the use of triplets + * '<system>-<kernel>-<cpu>' */ + int first = 0, second = 0; + char *temp = strchr(arch, '-'); + if (temp != NULL) { + first = temp - arch; + temp = strchr(temp + 1, '-'); + if (temp != NULL) { + second = temp - arch; + } } + + /* Search for matches when Packages arch given <cpu>: + * linux-any + * linux-<cpu> + * any-<cpu> + * any-linux-any + * any-linux-<cpu> + */ + if ((first == 0) && (first == second)) { + int size = strlen("any-linux-") + strlen(arch) + 1; + char *wildcard = malloc(size); + if (wildcard == NULL) { + fubar (SYSERR, "in_arch_list: failed to allocate memory for wildcard."); + } + + /* linux-any, linux-<cpu>, any-linux-any */ + sprintf(wildcard, "linux-%s", arch); + if (!strcmp(archtok,"linux-any") || !strcmp(archtok,wildcard) || + !strcmp(archtok,"any-linux-any")) { + free(archs); + free(wildcard); + return TRUE; + } + + /* any-<cpu> */ + sprintf(wildcard, "any-%s", arch); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(wildcard); + return TRUE; + } + + /* any-linux-<cpu> */ + sprintf(wildcard, "any-linux-%s", arch); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(wildcard); + return TRUE; + } + + free(wildcard); + } + + /* Search for matches when Packages arch given is <kernel>-<cpu>: + * any-<cpu> + * <kernel>-any + * any-any-<cpu> + * any-<kernel>-any + * any-<kernel>-<cpu> + */ + if ((first > 0) && (second == 0)) { + char *cpu = strdup(arch+first+1); + char *kernel = strdup(arch); + kernel[first] = '\0'; + + /* any-<cpu>, any-any-<cpu> */ + unsigned int size = strlen("any-any-") + strlen(cpu) + 1; + char *wildcard = malloc(size); + if (wildcard == NULL) { + fubar (SYSERR, "in_arch_list: failed to allocate memory for wildcard."); + } + sprintf(wildcard, "any-%s", cpu); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(wildcard); + return TRUE; + } + sprintf(wildcard, "any-any-%s", cpu); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(wildcard); + return TRUE; + } + + /* <kernel>-any, any-<kernel>-any */ + size = strlen("any-") + strlen(kernel) + strlen("-any") + 1; + wildcard = (char*)realloc(wildcard, size); + if (wildcard == NULL) { + fubar (SYSERR, + "in_arch_list: failed to reallocate memory for wildcard."); + } + sprintf(wildcard, "%s-any", kernel); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(wildcard); + return TRUE; + } + sprintf(wildcard, "any-%s-any", kernel); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(wildcard); + return TRUE; + } + + /* any-<kernel>-<cpu> */ + size = strlen("any-") + strlen(kernel) + strlen(cpu) + 1; + wildcard = (char*)realloc(wildcard, size); + if (wildcard == NULL) { + fubar (SYSERR, + "in_arch_list: failed to reallocate memory for wildcard."); + } + sprintf(wildcard, "any-%s-%s", kernel, cpu); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(wildcard); + return TRUE; + } + + free(cpu); + free(kernel); + free(wildcard); + } + + /* Search for matches when Pakages arch given is <system>-<kernel>-<cpu>: + * any-<cpu> + * <kernel>-any + * any-any-<cpu> + * any-<kernel>-any + * any-<kernel>-<cpu> + * <system>-any-any + * <system>-any-<cpu> + * <system>-<kernel>-any + */ + if ((first > 0) && (second > first)) { + char *cpu = strdup(arch+second+1); + char *kernel = strdup(arch+first+1); + kernel[strlen(arch)-second] = '\0'; + char *system = strdup(arch); + system[first] = '\0'; + + /* any-<cpu>, any-any-<cpu> */ + unsigned int size = strlen("any-any-") + strlen(cpu) + 1; + char *wildcard = malloc(size); + if (wildcard == NULL) { + fubar (SYSERR, "in_arch_list: failed to allocate memory for wildcard."); + } + sprintf(wildcard, "any-%s", cpu); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(system); + free(wildcard); + return TRUE; + } + sprintf(wildcard, "any-any-%s", cpu); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(system); + free(wildcard); + return TRUE; + } + + /* <kernel>-any, any-<kernel>-any */ + size = strlen("any-") + strlen(kernel) + strlen("-any") + 1; + wildcard = (char*)realloc(wildcard, size); + if (wildcard == NULL) { + fubar (SYSERR, + "in_arch_list: failed to reallocate memory for wildcard."); + } + sprintf(wildcard, "%s-any", kernel); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(system); + free(wildcard); + return TRUE; + } + sprintf(wildcard, "any-%s-any", kernel); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(system); + free(wildcard); + return TRUE; + } + + /* any-<kernel>-<cpu> */ + size = strlen("any-") + strlen(kernel) + strlen("-") + strlen(cpu) + 1; + wildcard = (char*)realloc(wildcard, size); + if (wildcard == NULL) { + fubar (SYSERR, + "in_arch_list: failed to reallocate memory for wildcard."); + } + sprintf(wildcard, "any-%s-%s", kernel, cpu); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(system); + free(wildcard); + return TRUE; + } + + /* <system>-any-any */ + size = strlen(system) + strlen("-any-any") + 1; + wildcard = (char*)realloc(wildcard, size); + if (wildcard == NULL) { + fubar (SYSERR, + "in_arch_list: failed to reallocate memory for wildcard."); + } + sprintf(wildcard, "%s-any-any", system); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(system); + free(wildcard); + return TRUE; + } + + /* <system>-any-<cpu> */ + size = strlen(system) + strlen("-any-") + strlen(cpu) + 1; + wildcard = (char*)realloc(wildcard, size); + if (wildcard == NULL) { + fubar (SYSERR, + "in_arch_list: failed to reallocate memory for wildcard."); + } + sprintf(wildcard, "%s-any-%s", system, cpu); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(system); + free(wildcard); + return TRUE; + } + + /* <system>-<kernel>-any */ + size = strlen(system) + strlen("-") + strlen(kernel) + strlen("-any") + 1; + wildcard = (char*)realloc(wildcard, size); + if (wildcard == NULL) { + fubar (SYSERR, + "in_arch_list: failed to reallocate memory for wildcard."); + } + sprintf(wildcard, "%s-%s-any", system, kernel); + if (!strcmp(archtok,wildcard)) { + free(archs); + free(cpu); + free(kernel); + free(system); + free(wildcard); + return TRUE; + } + + free(cpu); + free(kernel); + free(system); + free(wildcard); + } + + /* Go on to the next architecture in the list */ + archtok = strtok(NULL, " "); + } + free(archs); return FALSE; }