Package: gtk-gnutella
Version: 0.96.1svn12109-1
Severity: serious
Tags: patch
Justification: no longer builds from source
Build fails on ARM with STATIC_ASSERT failures. The ARM ABI padds
structudes to 4-byte boundaries by default. The attached patch adds
__attribute__((packed)) to inhibit this on structures that need to be
a funny size.
Paul
-- System Information:
Debian Release: testing/unstable
APT prefers unstable
APT policy: (500, 'unstable')
Architecture: arm (armv5tejl)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18-rc7
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
diff -ur gtk-gnutella-clean/src/core/gnutella.h gtk-gnutella-0.96.1svn12109/src/core/gnutella.h
--- gtk-gnutella-clean/src/core/gnutella.h 2006-10-16 00:01:09.000000000 +0100
+++ gtk-gnutella-0.96.1svn12109/src/core/gnutella.h 2006-11-04 15:07:19.000000000 +0000
@@ -48,25 +48,25 @@
struct gnutella_msg_init {
struct gnutella_header header;
/**< GGEP data may follow */
-};
+} __attribute__((packed));
struct gnutella_init_response {
guchar host_port[2];
guchar host_ip[4];
guchar files_count[4];
guchar kbytes_count[4];
-};
+} __attribute__((packed));
struct gnutella_msg_init_response {
struct gnutella_header header;
struct gnutella_init_response response;
/**< GGEP data may follow */
-};
+} __attribute__((packed));
struct gnutella_search {
guchar speed[2];
/**< query string follows */
-};
+} __attribute__((packed));
struct gnutella_search_results {
guchar num_recs;
@@ -76,41 +76,41 @@
/* record data follows */
/* Last 16 bytes = client_id */
-};
+} __attribute__((packed));
struct gnutella_msg_search {
struct gnutella_header header;
struct gnutella_search search;
-};
+} __attribute__((packed));
struct gnutella_push_request {
guchar guid[16];
guchar file_id[4];
guchar host_ip[4];
guchar host_port[2];
-};
+} __attribute__((packed));
struct gnutella_msg_push_request {
struct gnutella_header header;
struct gnutella_push_request request;
/**< GGEP data may follow */
-};
+} __attribute__((packed));
struct gnutella_bye {
guchar code[2];
/**< message string follows */
-};
+} __attribute__((packed));
struct gnutella_qrp_reset {
guchar variant; /**< 0x00 */
guchar table_length[4]; /**< little endian */
guchar infinity;
-};
+} __attribute__((packed));
struct gnutella_msg_qrp_reset {
struct gnutella_header header;
struct gnutella_qrp_reset data;
-};
+} __attribute__((packed));
struct gnutella_qrp_patch {
guchar variant; /**< 0x01 */
@@ -118,29 +118,29 @@
guchar seq_size;
guchar compressor;
guchar entry_bits;
-};
+} __attribute__((packed));
struct gnutella_msg_qrp_patch {
struct gnutella_header header;
struct gnutella_qrp_patch data;
-};
+} __attribute__((packed));
struct gnutella_vendor {
guchar vendor[4]; /**< For example, "GTKG" */
guchar selector_id[2]; /**< Message selector ID, little endian */
guchar version[2]; /**< Message version number, little endian */
/* payload follows */
-};
+} __attribute__((packed));
struct gnutella_msg_vendor {
struct gnutella_header header;
struct gnutella_vendor data;
-};
+} __attribute__((packed));
struct gnutella_msg_hsep_data {
struct gnutella_header header;
guchar triple[3 * sizeof(guint64)];
-};
+} __attribute__((packed));
#endif /* _core_gnutella_h_ */
diff -ur gtk-gnutella-clean/src/core/qhit.c gtk-gnutella-0.96.1svn12109/src/core/qhit.c
--- gtk-gnutella-clean/src/core/qhit.c 2006-10-16 00:01:09.000000000 +0100
+++ gtk-gnutella-0.96.1svn12109/src/core/qhit.c 2006-11-04 16:16:38.000000000 +0000
@@ -677,7 +677,7 @@
struct {
gchar ipv4[4];
gchar port[2];
- } alt;
+ } __attribute__((packed)) alt;
STATIC_ASSERT(sizeof alt == 6);
poke_be32(alt.ipv4, host_addr_ipv4(hvec[i].addr));
diff -ur gtk-gnutella-clean/src/if/core/gnutella.h gtk-gnutella-0.96.1svn12109/src/if/core/gnutella.h
--- gtk-gnutella-clean/src/if/core/gnutella.h 2006-10-16 00:01:09.000000000 +0100
+++ gtk-gnutella-0.96.1svn12109/src/if/core/gnutella.h 2006-11-04 15:03:09.000000000 +0000
@@ -62,7 +62,7 @@
guchar ttl;
guchar hops;
guchar size[4];
-};
+} __attribute__((packed));
#define GTA_HEADER_SIZE sizeof(struct gnutella_header)