Hex Artifact Content

Artifact 18ee9a3f9ae533c1fd664cda0bd9b5abf446f338:


0000: 23 21 20 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20  #! /usr/bin/env 
0010: 74 63 6c 73 68 0a 0a 73 65 74 20 6f 62 73 66 75  tclsh..set obsfu
0020: 63 61 74 65 20 30 0a 69 66 20 7b 5b 6c 69 6e 64  cate 0.if {[lind
0030: 65 78 20 24 61 72 67 76 20 65 6e 64 5d 20 3d 3d  ex $argv end] ==
0040: 20 22 2d 2d 6f 62 73 66 75 63 61 74 65 22 7d 20   "--obsfucate"} 
0050: 7b 0a 09 73 65 74 20 6f 62 73 66 75 63 61 74 65  {..set obsfucate
0060: 20 31 0a 0a 09 73 65 74 20 61 72 67 76 20 5b 6c   1...set argv [l
0070: 72 61 6e 67 65 20 24 61 72 67 76 20 30 20 65 6e  range $argv 0 en
0080: 64 2d 31 5d 0a 7d 0a 0a 69 66 20 7b 5b 6c 6c 65  d-1].}..if {[lle
0090: 6e 67 74 68 20 24 61 72 67 76 5d 20 21 3d 20 32  ngth $argv] != 2
00a0: 7d 20 7b 0a 09 70 75 74 73 20 73 74 64 65 72 72  } {..puts stderr
00b0: 20 22 55 73 61 67 65 3a 20 64 69 72 32 63 2e 74   "Usage: dir2c.t
00c0: 63 6c 20 3c 68 61 73 68 6b 65 79 3e 20 3c 73 74  cl <hashkey> <st
00d0: 61 72 74 64 69 72 3e 20 5c 5b 2d 2d 6f 62 73 66  artdir> \[--obsf
00e0: 75 63 61 74 65 5c 5d 22 0a 0a 09 65 78 69 74 20  ucate\]"...exit 
00f0: 31 0a 7d 0a 0a 73 65 74 20 68 61 73 68 6b 65 79  1.}..set hashkey
0100: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 30   [lindex $argv 0
0110: 5d 0a 73 65 74 20 73 74 61 72 74 64 69 72 20 5b  ].set startdir [
0120: 6c 69 6e 64 65 78 20 24 61 72 67 76 20 31 5d 0a  lindex $argv 1].
0130: 0a 70 72 6f 63 20 73 68 6f 72 74 65 6e 5f 66 69  .proc shorten_fi
0140: 6c 65 20 7b 64 69 72 20 66 69 6c 65 7d 20 7b 0a  le {dir file} {.
0150: 09 73 65 74 20 64 69 72 4e 61 6d 65 4c 65 6e 20  .set dirNameLen 
0160: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
0170: 64 69 72 5d 0a 0a 09 69 66 20 7b 5b 73 74 72 69  dir]...if {[stri
0180: 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65 20 30  ng range $file 0
0190: 20 5b 65 78 70 72 20 7b 24 64 69 72 4e 61 6d 65   [expr {$dirName
01a0: 4c 65 6e 20 2d 20 31 7d 5d 5d 20 3d 3d 20 24 64  Len - 1}]] == $d
01b0: 69 72 7d 20 7b 0a 09 09 73 65 74 20 66 69 6c 65  ir} {...set file
01c0: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
01d0: 66 69 6c 65 20 24 64 69 72 4e 61 6d 65 4c 65 6e  file $dirNameLen
01e0: 20 65 6e 64 5d 0a 09 7d 0a 0a 09 69 66 20 7b 5b   end]..}...if {[
01f0: 73 74 72 69 6e 67 20 69 6e 64 65 78 20 24 66 69  string index $fi
0200: 6c 65 20 30 5d 20 3d 3d 20 22 2f 22 7d 20 7b 0a  le 0] == "/"} {.
0210: 09 09 73 65 74 20 66 69 6c 65 20 5b 73 74 72 69  ..set file [stri
0220: 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65 20 31  ng range $file 1
0230: 20 65 6e 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e   end]..}..return
0240: 20 24 66 69 6c 65 0a 7d 0a 0a 70 72 6f 63 20 72   $file.}..proc r
0250: 65 63 75 72 73 69 76 65 5f 67 6c 6f 62 20 7b 64  ecursive_glob {d
0260: 69 72 7d 20 7b 0a 09 73 65 74 20 63 68 69 6c 64  ir} {..set child
0270: 72 65 6e 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d  ren [glob -nocom
0280: 70 6c 61 69 6e 20 2d 64 69 72 65 63 74 6f 72 79  plain -directory
0290: 20 24 64 69 72 20 2a 5d 0a 0a 09 73 65 74 20 72   $dir *]...set r
02a0: 65 74 20 5b 6c 69 73 74 20 24 64 69 72 5d 0a 09  et [list $dir]..
02b0: 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63  foreach child $c
02c0: 68 69 6c 64 72 65 6e 20 7b 0a 09 09 75 6e 73 65  hildren {...unse
02d0: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 63 68  t -nocomplain ch
02e0: 69 6c 64 69 6e 66 6f 0a 09 09 63 61 74 63 68 20  ildinfo...catch 
02f0: 7b 0a 09 09 09 66 69 6c 65 20 73 74 61 74 20 24  {....file stat $
0300: 63 68 69 6c 64 20 63 68 69 6c 64 69 6e 66 6f 0a  child childinfo.
0310: 09 09 7d 0a 0a 09 09 69 66 20 7b 21 5b 69 6e 66  ..}....if {![inf
0320: 6f 20 65 78 69 73 74 73 20 63 68 69 6c 64 69 6e  o exists childin
0330: 66 6f 28 74 79 70 65 29 5d 7d 20 7b 0a 09 09 09  fo(type)]} {....
0340: 63 6f 6e 74 69 6e 75 65 0a 09 09 7d 0a 0a 09 09  continue...}....
0350: 69 66 20 7b 24 63 68 69 6c 64 69 6e 66 6f 28 74  if {$childinfo(t
0360: 79 70 65 29 20 3d 3d 20 22 64 69 72 65 63 74 6f  ype) == "directo
0370: 72 79 22 7d 20 7b 0a 09 09 09 66 6f 72 65 61 63  ry"} {....foreac
0380: 68 20 61 64 64 20 5b 72 65 63 75 72 73 69 76 65  h add [recursive
0390: 5f 67 6c 6f 62 20 24 63 68 69 6c 64 5d 20 7b 0a  _glob $child] {.
03a0: 09 09 09 09 6c 61 70 70 65 6e 64 20 72 65 74 20  ....lappend ret 
03b0: 24 61 64 64 0a 09 09 09 7d 0a 0a 09 09 09 63 6f  $add....}.....co
03c0: 6e 74 69 6e 75 65 0a 09 09 7d 0a 0a 09 09 69 66  ntinue...}....if
03d0: 20 7b 24 63 68 69 6c 64 69 6e 66 6f 28 74 79 70   {$childinfo(typ
03e0: 65 29 20 21 3d 20 22 66 69 6c 65 22 7d 20 7b 0a  e) != "file"} {.
03f0: 09 09 09 63 6f 6e 74 69 6e 75 65 0a 09 09 7d 0a  ...continue...}.
0400: 0a 09 09 6c 61 70 70 65 6e 64 20 72 65 74 20 24  ...lappend ret $
0410: 63 68 69 6c 64 0a 09 7d 0a 0a 09 72 65 74 75 72  child..}...retur
0420: 6e 20 24 72 65 74 0a 7d 0a 0a 23 20 43 6f 6e 76  n $ret.}..# Conv
0430: 65 72 74 20 61 20 73 74 72 69 6e 67 20 69 6e 74  ert a string int
0440: 6f 20 61 20 43 2d 73 74 79 6c 65 20 62 69 6e 61  o a C-style bina
0450: 72 79 20 73 74 72 69 6e 67 0a 23 23 20 58 58 58  ry string.## XXX
0460: 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
0470: 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 74 69  needs to be opti
0480: 6d 69 7a 65 64 0a 70 72 6f 63 20 73 74 72 69 6e  mized.proc strin
0490: 67 69 66 79 20 7b 64 61 74 61 7d 20 7b 0a 09 73  gify {data} {..s
04a0: 65 74 20 72 65 74 20 22 5c 22 22 0a 09 66 6f 72  et ret "\""..for
04b0: 20 7b 73 65 74 20 69 64 78 20 30 7d 20 7b 24 69   {set idx 0} {$i
04c0: 64 78 20 3c 20 5b 73 74 72 69 6e 67 20 6c 65 6e  dx < [string len
04d0: 67 74 68 20 24 64 61 74 61 5d 7d 20 7b 69 6e 63  gth $data]} {inc
04e0: 72 20 69 64 78 7d 20 7b 0a 09 09 62 69 6e 61 72  r idx} {...binar
04f0: 79 20 73 63 61 6e 20 5b 73 74 72 69 6e 67 20 69  y scan [string i
0500: 6e 64 65 78 20 24 64 61 74 61 20 24 69 64 78 5d  ndex $data $idx]
0510: 20 48 2a 20 63 68 61 72 0a 0a 09 09 61 70 70 65   H* char....appe
0520: 6e 64 20 72 65 74 20 22 5c 5c 78 24 7b 63 68 61  nd ret "\\x${cha
0530: 72 7d 22 0a 0a 09 09 69 66 20 7b 28 24 69 64 78  r}"....if {($idx
0540: 20 25 20 32 30 29 20 3d 3d 20 30 20 26 26 20 24   % 20) == 0 && $
0550: 69 64 78 20 21 3d 20 30 7d 20 7b 0a 09 09 09 61  idx != 0} {....a
0560: 70 70 65 6e 64 20 72 65 74 20 22 5c 22 5c 6e 5c  ppend ret "\"\n\
0570: 22 22 0a 09 09 7d 0a 09 7d 0a 0a 09 73 65 74 20  ""...}..}...set 
0580: 72 65 74 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  ret [string trim
0590: 20 24 72 65 74 20 22 5c 6e 5c 22 22 5d 0a 0a 09   $ret "\n\""]...
05a0: 73 65 74 20 72 65 74 20 22 5c 22 24 72 65 74 5c  set ret "\"$ret\
05b0: 22 22 0a 0a 09 72 65 74 75 72 6e 20 24 72 65 74  ""...return $ret
05c0: 0a 7d 0a 0a 23 20 45 6e 63 72 79 70 74 20 74 68  .}..# Encrypt th
05d0: 65 20 64 61 74 61 0a 70 72 6f 63 20 72 61 6e 64  e data.proc rand
05e0: 6f 6d 5f 62 79 74 65 20 7b 7d 20 7b 0a 09 73 65  om_byte {} {..se
05f0: 74 20 76 61 6c 75 65 20 5b 65 78 70 72 20 7b 69  t value [expr {i
0600: 6e 74 28 32 35 36 20 2a 20 72 61 6e 64 28 29 29  nt(256 * rand())
0610: 7d 5d 0a 0a 09 72 65 74 75 72 6e 20 24 76 61 6c  }]...return $val
0620: 75 65 0a 7d 0a 0a 70 72 6f 63 20 65 6e 63 72 79  ue.}..proc encry
0630: 70 74 5f 6b 65 79 5f 67 65 6e 65 72 61 74 65 20  pt_key_generate 
0640: 7b 6d 65 74 68 6f 64 7d 20 7b 0a 09 73 77 69 74  {method} {..swit
0650: 63 68 20 2d 2d 20 24 6d 65 74 68 6f 64 20 7b 0a  ch -- $method {.
0660: 09 09 22 72 6f 74 61 74 65 5f 73 75 62 73 74 22  .."rotate_subst"
0670: 20 7b 0a 09 09 09 73 65 74 20 6b 65 79 28 6d 65   {....set key(me
0680: 74 68 6f 64 29 20 24 6d 65 74 68 6f 64 0a 09 09  thod) $method...
0690: 09 73 65 74 20 6b 65 79 28 72 6f 74 61 74 65 5f  .set key(rotate_
06a0: 6c 65 6e 67 74 68 29 20 5b 72 61 6e 64 6f 6d 5f  length) [random_
06b0: 62 79 74 65 5d 0a 0a 09 09 09 73 65 74 20 6b 65  byte].....set ke
06c0: 79 5f 64 61 74 61 20 5b 6c 69 73 74 5d 0a 09 09  y_data [list]...
06d0: 09 77 68 69 6c 65 20 7b 5b 6c 6c 65 6e 67 74 68  .while {[llength
06e0: 20 24 6b 65 79 5f 64 61 74 61 5d 20 21 3d 20 32   $key_data] != 2
06f0: 35 36 7d 20 7b 0a 09 09 09 09 73 65 74 20 76 61  56} {.....set va
0700: 6c 75 65 20 5b 72 61 6e 64 6f 6d 5f 62 79 74 65  lue [random_byte
0710: 5d 0a 09 09 09 09 69 66 20 7b 5b 6c 73 65 61 72  ].....if {[lsear
0720: 63 68 20 2d 65 78 61 63 74 20 24 6b 65 79 5f 64  ch -exact $key_d
0730: 61 74 61 20 24 76 61 6c 75 65 5d 20 21 3d 20 2d  ata $value] != -
0740: 31 7d 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e  1} {......contin
0750: 75 65 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6c 61  ue.....}......la
0760: 70 70 65 6e 64 20 6b 65 79 5f 64 61 74 61 20 24  ppend key_data $
0770: 76 61 6c 75 65 0a 09 09 09 7d 0a 0a 09 09 09 66  value....}.....f
0780: 6f 72 65 61 63 68 20 76 61 6c 75 65 20 24 6b 65  oreach value $ke
0790: 79 5f 64 61 74 61 20 7b 0a 09 09 09 09 61 70 70  y_data {.....app
07a0: 65 6e 64 20 6b 65 79 28 73 75 62 73 74 29 20 5b  end key(subst) [
07b0: 66 6f 72 6d 61 74 20 25 63 20 24 76 61 6c 75 65  format %c $value
07c0: 5d 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72  ]....}.....retur
07d0: 6e 20 5b 61 72 72 61 79 20 67 65 74 20 6b 65 79  n [array get key
07e0: 5d 0a 09 09 7d 0a 09 7d 0a 09 65 72 72 6f 72 20  ]...}..}..error 
07f0: 22 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64  "not implemented
0800: 22 0a 7d 0a 0a 70 72 6f 63 20 65 6e 63 72 79 70  ".}..proc encryp
0810: 74 5f 6b 65 79 5f 65 78 70 6f 72 74 20 7b 6b 65  t_key_export {ke
0820: 79 5f 64 69 63 74 20 74 61 72 67 65 74 7d 20 7b  y_dict target} {
0830: 0a 09 61 72 72 61 79 20 73 65 74 20 6b 65 79 20  ..array set key 
0840: 24 6b 65 79 5f 64 69 63 74 0a 0a 09 73 77 69 74  $key_dict...swit
0850: 63 68 20 2d 2d 20 24 6b 65 79 28 6d 65 74 68 6f  ch -- $key(metho
0860: 64 29 20 7b 0a 09 09 22 72 6f 74 61 74 65 5f 73  d) {..."rotate_s
0870: 75 62 73 74 22 20 7b 0a 09 09 09 73 77 69 74 63  ubst" {....switc
0880: 68 20 2d 2d 20 24 74 61 72 67 65 74 20 7b 0a 09  h -- $target {..
0890: 09 09 09 22 63 22 20 7b 0a 09 09 09 09 09 73 65  ..."c" {......se
08a0: 74 20 72 65 74 76 61 6c 20 22 2e 74 79 70 65 20  t retval ".type 
08b0: 3d 20 43 56 46 53 5f 4b 45 59 54 59 50 45 5f 52  = CVFS_KEYTYPE_R
08c0: 4f 54 41 54 45 5f 53 55 42 53 54 2c 5c 6e 22 0a  OTATE_SUBST,\n".
08d0: 09 09 09 09 09 61 70 70 65 6e 64 20 72 65 74 76  .....append retv
08e0: 61 6c 20 22 2e 74 79 70 65 64 61 74 61 2e 72 6f  al ".typedata.ro
08f0: 74 61 74 65 5f 73 75 62 73 74 2e 72 6f 74 61 74  tate_subst.rotat
0900: 65 5f 6c 65 6e 67 74 68 20 3d 20 24 6b 65 79 28  e_length = $key(
0910: 72 6f 74 61 74 65 5f 6c 65 6e 67 74 68 29 2c 5c  rotate_length),\
0920: 6e 22 0a 09 09 09 09 09 61 70 70 65 6e 64 20 72  n"......append r
0930: 65 74 76 61 6c 20 22 2e 74 79 70 65 64 61 74 61  etval ".typedata
0940: 2e 72 6f 74 61 74 65 5f 73 75 62 73 74 2e 73 75  .rotate_subst.su
0950: 62 73 74 20 20 20 20 20 20 20 20 20 3d 20 28 75  bst         = (u
0960: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
0970: 5b 73 74 72 69 6e 67 69 66 79 20 24 6b 65 79 28  [stringify $key(
0980: 73 75 62 73 74 29 5d 5c 6e 22 0a 0a 09 09 09 09  subst)]\n"......
0990: 09 72 65 74 75 72 6e 20 24 72 65 74 76 61 6c 0a  .return $retval.
09a0: 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09  ....}....}...}..
09b0: 7d 0a 0a 09 65 72 72 6f 72 20 22 6e 6f 74 20 69  }...error "not i
09c0: 6d 70 6c 65 6d 65 6e 74 65 64 22 0a 7d 0a 0a 70  mplemented".}..p
09d0: 72 6f 63 20 65 6e 63 72 79 70 74 20 7b 64 61 74  roc encrypt {dat
09e0: 61 20 6b 65 79 5f 64 69 63 74 20 7b 64 65 63 72  a key_dict {decr
09f0: 79 70 74 20 30 7d 7d 20 7b 0a 09 61 72 72 61 79  ypt 0}} {..array
0a00: 20 73 65 74 20 6b 65 79 20 24 6b 65 79 5f 64 69   set key $key_di
0a10: 63 74 0a 0a 09 73 77 69 74 63 68 20 2d 2d 20 24  ct...switch -- $
0a20: 6b 65 79 28 6d 65 74 68 6f 64 29 20 7b 0a 09 09  key(method) {...
0a30: 22 72 6f 74 61 74 65 5f 73 75 62 73 74 22 20 7b  "rotate_subst" {
0a40: 0a 09 09 09 73 65 74 20 72 65 74 76 61 6c 20 22  ....set retval "
0a50: 22 0a 09 09 09 73 65 74 20 64 61 74 61 6c 65 6e  "....set datalen
0a60: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0a70: 24 64 61 74 61 5d 0a 0a 09 09 09 66 6f 72 20 7b  $data].....for {
0a80: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 24  set i 0} {$i < $
0a90: 64 61 74 61 6c 65 6e 7d 20 7b 69 6e 63 72 20 69  datalen} {incr i
0aa0: 20 24 6b 65 79 28 72 6f 74 61 74 65 5f 6c 65 6e   $key(rotate_len
0ab0: 67 74 68 29 7d 20 7b 0a 09 09 09 09 73 65 74 20  gth)} {.....set 
0ac0: 6d 61 70 20 5b 6c 69 73 74 5d 0a 09 09 09 09 66  map [list].....f
0ad0: 6f 72 20 7b 73 65 74 20 6a 20 30 7d 20 7b 24 6a  or {set j 0} {$j
0ae0: 20 3c 20 32 35 36 7d 20 7b 69 6e 63 72 20 6a 7d   < 256} {incr j}
0af0: 20 7b 0a 09 09 09 09 09 69 66 20 7b 24 64 65 63   {......if {$dec
0b00: 72 79 70 74 7d 20 7b 0a 09 09 09 09 09 09 6c 61  rypt} {.......la
0b10: 70 70 65 6e 64 20 6d 61 70 20 5b 66 6f 72 6d 61  ppend map [forma
0b20: 74 20 25 63 20 24 6a 5d 20 5b 73 74 72 69 6e 67  t %c $j] [string
0b30: 20 69 6e 64 65 78 20 24 6b 65 79 28 73 75 62 73   index $key(subs
0b40: 74 29 20 24 6a 5d 0a 09 09 09 09 09 7d 20 65 6c  t) $j]......} el
0b50: 73 65 20 7b 0a 09 09 09 09 09 09 6c 61 70 70 65  se {.......lappe
0b60: 6e 64 20 6d 61 70 20 5b 73 74 72 69 6e 67 20 69  nd map [string i
0b70: 6e 64 65 78 20 24 6b 65 79 28 73 75 62 73 74 29  ndex $key(subst)
0b80: 20 24 6a 5d 20 5b 66 6f 72 6d 61 74 20 25 63 20   $j] [format %c 
0b90: 24 6a 5d 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  $j]......}.....}
0ba0: 0a 0a 09 09 09 09 73 65 74 20 65 6e 64 20 5b 65  ......set end [e
0bb0: 78 70 72 20 7b 24 69 20 2b 20 24 6b 65 79 28 72  xpr {$i + $key(r
0bc0: 6f 74 61 74 65 5f 6c 65 6e 67 74 68 29 20 2d 20  otate_length) - 
0bd0: 31 7d 5d 0a 0a 09 09 09 09 73 65 74 20 62 6c 6f  1}]......set blo
0be0: 63 6b 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  ck [string range
0bf0: 20 24 64 61 74 61 20 24 69 20 24 65 6e 64 5d 0a   $data $i $end].
0c00: 09 09 09 09 73 65 74 20 62 6c 6f 63 6b 20 5b 73  ....set block [s
0c10: 74 72 69 6e 67 20 6d 61 70 20 24 6d 61 70 20 24  tring map $map $
0c20: 62 6c 6f 63 6b 5d 0a 0a 09 09 09 09 61 70 70 65  block]......appe
0c30: 6e 64 20 72 65 74 76 61 6c 20 24 62 6c 6f 63 6b  nd retval $block
0c40: 0a 0a 09 09 09 09 73 65 74 20 6b 65 79 5f 65 6e  ......set key_en
0c50: 64 20 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 20  d [string index 
0c60: 24 6b 65 79 28 73 75 62 73 74 29 20 30 5d 0a 09  $key(subst) 0]..
0c70: 09 09 09 73 65 74 20 6b 65 79 28 73 75 62 73 74  ...set key(subst
0c80: 29 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  ) [string range 
0c90: 24 6b 65 79 28 73 75 62 73 74 29 20 31 20 65 6e  $key(subst) 1 en
0ca0: 64 5d 24 6b 65 79 5f 65 6e 64 0a 09 09 09 7d 0a  d]$key_end....}.
0cb0: 0a 09 09 09 72 65 74 75 72 6e 20 24 72 65 74 76  ....return $retv
0cc0: 61 6c 0a 09 09 7d 0a 09 09 22 61 65 73 22 20 7b  al...}..."aes" {
0cd0: 0a 09 09 09 70 61 63 6b 61 67 65 20 72 65 71 75  ....package requ
0ce0: 69 72 65 20 61 65 73 0a 09 09 7d 0a 09 7d 0a 09  ire aes...}..}..
0cf0: 65 72 72 6f 72 20 22 6e 6f 74 20 69 6d 70 6c 65  error "not imple
0d00: 6d 65 6e 74 65 64 22 0a 7d 0a 0a 70 72 6f 63 20  mented".}..proc 
0d10: 64 65 63 72 79 70 74 20 7b 64 61 74 61 20 6b 65  decrypt {data ke
0d20: 79 5f 64 69 63 74 7d 20 7b 0a 09 72 65 74 75 72  y_dict} {..retur
0d30: 6e 20 5b 65 6e 63 72 79 70 74 20 24 64 61 74 61  n [encrypt $data
0d40: 20 24 6b 65 79 5f 64 69 63 74 20 31 5d 0a 7d 0a   $key_dict 1].}.
0d50: 0a 23 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .# This function
0d60: 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e   must be kept in
0d70: 2d 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 67  -sync with the g
0d80: 65 6e 65 72 61 74 65 64 20 43 20 66 75 6e 63 74  enerated C funct
0d90: 69 6f 6e 20 62 65 6c 6f 77 0a 70 72 6f 63 20 63  ion below.proc c
0da0: 76 66 73 5f 68 61 73 68 20 7b 70 61 74 68 7d 20  vfs_hash {path} 
0db0: 7b 0a 09 73 65 74 20 68 20 30 0a 09 73 65 74 20  {..set h 0..set 
0dc0: 67 20 30 0a 0a 09 66 6f 72 20 7b 73 65 74 20 69  g 0...for {set i
0dd0: 64 78 20 30 7d 20 7b 24 69 64 78 20 3c 20 5b 73  dx 0} {$idx < [s
0de0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 61  tring length $pa
0df0: 74 68 5d 7d 20 7b 69 6e 63 72 20 69 64 78 7d 20  th]} {incr idx} 
0e00: 7b 0a 09 09 62 69 6e 61 72 79 20 73 63 61 6e 20  {...binary scan 
0e10: 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 20 24 70  [string index $p
0e20: 61 74 68 20 24 69 64 78 5d 20 48 2a 20 63 68 61  ath $idx] H* cha
0e30: 72 0a 09 09 73 65 74 20 63 68 61 72 20 22 30 78  r...set char "0x
0e40: 24 63 68 61 72 22 0a 0a 09 09 73 65 74 20 68 20  $char"....set h 
0e50: 5b 65 78 70 72 20 7b 28 24 68 20 3c 3c 20 34 29  [expr {($h << 4)
0e60: 20 2b 20 24 63 68 61 72 7d 5d 0a 09 09 73 65 74   + $char}]...set
0e70: 20 67 20 5b 65 78 70 72 20 7b 24 68 20 26 20 30   g [expr {$h & 0
0e80: 78 66 30 30 30 30 30 30 30 7d 5d 0a 09 09 69 66  xf0000000}]...if
0e90: 20 7b 24 67 20 21 3d 20 30 7d 20 7b 0a 09 09 09   {$g != 0} {....
0ea0: 73 65 74 20 68 20 5b 65 78 70 72 20 7b 28 24 68  set h [expr {($h
0eb0: 20 26 20 30 78 66 66 66 66 66 66 66 66 29 20 5e   & 0xffffffff) ^
0ec0: 20 28 24 67 20 3e 3e 20 32 34 29 7d 5d 0a 09 09   ($g >> 24)}]...
0ed0: 7d 0a 0a 09 09 73 65 74 20 68 20 5b 65 78 70 72  }....set h [expr
0ee0: 20 7b 24 68 20 26 20 28 28 7e 24 67 29 20 26 20   {$h & ((~$g) & 
0ef0: 30 78 66 66 66 66 66 66 66 66 29 7d 5d 0a 09 7d  0xffffffff)}]..}
0f00: 0a 0a 09 72 65 74 75 72 6e 20 24 68 0a 7d 0a 0a  ...return $h.}..
0f10: 23 20 49 66 20 65 6e 63 72 79 70 74 69 6f 6e 20  # If encryption 
0f20: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 67 65  is requested, ge
0f30: 6e 65 72 61 74 65 20 61 20 6b 65 79 0a 69 66 20  nerate a key.if 
0f40: 7b 24 6f 62 73 66 75 63 61 74 65 7d 20 7b 0a 09  {$obsfucate} {..
0f50: 73 65 74 20 6f 62 73 66 75 63 61 74 69 6f 6e 5f  set obsfucation_
0f60: 6b 65 79 20 5b 65 6e 63 72 79 70 74 5f 6b 65 79  key [encrypt_key
0f70: 5f 67 65 6e 65 72 61 74 65 20 22 72 6f 74 61 74  _generate "rotat
0f80: 65 5f 73 75 62 73 74 22 5d 0a 7d 0a 0a 23 20 47  e_subst"].}..# G
0f90: 65 6e 65 72 61 74 65 20 6c 69 73 74 20 6f 66 20  enerate list of 
0fa0: 66 69 6c 65 73 20 74 6f 20 69 6e 63 6c 75 64 65  files to include
0fb0: 20 69 6e 20 6f 75 74 70 75 74 0a 73 65 74 20 66   in output.set f
0fc0: 69 6c 65 73 20 5b 72 65 63 75 72 73 69 76 65 5f  iles [recursive_
0fd0: 67 6c 6f 62 20 24 73 74 61 72 74 64 69 72 5d 0a  glob $startdir].
0fe0: 0a 23 20 49 6e 73 65 72 74 20 64 75 6d 6d 79 20  .# Insert dummy 
0ff0: 65 6e 74 72 79 20 63 6f 6f 72 65 73 70 6f 6e 64  entry coorespond
1000: 69 6e 67 20 74 6f 20 43 20 64 75 6d 6d 79 20 65  ing to C dummy e
1010: 6e 74 72 79 0a 73 65 74 20 66 69 6c 65 73 20 5b  ntry.set files [
1020: 6c 69 6e 73 65 72 74 20 24 66 69 6c 65 73 20 30  linsert $files 0
1030: 20 22 5f 5f 44 55 4d 4d 59 5f 5f 22 5d 0a 0a 23   "__DUMMY__"]..#
1040: 20 50 72 6f 64 75 63 65 20 43 38 39 20 63 6f 6d   Produce C89 com
1050: 70 61 74 69 62 6c 65 20 68 65 61 64 65 72 0a 73  patible header.s
1060: 65 74 20 63 70 70 5f 74 61 67 20 22 43 56 46 53  et cpp_tag "CVFS
1070: 5f 5b 73 74 72 69 6e 67 20 74 6f 75 70 70 65 72  _[string toupper
1080: 20 24 68 61 73 68 6b 65 79 5d 22 0a 73 65 74 20   $hashkey]".set 
1090: 63 6f 64 65 5f 74 61 67 20 22 63 76 66 73 5f 5b  code_tag "cvfs_[
10a0: 73 74 72 69 6e 67 20 74 6f 6c 6f 77 65 72 20 24  string tolower $
10b0: 68 61 73 68 6b 65 79 5d 22 0a 73 65 74 20 68 61  hashkey]".set ha
10c0: 73 68 6b 65 79 20 5b 73 74 72 69 6e 67 20 74 6f  shkey [string to
10d0: 6c 6f 77 65 72 20 24 68 61 73 68 6b 65 79 5d 0a  lower $hashkey].
10e0: 0a 70 75 74 73 20 22 23 69 66 6e 64 65 66 20 24  .puts "#ifndef $
10f0: 63 70 70 5f 74 61 67 22 0a 70 75 74 73 20 22 23  cpp_tag".puts "#
1100: 20 20 64 65 66 69 6e 65 20 24 63 70 70 5f 74 61    define $cpp_ta
1110: 67 20 31 22 0a 70 75 74 73 20 7b 0a 23 20 20 69  g 1".puts {.#  i
1120: 66 64 65 66 20 48 41 56 45 5f 53 54 44 43 0a 23  fdef HAVE_STDC.#
1130: 20 20 20 20 69 66 6e 64 65 66 20 48 41 56 45 5f      ifndef HAVE_
1140: 55 4e 49 53 54 44 5f 48 0a 23 20 20 20 20 20 20  UNISTD_H.#      
1150: 64 65 66 69 6e 65 20 48 41 56 45 5f 55 4e 49 53  define HAVE_UNIS
1160: 54 44 5f 48 20 31 0a 23 20 20 20 20 65 6e 64 69  TD_H 1.#    endi
1170: 66 0a 23 20 20 20 20 69 66 6e 64 65 66 20 48 41  f.#    ifndef HA
1180: 56 45 5f 53 54 52 49 4e 47 5f 48 0a 23 20 20 20  VE_STRING_H.#   
1190: 20 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 53     define HAVE_S
11a0: 54 52 49 4e 47 5f 48 20 31 0a 23 20 20 20 20 65  TRING_H 1.#    e
11b0: 6e 64 69 66 0a 23 20 20 20 20 69 66 6e 64 65 66  ndif.#    ifndef
11c0: 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a 23   HAVE_STDLIB_H.#
11d0: 20 20 20 20 20 20 64 65 66 69 6e 65 20 48 41 56        define HAV
11e0: 45 5f 53 54 44 4c 49 42 5f 48 20 31 0a 23 20 20  E_STDLIB_H 1.#  
11f0: 20 20 65 6e 64 69 66 0a 23 20 20 65 6e 64 69 66    endif.#  endif
1200: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 55  .#  ifdef HAVE_U
1210: 4e 49 53 54 44 5f 48 0a 23 20 20 20 20 69 6e 63  NISTD_H.#    inc
1220: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
1230: 23 20 20 65 6e 64 69 66 0a 23 20 20 69 66 64 65  #  endif.#  ifde
1240: 66 20 48 41 56 45 5f 53 54 52 49 4e 47 5f 48 0a  f HAVE_STRING_H.
1250: 23 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 73 74  #    include <st
1260: 72 69 6e 67 2e 68 3e 0a 23 20 20 65 6e 64 69 66  ring.h>.#  endif
1270: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 53  .#  ifdef HAVE_S
1280: 54 44 4c 49 42 5f 48 0a 23 20 20 20 20 69 6e 63  TDLIB_H.#    inc
1290: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
12a0: 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 69 66 6e  #  endif..#  ifn
12b0: 64 65 66 20 4c 4f 41 44 45 44 5f 43 56 46 53 5f  def LOADED_CVFS_
12c0: 43 4f 4d 4d 4f 4e 0a 23 20 20 20 20 64 65 66 69  COMMON.#    defi
12d0: 6e 65 20 4c 4f 41 44 45 44 5f 43 56 46 53 5f 43  ne LOADED_CVFS_C
12e0: 4f 4d 4d 4f 4e 20 31 0a 0a 74 79 70 65 64 65 66  OMMON 1..typedef
12f0: 20 65 6e 75 6d 20 7b 0a 09 43 56 46 53 5f 46 49   enum {..CVFS_FI
1300: 4c 45 54 59 50 45 5f 46 49 4c 45 20 20 20 20 20  LETYPE_FILE     
1310: 20 20 20 20 20 20 20 3d 20 30 2c 0a 09 43 56 46         = 0,..CVF
1320: 53 5f 46 49 4c 45 54 59 50 45 5f 44 49 52 20 20  S_FILETYPE_DIR  
1330: 20 20 20 20 20 20 20 20 20 20 20 3d 20 31 2c 0a             = 1,.
1340: 09 43 56 46 53 5f 46 49 4c 45 54 59 50 45 5f 45  .CVFS_FILETYPE_E
1350: 4e 43 52 59 50 54 45 44 5f 46 49 4c 45 20 20 3d  NCRYPTED_FILE  =
1360: 20 32 2c 0a 09 43 56 46 53 5f 46 49 4c 45 54 59   2,..CVFS_FILETY
1370: 50 45 5f 43 4f 4d 50 52 45 53 53 45 44 5f 46 49  PE_COMPRESSED_FI
1380: 4c 45 20 3d 20 34 2c 0a 7d 20 63 76 66 73 5f 66  LE = 4,.} cvfs_f
1390: 69 6c 65 74 79 70 65 5f 74 3b 0a 0a 73 74 72 75  iletype_t;..stru
13a0: 63 74 20 63 76 66 73 5f 64 61 74 61 20 7b 0a 09  ct cvfs_data {..
13b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 20 20 20  const char *    
13c0: 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3b 0a 09           name;..
13d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 20 20  unsigned long   
13e0: 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 3b 0a           index;.
13f0: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 20  .unsigned long  
1400: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 3b 0a            size;.
1410: 09 63 76 66 73 5f 66 69 6c 65 74 79 70 65 5f 74  .cvfs_filetype_t
1420: 20 20 20 20 20 20 20 20 20 20 74 79 70 65 3b 0a            type;.
1430: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  .const unsigned 
1440: 63 68 61 72 20 2a 20 20 20 20 64 61 74 61 3b 0a  char *    data;.
1450: 09 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  .int            
1460: 20 20 20 20 20 20 20 20 20 20 66 72 65 65 3b 0a            free;.
1470: 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  };..typedef enum
1480: 20 7b 0a 09 43 56 46 53 5f 4b 45 59 54 59 50 45   {..CVFS_KEYTYPE
1490: 5f 52 4f 54 41 54 45 5f 53 55 42 53 54 20 20 20  _ROTATE_SUBST   
14a0: 20 20 3d 20 30 2c 0a 7d 20 63 76 66 73 5f 6b 65    = 0,.} cvfs_ke
14b0: 79 74 79 70 65 5f 74 3b 0a 0a 73 74 72 75 63 74  ytype_t;..struct
14c0: 20 63 76 66 73 5f 6b 65 79 20 7b 0a 09 63 76 66   cvfs_key {..cvf
14d0: 73 5f 6b 65 79 74 79 70 65 5f 74 20 74 79 70 65  s_keytype_t type
14e0: 3b 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74 72  ;..union {...str
14f0: 75 63 74 20 7b 0a 09 09 09 69 6e 74 20 72 6f 74  uct {....int rot
1500: 61 74 65 5f 6c 65 6e 67 74 68 3b 0a 09 09 09 75  ate_length;....u
1510: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 75  nsigned char *su
1520: 62 73 74 3b 0a 09 09 7d 20 72 6f 74 61 74 65 5f  bst;...} rotate_
1530: 73 75 62 73 74 3b 0a 09 7d 20 74 79 70 65 64 61  subst;..} typeda
1540: 74 61 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 75  ta;.};..static u
1550: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 76 66  nsigned long cvf
1560: 73 5f 68 61 73 68 28 63 6f 6e 73 74 20 75 6e 73  s_hash(const uns
1570: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 61 74 68  igned char *path
1580: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
1590: 6e 67 20 69 2c 20 68 20 3d 20 30 2c 20 67 20 3d  ng i, h = 0, g =
15a0: 20 30 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30   0;...for (i = 0
15b0: 3b 20 70 61 74 68 5b 69 5d 3b 20 69 2b 2b 29 20  ; path[i]; i++) 
15c0: 7b 0a 09 09 68 20 3d 20 28 68 20 3c 3c 20 34 29  {...h = (h << 4)
15d0: 20 2b 20 70 61 74 68 5b 69 5d 3b 0a 09 09 67 20   + path[i];...g 
15e0: 3d 20 68 20 26 20 30 78 66 30 30 30 30 30 30 30  = h & 0xf0000000
15f0: 3b 0a 09 09 69 66 20 28 67 29 20 7b 0a 09 09 09  ;...if (g) {....
1600: 68 20 5e 3d 20 28 67 20 3e 3e 20 32 34 29 3b 0a  h ^= (g >> 24);.
1610: 09 09 7d 0a 09 09 68 20 26 3d 20 28 28 7e 67 29  ..}...h &= ((~g)
1620: 20 26 20 30 78 66 66 66 66 66 66 66 66 4c 55 29   & 0xffffffffLU)
1630: 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20 0a 20 20  ;..}.        .  
1640: 20 20 20 20 20 20 72 65 74 75 72 6e 28 68 29 3b        return(h);
1650: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .}..static int c
1660: 76 66 73 5f 64 65 63 72 79 70 74 28 75 6e 73 69  vfs_decrypt(unsi
1670: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 2c 20  gned char *out, 
1680: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1690: 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65  har *in, unsigne
16a0: 64 20 6c 6f 6e 67 20 69 6e 5f 6f 75 74 5f 6c 65  d long in_out_le
16b0: 6e 67 74 68 2c 20 73 74 72 75 63 74 20 63 76 66  ngth, struct cvf
16c0: 73 5f 6b 65 79 20 2a 6b 65 79 29 20 7b 0a 09 75  s_key *key) {..u
16d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 3b 0a  nsigned long i;.
16e0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69  .unsigned char i
16f0: 6e 5f 63 68 2c 20 6f 75 74 5f 63 68 3b 0a 09 69  n_ch, out_ch;..i
1700: 6e 74 20 63 68 5f 69 64 78 3b 0a 0a 09 66 6f 72  nt ch_idx;...for
1710: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 69 6e 5f   (i = 0; i < in_
1720: 6f 75 74 5f 6c 65 6e 67 74 68 3b 20 69 2b 2b 29  out_length; i++)
1730: 20 7b 0a 09 09 69 6e 5f 63 68 20 3d 20 69 6e 5b   {...in_ch = in[
1740: 69 5d 3b 0a 0a 09 09 63 68 5f 69 64 78 20 3d 20  i];....ch_idx = 
1750: 28 69 6e 5f 63 68 20 2b 20 28 69 20 2f 20 6b 65  (in_ch + (i / ke
1760: 79 2d 3e 74 79 70 65 64 61 74 61 2e 72 6f 74 61  y->typedata.rota
1770: 74 65 5f 73 75 62 73 74 2e 72 6f 74 61 74 65 5f  te_subst.rotate_
1780: 6c 65 6e 67 74 68 29 29 20 25 20 32 35 36 3b 0a  length)) % 256;.
1790: 0a 09 09 6f 75 74 5f 63 68 20 3d 20 6b 65 79 2d  ...out_ch = key-
17a0: 3e 74 79 70 65 64 61 74 61 2e 72 6f 74 61 74 65  >typedata.rotate
17b0: 5f 73 75 62 73 74 2e 73 75 62 73 74 5b 63 68 5f  _subst.subst[ch_
17c0: 69 64 78 5d 3b 0a 09 09 6f 75 74 5b 69 5d 20 3d  idx];...out[i] =
17d0: 20 6f 75 74 5f 63 68 3b 0a 09 7d 0a 0a 09 72 65   out_ch;..}...re
17e0: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 23 20 20 65  turn(0);.}..#  e
17f0: 6e 64 69 66 20 2f 2a 20 21 4c 4f 41 44 45 44 5f  ndif /* !LOADED_
1800: 43 56 46 53 5f 43 4f 4d 4d 4f 4e 20 2a 2f 7d 0a  CVFS_COMMON */}.
1810: 70 75 74 73 20 22 22 0a 0a 70 75 74 73 20 22 73  puts ""..puts "s
1820: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 76 66  tatic struct cvf
1830: 73 5f 64 61 74 61 20 24 7b 63 6f 64 65 5f 74 61  s_data ${code_ta
1840: 67 7d 5f 64 61 74 61 5c 5b 5c 5d 20 3d 20 7b 22  g}_data\[\] = {"
1850: 0a 70 75 74 73 20 22 5c 74 7b 22 0a 70 75 74 73  .puts "\t{".puts
1860: 20 22 5c 74 5c 74 2f 2a 20 49 6e 64 65 78 20 30   "\t\t/* Index 0
1870: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
1880: 62 65 63 61 75 73 65 20 77 65 20 75 73 65 20 74  because we use t
1890: 68 65 20 76 61 6c 75 65 20 30 20 74 6f 20 72 65  he value 0 to re
18a0: 70 72 65 73 65 6e 74 20 66 61 69 6c 75 72 65 20  present failure 
18b0: 2a 2f 22 0a 70 75 74 73 20 22 5c 74 5c 74 2e 6e  */".puts "\t\t.n
18c0: 61 6d 65 20 20 3d 20 4e 55 4c 4c 2c 22 0a 70 75  ame  = NULL,".pu
18d0: 74 73 20 22 5c 74 5c 74 2e 69 6e 64 65 78 20 3d  ts "\t\t.index =
18e0: 20 30 2c 22 0a 70 75 74 73 20 22 5c 74 5c 74 2e   0,".puts "\t\t.
18f0: 74 79 70 65 20 20 3d 20 30 2c 22 0a 70 75 74 73  type  = 0,".puts
1900: 20 22 5c 74 5c 74 2e 73 69 7a 65 20 20 3d 20 30   "\t\t.size  = 0
1910: 2c 22 0a 70 75 74 73 20 22 5c 74 5c 74 2e 64 61  ,".puts "\t\t.da
1920: 74 61 20 20 3d 20 4e 55 4c 4c 2c 22 0a 70 75 74  ta  = NULL,".put
1930: 73 20 22 5c 74 5c 74 2e 66 72 65 65 20 20 3d 20  s "\t\t.free  = 
1940: 30 2c 22 0a 70 75 74 73 20 22 5c 74 7d 2c 22 0a  0,".puts "\t},".
1950: 66 6f 72 20 7b 73 65 74 20 69 64 78 20 31 7d 20  for {set idx 1} 
1960: 7b 24 69 64 78 20 3c 20 5b 6c 6c 65 6e 67 74 68  {$idx < [llength
1970: 20 24 66 69 6c 65 73 5d 7d 20 7b 69 6e 63 72 20   $files]} {incr 
1980: 69 64 78 7d 20 7b 0a 09 73 65 74 20 66 69 6c 65  idx} {..set file
1990: 20 5b 6c 69 6e 64 65 78 20 24 66 69 6c 65 73 20   [lindex $files 
19a0: 24 69 64 78 5d 0a 09 73 65 74 20 73 68 6f 72 74  $idx]..set short
19b0: 66 69 6c 65 20 5b 73 68 6f 72 74 65 6e 5f 66 69  file [shorten_fi
19c0: 6c 65 20 24 73 74 61 72 74 64 69 72 20 24 66 69  le $startdir $fi
19d0: 6c 65 5d 0a 0a 09 75 6e 73 65 74 20 2d 6e 6f 63  le]...unset -noc
19e0: 6f 6d 70 6c 61 69 6e 20 66 69 6e 66 6f 20 74 79  omplain finfo ty
19f0: 70 65 0a 09 66 69 6c 65 20 73 74 61 74 20 24 66  pe..file stat $f
1a00: 69 6c 65 20 66 69 6e 66 6f 0a 0a 09 73 77 69 74  ile finfo...swit
1a10: 63 68 20 2d 2d 20 24 66 69 6e 66 6f 28 74 79 70  ch -- $finfo(typ
1a20: 65 29 20 7b 0a 09 09 22 66 69 6c 65 22 20 7b 0a  e) {..."file" {.
1a30: 09 09 09 73 65 74 20 73 69 7a 65 20 24 66 69 6e  ...set size $fin
1a40: 66 6f 28 73 69 7a 65 29 0a 0a 09 09 09 73 65 74  fo(size).....set
1a50: 20 66 64 20 5b 6f 70 65 6e 20 24 66 69 6c 65 5d   fd [open $file]
1a60: 0a 09 09 09 66 63 6f 6e 66 69 67 75 72 65 20 24  ....fconfigure $
1a70: 66 64 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20  fd -translation 
1a80: 62 69 6e 61 72 79 0a 09 09 09 73 65 74 20 64 61  binary....set da
1a90: 74 61 20 5b 72 65 61 64 20 24 66 64 5d 0a 09 09  ta [read $fd]...
1aa0: 09 63 6c 6f 73 65 20 24 66 64 0a 0a 09 09 09 69  .close $fd.....i
1ab0: 66 20 7b 24 6f 62 73 66 75 63 61 74 65 7d 20 7b  f {$obsfucate} {
1ac0: 0a 09 09 09 09 73 65 74 20 74 79 70 65 20 22 43  .....set type "C
1ad0: 56 46 53 5f 46 49 4c 45 54 59 50 45 5f 45 4e 43  VFS_FILETYPE_ENC
1ae0: 52 59 50 54 45 44 5f 46 49 4c 45 22 0a 09 09 09  RYPTED_FILE"....
1af0: 09 73 65 74 20 64 61 74 61 20 22 28 75 6e 73 69  .set data "(unsi
1b00: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 5b 73 74  gned char *) [st
1b10: 72 69 6e 67 69 66 79 20 5b 65 6e 63 72 79 70 74  ringify [encrypt
1b20: 20 24 64 61 74 61 20 24 6f 62 73 66 75 63 61 74   $data $obsfucat
1b30: 69 6f 6e 5f 6b 65 79 5d 5d 22 0a 09 09 09 7d 20  ion_key]]"....} 
1b40: 65 6c 73 65 20 7b 0a 09 09 09 09 73 65 74 20 74  else {.....set t
1b50: 79 70 65 20 22 43 56 46 53 5f 46 49 4c 45 54 59  ype "CVFS_FILETY
1b60: 50 45 5f 46 49 4c 45 22 0a 09 09 09 09 73 65 74  PE_FILE".....set
1b70: 20 64 61 74 61 20 22 28 75 6e 73 69 67 6e 65 64   data "(unsigned
1b80: 20 63 68 61 72 20 2a 29 20 5b 73 74 72 69 6e 67   char *) [string
1b90: 69 66 79 20 24 64 61 74 61 5d 22 0a 09 09 09 7d  ify $data]"....}
1ba0: 0a 09 09 7d 0a 09 09 22 64 69 72 65 63 74 6f 72  ...}..."director
1bb0: 79 22 20 7b 0a 09 09 09 73 65 74 20 74 79 70 65  y" {....set type
1bc0: 20 22 43 56 46 53 5f 46 49 4c 45 54 59 50 45 5f   "CVFS_FILETYPE_
1bd0: 44 49 52 22 0a 09 09 09 73 65 74 20 64 61 74 61  DIR"....set data
1be0: 20 22 4e 55 4c 4c 22 0a 09 09 09 73 65 74 20 73   "NULL"....set s
1bf0: 69 7a 65 20 30 0a 09 09 7d 0a 09 7d 0a 0a 09 70  ize 0...}..}...p
1c00: 75 74 73 20 22 5c 74 7b 22 0a 09 70 75 74 73 20  uts "\t{"..puts 
1c10: 22 5c 74 5c 74 2e 6e 61 6d 65 20 20 3d 20 5c 22  "\t\t.name  = \"
1c20: 24 73 68 6f 72 74 66 69 6c 65 5c 22 2c 22 0a 09  $shortfile\","..
1c30: 70 75 74 73 20 22 5c 74 5c 74 2e 69 6e 64 65 78  puts "\t\t.index
1c40: 20 3d 20 24 69 64 78 2c 22 0a 09 70 75 74 73 20   = $idx,"..puts 
1c50: 22 5c 74 5c 74 2e 74 79 70 65 20 20 3d 20 24 74  "\t\t.type  = $t
1c60: 79 70 65 2c 22 0a 09 70 75 74 73 20 22 5c 74 5c  ype,"..puts "\t\
1c70: 74 2e 73 69 7a 65 20 20 3d 20 24 73 69 7a 65 2c  t.size  = $size,
1c80: 22 0a 09 70 75 74 73 20 22 5c 74 5c 74 2e 64 61  "..puts "\t\t.da
1c90: 74 61 20 20 3d 20 24 64 61 74 61 2c 22 0a 09 70  ta  = $data,"..p
1ca0: 75 74 73 20 22 5c 74 5c 74 2e 66 72 65 65 20 20  uts "\t\t.free  
1cb0: 3d 20 30 2c 22 0a 09 70 75 74 73 20 22 5c 74 7d  = 0,"..puts "\t}
1cc0: 2c 22 0a 7d 0a 70 75 74 73 20 22 7d 3b 22 0a 70  ,".}.puts "};".p
1cd0: 75 74 73 20 22 22 0a 0a 70 75 74 73 20 22 73 74  uts ""..puts "st
1ce0: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
1cf0: 6e 67 20 24 7b 63 6f 64 65 5f 74 61 67 7d 5f 6c  ng ${code_tag}_l
1d00: 6f 6f 6b 75 70 5f 69 6e 64 65 78 28 63 6f 6e 73  ookup_index(cons
1d10: 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 22  t char *path) {"
1d20: 0a 70 75 74 73 20 22 5c 74 73 77 69 74 63 68 20  .puts "\tswitch 
1d30: 28 63 76 66 73 5f 68 61 73 68 28 28 75 6e 73 69  (cvfs_hash((unsi
1d40: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 70 61 74  gned char *) pat
1d50: 68 29 29 20 7b 22 0a 0a 66 6f 72 20 7b 73 65 74  h)) {"..for {set
1d60: 20 69 64 78 20 31 7d 20 7b 24 69 64 78 20 3c 20   idx 1} {$idx < 
1d70: 5b 6c 6c 65 6e 67 74 68 20 24 66 69 6c 65 73 5d  [llength $files]
1d80: 7d 20 7b 69 6e 63 72 20 69 64 78 7d 20 7b 0a 09  } {incr idx} {..
1d90: 73 65 74 20 66 69 6c 65 20 5b 6c 69 6e 64 65 78  set file [lindex
1da0: 20 24 66 69 6c 65 73 20 24 69 64 78 5d 0a 09 73   $files $idx]..s
1db0: 65 74 20 73 68 6f 72 74 66 69 6c 65 20 5b 73 68  et shortfile [sh
1dc0: 6f 72 74 65 6e 5f 66 69 6c 65 20 24 73 74 61 72  orten_file $star
1dd0: 74 64 69 72 20 24 66 69 6c 65 5d 0a 09 73 65 74  tdir $file]..set
1de0: 20 68 61 73 68 20 5b 63 76 66 73 5f 68 61 73 68   hash [cvfs_hash
1df0: 20 24 73 68 6f 72 74 66 69 6c 65 5d 0a 0a 09 6c   $shortfile]...l
1e00: 61 70 70 65 6e 64 20 69 6e 64 65 78 65 73 5f 70  append indexes_p
1e10: 65 72 5f 68 61 73 68 28 24 68 61 73 68 29 20 5b  er_hash($hash) [
1e20: 6c 69 73 74 20 24 73 68 6f 72 74 66 69 6c 65 20  list $shortfile 
1e30: 24 69 64 78 5d 0a 7d 0a 0a 66 6f 72 65 61 63 68  $idx].}..foreach
1e40: 20 7b 68 61 73 68 20 69 64 78 5f 6c 69 73 74 7d   {hash idx_list}
1e50: 20 5b 61 72 72 61 79 20 67 65 74 20 69 6e 64 65   [array get inde
1e60: 78 65 73 5f 70 65 72 5f 68 61 73 68 5d 20 7b 0a  xes_per_hash] {.
1e70: 09 70 75 74 73 20 22 5c 74 5c 74 63 61 73 65 20  .puts "\t\tcase 
1e80: 24 68 61 73 68 3a 22 0a 0a 09 69 66 20 7b 5b 6c  $hash:"...if {[l
1e90: 6c 65 6e 67 74 68 20 24 69 64 78 5f 6c 69 73 74  length $idx_list
1ea0: 5d 20 3d 3d 20 31 7d 20 7b 0a 09 09 73 65 74 20  ] == 1} {...set 
1eb0: 69 64 78 20 5b 6c 69 6e 64 65 78 20 24 69 64 78  idx [lindex $idx
1ec0: 5f 6c 69 73 74 20 30 20 31 5d 0a 0a 09 09 70 75  _list 0 1]....pu
1ed0: 74 73 20 22 5c 74 5c 74 5c 74 72 65 74 75 72 6e  ts "\t\t\treturn
1ee0: 28 24 69 64 78 29 3b 22 0a 09 7d 20 65 6c 73 65  ($idx);"..} else
1ef0: 20 7b 0a 09 09 66 6f 72 65 61 63 68 20 69 64 78   {...foreach idx
1f00: 5f 65 6e 74 20 24 69 64 78 5f 6c 69 73 74 20 7b  _ent $idx_list {
1f10: 0a 09 09 09 73 65 74 20 73 68 6f 72 74 66 69 6c  ....set shortfil
1f20: 65 20 5b 6c 69 6e 64 65 78 20 24 69 64 78 5f 65  e [lindex $idx_e
1f30: 6e 74 20 30 5d 0a 09 09 09 73 65 74 20 69 64 78  nt 0]....set idx
1f40: 20 5b 6c 69 6e 64 65 78 20 24 69 64 78 5f 65 6e   [lindex $idx_en
1f50: 74 20 31 5d 0a 0a 09 09 09 70 75 74 73 20 22 5c  t 1].....puts "\
1f60: 74 5c 74 5c 74 69 66 20 28 73 74 72 63 6d 70 28  t\t\tif (strcmp(
1f70: 70 61 74 68 2c 20 5c 22 24 73 68 6f 72 74 66 69  path, \"$shortfi
1f80: 6c 65 5c 22 29 20 3d 3d 20 30 29 20 72 65 74 75  le\") == 0) retu
1f90: 72 6e 28 24 69 64 78 29 3b 22 0a 09 09 7d 0a 09  rn($idx);"...}..
1fa0: 09 70 75 74 73 20 22 5c 74 5c 74 5c 74 62 72 65  .puts "\t\t\tbre
1fb0: 61 6b 3b 22 0a 09 7d 0a 7d 0a 0a 70 75 74 73 20  ak;"..}.}..puts 
1fc0: 22 5c 74 7d 22 0a 70 75 74 73 20 22 5c 74 72 65  "\t}".puts "\tre
1fd0: 74 75 72 6e 28 30 29 3b 22 0a 70 75 74 73 20 22  turn(0);".puts "
1fe0: 7d 22 0a 70 75 74 73 20 22 22 0a 0a 70 75 74 73  }".puts ""..puts
1ff0: 20 22 73 74 61 74 69 63 20 73 74 72 75 63 74 20   "static struct 
2000: 63 76 66 73 5f 64 61 74 61 20 2a 24 7b 63 6f 64  cvfs_data *${cod
2010: 65 5f 74 61 67 7d 5f 67 65 74 44 61 74 61 28 63  e_tag}_getData(c
2020: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
2030: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69   unsigned long i
2040: 6e 64 65 78 29 20 7b 22 0a 70 75 74 73 20 22 5c  ndex) {".puts "\
2050: 74 69 66 20 28 70 61 74 68 20 21 3d 20 4e 55 4c  tif (path != NUL
2060: 4c 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 5c 74  L) {".puts "\t\t
2070: 69 6e 64 65 78 20 3d 20 24 7b 63 6f 64 65 5f 74  index = ${code_t
2080: 61 67 7d 5f 6c 6f 6f 6b 75 70 5f 69 6e 64 65 78  ag}_lookup_index
2090: 28 70 61 74 68 29 3b 22 0a 70 75 74 73 20 22 5c  (path);".puts "\
20a0: 74 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74 73  t}".puts "".puts
20b0: 20 22 5c 74 69 66 20 28 69 6e 64 65 78 20 3d 3d   "\tif (index ==
20c0: 20 30 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 5c   0) {".puts "\t\
20d0: 74 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 22 0a  treturn(NULL);".
20e0: 70 75 74 73 20 22 5c 74 7d 22 0a 70 75 74 73 20  puts "\t}".puts 
20f0: 22 22 0a 70 75 74 73 20 22 5c 74 69 66 20 28 70  "".puts "\tif (p
2100: 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 22 0a  ath != NULL) {".
2110: 70 75 74 73 20 22 5c 74 5c 74 69 66 20 28 73 74  puts "\t\tif (st
2120: 72 63 6d 70 28 70 61 74 68 2c 20 24 7b 63 6f 64  rcmp(path, ${cod
2130: 65 5f 74 61 67 7d 5f 64 61 74 61 5c 5b 69 6e 64  e_tag}_data\[ind
2140: 65 78 5c 5d 2e 6e 61 6d 65 29 20 21 3d 20 30 29  ex\].name) != 0)
2150: 20 7b 22 0a 70 75 74 73 20 22 5c 74 5c 74 5c 74   {".puts "\t\t\t
2160: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 22 0a 70  return(NULL);".p
2170: 75 74 73 20 22 5c 74 5c 74 7d 22 0a 70 75 74 73  uts "\t\t}".puts
2180: 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70   "\t}".puts "".p
2190: 75 74 73 20 22 5c 74 72 65 74 75 72 6e 28 26 24  uts "\treturn(&$
21a0: 7b 63 6f 64 65 5f 74 61 67 7d 5f 64 61 74 61 5c  {code_tag}_data\
21b0: 5b 69 6e 64 65 78 5c 5d 29 3b 22 0a 70 75 74 73  [index\]);".puts
21c0: 20 22 7d 22 0a 70 75 74 73 20 22 22 0a 0a 70 75   "}".puts ""..pu
21d0: 74 73 20 22 73 74 61 74 69 63 20 75 6e 73 69 67  ts "static unsig
21e0: 6e 65 64 20 6c 6f 6e 67 20 24 7b 63 6f 64 65 5f  ned long ${code_
21f0: 74 61 67 7d 5f 67 65 74 43 68 69 6c 64 72 65 6e  tag}_getChildren
2200: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74  (const char *pat
2210: 68 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  h, unsigned long
2220: 20 2a 6f 75 74 62 75 66 2c 20 75 6e 73 69 67 6e   *outbuf, unsign
2230: 65 64 20 6c 6f 6e 67 20 6f 75 74 62 75 66 5f 63  ed long outbuf_c
2240: 6f 75 6e 74 29 20 7b 22 0a 70 75 74 73 20 22 5c  ount) {".puts "\
2250: 74 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  tunsigned long i
2260: 6e 64 65 78 3b 22 0a 70 75 74 73 20 22 5c 74 75  ndex;".puts "\tu
2270: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
2280: 5f 63 68 69 6c 64 72 65 6e 20 3d 20 30 3b 22 0a  _children = 0;".
2290: 70 75 74 73 20 22 22 0a 70 75 74 73 20 22 5c 74  puts "".puts "\t
22a0: 69 6e 64 65 78 20 3d 20 24 7b 63 6f 64 65 5f 74  index = ${code_t
22b0: 61 67 7d 5f 6c 6f 6f 6b 75 70 5f 69 6e 64 65 78  ag}_lookup_index
22c0: 28 70 61 74 68 29 3b 22 0a 70 75 74 73 20 22 5c  (path);".puts "\
22d0: 74 69 66 20 28 69 6e 64 65 78 20 3d 3d 20 30 29  tif (index == 0)
22e0: 20 7b 22 0a 70 75 74 73 20 22 5c 74 5c 74 72 65   {".puts "\t\tre
22f0: 74 75 72 6e 28 30 29 3b 22 0a 70 75 74 73 20 22  turn(0);".puts "
2300: 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74  \t}".puts "".put
2310: 73 20 22 5c 74 69 66 20 28 24 7b 63 6f 64 65 5f  s "\tif (${code_
2320: 74 61 67 7d 5f 64 61 74 61 5c 5b 69 6e 64 65 78  tag}_data\[index
2330: 5c 5d 2e 74 79 70 65 20 21 3d 20 43 56 46 53 5f  \].type != CVFS_
2340: 46 49 4c 45 54 59 50 45 5f 44 49 52 29 20 7b 22  FILETYPE_DIR) {"
2350: 0a 70 75 74 73 20 22 5c 74 5c 74 72 65 74 75 72  .puts "\t\tretur
2360: 6e 28 30 29 3b 22 0a 70 75 74 73 20 22 5c 74 7d  n(0);".puts "\t}
2370: 22 0a 70 75 74 73 20 22 22 0a 70 75 74 73 20 22  ".puts "".puts "
2380: 5c 74 69 66 20 28 73 74 72 63 6d 70 28 70 61 74  \tif (strcmp(pat
2390: 68 2c 20 24 7b 63 6f 64 65 5f 74 61 67 7d 5f 64  h, ${code_tag}_d
23a0: 61 74 61 5c 5b 69 6e 64 65 78 5c 5d 2e 6e 61 6d  ata\[index\].nam
23b0: 65 29 20 21 3d 20 30 29 20 7b 22 0a 70 75 74 73  e) != 0) {".puts
23c0: 20 22 5c 74 5c 74 72 65 74 75 72 6e 28 30 29 3b   "\t\treturn(0);
23d0: 22 0a 70 75 74 73 20 22 5c 74 7d 22 0a 70 75 74  ".puts "\t}".put
23e0: 73 20 22 22 0a 70 75 74 73 20 22 5c 74 73 77 69  s "".puts "\tswi
23f0: 74 63 68 20 28 69 6e 64 65 78 29 20 7b 22 0a 0a  tch (index) {"..
2400: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
2410: 6e 20 63 68 69 6c 64 72 65 6e 0a 61 72 72 61 79  n children.array
2420: 20 73 65 74 20 63 68 69 6c 64 72 65 6e 20 5b 6c   set children [l
2430: 69 73 74 5d 0a 66 6f 72 20 7b 73 65 74 20 69 64  ist].for {set id
2440: 78 20 31 7d 20 7b 24 69 64 78 20 3c 20 5b 6c 6c  x 1} {$idx < [ll
2450: 65 6e 67 74 68 20 24 66 69 6c 65 73 5d 7d 20 7b  ength $files]} {
2460: 69 6e 63 72 20 69 64 78 7d 20 7b 0a 09 73 65 74  incr idx} {..set
2470: 20 66 69 6c 65 20 5b 6c 69 6e 64 65 78 20 24 66   file [lindex $f
2480: 69 6c 65 73 20 24 69 64 78 5d 0a 09 73 65 74 20  iles $idx]..set 
2490: 73 68 6f 72 74 66 69 6c 65 20 5b 73 68 6f 72 74  shortfile [short
24a0: 65 6e 5f 66 69 6c 65 20 24 73 74 61 72 74 64 69  en_file $startdi
24b0: 72 20 24 66 69 6c 65 5d 0a 0a 09 75 6e 73 65 74  r $file]...unset
24c0: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 66 69 6e   -nocomplain fin
24d0: 66 6f 20 74 79 70 65 0a 09 66 69 6c 65 20 73 74  fo type..file st
24e0: 61 74 20 24 66 69 6c 65 20 66 69 6e 66 6f 0a 0a  at $file finfo..
24f0: 09 69 66 20 7b 24 66 69 6e 66 6f 28 74 79 70 65  .if {$finfo(type
2500: 29 20 21 3d 20 22 64 69 72 65 63 74 6f 72 79 22  ) != "directory"
2510: 7d 20 7b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  } {...continue;.
2520: 09 7d 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e 65  .}...# Determine
2530: 20 77 68 69 63 68 20 63 68 69 6c 64 72 65 6e 20   which children 
2540: 61 72 65 20 75 6e 64 65 72 20 74 68 69 73 20 64  are under this d
2550: 69 72 65 63 74 6f 72 79 0a 09 23 23 20 43 6f 6e  irectory..## Con
2560: 76 65 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  vert the current
2570: 20 70 61 74 68 6e 61 6d 65 20 74 6f 20 61 20 72   pathname to a r
2580: 65 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  egular expressio
2590: 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 65  n that matches e
25a0: 78 61 63 74 6c 79 0a 09 73 65 74 20 66 69 6c 65  xactly..set file
25b0: 5f 72 65 67 65 78 70 20 5b 73 74 72 69 6e 67 20  _regexp [string 
25c0: 6d 61 70 20 5b 6c 69 73 74 20 22 5c 5c 22 20 22  map [list "\\" "
25d0: 5c 5c 5c 5c 22 20 22 2e 22 20 22 5c 5c 2e 22 20  \\\\" "." "\\." 
25e0: 22 5c 7b 22 20 22 5c 5c 5c 7b 22 20 22 5c 7d 22  "\{" "\\\{" "\}"
25f0: 20 22 5c 5c 5c 7d 22 20 22 2a 22 20 22 5c 5c 2a   "\\\}" "*" "\\*
2600: 22 5d 20 24 66 69 6c 65 5d 0a 0a 09 23 23 20 53  "] $file]...## S
2610: 65 61 72 63 68 20 66 6f 72 20 70 61 74 68 6e 61  earch for pathna
2620: 6d 65 73 20 77 68 69 63 68 20 73 74 61 72 74 20  mes which start 
2630: 77 69 74 68 20 65 78 61 63 74 6c 79 20 6f 75 72  with exactly our
2640: 20 6e 61 6d 65 2c 20 66 6f 6c 6c 6f 77 65 64 20   name, followed 
2650: 62 79 20 61 20 73 6c 61 73 68 0a 09 23 23 20 66  by a slash..## f
2660: 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 6f 20 6d 6f  ollowed by no mo
2670: 72 65 20 73 6c 61 73 68 65 73 20 28 64 69 72 65  re slashes (dire
2680: 63 74 20 64 65 73 63 65 6e 64 61 6e 74 73 29 0a  ct descendants).
2690: 09 73 65 74 20 63 68 69 6c 64 5f 69 64 78 5f 6c  .set child_idx_l
26a0: 69 73 74 20 5b 6c 73 65 61 72 63 68 20 2d 72 65  ist [lsearch -re
26b0: 67 65 78 70 20 2d 61 6c 6c 20 24 66 69 6c 65 73  gexp -all $files
26c0: 20 22 5e 24 7b 66 69 6c 65 5f 72 65 67 65 78 70   "^${file_regexp
26d0: 7d 2f 5c 5b 5e 2f 5c 5d 2a 24 22 5d 0a 0a 09 73  }/\[^/\]*$"]...s
26e0: 65 74 20 63 68 69 6c 64 72 65 6e 28 24 69 64 78  et children($idx
26f0: 29 20 24 63 68 69 6c 64 5f 69 64 78 5f 6c 69 73  ) $child_idx_lis
2700: 74 0a 0a 09 70 75 74 73 20 22 5c 74 5c 74 63 61  t...puts "\t\tca
2710: 73 65 20 24 69 64 78 3a 22 0a 09 70 75 74 73 20  se $idx:"..puts 
2720: 22 5c 74 5c 74 5c 74 6e 75 6d 5f 63 68 69 6c 64  "\t\t\tnum_child
2730: 72 65 6e 20 3d 20 5b 6c 6c 65 6e 67 74 68 20 24  ren = [llength $
2740: 63 68 69 6c 64 5f 69 64 78 5f 6c 69 73 74 5d 3b  child_idx_list];
2750: 22 0a 09 70 75 74 73 20 22 5c 74 5c 74 5c 74 62  "..puts "\t\t\tb
2760: 72 65 61 6b 3b 22 0a 09 0a 7d 0a 0a 70 75 74 73  reak;"...}..puts
2770: 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70   "\t}".puts "".p
2780: 75 74 73 20 22 5c 74 69 66 20 28 6f 75 74 62 75  uts "\tif (outbu
2790: 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 22 0a 70 75  f == NULL) {".pu
27a0: 74 73 20 22 5c 74 5c 74 72 65 74 75 72 6e 28 6e  ts "\t\treturn(n
27b0: 75 6d 5f 63 68 69 6c 64 72 65 6e 29 3b 22 0a 70  um_children);".p
27c0: 75 74 73 20 22 5c 74 7d 22 0a 70 75 74 73 20 22  uts "\t}".puts "
27d0: 22 0a 70 75 74 73 20 22 5c 74 69 66 20 28 6e 75  ".puts "\tif (nu
27e0: 6d 5f 63 68 69 6c 64 72 65 6e 20 3e 20 6f 75 74  m_children > out
27f0: 62 75 66 5f 63 6f 75 6e 74 29 20 7b 22 0a 70 75  buf_count) {".pu
2800: 74 73 20 22 5c 74 5c 74 6e 75 6d 5f 63 68 69 6c  ts "\t\tnum_chil
2810: 64 72 65 6e 20 3d 20 6f 75 74 62 75 66 5f 63 6f  dren = outbuf_co
2820: 75 6e 74 3b 22 0a 70 75 74 73 20 22 5c 74 7d 22  unt;".puts "\t}"
2830: 0a 70 75 74 73 20 22 22 0a 70 75 74 73 20 22 5c  .puts "".puts "\
2840: 74 69 66 20 28 6e 75 6d 5f 63 68 69 6c 64 72 65  tif (num_childre
2850: 6e 20 3d 3d 20 30 29 20 7b 22 0a 70 75 74 73 20  n == 0) {".puts 
2860: 22 5c 74 5c 74 72 65 74 75 72 6e 28 6e 75 6d 5f  "\t\treturn(num_
2870: 63 68 69 6c 64 72 65 6e 29 3b 22 0a 70 75 74 73  children);".puts
2880: 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70   "\t}".puts "".p
2890: 75 74 73 20 22 5c 74 69 66 20 28 6f 75 74 62 75  uts "\tif (outbu
28a0: 66 5f 63 6f 75 6e 74 20 3e 20 6e 75 6d 5f 63 68  f_count > num_ch
28b0: 69 6c 64 72 65 6e 29 20 7b 22 0a 70 75 74 73 20  ildren) {".puts 
28c0: 22 5c 74 5c 74 6f 75 74 62 75 66 5f 63 6f 75 6e  "\t\toutbuf_coun
28d0: 74 20 3d 20 6e 75 6d 5f 63 68 69 6c 64 72 65 6e  t = num_children
28e0: 3b 22 0a 70 75 74 73 20 22 5c 74 7d 22 0a 70 75  ;".puts "\t}".pu
28f0: 74 73 20 22 22 0a 70 75 74 73 20 22 5c 74 73 77  ts "".puts "\tsw
2900: 69 74 63 68 20 28 69 6e 64 65 78 29 20 7b 22 0a  itch (index) {".
2910: 0a 66 6f 72 65 61 63 68 20 7b 69 64 78 20 63 68  .foreach {idx ch
2920: 69 6c 64 5f 69 64 78 5f 6c 69 73 74 7d 20 5b 61  ild_idx_list} [a
2930: 72 72 61 79 20 67 65 74 20 63 68 69 6c 64 72 65  rray get childre
2940: 6e 5d 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67  n] {..if {[lleng
2950: 74 68 20 24 63 68 69 6c 64 5f 69 64 78 5f 6c 69  th $child_idx_li
2960: 73 74 5d 20 3d 3d 20 30 7d 20 7b 0a 09 09 63 6f  st] == 0} {...co
2970: 6e 74 69 6e 75 65 0a 09 7d 0a 0a 09 70 75 74 73  ntinue..}...puts
2980: 20 22 5c 74 5c 74 63 61 73 65 20 24 69 64 78 3a   "\t\tcase $idx:
2990: 22 0a 09 70 75 74 73 20 22 5c 74 5c 74 5c 74 73  "..puts "\t\t\ts
29a0: 77 69 74 63 68 28 6f 75 74 62 75 66 5f 63 6f 75  witch(outbuf_cou
29b0: 6e 74 29 20 7b 22 0a 0a 09 66 6f 72 20 7b 73 65  nt) {"...for {se
29c0: 74 20 63 68 69 6c 64 5f 69 64 78 5f 69 64 78 20  t child_idx_idx 
29d0: 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20  [expr {[llength 
29e0: 24 63 68 69 6c 64 5f 69 64 78 5f 6c 69 73 74 5d  $child_idx_list]
29f0: 20 2d 20 31 7d 5d 7d 20 7b 24 63 68 69 6c 64 5f   - 1}]} {$child_
2a00: 69 64 78 5f 69 64 78 20 3e 3d 20 30 7d 20 7b 69  idx_idx >= 0} {i
2a10: 6e 63 72 20 63 68 69 6c 64 5f 69 64 78 5f 69 64  ncr child_idx_id
2a20: 78 20 2d 31 7d 20 7b 0a 09 09 73 65 74 20 63 68  x -1} {...set ch
2a30: 69 6c 64 5f 69 64 78 20 5b 6c 69 6e 64 65 78 20  ild_idx [lindex 
2a40: 24 63 68 69 6c 64 5f 69 64 78 5f 6c 69 73 74 20  $child_idx_list 
2a50: 24 63 68 69 6c 64 5f 69 64 78 5f 69 64 78 5d 0a  $child_idx_idx].
2a60: 0a 09 09 70 75 74 73 20 22 5c 74 5c 74 5c 74 5c  ...puts "\t\t\t\
2a70: 74 63 61 73 65 20 5b 65 78 70 72 20 7b 24 63 68  tcase [expr {$ch
2a80: 69 6c 64 5f 69 64 78 5f 69 64 78 20 2b 20 31 7d  ild_idx_idx + 1}
2a90: 5d 3a 22 0a 09 09 70 75 74 73 20 22 5c 74 5c 74  ]:"...puts "\t\t
2aa0: 5c 74 5c 74 5c 74 6f 75 74 62 75 66 5c 5b 24 63  \t\t\toutbuf\[$c
2ab0: 68 69 6c 64 5f 69 64 78 5f 69 64 78 5c 5d 20 3d  hild_idx_idx\] =
2ac0: 20 24 63 68 69 6c 64 5f 69 64 78 3b 22 0a 09 7d   $child_idx;"..}
2ad0: 0a 0a 09 70 75 74 73 20 22 5c 74 5c 74 5c 74 7d  ...puts "\t\t\t}
2ae0: 22 0a 0a 09 70 75 74 73 20 22 5c 74 5c 74 5c 74  "...puts "\t\t\t
2af0: 62 72 65 61 6b 3b 22 0a 7d 0a 0a 70 75 74 73 20  break;".}..puts 
2b00: 22 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70 75  "\t}".puts "".pu
2b10: 74 73 20 22 5c 74 72 65 74 75 72 6e 28 6e 75 6d  ts "\treturn(num
2b20: 5f 63 68 69 6c 64 72 65 6e 29 3b 22 0a 70 75 74  _children);".put
2b30: 73 20 22 7d 22 0a 70 75 74 73 20 22 22 0a 0a 69  s "}".puts ""..i
2b40: 66 20 7b 24 6f 62 73 66 75 63 61 74 65 7d 20 7b  f {$obsfucate} {
2b50: 0a 09 70 75 74 73 20 22 73 74 61 74 69 63 20 76  ..puts "static v
2b60: 6f 69 64 20 24 7b 63 6f 64 65 5f 74 61 67 7d 5f  oid ${code_tag}_
2b70: 64 65 63 72 79 70 74 46 69 6c 65 28 63 6f 6e 73  decryptFile(cons
2b80: 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74  t char *path, st
2b90: 72 75 63 74 20 63 76 66 73 5f 64 61 74 61 20 2a  ruct cvfs_data *
2ba0: 66 69 6e 66 6f 29 20 7b 22 0a 09 70 75 74 73 20  finfo) {"..puts 
2bb0: 22 5c 74 73 74 61 74 69 63 20 73 74 72 75 63 74  "\tstatic struct
2bc0: 20 63 76 66 73 5f 6b 65 79 20 6b 65 79 20 3d 20   cvfs_key key = 
2bd0: 7b 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c  { [string map [l
2be0: 69 73 74 20 22 5c 6e 22 20 22 20 22 5d 20 5b 65  ist "\n" " "] [e
2bf0: 6e 63 72 79 70 74 5f 6b 65 79 5f 65 78 70 6f 72  ncrypt_key_expor
2c00: 74 20 24 6f 62 73 66 75 63 61 74 69 6f 6e 5f 6b  t $obsfucation_k
2c10: 65 79 20 22 63 22 5d 5d 20 7d 3b 22 0a 09 70 75  ey "c"]] };"..pu
2c20: 74 73 20 22 5c 74 75 6e 73 69 67 6e 65 64 20 63  ts "\tunsigned c
2c30: 68 61 72 20 2a 6e 65 77 5f 64 61 74 61 2c 20 2a  har *new_data, *
2c40: 6f 6c 64 5f 64 61 74 61 3b 22 0a 09 70 75 74 73  old_data;"..puts
2c50: 20 22 5c 74 69 6e 74 20 64 65 63 72 79 70 74 5f   "\tint decrypt_
2c60: 72 65 74 2c 20 66 72 65 65 5f 6f 6c 64 5f 64 61  ret, free_old_da
2c70: 74 61 3b 22 0a 09 70 75 74 73 20 22 22 0a 09 70  ta;"..puts ""..p
2c80: 75 74 73 20 22 5c 74 6e 65 77 5f 64 61 74 61 20  uts "\tnew_data 
2c90: 3d 20 6d 61 6c 6c 6f 63 28 66 69 6e 66 6f 2d 3e  = malloc(finfo->
2ca0: 73 69 7a 65 29 3b 22 0a 09 70 75 74 73 20 22 5c  size);"..puts "\
2cb0: 74 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 63  tdecrypt_ret = c
2cc0: 76 66 73 5f 64 65 63 72 79 70 74 28 6e 65 77 5f  vfs_decrypt(new_
2cd0: 64 61 74 61 2c 20 66 69 6e 66 6f 2d 3e 64 61 74  data, finfo->dat
2ce0: 61 2c 20 66 69 6e 66 6f 2d 3e 73 69 7a 65 2c 20  a, finfo->size, 
2cf0: 26 6b 65 79 29 3b 22 0a 09 70 75 74 73 20 22 5c  &key);"..puts "\
2d00: 74 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74  tif (decrypt_ret
2d10: 20 21 3d 20 30 29 20 7b 22 0a 09 70 75 74 73 20   != 0) {"..puts 
2d20: 22 5c 74 5c 74 66 72 65 65 28 6e 65 77 5f 64 61  "\t\tfree(new_da
2d30: 74 61 29 3b 22 0a 09 70 75 74 73 20 22 22 0a 09  ta);"..puts ""..
2d40: 70 75 74 73 20 22 5c 74 5c 74 72 65 74 75 72 6e  puts "\t\treturn
2d50: 3b 22 0a 09 70 75 74 73 20 22 5c 74 7d 22 0a 09  ;"..puts "\t}"..
2d60: 70 75 74 73 20 22 22 0a 09 70 75 74 73 20 22 5c  puts ""..puts "\
2d70: 74 66 72 65 65 5f 6f 6c 64 5f 64 61 74 61 20 3d  tfree_old_data =
2d80: 20 66 69 6e 66 6f 2d 3e 66 72 65 65 3b 22 0a 09   finfo->free;"..
2d90: 70 75 74 73 20 22 5c 74 6f 6c 64 5f 64 61 74 61  puts "\told_data
2da0: 20 3d 20 28 76 6f 69 64 20 2a 29 20 66 69 6e 66   = (void *) finf
2db0: 6f 2d 3e 64 61 74 61 3b 22 0a 09 70 75 74 73 20  o->data;"..puts 
2dc0: 22 22 0a 09 70 75 74 73 20 22 5c 74 66 69 6e 66  ""..puts "\tfinf
2dd0: 6f 2d 3e 64 61 74 61 20 3d 20 6e 65 77 5f 64 61  o->data = new_da
2de0: 74 61 3b 22 0a 09 70 75 74 73 20 22 5c 74 66 69  ta;"..puts "\tfi
2df0: 6e 66 6f 2d 3e 66 72 65 65 20 3d 20 31 3b 22 0a  nfo->free = 1;".
2e00: 09 70 75 74 73 20 22 5c 74 66 69 6e 66 6f 2d 3e  .puts "\tfinfo->
2e10: 74 79 70 65 20 3d 20 43 56 46 53 5f 46 49 4c 45  type = CVFS_FILE
2e20: 54 59 50 45 5f 46 49 4c 45 3b 22 0a 09 70 75 74  TYPE_FILE;"..put
2e30: 73 20 22 22 0a 09 70 75 74 73 20 22 5c 74 69 66  s ""..puts "\tif
2e40: 20 28 66 72 65 65 5f 6f 6c 64 5f 64 61 74 61 29   (free_old_data)
2e50: 20 7b 22 0a 09 70 75 74 73 20 22 5c 74 5c 74 66   {"..puts "\t\tf
2e60: 72 65 65 28 6f 6c 64 5f 64 61 74 61 29 3b 22 0a  ree(old_data);".
2e70: 09 70 75 74 73 20 22 5c 74 7d 22 0a 09 70 75 74  .puts "\t}"..put
2e80: 73 20 22 5c 74 72 65 74 75 72 6e 3b 22 0a 09 70  s "\treturn;"..p
2e90: 75 74 73 20 22 7d 22 0a 09 70 75 74 73 20 22 22  uts "}"..puts ""
2ea0: 0a 7d 0a 0a 70 75 74 73 20 22 23 20 20 69 66 64  .}..puts "#  ifd
2eb0: 65 66 20 43 56 46 53 5f 4d 41 4b 45 5f 4c 4f 41  ef CVFS_MAKE_LOA
2ec0: 44 41 42 4c 45 22 0a 0a 73 65 74 20 66 64 20 5b  DABLE"..set fd [
2ed0: 6f 70 65 6e 20 22 63 76 66 73 5f 64 61 74 61 2e  open "cvfs_data.
2ee0: 63 22 5d 0a 70 75 74 73 20 5b 72 65 61 64 20 24  c"].puts [read $
2ef0: 66 64 5d 0a 63 6c 6f 73 65 20 24 66 64 0a 0a 70  fd].close $fd..p
2f00: 75 74 73 20 22 73 74 61 74 69 63 20 63 6d 64 5f  uts "static cmd_
2f10: 67 65 74 44 61 74 61 5f 74 20 2a 67 65 74 43 6d  getData_t *getCm
2f20: 64 44 61 74 61 28 63 6f 6e 73 74 20 63 68 61 72  dData(const char
2f30: 20 2a 68 61 73 68 6b 65 79 29 20 7b 22 0a 70 75   *hashkey) {".pu
2f40: 74 73 20 22 5c 74 72 65 74 75 72 6e 28 24 7b 63  ts "\treturn(${c
2f50: 6f 64 65 5f 74 61 67 7d 5f 67 65 74 44 61 74 61  ode_tag}_getData
2f60: 29 3b 22 0a 70 75 74 73 20 22 7d 22 0a 70 75 74  );".puts "}".put
2f70: 73 20 22 22 0a 70 75 74 73 20 22 73 74 61 74 69  s "".puts "stati
2f80: 63 20 63 6d 64 5f 67 65 74 43 68 69 6c 64 72 65  c cmd_getChildre
2f90: 6e 5f 74 20 2a 67 65 74 43 6d 64 43 68 69 6c 64  n_t *getCmdChild
2fa0: 72 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ren(const char *
2fb0: 68 61 73 68 6b 65 79 29 20 7b 22 0a 70 75 74 73  hashkey) {".puts
2fc0: 20 22 5c 74 72 65 74 75 72 6e 28 24 7b 63 6f 64   "\treturn(${cod
2fd0: 65 5f 74 61 67 7d 5f 67 65 74 43 68 69 6c 64 72  e_tag}_getChildr
2fe0: 65 6e 29 3b 22 0a 70 75 74 73 20 22 7d 22 0a 70  en);".puts "}".p
2ff0: 75 74 73 20 22 22 0a 70 75 74 73 20 22 73 74 61  uts "".puts "sta
3000: 74 69 63 20 63 6d 64 5f 64 65 63 72 79 70 74 46  tic cmd_decryptF
3010: 69 6c 65 5f 74 20 2a 67 65 74 43 6d 64 44 65 63  ile_t *getCmdDec
3020: 72 79 70 74 46 69 6c 65 28 63 6f 6e 73 74 20 63  ryptFile(const c
3030: 68 61 72 20 2a 68 61 73 68 6b 65 79 29 20 7b 22  har *hashkey) {"
3040: 0a 69 66 20 7b 24 6f 62 73 66 75 63 61 74 65 7d  .if {$obsfucate}
3050: 20 7b 0a 09 70 75 74 73 20 22 5c 74 72 65 74 75   {..puts "\tretu
3060: 72 6e 28 24 7b 63 6f 64 65 5f 74 61 67 7d 5f 64  rn(${code_tag}_d
3070: 65 63 72 79 70 74 46 69 6c 65 29 3b 22 0a 7d 20  ecryptFile);".} 
3080: 65 6c 73 65 20 7b 0a 09 70 75 74 73 20 22 5c 74  else {..puts "\t
3090: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 22 0a 7d  return(NULL);".}
30a0: 0a 70 75 74 73 20 22 7d 22 0a 70 75 74 73 20 22  .puts "}".puts "
30b0: 22 0a 0a 70 75 74 73 20 22 69 6e 74 20 43 76 66  "..puts "int Cvf
30c0: 73 5f 64 61 74 61 5f 24 7b 68 61 73 68 6b 65 79  s_data_${hashkey
30d0: 7d 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  }_Init(Tcl_Inter
30e0: 70 20 2a 69 6e 74 65 72 70 29 20 7b 22 0a 70 75  p *interp) {".pu
30f0: 74 73 20 22 5c 74 54 63 6c 5f 43 6f 6d 6d 61 6e  ts "\tTcl_Comman
3100: 64 20 74 63 6c 43 72 65 61 74 43 6f 6d 6d 5f 72  d tclCreatComm_r
3110: 65 74 3b 22 0a 70 75 74 73 20 22 5c 74 69 6e 74  et;".puts "\tint
3120: 20 74 63 6c 50 6b 67 50 72 6f 76 5f 72 65 74 3b   tclPkgProv_ret;
3130: 22 0a 70 75 74 73 20 22 22 0a 70 75 74 73 20 22  ".puts "".puts "
3140: 5c 74 74 63 6c 43 72 65 61 74 43 6f 6d 6d 5f 72  \ttclCreatComm_r
3150: 65 74 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 4f  et = Tcl_CreateO
3160: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
3170: 2c 20 5c 22 3a 3a 76 66 73 3a 3a 63 76 66 73 3a  , \"::vfs::cvfs:
3180: 3a 64 61 74 61 3a 3a 24 7b 68 61 73 68 6b 65 79  :data::${hashkey
3190: 7d 3a 3a 67 65 74 4d 65 74 61 64 61 74 61 5c 22  }::getMetadata\"
31a0: 2c 20 67 65 74 4d 65 74 61 64 61 74 61 2c 20 4e  , getMetadata, N
31b0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 22 0a 70 75 74  ULL, NULL);".put
31c0: 73 20 22 5c 74 69 66 20 28 21 74 63 6c 43 72 65  s "\tif (!tclCre
31d0: 61 74 43 6f 6d 6d 5f 72 65 74 29 20 7b 22 0a 70  atComm_ret) {".p
31e0: 75 74 73 20 22 5c 74 5c 74 72 65 74 75 72 6e 28  uts "\t\treturn(
31f0: 54 43 4c 5f 45 52 52 4f 52 29 3b 22 0a 70 75 74  TCL_ERROR);".put
3200: 73 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a  s "\t}".puts "".
3210: 70 75 74 73 20 22 5c 74 74 63 6c 43 72 65 61 74  puts "\ttclCreat
3220: 43 6f 6d 6d 5f 72 65 74 20 3d 20 54 63 6c 5f 43  Comm_ret = Tcl_C
3230: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
3240: 69 6e 74 65 72 70 2c 20 5c 22 3a 3a 76 66 73 3a  interp, \"::vfs:
3250: 3a 63 76 66 73 3a 3a 64 61 74 61 3a 3a 24 7b 68  :cvfs::data::${h
3260: 61 73 68 6b 65 79 7d 3a 3a 67 65 74 44 61 74 61  ashkey}::getData
3270: 5c 22 2c 20 67 65 74 44 61 74 61 2c 20 4e 55 4c  \", getData, NUL
3280: 4c 2c 20 4e 55 4c 4c 29 3b 22 0a 70 75 74 73 20  L, NULL);".puts 
3290: 22 5c 74 69 66 20 28 21 74 63 6c 43 72 65 61 74  "\tif (!tclCreat
32a0: 43 6f 6d 6d 5f 72 65 74 29 20 7b 22 0a 70 75 74  Comm_ret) {".put
32b0: 73 20 22 5c 74 5c 74 72 65 74 75 72 6e 28 54 43  s "\t\treturn(TC
32c0: 4c 5f 45 52 52 4f 52 29 3b 22 0a 70 75 74 73 20  L_ERROR);".puts 
32d0: 22 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70 75  "\t}".puts "".pu
32e0: 74 73 20 22 5c 74 74 63 6c 43 72 65 61 74 43 6f  ts "\ttclCreatCo
32f0: 6d 6d 5f 72 65 74 20 3d 20 54 63 6c 5f 43 72 65  mm_ret = Tcl_Cre
3300: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
3310: 74 65 72 70 2c 20 5c 22 3a 3a 76 66 73 3a 3a 63  terp, \"::vfs::c
3320: 76 66 73 3a 3a 64 61 74 61 3a 3a 24 7b 68 61 73  vfs::data::${has
3330: 68 6b 65 79 7d 3a 3a 67 65 74 43 68 69 6c 64 72  hkey}::getChildr
3340: 65 6e 5c 22 2c 20 67 65 74 43 68 69 6c 64 72 65  en\", getChildre
3350: 6e 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 22  n, NULL, NULL);"
3360: 0a 70 75 74 73 20 22 5c 74 69 66 20 28 21 74 63  .puts "\tif (!tc
3370: 6c 43 72 65 61 74 43 6f 6d 6d 5f 72 65 74 29 20  lCreatComm_ret) 
3380: 7b 22 0a 70 75 74 73 20 22 5c 74 5c 74 72 65 74  {".puts "\t\tret
3390: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 22  urn(TCL_ERROR);"
33a0: 0a 70 75 74 73 20 22 5c 74 7d 22 0a 70 75 74 73  .puts "\t}".puts
33b0: 20 22 22 0a 70 75 74 73 20 22 5c 74 74 63 6c 50   "".puts "\ttclP
33c0: 6b 67 50 72 6f 76 5f 72 65 74 20 3d 20 54 63 6c  kgProv_ret = Tcl
33d0: 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
33e0: 72 70 2c 20 5c 22 76 66 73 3a 3a 63 76 66 73 3a  rp, \"vfs::cvfs:
33f0: 3a 64 61 74 61 3a 3a 24 7b 68 61 73 68 6b 65 79  :data::${hashkey
3400: 7d 5c 22 2c 20 5c 22 31 2e 30 5c 22 29 3b 22 0a  }\", \"1.0\");".
3410: 70 75 74 73 20 22 22 0a 70 75 74 73 20 22 5c 74  puts "".puts "\t
3420: 72 65 74 75 72 6e 28 74 63 6c 50 6b 67 50 72 6f  return(tclPkgPro
3430: 76 5f 72 65 74 29 3b 22 0a 70 75 74 73 20 22 5c  v_ret);".puts "\
3440: 74 7d 22 0a 70 75 74 73 20 22 23 20 20 65 6e 64  t}".puts "#  end
3450: 69 66 20 2f 2a 20 43 56 46 53 5f 4d 41 4b 45 5f  if /* CVFS_MAKE_
3460: 4c 4f 41 44 41 42 4c 45 20 2a 2f 22 0a 0a 70 75  LOADABLE */"..pu
3470: 74 73 20 22 23 65 6e 64 69 66 20 2f 2a 20 21 24  ts "#endif /* !$
3480: 63 70 70 5f 74 61 67 20 2a 2f 22 0a              cpp_tag */".