*** cpio-2.4.2/copyout.c.orig Wed Jan 10 17:10:45 1996 --- cpio-2.4.2/copyout.c Tue May 25 07:01:20 1999 *************** *** 44,49 **** --- 44,51 ---- struct new_cpio_header *file_hdr; int out_des; { + /* This is a GCC or libc 6 bug workaround... */ + int libc6_fix_dev, libc6_fix_rdev; /* can't be where it should be -- see below */ if (archive_format == arf_newascii || archive_format == arf_crcascii) { char ascii_header[112]; *************** *** 108,122 **** int dev = 0, rdev = 0; #endif if ((file_hdr->c_ino >> 16) != 0) error (0, 0, "%s: truncating inode number", file_hdr->c_name); sprintf (ascii_header, "%06o%06o%06lo%06lo%06lo%06lo%06lo%06o%011lo%06lo%011lo", ! file_hdr->c_magic & 0xFFFF, dev & 0xFFFF, file_hdr->c_ino & 0xFFFF, file_hdr->c_mode & 0xFFFF, file_hdr->c_uid & 0xFFFF, file_hdr->c_gid & 0xFFFF, ! file_hdr->c_nlink & 0xFFFF, rdev & 0xFFFF, file_hdr->c_mtime, file_hdr->c_namesize & 0xFFFF, file_hdr->c_filesize); tape_buffered_write (ascii_header, out_des, 76L); --- 110,135 ---- int dev = 0, rdev = 0; #endif + /* This is a GCC or libc 6 bug workaround... ifndef __MSDOS__, + GCC dev_t is of 'unsigned long long int' type, which is making sprintf + bug out with confused output as a result below. To fix this without + rewriting libc 6.0, libc6_fix_dev and libc6_fix_rdev is used here: */ + + /* Can't have this declaration here - is getting parse error before `int' + int libc6_fix_dev, libc6_fix_rdev; */ + + libc6_fix_dev = dev & 0xFFFF; + libc6_fix_rdev = rdev & 0xFFFF; + if ((file_hdr->c_ino >> 16) != 0) error (0, 0, "%s: truncating inode number", file_hdr->c_name); sprintf (ascii_header, "%06o%06o%06lo%06lo%06lo%06lo%06lo%06o%011lo%06lo%011lo", ! file_hdr->c_magic & 0xFFFF, libc6_fix_dev & 0xFFFF, file_hdr->c_ino & 0xFFFF, file_hdr->c_mode & 0xFFFF, file_hdr->c_uid & 0xFFFF, file_hdr->c_gid & 0xFFFF, ! file_hdr->c_nlink & 0xFFFF, libc6_fix_rdev & 0xFFFF, file_hdr->c_mtime, file_hdr->c_namesize & 0xFFFF, file_hdr->c_filesize); tape_buffered_write (ascii_header, out_des, 76L);