#!/usr/bin/perl -w use strict; sub ls { local *D; opendir(D, $_[0]) || return (); my @r = grep {$_ ne '.' && $_ ne '..'} readdir(D); closedir D; return @r; } my $xenswap = $ARGV[0] || die "please specify output file"; die("$xenswap: $!\n") unless -e $xenswap; open(S, '>', $xenswap) || die("$xenswap: $!\n"); # placeholder for buildstatus information syswrite(S, 'x'x512); my $topdir = '/.build.packages'; if (-l $topdir) { $topdir = '/'.readlink($topdir) || die("readlink: $!"); } my @dirs = map {"$topdir/RPMS/$_"} ls("$topdir/RPMS"); unshift @dirs, "$topdir/SRPMS"; unshift @dirs, "$topdir/DEBS"; unshift @dirs, "$topdir/KIWI"; my @packs; for my $dir (@dirs) { push @packs, map {"$dir/$_"} grep {-f "$dir/$_"} ls($dir); } #unshift @packs, '/.build.log'; my $cpio = ''; for my $pack (@packs) { print "$pack\n"; my @s = stat($pack); my $n = $pack; $n =~ s/.*\///; $n = 'logfile' if $n eq '.build.log'; die("$pack: $!\n") unless @s; $cpio .= "07070100000000000081a4000000000000000000000001"; $cpio .= sprintf("%08x%08x", $s[9], $s[7]); $cpio .= "00000000000000000000000000000000"; $cpio .= sprintf("%08x", length($n) + 1); $cpio .= "00000000"; $cpio .= "$n\0"; $cpio .= substr("\0\0\0\0", (length($cpio) & 3)) if length($cpio) & 3; open(F, '<', $pack) || die("$pack: $!\n"); my $l = $s[7]; while ($l) { my $ll = sysread(F, $cpio, $l > 8192 ? 8192 : $l, length($cpio)); die("$pack: $!\n") unless $ll; die if $ll > $l; $l -= $ll; while (length($cpio) > 4096) { (syswrite(S, $cpio, 4096) || 0) == 4096 || die("swap write: $!\n"); $cpio = substr($cpio, 4096); } } $cpio .= substr("\0\0\0\0", (length($cpio) & 3)) if length($cpio) & 3; } $cpio .= "07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000b00000000TRAILER!!!\0\0\0\0"; $cpio .= "\0" x (4096 - length($cpio) % 4096) if length($cpio) % 4096; while (length($cpio)) { (syswrite(S, $cpio, 4096) || 0) == 4096 || die("swap write: $!\n"); $cpio = substr($cpio, 4096); }