diff -ru5 ftt_orig/ftt_lib/ftt_defines.h ftt_new/ftt_lib/ftt_defines.h --- ftt_orig/ftt_lib/ftt_defines.h 1999-11-15 14:06:48.000000000 -0600 +++ ftt_new/ftt_lib/ftt_defines.h 2003-02-12 16:36:55.000000000 -0600 @@ -162,14 +162,15 @@ extern char *ftt_label_type_names[]; #define FTT_ANSI_HEADER 0 #define FTT_FMB_HEADER 1 #define FTT_TAR_HEADER 2 #define FTT_CPIO_HEADER 3 -#define FTT_UNKNOWN_HEADER 4 -#define FTT_BLANK_HEADER 5 -#define FTT_DONTCHECK_HEADER 6 -#define FTT_MAX_HEADER 7 +#define FTT_IBM_HEADER 4 +#define FTT_UNKNOWN_HEADER 5 +#define FTT_BLANK_HEADER 6 +#define FTT_DONTCHECK_HEADER 7 +#define FTT_MAX_HEADER 8 /* readonly Values */ #define FTT_RDWR 0 diff -ru5 ftt_orig/ftt_lib/ftt_label.c ftt_new/ftt_lib/ftt_label.c --- ftt_orig/ftt_lib/ftt_label.c 1998-05-26 15:23:34.000000000 -0500 +++ ftt_new/ftt_lib/ftt_label.c 2003-02-12 16:37:03.000000000 -0600 @@ -1,23 +1,29 @@ static char rcsid[] = "@(#)$Id: ftt_label.c,v 1.16 1998/05/26 20:23:34 mengel Exp $"; #include #include "ftt_private.h" #include -#define pack(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d)) +#define pack(a,b,c,d) \ + (((((long) a) << 24) & 0xFF000000) | \ + ((((long) b) << 16) & 0x00FF0000) | \ + ((((long) c) << 8) & 0x0000FF00) | \ + (((long) d) & 0x000000FF)) +// ((((long)a)<<24)|(((long)b)<<16)|(((long)c)<<8)|((long)d)) int ftt_format_label_version( char *, int, char *, int, int, char ); char *ftt_label_type_names[] = { /* FTT_ANSI_HEADER 0 */ "FTT_ANSI_HEADER", /* FTT_FMB_HEADER 1 */ "FTT_FMB_HEADER", /* FTT_TAR_HEADER 2 */ "FTT_TAR_HEADER", /* FTT_CPIO_HEADER 3 */ "FTT_CPIO_HEADER", - /* FTT_UNKNOWN_HEADER 4 */ "FTT_UNKNOWN_HEADER", - /* FTT_BLANK_HEADER 5 */ "FTT_BLANK_HEADER", - /* FTT_DONTCHECK_HEADER 6 */ "FTT_DONTCHECK_HEADER", - /* FTT_MAX_HEADER 7 */ "FTT_MAX_HEADER", + /* FTT_IBM_HEADER 4 */ "FTT_IBM_HEADER", + /* FTT_UNKNOWN_HEADER 5 */ "FTT_UNKNOWN_HEADER", + /* FTT_BLANK_HEADER 6 */ "FTT_BLANK_HEADER", + /* FTT_DONTCHECK_HEADER 7 */ "FTT_DONTCHECK_HEADER", + /* FTT_MAX_HEADER 8 */ "FTT_MAX_HEADER", }; int ftt_guess_label(char *buf, int length, char **vol, int *vlen) { char *p; @@ -51,11 +57,11 @@ ftt_eprintf("Ok\n"); ftt_errno = FTT_SUCCESS; /* pick the ones we can with the first 4 bytes */ - switch(pack(buf[0],buf[1],buf[2],buf[3])) { + switch (pack(buf[0],buf[1],buf[2],buf[3])) { case pack('V','O','L','1'): if (vol) *vol = buf+4; /* trim blanks -- loop has to stop at least when it hits the '1' */ p = buf+10; @@ -67,10 +73,26 @@ case pack('0','7','0','7'): if (vol) *vol = buf + 0156; if (vlen) *vlen = strlen(*vol); return FTT_CPIO_HEADER; + + case pack(0xE5, 0xD6, 0xD3, 0xF1): + if (vol) *vol = buf + 4; + /* trim blanks -- loop has to stop at least when it hits the '1' */ + /* EBCDIC ... 0x40 = space */ + p = buf+10; + while (0x40 == *p) { + p--; + } + if (vlen) *vlen = (p - (buf + 4)) + 1; + return FTT_IBM_HEADER; + + /* FIDIAN: Debugging line made things easier for me + default: + printf("Unknown %x\n", (long) pack(buf[0], buf[1], buf[2], buf[3])); + */ } /* check for a tar header */ if (pack('u','s','t','a')==pack(buf[0401],buf[0402],buf[0403],buf[0404])) { @@ -129,20 +151,42 @@ if ( version == 0 ) { /* default is 4 */ version = '4'; } ftt_to_upper(volbuf); if (length >= 80) { - sprintf(buf, "VOL1%-6.6s%-1.1s%-13.13s%-13.13s%-14.14s%-28.28s%-1.1d", + sprintf(buf, "VOL1%-6.6s%-1.1s%-13.13s%-13.13s%-14.14s%-28.28s%-1.1d", volbuf, " ", " ", "ftt", " ", " " , version); return 80; } else { ftt_errno = FTT_EBLKSIZE; ftt_eprintf("ftt_format_label: the buffer size of %d is too small for the indicated header type."); return -1; } break; + case FTT_IBM_HEADER: + // volbuf must already be in EBCDIC + // volbuf must be 6 byes long + // Use spaces (0x40 in EBCDIC) to pad volbuf to the correct size + ftt_to_upper(volbuf); + if (length >= 80) + if (length >= 80) { + memset(buf, 0x40, length); + buf[0] = 0xE5; + buf[1] = 0xD6; + buf[2] = 0xD3; + buf[3] = 0xF1; + sprintf(buf, "%c%c%c%c%-6.6s", + 0xE5, 0xD6, 0xD3, 0xF1, volbuf); + return 80; + } else { + ftt_errno = FTT_EBLKSIZE; + ftt_eprintf("ftt_format_label: the buffer size of %d is too small for the indicated header type."); + return -1; + } + break; + case FTT_FMB_HEADER: if (length >= 2048) { sprintf(buf, "%s\n%s\n%s\n%s\n", volbuf, "never", "cpio", "16k"); return 2048; diff -ru5 ftt_orig/include/ftt_defines.h ftt_new/include/ftt_defines.h --- ftt_orig/include/ftt_defines.h 2002-07-25 13:38:34.000000000 -0500 +++ ftt_new/include/ftt_defines.h 2003-02-12 16:37:13.000000000 -0600 @@ -162,14 +162,15 @@ extern char *ftt_label_type_names[]; #define FTT_ANSI_HEADER 0 #define FTT_FMB_HEADER 1 #define FTT_TAR_HEADER 2 #define FTT_CPIO_HEADER 3 -#define FTT_UNKNOWN_HEADER 4 -#define FTT_BLANK_HEADER 5 -#define FTT_DONTCHECK_HEADER 6 -#define FTT_MAX_HEADER 7 +#define FTT_IBM_HEADER 4 +#define FTT_UNKNOWN_HEADER 5 +#define FTT_BLANK_HEADER 6 +#define FTT_DONTCHECK_HEADER 7 +#define FTT_MAX_HEADER 8 /* readonly Values */ #define FTT_RDWR 0