diff options
Diffstat (limited to 'usr.sbin/ctm/mkCTM/mkCTM')
-rw-r--r-- | usr.sbin/ctm/mkCTM/mkCTM | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/usr.sbin/ctm/mkCTM/mkCTM b/usr.sbin/ctm/mkCTM/mkCTM new file mode 100644 index 0000000..5d94fa3 --- /dev/null +++ b/usr.sbin/ctm/mkCTM/mkCTM @@ -0,0 +1,147 @@ +#!/usr/local/bin/tclsh + +source $argv + +set tmp $CTMtmp +set dd $CTMdest +set d1 $CTMcopy +set d2 $CTMref +set foo $CTMdate +set foo $CTMprefix +set foo $CTMname + +exec rm -f $tmp.* + +set f1 [open "| ./ctm_scan $d1"] +set f2 [open "| ./ctm_scan $d2"] + +set fo_del [open $tmp.del w] +set fo_rmdir [open $tmp.rmdir w] +set fo_mkdir [open $tmp.mkdir w] +set fo_files [open $tmp.files w] +set changes 0 + +#### +# Find CTM# +for {set i 0} {1} {incr i} { + if {[file exists [format "%s/$CTMname.%04d" $dd $i]]} continue + if {[file exists [format "%s/$CTMname.%04d.gz" $dd $i]]} continue + break +} +set CTMnbr $i + +puts "Doing CTMname $CTMname CTMnbr $CTMnbr CTMdate $CTMdate" + +##### +# Type Name Mode User Group Barf Size Hash + +proc CTMadd {t n m u g b s h} { + global fo_files fo_mkdir changes d2 + puts stderr "A $b $t $n" + if {$t == "d"} { + puts $fo_mkdir "CTMDM $n $u $g $m" + incr changes + return + } + puts $fo_files "CTMFM $n $u $g $m $h $s" + flush $fo_files + exec cat $d2/$n >@ $fo_files + puts $fo_files "" + incr changes + return +} +proc CTMdel {t n m u g b s h} { + global fo_del fo_rmdir changes + puts stderr "D $b $t $n" + if {$t == "d"} { + puts $fo_rmdir "CTMDR $n" + incr changes + return + } + puts $fo_del "CTMFR $n $h" + incr changes + return +} +proc CTMchg {t1 n1 m1 u1 g1 b1 s1 h1 t2 n2 m2 u2 g2 b2 s2 h2} { + global fo_files d2 d1 changes + if {$t1 == "d" && $t2 == "d"} { + return + } + if {$t1 == "d" || $t2 == "d"} { + CTMdel $t1 $n1 $m1 $u1 $g1 $b1 $s1 $h1 + CTMadd $t2 $n2 $m2 $u2 $g2 $b2 $s2 $h2 + return + } + if {"x$h1" == "x$h2" && $s1 == $s2} { + return + puts stderr "M $b1$b2 $t1$t2 $n1" + puts $fo_files "CTMFA $n2 $u2 $g2 $m2 $h2" + incr changes + return + } + if {$b1 != "0" || $b2 != "0"} { + puts stderr "R $b1$b2 $t1$t2 $n1" + puts $fo_files "CTMFS $n2 $u2 $g2 $m2 $h1 $h2 $s2" + flush $fo_files + exec cat $d2/$n2 >@ $fo_files + puts $fo_files "" + incr changes + return + } + puts stderr "E $b1$b2 $t1$t2 $n1" + set i [catch "exec diff -e $d1/$n1 $d2/$n2 > tmp" j] + set s [file size tmp] + puts $fo_files "CTMFE $n1 $u2 $g2 $m2 $h1 $h2 $s" + flush $fo_files + exec cat tmp >@ $fo_files + puts $fo_files "" + incr changes +} +##### +set l1 "" +set l2 "" + +while 1 { + + if {$l1 == ""} {gets $f1 l1} + + if {$l2 == ""} {gets $f2 l2} + + if {$l1 == "" && $l2 == ""} break + + set n1 [lindex $l1 1] + set n2 [lindex $l2 1] + + if {$l1 == $l2} { set l1 "" ; set l2 "" ; continue } + + if {$l1 == "" } { eval CTMadd $l2 ; set l2 "" ; continue } + + if {$l2 == "" } { eval CTMdel $l1 ; set l1 "" ; continue } + + if {$n1 < $n2 } { eval CTMdel $l1 ; set l1 "" ; continue } + + if {$n1 > $n2 } { eval CTMadd $l2 ; set l2 "" ; continue } + + if {$n1 == $n2} { eval CTMchg $l1 $l2 ; set l1 "" ; set l2 "" ; continue } +} + +close $fo_del +close $fo_rmdir +close $fo_mkdir +close $fo_files + +exec echo CTM_BEGIN 2.0 $CTMname $CTMnbr $CTMdate $CTMprefix > $tmp.begin +exec echo -n "CTM_END " >> $tmp.end +set m [exec cat $tmp.begin $tmp.del $tmp.rmdir $tmp.mkdir $tmp.files $tmp.end | md5] +exec echo "$m" >> $tmp.end + +if {!$changes} { + puts "no changes" + exec sh -c "rm -f $tmp.*" + exit 0 +} + +set nm [format "%s/%s.%04d" $dd $CTMname $CTMnbr] +exec cat $tmp.begin $tmp.del $tmp.rmdir $tmp.mkdir $tmp.files $tmp.end | gzip -9 -v > ${nm}.gz 2>@ stdout +exec sh -c "rm -f $tmp.*" +exec sh -e -x -c "cd $CTMcopy ; /root/CTM/ctm -v -v -v ${nm}.gz" >&@ stdout |