Re: ftape-tools: FTBFS: Syntax error before '__FUNCTION__'
The following patch fixes all the GCC 4.0 build errors. However, it
does need testing by an ftape user (to check old tapes still
read--there were some struct packing issues).
Regards,
Roger
diff -urN ftape-tools-1.09.2002.03.21.original/debian/changelog ftape-tools-1.09.2002.03.21/debian/changelog
--- ftape-tools-1.09.2002.03.21.original/debian/changelog 2005-07-24 12:10:54.000000000 +0100
+++ ftape-tools-1.09.2002.03.21/debian/changelog 2005-07-24 14:13:45.000000000 +0100
@@ -1,3 +1,28 @@
+ftape-tools (1:1.09.2002.03.21-0.4) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Fix several GCC 4.0 incompatibilies (Closes: #318533).
+ - src/ftformat/ftfmt-options.c: struct opt_parms.label is a
+ "u_int8_t *"; add appropriate typecasts.
+ - /src/ftformat/ftfmt-tapelib.c:
+ + Replace the use of the non-standard preprocessor macro
+ __FUNCTION__ with the C99 __func__.
+ + Include missing <stdlib.h>.
+ - src/ftformat/ftformat.c:
+ + Include missing <stdlib.h>.
+ + Add "char *" casts to quell signedness warnings.
+ - src/ftformat/ftformat.h, src/vtblc/ftvt.h: "__attribute__ ((packed))"
+ must come immediately after the end of the struct definition, not
+ after the typedef name.
+ - src/vtblc/libftvt.c:
+ + Add "char *" casts to quell signedness warnings.
+ + Add GET_SINGLE_BITFIELD_VALUE_ACTION and GET_SINGLE_BITFIELD_VALUE
+ macros to replace the use of GET_SINGLE_VALUE_ACTION and
+ GET_SINGLE_VALUE for bitfield values in structs. The latter
+ use the GCC typeof extension, which does not work with bifields.
+
+ -- Roger Leigh <rleigh@debian.org> Sun, 24 Jul 2005 14:13:33 +0100
+
ftape-tools (1:1.09.2002.03.21-0.3) unstable; urgency=low
* Uploading with maintainer set to QA group
diff -urN ftape-tools-1.09.2002.03.21.original/src/ftformat/ftfmt-options.c ftape-tools-1.09.2002.03.21/src/ftformat/ftfmt-options.c
--- ftape-tools-1.09.2002.03.21.original/src/ftformat/ftfmt-options.c 2000-07-23 14:55:40.000000000 +0100
+++ ftape-tools-1.09.2002.03.21/src/ftformat/ftfmt-options.c 2005-07-24 12:59:34.000000000 +0100
@@ -51,7 +51,7 @@
#include "version.h"
struct opt_parms opt = {
- FTAPE_DEF_LABEL,
+ (u_int8_t *) FTAPE_DEF_LABEL,
FTAPE_DEF_TAPE,
FT_BUFF_SIZE * NR_FTAPE_BUFFERS,
AUTO,
@@ -311,7 +311,7 @@
}
break;
case 'L':
- opt.label = optarg;
+ opt.label = (u_int8_t *) optarg;
break;
case 'M':
opt.dma_size = strtol(optarg, NULL, 0);
diff -urN ftape-tools-1.09.2002.03.21.original/src/ftformat/ftfmt-tapelib.c ftape-tools-1.09.2002.03.21/src/ftformat/ftfmt-tapelib.c
--- ftape-tools-1.09.2002.03.21.original/src/ftformat/ftfmt-tapelib.c 2000-07-23 23:47:59.000000000 +0100
+++ ftape-tools-1.09.2002.03.21/src/ftformat/ftfmt-tapelib.c 2005-07-24 12:18:25.000000000 +0100
@@ -36,6 +36,7 @@
#define MAP_FAILED (void *)(-1)
#endif
#include <stdio.h>
+#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
@@ -437,7 +438,7 @@
printf(_("Writing reference bursts ... "));
if (qic_simple_command(tape_fd, 0, QIC_ENTER_FORMAT_MODE, -1, 0, NULL)) {
- fprintf(stderr, "\n"__FUNCTION__ " %s", _("failed!\n"));
+ fprintf(stderr, "\n%s %s", __func__, _("failed!\n"));
return -1;
}
if (qic_simple_command(tape_fd, 0, QIC_WRITE_REFERENCE_BURST, -1, 940,
@@ -445,7 +446,7 @@
return -1;
}
if (!(status & QIC_STATUS_REFERENCED)) {
- fprintf(stderr, "\n"__FUNCTION__ " %s", _("failed!\n"));
+ fprintf(stderr, "\n%s %s", __func__, _("failed!\n"));
return -1;
}
printf(_("done.\n"));
@@ -804,7 +805,8 @@
}
if (buf_pos == buf_end) { /* cycle */
msync_offset = 0; /* reset to start of buffer */
- buf_start = (void*) buf_pos = buf;
+ buf_pos = buf;
+ buf_start = (void*) buf_pos;
}
}
/* We only sync after computing enough parameters for an entire page,
@@ -845,7 +847,7 @@
struct mtftformat_virtual fmtc;
if (qic_simple_command(tape_fd, 0, QIC_ENTER_FORMAT_MODE, -1, 0, NULL)) {
- fprintf(stderr, __FUNCTION__ " %s", _("failed!\n"));
+ fprintf(stderr, "%s %s", __func__, _("failed!\n"));
return -1;
}
trk = 0;
diff -urN ftape-tools-1.09.2002.03.21.original/src/ftformat/ftformat.c ftape-tools-1.09.2002.03.21/src/ftformat/ftformat.c
--- ftape-tools-1.09.2002.03.21.original/src/ftformat/ftformat.c 2002-03-21 22:00:14.000000000 +0000
+++ ftape-tools-1.09.2002.03.21/src/ftformat/ftformat.c 2005-07-24 13:00:26.000000000 +0100
@@ -31,6 +31,7 @@
#include <sys/types.h>
#include <stdio.h>
+#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <locale.h>
@@ -202,7 +203,7 @@
exit (1);
}
- if (compose_header_segment(hseg, opts.label, &tpparms)) {
+ if (compose_header_segment(hseg, (char *) opts.label, &tpparms)) {
tape_close(tape_fd, dma_buffer, opts.dma_size);
exit (1);
}
diff -urN ftape-tools-1.09.2002.03.21.original/src/ftformat/ftformat.h ftape-tools-1.09.2002.03.21/src/ftformat/ftformat.h
--- ftape-tools-1.09.2002.03.21.original/src/ftformat/ftformat.h 2001-08-11 01:08:58.000000000 +0100
+++ ftape-tools-1.09.2002.03.21/src/ftformat/ftformat.h 2005-07-24 12:55:27.000000000 +0100
@@ -45,11 +45,11 @@
typedef struct {
u_int8_t cyl; u_int8_t head; u_int8_t sect; u_int8_t size;
-} format_sector __attribute__ ((packed));
+} __attribute__ ((packed)) format_sector;
typedef struct {
format_sector sectors[FT_SECTORS_PER_SEGMENT];
-} format_segment __attribute__ ((packed));
+} __attribute__ ((packed)) format_segment;
#define MAX_FLOPPY_SECTOR 128 /* number of sectors per track */
#define SEGMENTS_PER_FLOPPY_TRACK (MAX_FLOPPY_SECTOR/FT_SECTORS_PER_SEGMENT)
diff -urN ftape-tools-1.09.2002.03.21.original/src/vtblc/ftvt.h ftape-tools-1.09.2002.03.21/src/vtblc/ftvt.h
--- ftape-tools-1.09.2002.03.21.original/src/vtblc/ftvt.h 2001-08-12 17:34:20.000000000 +0100
+++ ftape-tools-1.09.2002.03.21/src/vtblc/ftvt.h 2005-07-24 13:01:15.000000000 +0100
@@ -111,14 +111,14 @@
u_int8_t cmap;
u_int8_t qic113;
u_int8_t reserved[26-ZFT_SIGLEN-2-1-1];
-} zft_ext_qic80_t __attribute__ ((packed));
+} __attribute__ ((packed)) zft_ext_qic80_t;
typedef struct zft_ext_qic113 {
u_int8_t sig[ZFT_SIGLEN2];
u_int8_t version;
u_int16_t blksz;
u_int8_t reserved[8];
-} zft_ext_qic113_t __attribute__ ((packed));
+} __attribute__ ((packed)) zft_ext_qic113_t;
/* for bsm map stuff
*/
@@ -162,7 +162,7 @@
u_int8_t format;
u_int8_t reserved_2;
u_int8_t reserved_3;
-} ftvt_entry __attribute__ ((packed));
+} __attribute__ ((packed)) ftvt_entry;
typedef struct ftvt {
int num;
diff -urN ftape-tools-1.09.2002.03.21.original/src/vtblc/libftvt.c ftape-tools-1.09.2002.03.21/src/vtblc/libftvt.c
--- ftape-tools-1.09.2002.03.21.original/src/vtblc/libftvt.c 2001-08-11 01:16:32.000000000 +0100
+++ ftape-tools-1.09.2002.03.21/src/vtblc/libftvt.c 2005-07-24 13:27:06.000000000 +0100
@@ -680,26 +680,26 @@
printf("QIC_MINOR %d\n", volume->entry.ext.qic113.minor);
print_hex_line(stdout,
"VENDOR_EXTENSION \"",
- volume->entry.ext.qic113.ext,
+ (char *)volume->entry.ext.qic113.ext,
"\"\n", sizeof(volume->entry.ext.qic113.ext));
print_char_line(stdout,
"# ",
- volume->entry.ext.qic113.ext,
+ (char*)volume->entry.ext.qic113.ext,
"\n", sizeof(volume->entry.ext.qic113.ext));
} else {
print_hex_line(stdout,
"VENDOR_EXTENSION \"",
- volume->entry.ext.ext,
+ (char*)volume->entry.ext.ext,
"\"\n", sizeof(volume->entry.ext.ext));
print_char_line(stdout,
"# ",
- volume->entry.ext.ext,
+ (char*)volume->entry.ext.ext,
"\n", sizeof(volume->entry.ext.ext));
}
- print_hex_line(stdout, "PASSWORD \"", volume->entry.pwd, "\"\n",
- sizeof(volume->entry.pwd));
+ print_hex_line(stdout, "PASSWORD \"", (char *)volume->entry.pwd,
+ "\"\n", sizeof(volume->entry.pwd));
if (volume->entry.pwd[0] != '\0') {
- print_char_line(stdout, "# ", volume->entry.pwd, "\n",
+ print_char_line(stdout, "# ", (char *)volume->entry.pwd, "\n",
sizeof(volume->entry.pwd));
} else {
printf("# no password\n");
@@ -722,9 +722,10 @@
} else {
/* print remaining values as hex string */
print_hex_line(stdout,
- "VENDOR_DATA \"", &volume->bytes[56], "\"\n", 72);
+ "VENDOR_DATA \"", (char *)&volume->bytes[56],
+ "\"\n", 72);
print_char_line(stdout,
- "# ", &volume->bytes[56], "\n", 72);
+ "# ", (char *)&volume->bytes[56], "\n", 72);
}
}
@@ -812,28 +813,28 @@
*/
static void print_one_xtbl(const ftvt *volume)
{
- print_hex_line(stdout,
- "NAME \"", &volume->bytes[XTBL_NAME], "\"\n", 88);
- print_hex_line(stdout,
- "PASSWORD \"", &volume->bytes[XTBL_PWD], "\"\n", 16);
- print_hex_line(stdout,
- "RESERVED \"", &volume->bytes[XTBL_RES], "\"\n", 20);
+ print_hex_line(stdout, "NAME \"",
+ (char *)&volume->bytes[XTBL_NAME], "\"\n", 88);
+ print_hex_line(stdout, "PASSWORD \"",
+ (char *)&volume->bytes[XTBL_PWD], "\"\n", 16);
+ print_hex_line(stdout, "RESERVED \"",
+ (char *)&volume->bytes[XTBL_RES], "\"\n", 20);
}
static void print_one_utid(const ftvt *volume)
{
- print_hex_line(stdout,
- "NAME \"", &volume->bytes[UTID_NAME], "\"\n", 88);
- print_hex_line(stdout,
- "RESERVED \"", &volume->bytes[XTBL_RES], "\"\n", 36);
+ print_hex_line(stdout, "NAME \"",
+ (char *)&volume->bytes[UTID_NAME], "\"\n", 88);
+ print_hex_line(stdout, "RESERVED \"",
+ (char *)&volume->bytes[XTBL_RES], "\"\n", 36);
}
static void print_one_exvt(const ftvt *volume)
{
printf("PARENT %d\n", *(u_int16_t *)&volume->bytes[EXVT_PARENT]);
printf("CHILD %d\n", *(u_int16_t *)&volume->bytes[EXVT_CHILD]);
- print_hex_line(stdout,
- "RESERVED \"", &volume->bytes[EXVT_RES], "\"\n", 120);
+ print_hex_line(stdout, "RESERVED \"",
+ (char *)&volume->bytes[EXVT_RES], "\"\n", 120);
}
/* Print one volume table in tagged output format (i.e. keyword-value
@@ -868,9 +869,9 @@
}
}
if (i == NR_ITEMS(prt_handler)) { /* unknown signature */
- print_hex_line(stdout,
- "ENTRY_DATA \"", &volume->bytes[4], "\"\n", 124);
- print_char_line(stdout, "# ", &volume->bytes[4], "\n", 124);
+ print_hex_line(stdout, "ENTRY_DATA \"",
+ (char *)&volume->bytes[4], "\"\n", 124);
+ print_char_line(stdout, "# ", (char *)&volume->bytes[4], "\n", 124);
}
}
@@ -918,13 +919,13 @@
*
* tag : the keyword
* conv: conversion characater (like d, u, L etc.) for the numeric value
- * dest: Location to store the value in.
+ * dest: Location to store the value in (NOT a bitfield).
* action: something. Must allow a semicolon at end.
*
*/
#define GET_SINGLE_VALUE_ACTION(tag, conv, dest, action) \
{ \
- typeof(dest) value; /* cope with bitfields */ \
+ typeof(dest) value; \
\
if (strncmp(#tag, buffer, sizeof(#tag)-1) == 0) { \
if (sscanf(buffer, #tag" %"#conv, &value) == 1) { \
@@ -943,12 +944,47 @@
*
* tag : the keyword
* conv: conversion characater (like d, u, L etc.) for the numeric value
- * dest: Location to store the value in.
+ * dest: Location to store the value in (NOT a bitfield).
*
*/
#define GET_SINGLE_VALUE(tag, conv, dest) \
GET_SINGLE_VALUE_ACTION(tag, conv, dest, /**/)
+/* Internal use. Get a single bitfield value and do something
+ *
+ * tag : the keyword
+ * conv: conversion characater (like d, u, L etc.) for the numeric value
+ * dest: Bitfield location to store the value in.
+ * action: something. Must allow a semicolon at end.
+ *
+ */
+#define GET_SINGLE_BITFIELD_VALUE_ACTION(tag, conv, dest, action) \
+{ \
+ unsigned int value; /* storage for bitfield */ \
+ \
+ if (strncmp(#tag, buffer, sizeof(#tag)-1) == 0) { \
+ if (sscanf(buffer, #tag" %"#conv, &value) == 1) { \
+ (dest) = value; \
+ action; \
+ } else { \
+ ftvt_error(_("Corrupt volume input data: %s\n"), \
+ buffer); \
+ return -1; \
+ } \
+ continue; \
+ } \
+}
+
+/* Internal use. Get a single bitfield value.
+ *
+ * tag : the keyword
+ * conv: conversion characater (like d, u, L etc.) for the numeric value
+ * dest: Bitfield location to store the value in.
+ *
+ */
+#define GET_SINGLE_BITFIELD_VALUE(tag, conv, dest) \
+ GET_SINGLE_BITFIELD_VALUE_ACTION(tag, conv, dest, /**/)
+
/* Internal use only. Get a string value.
*
* tag: the keyword.
@@ -1071,7 +1107,7 @@
ftvt_error(_("Corrupt volume input data\n"));
return -1;
}
- GET_STRING_VALUE(SIGNATURE, volume->ftvt_sig, 4,
+ GET_STRING_VALUE(SIGNATURE, (char *)volume->ftvt_sig, 4,
{
int i;
@@ -1098,38 +1134,38 @@
GET_SINGLE_VALUE_ACTION(END, i, volume->end, end_seen = 1);
GET_SINGLE_VALUE_ACTION (NUM_SEGMENTS, i, volume->num_segments,
num_segments_seen = 1);
- GET_STRING_VALUE(DESCRIPTION, volume->ftvt_desc, 44,
+ GET_STRING_VALUE(DESCRIPTION, (char *)volume->ftvt_desc, 44,
memset(volume->ftvt_desc + strlen(value), ' ',
44 - strlen(value)));
GET_STRING_VALUE(DATE, NULL, 1024,
{ if (ftvt_set_date(volumes, maxnum, value, num)) {
return -1;
} });
- GET_SINGLE_VALUE(FLAG_VENDOR_SPECIFIC, i,
- volume->entry.vendor_specific);
+ GET_SINGLE_BITFIELD_VALUE(FLAG_VENDOR_SPECIFIC, (char *)i,
+ volume->entry.vendor_specific);
GET_SINGLE_VALUE(QIC_MAJOR, i, volume->entry.ext.qic113.major);
GET_SINGLE_VALUE(QIC_MINOR, i, volume->entry.ext.qic113.minor);
- GET_STRING_VALUE(VENDOR_DATA, &volume->bytes[56], 72, /**/);
+ GET_STRING_VALUE(VENDOR_DATA, (char *)&volume->bytes[56], 72, /**/);
if (volume->entry.vendor_specific &&
(volume->fmt_code == fmt_big ||
(volume->fmt_code != fmt_big &&
volume->entry.ext.qic113.major != 113))) {
continue; /* ignore all other tags */
}
- GET_SINGLE_VALUE(FLAG_MULTI_CARTRIDGE, i,
- volume->entry.multi_cartridge);
- GET_SINGLE_VALUE(FLAG_NOT_VERIFIED, i,
- volume->entry.not_verified);
- GET_SINGLE_VALUE(FLAG_REDIRECTION_INHIBIT, i,
- volume->entry.inhibit_redirection);
- GET_SINGLE_VALUE(FLAG_SEGMENT_SPANNING, i,
- volume->entry.segment_spanning);
- GET_SINGLE_VALUE(FLAG_DIRECTORY_LAST, i,
- volume->entry.directory_last);
- GET_SINGLE_VALUE(FLAG_RESERVED_6, i,
- volume->entry.fl_reserved_6);
- GET_SINGLE_VALUE(FLAG_RESERVED_7, i,
- volume->entry.fl_reserved_7);
+ GET_SINGLE_BITFIELD_VALUE(FLAG_MULTI_CARTRIDGE, i,
+ volume->entry.multi_cartridge);
+ GET_SINGLE_BITFIELD_VALUE(FLAG_NOT_VERIFIED, i,
+ volume->entry.not_verified);
+ GET_SINGLE_BITFIELD_VALUE(FLAG_REDIRECTION_INHIBIT, i,
+ volume->entry.inhibit_redirection);
+ GET_SINGLE_BITFIELD_VALUE(FLAG_SEGMENT_SPANNING, i,
+ volume->entry.segment_spanning);
+ GET_SINGLE_BITFIELD_VALUE(FLAG_DIRECTORY_LAST, i,
+ volume->entry.directory_last);
+ GET_SINGLE_BITFIELD_VALUE(FLAG_RESERVED_6, i,
+ volume->entry.fl_reserved_6);
+ GET_SINGLE_BITFIELD_VALUE(FLAG_RESERVED_7, i,
+ volume->entry.fl_reserved_7);
GET_SINGLE_VALUE(MULTI_CARTRIDGE_COUNT, i,
volume->entry.m_no);
GET_SINGLE_VALUE(DIRECTORY_SIZE, i,
@@ -1188,7 +1224,8 @@
while (isspace(*p)) p++;
while (*p != '\0' && !isspace(*p)) p++;
} });
- GET_STRING_VALUE(SOURCE_DRIVE, volume->entry.source_drive, 16,
+ GET_STRING_VALUE(SOURCE_DRIVE,
+ (char*)volume->entry.source_drive, 16,
/**/);
break;
case xtbl:
@@ -1507,7 +1544,7 @@
ftvt_error(_("Volume number too big or negative: %d\n"), vtbl_no);
return -1;
}
- strncpy(volumes[vtbl_no].ftvt_desc, desc, 44);
+ strncpy((char *)volumes[vtbl_no].ftvt_desc, desc, 44);
if ((len = strlen(desc)) < 44) {
memset(volumes[vtbl_no].ftvt_desc + len, ' ', 44 - len);
}
--
Roger Leigh
Printing on GNU/Linux? http://gimp-print.sourceforge.net/
Debian GNU/Linux http://www.debian.org/
GPG Public Key: 0x25BFB848. Please sign and encrypt your mail.
Reply to: