--- /dev/null
+#!/usr/bin/perl -w\r
+\r
+$Usage =<< ".";\r
+\r
+This is the rfs program\r
+\r
+After run nfsscan, you will get a file-list file in the output\r
+\r
+This perl program do post processing based on this file\r
+\r
+\r
+.\r
+\r
+$writebuf = "R" x 8193;\r
+$writeBlockSize = 8192;\r
+\r
+\r
+main ();\r
+\r
+sub rfsCreateFile()\r
+{\r
+ my ($path, $pathcnt, $sizeHexStr) = @_;\r
+ $sizeHexStr = "0x".$sizeHexStr;\r
+\r
+ my $dir = $path;\r
+ my $name = '';\r
+ my $cmdbuf;\r
+\r
+ $dir =~ /(^.*)\/(.*)/;\r
+ $dir = $1;\r
+ $name = $2;\r
+ if (!$dir) {$dir = ".";}\r
+ die "name is empty\n" if (!$name);\r
+ #print "path($path) dir($dir) name($name)\n";\r
+\r
+ if (! -e $dir) {\r
+ $cmdbuf = "mkdir -p $dir";\r
+ system $cmdbuf;\r
+ print "RFS: Warning: the directory should be created already: $path\n";\r
+ } else {\r
+ die "warning: directory name exist but not a directory: $path\n" if (!(-d $dir));\r
+ }\r
+\r
+ my $size = hex($sizeHexStr);\r
+ my $remSize = $size % $writeBlockSize;\r
+ my $lp = ($size - $remSize) / $writeBlockSize;\r
+ #print "size($sizeHexStr) lp($lp) rem($remSize)\n";\r
+\r
+ open RFSTMPWRITE, ">$path" || die "RFS: can not open file for write";\r
+\r
+ my $i = 0;\r
+ for ($i = 0; $i < $lp; $i++) {\r
+ syswrite(RFSTMPWRITE, $writebuf, $writeBlockSize);\r
+ }\r
+ if ($remSize) {\r
+ syswrite(RFSTMPWRITE, $writebuf, $remSize);\r
+ #print "write ($remSize) byte\n";\r
+ }\r
+ close RFSTMPWRITE;\r
+}\r
+\r
+# Useful commands:\r
+# sort -n -k a,b -c -u \r
+# \r
+#\r
+\r
+sub main {\r
+\r
+ my $cmdbuf;\r
+ \r
+ # skip comment lines\r
+ # if (path_count ($6) == 0 or original_op($9) == "create" or "mkdir") skip the file \r
+\r
+ $cmdbuf = 'gawk \' !/^[#]/ { if ($6 != "0" && $9 != "create" && $9 != "mkdir") print $0 }\' test.fil > active.fil';\r
+ print "$cmdbuf\n";\r
+ system $cmdbuf;\r
+ \r
+ # sort the active.fil according to path_count\r
+ $cmdbuf = 'sort -k 5,5 active.fil > active.fil.order';\r
+ print "$cmdbuf\n";\r
+ system $cmdbuf;\r
+ $cmdbuf = 'sort -n -k 6,6 active.fil > active.fil.order-pathcnt';\r
+ print "$cmdbuf\n";\r
+ system $cmdbuf;\r
+\r
+ # keep the interested field only\r
+ # 2(D/F) 4(FH) 5(path) 6(count) 7(size) 8(mode)\r
+ $cmdbuf = 'gawk \' { print $2, $4, $5, $6, $7, $8 }\' active.fil.order > active';\r
+ print "$cmdbuf\n";\r
+ system $cmdbuf;\r
+ $cmdbuf = 'gawk \' { print $4, $5 }\' active.fil.order > fh-path-map';\r
+ print "$cmdbuf\n";\r
+ system $cmdbuf;\r
+ $cmdbuf = 'gawk \' { print $2, $4, $5, $6, $7, $8 }\' active.fil.order-pathcnt > active-pathcnt';\r
+ print "$cmdbuf\n";\r
+ system $cmdbuf;\r
+ $cmdbuf = 'gawk \' { print $4, $5 }\' active.fil.order-pathcnt > fh-path-map-pathcnt';\r
+ print "$cmdbuf\n";\r
+ system $cmdbuf;\r
+\r
+ #exit(0);\r
+ \r
+ # so far, you got the following information\r
+ # in active: all files/dirs active \r
+ # in noattrdir-root: a set of fhs pointing to RFSNN0\r
+ # in rfsinfo: a set of dir fhs refer to RFSNNxxx(>0)\r
+ # a set of file fhs should be discard due to short of information\r
+\r
+ # create the active fs\r
+ # 1. BASEDIR/RFSNN0\r
+ # 2. BASEDIR/active\r
+ $cmdbuf = "mkdir -p RFSFS/RFSNN0";\r
+ system $cmdbuf;\r
+ open RFS_ACTIVE, "active";\r
+ while (<RFS_ACTIVE>) {\r
+ chop;\r
+ my ($type, $fh, $path, $pathcnt, $sizeHexStr, $mode) = split (' ', $_, 7);\r
+ if ($type eq "D") {\r
+ $cmdbuf = "mkdir -p RFSFS$path";\r
+ system $cmdbuf;\r
+ }\r
+ else {\r
+ &rfsCreateFile("RFSFS$path", $pathcnt, $sizeHexStr);\r
+ }\r
+ \r
+ }\r
+\r
+ # create map table: key (fh), value (path/fn)\r
+\r
+ # check whether there is fh that is not mapped to any path/fn in the trace\r
+\r
+ # simulate a replay of trace\r
+\r
+ return;\r
+ \r
+}\r
+\r
+1;\r