--- Begin Message ---
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;
}
--- End Message ---