Hex Artifact Content

Artifact 74a40bc0967d785aa05f9fb51f3ed840c01306af:


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 23 20 20 69 6e 63 6c  #  endif.#  incl
12b0: 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 0a 23 20 20  ude <tcl.h>..#  
12c0: 69 66 6e 64 65 66 20 4c 4f 41 44 45 44 5f 43 56  ifndef LOADED_CV
12d0: 46 53 5f 43 4f 4d 4d 4f 4e 0a 23 20 20 20 20 64  FS_COMMON.#    d
12e0: 65 66 69 6e 65 20 4c 4f 41 44 45 44 5f 43 56 46  efine LOADED_CVF
12f0: 53 5f 43 4f 4d 4d 4f 4e 20 31 0a 0a 74 79 70 65  S_COMMON 1..type
1300: 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 56 46 53  def enum {..CVFS
1310: 5f 46 49 4c 45 54 59 50 45 5f 46 49 4c 45 20 20  _FILETYPE_FILE  
1320: 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a 09            = 0,..
1330: 43 56 46 53 5f 46 49 4c 45 54 59 50 45 5f 44 49  CVFS_FILETYPE_DI
1340: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20  R             = 
1350: 31 2c 0a 09 43 56 46 53 5f 46 49 4c 45 54 59 50  1,..CVFS_FILETYP
1360: 45 5f 45 4e 43 52 59 50 54 45 44 5f 46 49 4c 45  E_ENCRYPTED_FILE
1370: 20 20 3d 20 32 2c 0a 09 43 56 46 53 5f 46 49 4c    = 2,..CVFS_FIL
1380: 45 54 59 50 45 5f 43 4f 4d 50 52 45 53 53 45 44  ETYPE_COMPRESSED
1390: 5f 46 49 4c 45 20 3d 20 34 2c 0a 7d 20 63 76 66  _FILE = 4,.} cvf
13a0: 73 5f 66 69 6c 65 74 79 70 65 5f 74 3b 0a 0a 73  s_filetype_t;..s
13b0: 74 72 75 63 74 20 63 76 66 73 5f 64 61 74 61 20  truct cvfs_data 
13c0: 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  {..const char * 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
13e0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65              inde
1400: 78 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x;..unsigned lon
1410: 67 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a  g            siz
1420: 65 3b 0a 09 63 76 66 73 5f 66 69 6c 65 74 79 70  e;..cvfs_filetyp
1430: 65 5f 74 20 20 20 20 20 20 20 20 20 20 74 79 70  e_t          typ
1440: 65 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  e;..const unsign
1450: 65 64 20 63 68 61 72 20 2a 20 20 20 20 64 61 74  ed char *    dat
1460: 61 3b 0a 09 69 6e 74 20 20 20 20 20 20 20 20 20  a;..int         
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 65               fre
1480: 65 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65  e;.};..typedef e
1490: 6e 75 6d 20 7b 0a 09 43 56 46 53 5f 4b 45 59 54  num {..CVFS_KEYT
14a0: 59 50 45 5f 52 4f 54 41 54 45 5f 53 55 42 53 54  YPE_ROTATE_SUBST
14b0: 20 20 20 20 20 3d 20 30 2c 0a 7d 20 63 76 66 73       = 0,.} cvfs
14c0: 5f 6b 65 79 74 79 70 65 5f 74 3b 0a 0a 73 74 72  _keytype_t;..str
14d0: 75 63 74 20 63 76 66 73 5f 6b 65 79 20 7b 0a 09  uct cvfs_key {..
14e0: 63 76 66 73 5f 6b 65 79 74 79 70 65 5f 74 20 74  cvfs_keytype_t t
14f0: 79 70 65 3b 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09  ype;..union {...
1500: 73 74 72 75 63 74 20 7b 0a 09 09 09 69 6e 74 20  struct {....int 
1510: 72 6f 74 61 74 65 5f 6c 65 6e 67 74 68 3b 0a 09  rotate_length;..
1520: 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
1530: 2a 73 75 62 73 74 3b 0a 09 09 7d 20 72 6f 74 61  *subst;...} rota
1540: 74 65 5f 73 75 62 73 74 3b 0a 09 7d 20 74 79 70  te_subst;..} typ
1550: 65 64 61 74 61 3b 0a 7d 3b 0a 0a 73 74 61 74 69  edata;.};..stati
1560: 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
1570: 63 76 66 73 5f 68 61 73 68 28 63 6f 6e 73 74 20  cvfs_hash(const 
1580: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1590: 61 74 68 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  ath) {..unsigned
15a0: 20 6c 6f 6e 67 20 69 2c 20 68 20 3d 20 30 2c 20   long i, h = 0, 
15b0: 67 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 69 20  g = 0;...for (i 
15c0: 3d 20 30 3b 20 70 61 74 68 5b 69 5d 3b 20 69 2b  = 0; path[i]; i+
15d0: 2b 29 20 7b 0a 09 09 68 20 3d 20 28 68 20 3c 3c  +) {...h = (h <<
15e0: 20 34 29 20 2b 20 70 61 74 68 5b 69 5d 3b 0a 09   4) + path[i];..
15f0: 09 67 20 3d 20 68 20 26 20 30 78 66 30 30 30 30  .g = h & 0xf0000
1600: 30 30 30 3b 0a 09 09 69 66 20 28 67 29 20 7b 0a  000;...if (g) {.
1610: 09 09 09 68 20 5e 3d 20 28 67 20 3e 3e 20 32 34  ...h ^= (g >> 24
1620: 29 3b 0a 09 09 7d 0a 09 09 68 20 26 3d 20 28 28  );...}...h &= ((
1630: 7e 67 29 20 26 20 30 78 66 66 66 66 66 66 66 66  ~g) & 0xffffffff
1640: 4c 55 29 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20  LU);..}.        
1650: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 28  .        return(
1660: 68 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  h);.}..static in
1670: 74 20 63 76 66 73 5f 64 65 63 72 79 70 74 28 75  t cvfs_decrypt(u
1680: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
1690: 74 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  t, const unsigne
16a0: 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69  d char *in, unsi
16b0: 67 6e 65 64 20 6c 6f 6e 67 20 69 6e 5f 6f 75 74  gned long in_out
16c0: 5f 6c 65 6e 67 74 68 2c 20 73 74 72 75 63 74 20  _length, struct 
16d0: 63 76 66 73 5f 6b 65 79 20 2a 6b 65 79 29 20 7b  cvfs_key *key) {
16e0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
16f0: 69 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  i;..unsigned cha
1700: 72 20 69 6e 5f 63 68 2c 20 6f 75 74 5f 63 68 3b  r in_ch, out_ch;
1710: 0a 09 69 6e 74 20 63 68 5f 69 64 78 3b 0a 0a 09  ..int ch_idx;...
1720: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
1730: 69 6e 5f 6f 75 74 5f 6c 65 6e 67 74 68 3b 20 69  in_out_length; i
1740: 2b 2b 29 20 7b 0a 09 09 69 6e 5f 63 68 20 3d 20  ++) {...in_ch = 
1750: 69 6e 5b 69 5d 3b 0a 0a 09 09 63 68 5f 69 64 78  in[i];....ch_idx
1760: 20 3d 20 28 69 6e 5f 63 68 20 2b 20 28 69 20 2f   = (in_ch + (i /
1770: 20 6b 65 79 2d 3e 74 79 70 65 64 61 74 61 2e 72   key->typedata.r
1780: 6f 74 61 74 65 5f 73 75 62 73 74 2e 72 6f 74 61  otate_subst.rota
1790: 74 65 5f 6c 65 6e 67 74 68 29 29 20 25 20 32 35  te_length)) % 25
17a0: 36 3b 0a 0a 09 09 6f 75 74 5f 63 68 20 3d 20 6b  6;....out_ch = k
17b0: 65 79 2d 3e 74 79 70 65 64 61 74 61 2e 72 6f 74  ey->typedata.rot
17c0: 61 74 65 5f 73 75 62 73 74 2e 73 75 62 73 74 5b  ate_subst.subst[
17d0: 63 68 5f 69 64 78 5d 3b 0a 09 09 6f 75 74 5b 69  ch_idx];...out[i
17e0: 5d 20 3d 20 6f 75 74 5f 63 68 3b 0a 09 7d 0a 0a  ] = out_ch;..}..
17f0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 23  .return(0);.}..#
1800: 20 20 65 6e 64 69 66 20 2f 2a 20 21 4c 4f 41 44    endif /* !LOAD
1810: 45 44 5f 43 56 46 53 5f 43 4f 4d 4d 4f 4e 20 2a  ED_CVFS_COMMON *
1820: 2f 7d 0a 70 75 74 73 20 22 22 0a 0a 70 75 74 73  /}.puts ""..puts
1830: 20 22 73 74 61 74 69 63 20 73 74 72 75 63 74 20   "static struct 
1840: 63 76 66 73 5f 64 61 74 61 20 24 7b 63 6f 64 65  cvfs_data ${code
1850: 5f 74 61 67 7d 5f 64 61 74 61 5c 5b 5c 5d 20 3d  _tag}_data\[\] =
1860: 20 7b 22 0a 70 75 74 73 20 22 5c 74 7b 22 0a 70   {".puts "\t{".p
1870: 75 74 73 20 22 5c 74 5c 74 2f 2a 20 49 6e 64 65  uts "\t\t/* Inde
1880: 78 20 30 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  x 0 cannot be us
1890: 65 64 20 62 65 63 61 75 73 65 20 77 65 20 75 73  ed because we us
18a0: 65 20 74 68 65 20 76 61 6c 75 65 20 30 20 74 6f  e the value 0 to
18b0: 20 72 65 70 72 65 73 65 6e 74 20 66 61 69 6c 75   represent failu
18c0: 72 65 20 2a 2f 22 0a 70 75 74 73 20 22 5c 74 5c  re */".puts "\t\
18d0: 74 2e 6e 61 6d 65 20 20 3d 20 4e 55 4c 4c 2c 22  t.name  = NULL,"
18e0: 0a 70 75 74 73 20 22 5c 74 5c 74 2e 69 6e 64 65  .puts "\t\t.inde
18f0: 78 20 3d 20 30 2c 22 0a 70 75 74 73 20 22 5c 74  x = 0,".puts "\t
1900: 5c 74 2e 74 79 70 65 20 20 3d 20 30 2c 22 0a 70  \t.type  = 0,".p
1910: 75 74 73 20 22 5c 74 5c 74 2e 73 69 7a 65 20 20  uts "\t\t.size  
1920: 3d 20 30 2c 22 0a 70 75 74 73 20 22 5c 74 5c 74  = 0,".puts "\t\t
1930: 2e 64 61 74 61 20 20 3d 20 4e 55 4c 4c 2c 22 0a  .data  = NULL,".
1940: 70 75 74 73 20 22 5c 74 5c 74 2e 66 72 65 65 20  puts "\t\t.free 
1950: 20 3d 20 30 2c 22 0a 70 75 74 73 20 22 5c 74 7d   = 0,".puts "\t}
1960: 2c 22 0a 66 6f 72 20 7b 73 65 74 20 69 64 78 20  ,".for {set idx 
1970: 31 7d 20 7b 24 69 64 78 20 3c 20 5b 6c 6c 65 6e  1} {$idx < [llen
1980: 67 74 68 20 24 66 69 6c 65 73 5d 7d 20 7b 69 6e  gth $files]} {in
1990: 63 72 20 69 64 78 7d 20 7b 0a 09 73 65 74 20 66  cr idx} {..set f
19a0: 69 6c 65 20 5b 6c 69 6e 64 65 78 20 24 66 69 6c  ile [lindex $fil
19b0: 65 73 20 24 69 64 78 5d 0a 09 73 65 74 20 73 68  es $idx]..set sh
19c0: 6f 72 74 66 69 6c 65 20 5b 73 68 6f 72 74 65 6e  ortfile [shorten
19d0: 5f 66 69 6c 65 20 24 73 74 61 72 74 64 69 72 20  _file $startdir 
19e0: 24 66 69 6c 65 5d 0a 0a 09 75 6e 73 65 74 20 2d  $file]...unset -
19f0: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 66 69 6e 66 6f  nocomplain finfo
1a00: 20 74 79 70 65 0a 09 66 69 6c 65 20 73 74 61 74   type..file stat
1a10: 20 24 66 69 6c 65 20 66 69 6e 66 6f 0a 0a 09 73   $file finfo...s
1a20: 77 69 74 63 68 20 2d 2d 20 24 66 69 6e 66 6f 28  witch -- $finfo(
1a30: 74 79 70 65 29 20 7b 0a 09 09 22 66 69 6c 65 22  type) {..."file"
1a40: 20 7b 0a 09 09 09 73 65 74 20 73 69 7a 65 20 24   {....set size $
1a50: 66 69 6e 66 6f 28 73 69 7a 65 29 0a 0a 09 09 09  finfo(size).....
1a60: 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 66 69  set fd [open $fi
1a70: 6c 65 5d 0a 09 09 09 66 63 6f 6e 66 69 67 75 72  le]....fconfigur
1a80: 65 20 24 66 64 20 2d 74 72 61 6e 73 6c 61 74 69  e $fd -translati
1a90: 6f 6e 20 62 69 6e 61 72 79 0a 09 09 09 73 65 74  on binary....set
1aa0: 20 64 61 74 61 20 5b 72 65 61 64 20 24 66 64 5d   data [read $fd]
1ab0: 0a 09 09 09 63 6c 6f 73 65 20 24 66 64 0a 0a 09  ....close $fd...
1ac0: 09 09 69 66 20 7b 24 6f 62 73 66 75 63 61 74 65  ..if {$obsfucate
1ad0: 7d 20 7b 0a 09 09 09 09 73 65 74 20 74 79 70 65  } {.....set type
1ae0: 20 22 43 56 46 53 5f 46 49 4c 45 54 59 50 45 5f   "CVFS_FILETYPE_
1af0: 45 4e 43 52 59 50 54 45 44 5f 46 49 4c 45 22 0a  ENCRYPTED_FILE".
1b00: 09 09 09 09 73 65 74 20 64 61 74 61 20 22 28 75  ....set data "(u
1b10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
1b20: 5b 73 74 72 69 6e 67 69 66 79 20 5b 65 6e 63 72  [stringify [encr
1b30: 79 70 74 20 24 64 61 74 61 20 24 6f 62 73 66 75  ypt $data $obsfu
1b40: 63 61 74 69 6f 6e 5f 6b 65 79 5d 5d 22 0a 09 09  cation_key]]"...
1b50: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 73 65  .} else {.....se
1b60: 74 20 74 79 70 65 20 22 43 56 46 53 5f 46 49 4c  t type "CVFS_FIL
1b70: 45 54 59 50 45 5f 46 49 4c 45 22 0a 09 09 09 09  ETYPE_FILE".....
1b80: 73 65 74 20 64 61 74 61 20 22 28 75 6e 73 69 67  set data "(unsig
1b90: 6e 65 64 20 63 68 61 72 20 2a 29 20 5b 73 74 72  ned char *) [str
1ba0: 69 6e 67 69 66 79 20 24 64 61 74 61 5d 22 0a 09  ingify $data]"..
1bb0: 09 09 7d 0a 09 09 7d 0a 09 09 22 64 69 72 65 63  ..}...}..."direc
1bc0: 74 6f 72 79 22 20 7b 0a 09 09 09 73 65 74 20 74  tory" {....set t
1bd0: 79 70 65 20 22 43 56 46 53 5f 46 49 4c 45 54 59  ype "CVFS_FILETY
1be0: 50 45 5f 44 49 52 22 0a 09 09 09 73 65 74 20 64  PE_DIR"....set d
1bf0: 61 74 61 20 22 4e 55 4c 4c 22 0a 09 09 09 73 65  ata "NULL"....se
1c00: 74 20 73 69 7a 65 20 30 0a 09 09 7d 0a 09 7d 0a  t size 0...}..}.
1c10: 0a 09 70 75 74 73 20 22 5c 74 7b 22 0a 09 70 75  ..puts "\t{"..pu
1c20: 74 73 20 22 5c 74 5c 74 2e 6e 61 6d 65 20 20 3d  ts "\t\t.name  =
1c30: 20 5c 22 24 73 68 6f 72 74 66 69 6c 65 5c 22 2c   \"$shortfile\",
1c40: 22 0a 09 70 75 74 73 20 22 5c 74 5c 74 2e 69 6e  "..puts "\t\t.in
1c50: 64 65 78 20 3d 20 24 69 64 78 2c 22 0a 09 70 75  dex = $idx,"..pu
1c60: 74 73 20 22 5c 74 5c 74 2e 74 79 70 65 20 20 3d  ts "\t\t.type  =
1c70: 20 24 74 79 70 65 2c 22 0a 09 70 75 74 73 20 22   $type,"..puts "
1c80: 5c 74 5c 74 2e 73 69 7a 65 20 20 3d 20 24 73 69  \t\t.size  = $si
1c90: 7a 65 2c 22 0a 09 70 75 74 73 20 22 5c 74 5c 74  ze,"..puts "\t\t
1ca0: 2e 64 61 74 61 20 20 3d 20 24 64 61 74 61 2c 22  .data  = $data,"
1cb0: 0a 09 70 75 74 73 20 22 5c 74 5c 74 2e 66 72 65  ..puts "\t\t.fre
1cc0: 65 20 20 3d 20 30 2c 22 0a 09 70 75 74 73 20 22  e  = 0,"..puts "
1cd0: 5c 74 7d 2c 22 0a 7d 0a 70 75 74 73 20 22 7d 3b  \t},".}.puts "};
1ce0: 22 0a 70 75 74 73 20 22 22 0a 0a 70 75 74 73 20  ".puts ""..puts 
1cf0: 22 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  "static unsigned
1d00: 20 6c 6f 6e 67 20 24 7b 63 6f 64 65 5f 74 61 67   long ${code_tag
1d10: 7d 5f 6c 6f 6f 6b 75 70 5f 69 6e 64 65 78 28 63  }_lookup_index(c
1d20: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
1d30: 20 7b 22 0a 70 75 74 73 20 22 5c 74 73 77 69 74   {".puts "\tswit
1d40: 63 68 20 28 63 76 66 73 5f 68 61 73 68 28 28 75  ch (cvfs_hash((u
1d50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
1d60: 70 61 74 68 29 29 20 7b 22 0a 0a 66 6f 72 20 7b  path)) {"..for {
1d70: 73 65 74 20 69 64 78 20 31 7d 20 7b 24 69 64 78  set idx 1} {$idx
1d80: 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 66 69 6c   < [llength $fil
1d90: 65 73 5d 7d 20 7b 69 6e 63 72 20 69 64 78 7d 20  es]} {incr idx} 
1da0: 7b 0a 09 73 65 74 20 66 69 6c 65 20 5b 6c 69 6e  {..set file [lin
1db0: 64 65 78 20 24 66 69 6c 65 73 20 24 69 64 78 5d  dex $files $idx]
1dc0: 0a 09 73 65 74 20 73 68 6f 72 74 66 69 6c 65 20  ..set shortfile 
1dd0: 5b 73 68 6f 72 74 65 6e 5f 66 69 6c 65 20 24 73  [shorten_file $s
1de0: 74 61 72 74 64 69 72 20 24 66 69 6c 65 5d 0a 09  tartdir $file]..
1df0: 73 65 74 20 68 61 73 68 20 5b 63 76 66 73 5f 68  set hash [cvfs_h
1e00: 61 73 68 20 24 73 68 6f 72 74 66 69 6c 65 5d 0a  ash $shortfile].
1e10: 0a 09 6c 61 70 70 65 6e 64 20 69 6e 64 65 78 65  ..lappend indexe
1e20: 73 5f 70 65 72 5f 68 61 73 68 28 24 68 61 73 68  s_per_hash($hash
1e30: 29 20 5b 6c 69 73 74 20 24 73 68 6f 72 74 66 69  ) [list $shortfi
1e40: 6c 65 20 24 69 64 78 5d 0a 7d 0a 0a 66 6f 72 65  le $idx].}..fore
1e50: 61 63 68 20 7b 68 61 73 68 20 69 64 78 5f 6c 69  ach {hash idx_li
1e60: 73 74 7d 20 5b 61 72 72 61 79 20 67 65 74 20 69  st} [array get i
1e70: 6e 64 65 78 65 73 5f 70 65 72 5f 68 61 73 68 5d  ndexes_per_hash]
1e80: 20 7b 0a 09 70 75 74 73 20 22 5c 74 5c 74 63 61   {..puts "\t\tca
1e90: 73 65 20 24 68 61 73 68 3a 22 0a 0a 09 69 66 20  se $hash:"...if 
1ea0: 7b 5b 6c 6c 65 6e 67 74 68 20 24 69 64 78 5f 6c  {[llength $idx_l
1eb0: 69 73 74 5d 20 3d 3d 20 31 7d 20 7b 0a 09 09 73  ist] == 1} {...s
1ec0: 65 74 20 69 64 78 20 5b 6c 69 6e 64 65 78 20 24  et idx [lindex $
1ed0: 69 64 78 5f 6c 69 73 74 20 30 20 31 5d 0a 0a 09  idx_list 0 1]...
1ee0: 09 70 75 74 73 20 22 5c 74 5c 74 5c 74 72 65 74  .puts "\t\t\tret
1ef0: 75 72 6e 28 24 69 64 78 29 3b 22 0a 09 7d 20 65  urn($idx);"..} e
1f00: 6c 73 65 20 7b 0a 09 09 66 6f 72 65 61 63 68 20  lse {...foreach 
1f10: 69 64 78 5f 65 6e 74 20 24 69 64 78 5f 6c 69 73  idx_ent $idx_lis
1f20: 74 20 7b 0a 09 09 09 73 65 74 20 73 68 6f 72 74  t {....set short
1f30: 66 69 6c 65 20 5b 6c 69 6e 64 65 78 20 24 69 64  file [lindex $id
1f40: 78 5f 65 6e 74 20 30 5d 0a 09 09 09 73 65 74 20  x_ent 0]....set 
1f50: 69 64 78 20 5b 6c 69 6e 64 65 78 20 24 69 64 78  idx [lindex $idx
1f60: 5f 65 6e 74 20 31 5d 0a 0a 09 09 09 70 75 74 73  _ent 1].....puts
1f70: 20 22 5c 74 5c 74 5c 74 69 66 20 28 73 74 72 63   "\t\t\tif (strc
1f80: 6d 70 28 70 61 74 68 2c 20 5c 22 24 73 68 6f 72  mp(path, \"$shor
1f90: 74 66 69 6c 65 5c 22 29 20 3d 3d 20 30 29 20 72  tfile\") == 0) r
1fa0: 65 74 75 72 6e 28 24 69 64 78 29 3b 22 0a 09 09  eturn($idx);"...
1fb0: 7d 0a 09 09 70 75 74 73 20 22 5c 74 5c 74 5c 74  }...puts "\t\t\t
1fc0: 62 72 65 61 6b 3b 22 0a 09 7d 0a 7d 0a 0a 70 75  break;"..}.}..pu
1fd0: 74 73 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 5c  ts "\t}".puts "\
1fe0: 74 72 65 74 75 72 6e 28 30 29 3b 22 0a 70 75 74  treturn(0);".put
1ff0: 73 20 22 7d 22 0a 70 75 74 73 20 22 22 0a 0a 70  s "}".puts ""..p
2000: 75 74 73 20 22 73 74 61 74 69 63 20 73 74 72 75  uts "static stru
2010: 63 74 20 63 76 66 73 5f 64 61 74 61 20 2a 24 7b  ct cvfs_data *${
2020: 63 6f 64 65 5f 74 61 67 7d 5f 67 65 74 44 61 74  code_tag}_getDat
2030: 61 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  a(const char *pa
2040: 74 68 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  th, unsigned lon
2050: 67 20 69 6e 64 65 78 29 20 7b 22 0a 70 75 74 73  g index) {".puts
2060: 20 22 5c 74 69 66 20 28 70 61 74 68 20 21 3d 20   "\tif (path != 
2070: 4e 55 4c 4c 29 20 7b 22 0a 70 75 74 73 20 22 5c  NULL) {".puts "\
2080: 74 5c 74 69 6e 64 65 78 20 3d 20 24 7b 63 6f 64  t\tindex = ${cod
2090: 65 5f 74 61 67 7d 5f 6c 6f 6f 6b 75 70 5f 69 6e  e_tag}_lookup_in
20a0: 64 65 78 28 70 61 74 68 29 3b 22 0a 70 75 74 73  dex(path);".puts
20b0: 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70   "\t}".puts "".p
20c0: 75 74 73 20 22 5c 74 69 66 20 28 69 6e 64 65 78  uts "\tif (index
20d0: 20 3d 3d 20 30 29 20 7b 22 0a 70 75 74 73 20 22   == 0) {".puts "
20e0: 5c 74 5c 74 72 65 74 75 72 6e 28 4e 55 4c 4c 29  \t\treturn(NULL)
20f0: 3b 22 0a 70 75 74 73 20 22 5c 74 7d 22 0a 70 75  ;".puts "\t}".pu
2100: 74 73 20 22 22 0a 70 75 74 73 20 22 5c 74 69 66  ts "".puts "\tif
2110: 20 28 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20   (path != NULL) 
2120: 7b 22 0a 70 75 74 73 20 22 5c 74 5c 74 69 66 20  {".puts "\t\tif 
2130: 28 73 74 72 63 6d 70 28 70 61 74 68 2c 20 24 7b  (strcmp(path, ${
2140: 63 6f 64 65 5f 74 61 67 7d 5f 64 61 74 61 5c 5b  code_tag}_data\[
2150: 69 6e 64 65 78 5c 5d 2e 6e 61 6d 65 29 20 21 3d  index\].name) !=
2160: 20 30 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 5c   0) {".puts "\t\
2170: 74 5c 74 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  t\treturn(NULL);
2180: 22 0a 70 75 74 73 20 22 5c 74 5c 74 7d 22 0a 70  ".puts "\t\t}".p
2190: 75 74 73 20 22 5c 74 7d 22 0a 70 75 74 73 20 22  uts "\t}".puts "
21a0: 22 0a 70 75 74 73 20 22 5c 74 72 65 74 75 72 6e  ".puts "\treturn
21b0: 28 26 24 7b 63 6f 64 65 5f 74 61 67 7d 5f 64 61  (&${code_tag}_da
21c0: 74 61 5c 5b 69 6e 64 65 78 5c 5d 29 3b 22 0a 70  ta\[index\]);".p
21d0: 75 74 73 20 22 7d 22 0a 70 75 74 73 20 22 22 0a  uts "}".puts "".
21e0: 0a 70 75 74 73 20 22 73 74 61 74 69 63 20 75 6e  .puts "static un
21f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 24 7b 63 6f  signed long ${co
2200: 64 65 5f 74 61 67 7d 5f 67 65 74 43 68 69 6c 64  de_tag}_getChild
2210: 72 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ren(const char *
2220: 70 61 74 68 2c 20 75 6e 73 69 67 6e 65 64 20 6c  path, unsigned l
2230: 6f 6e 67 20 2a 6f 75 74 62 75 66 2c 20 75 6e 73  ong *outbuf, uns
2240: 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 62 75  igned long outbu
2250: 66 5f 63 6f 75 6e 74 29 20 7b 22 0a 70 75 74 73  f_count) {".puts
2260: 20 22 5c 74 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   "\tunsigned lon
2270: 67 20 69 6e 64 65 78 3b 22 0a 70 75 74 73 20 22  g index;".puts "
2280: 5c 74 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  \tunsigned long 
2290: 6e 75 6d 5f 63 68 69 6c 64 72 65 6e 20 3d 20 30  num_children = 0
22a0: 3b 22 0a 70 75 74 73 20 22 22 0a 70 75 74 73 20  ;".puts "".puts 
22b0: 22 5c 74 69 6e 64 65 78 20 3d 20 24 7b 63 6f 64  "\tindex = ${cod
22c0: 65 5f 74 61 67 7d 5f 6c 6f 6f 6b 75 70 5f 69 6e  e_tag}_lookup_in
22d0: 64 65 78 28 70 61 74 68 29 3b 22 0a 70 75 74 73  dex(path);".puts
22e0: 20 22 5c 74 69 66 20 28 69 6e 64 65 78 20 3d 3d   "\tif (index ==
22f0: 20 30 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 5c   0) {".puts "\t\
2300: 74 72 65 74 75 72 6e 28 30 29 3b 22 0a 70 75 74  treturn(0);".put
2310: 73 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a  s "\t}".puts "".
2320: 70 75 74 73 20 22 5c 74 69 66 20 28 24 7b 63 6f  puts "\tif (${co
2330: 64 65 5f 74 61 67 7d 5f 64 61 74 61 5c 5b 69 6e  de_tag}_data\[in
2340: 64 65 78 5c 5d 2e 74 79 70 65 20 21 3d 20 43 56  dex\].type != CV
2350: 46 53 5f 46 49 4c 45 54 59 50 45 5f 44 49 52 29  FS_FILETYPE_DIR)
2360: 20 7b 22 0a 70 75 74 73 20 22 5c 74 5c 74 72 65   {".puts "\t\tre
2370: 74 75 72 6e 28 30 29 3b 22 0a 70 75 74 73 20 22  turn(0);".puts "
2380: 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74  \t}".puts "".put
2390: 73 20 22 5c 74 69 66 20 28 73 74 72 63 6d 70 28  s "\tif (strcmp(
23a0: 70 61 74 68 2c 20 24 7b 63 6f 64 65 5f 74 61 67  path, ${code_tag
23b0: 7d 5f 64 61 74 61 5c 5b 69 6e 64 65 78 5c 5d 2e  }_data\[index\].
23c0: 6e 61 6d 65 29 20 21 3d 20 30 29 20 7b 22 0a 70  name) != 0) {".p
23d0: 75 74 73 20 22 5c 74 5c 74 72 65 74 75 72 6e 28  uts "\t\treturn(
23e0: 30 29 3b 22 0a 70 75 74 73 20 22 5c 74 7d 22 0a  0);".puts "\t}".
23f0: 70 75 74 73 20 22 22 0a 70 75 74 73 20 22 5c 74  puts "".puts "\t
2400: 73 77 69 74 63 68 20 28 69 6e 64 65 78 29 20 7b  switch (index) {
2410: 22 0a 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70  "..unset -nocomp
2420: 6c 61 69 6e 20 63 68 69 6c 64 72 65 6e 0a 61 72  lain children.ar
2430: 72 61 79 20 73 65 74 20 63 68 69 6c 64 72 65 6e  ray set children
2440: 20 5b 6c 69 73 74 5d 0a 66 6f 72 20 7b 73 65 74   [list].for {set
2450: 20 69 64 78 20 31 7d 20 7b 24 69 64 78 20 3c 20   idx 1} {$idx < 
2460: 5b 6c 6c 65 6e 67 74 68 20 24 66 69 6c 65 73 5d  [llength $files]
2470: 7d 20 7b 69 6e 63 72 20 69 64 78 7d 20 7b 0a 09  } {incr idx} {..
2480: 73 65 74 20 66 69 6c 65 20 5b 6c 69 6e 64 65 78  set file [lindex
2490: 20 24 66 69 6c 65 73 20 24 69 64 78 5d 0a 09 73   $files $idx]..s
24a0: 65 74 20 73 68 6f 72 74 66 69 6c 65 20 5b 73 68  et shortfile [sh
24b0: 6f 72 74 65 6e 5f 66 69 6c 65 20 24 73 74 61 72  orten_file $star
24c0: 74 64 69 72 20 24 66 69 6c 65 5d 0a 0a 09 75 6e  tdir $file]...un
24d0: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
24e0: 66 69 6e 66 6f 20 74 79 70 65 0a 09 66 69 6c 65  finfo type..file
24f0: 20 73 74 61 74 20 24 66 69 6c 65 20 66 69 6e 66   stat $file finf
2500: 6f 0a 0a 09 69 66 20 7b 24 66 69 6e 66 6f 28 74  o...if {$finfo(t
2510: 79 70 65 29 20 21 3d 20 22 64 69 72 65 63 74 6f  ype) != "directo
2520: 72 79 22 7d 20 7b 0a 09 09 63 6f 6e 74 69 6e 75  ry"} {...continu
2530: 65 3b 0a 09 7d 0a 0a 09 23 20 44 65 74 65 72 6d  e;..}...# Determ
2540: 69 6e 65 20 77 68 69 63 68 20 63 68 69 6c 64 72  ine which childr
2550: 65 6e 20 61 72 65 20 75 6e 64 65 72 20 74 68 69  en are under thi
2560: 73 20 64 69 72 65 63 74 6f 72 79 0a 09 23 23 20  s directory..## 
2570: 43 6f 6e 76 65 72 74 20 74 68 65 20 63 75 72 72  Convert the curr
2580: 65 6e 74 20 70 61 74 68 6e 61 6d 65 20 74 6f 20  ent pathname to 
2590: 61 20 72 65 67 75 6c 61 72 20 65 78 70 72 65 73  a regular expres
25a0: 73 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65  sion that matche
25b0: 73 20 65 78 61 63 74 6c 79 0a 09 73 65 74 20 66  s exactly..set f
25c0: 69 6c 65 5f 72 65 67 65 78 70 20 5b 73 74 72 69  ile_regexp [stri
25d0: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 22 5c 5c  ng map [list "\\
25e0: 22 20 22 5c 5c 5c 5c 22 20 22 2e 22 20 22 5c 5c  " "\\\\" "." "\\
25f0: 2e 22 20 22 5c 7b 22 20 22 5c 5c 5c 7b 22 20 22  ." "\{" "\\\{" "
2600: 5c 7d 22 20 22 5c 5c 5c 7d 22 20 22 2a 22 20 22  \}" "\\\}" "*" "
2610: 5c 5c 2a 22 5d 20 24 66 69 6c 65 5d 0a 0a 09 23  \\*"] $file]...#
2620: 23 20 53 65 61 72 63 68 20 66 6f 72 20 70 61 74  # Search for pat
2630: 68 6e 61 6d 65 73 20 77 68 69 63 68 20 73 74 61  hnames which sta
2640: 72 74 20 77 69 74 68 20 65 78 61 63 74 6c 79 20  rt with exactly 
2650: 6f 75 72 20 6e 61 6d 65 2c 20 66 6f 6c 6c 6f 77  our name, follow
2660: 65 64 20 62 79 20 61 20 73 6c 61 73 68 0a 09 23  ed by a slash..#
2670: 23 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 6f  # followed by no
2680: 20 6d 6f 72 65 20 73 6c 61 73 68 65 73 20 28 64   more slashes (d
2690: 69 72 65 63 74 20 64 65 73 63 65 6e 64 61 6e 74  irect descendant
26a0: 73 29 0a 09 73 65 74 20 63 68 69 6c 64 5f 69 64  s)..set child_id
26b0: 78 5f 6c 69 73 74 20 5b 6c 73 65 61 72 63 68 20  x_list [lsearch 
26c0: 2d 72 65 67 65 78 70 20 2d 61 6c 6c 20 24 66 69  -regexp -all $fi
26d0: 6c 65 73 20 22 5e 24 7b 66 69 6c 65 5f 72 65 67  les "^${file_reg
26e0: 65 78 70 7d 2f 5c 5b 5e 2f 5c 5d 2a 24 22 5d 0a  exp}/\[^/\]*$"].
26f0: 0a 09 73 65 74 20 63 68 69 6c 64 72 65 6e 28 24  ..set children($
2700: 69 64 78 29 20 24 63 68 69 6c 64 5f 69 64 78 5f  idx) $child_idx_
2710: 6c 69 73 74 0a 0a 09 70 75 74 73 20 22 5c 74 5c  list...puts "\t\
2720: 74 63 61 73 65 20 24 69 64 78 3a 22 0a 09 70 75  tcase $idx:"..pu
2730: 74 73 20 22 5c 74 5c 74 5c 74 6e 75 6d 5f 63 68  ts "\t\t\tnum_ch
2740: 69 6c 64 72 65 6e 20 3d 20 5b 6c 6c 65 6e 67 74  ildren = [llengt
2750: 68 20 24 63 68 69 6c 64 5f 69 64 78 5f 6c 69 73  h $child_idx_lis
2760: 74 5d 3b 22 0a 09 70 75 74 73 20 22 5c 74 5c 74  t];"..puts "\t\t
2770: 5c 74 62 72 65 61 6b 3b 22 0a 09 0a 7d 0a 0a 70  \tbreak;"...}..p
2780: 75 74 73 20 22 5c 74 7d 22 0a 70 75 74 73 20 22  uts "\t}".puts "
2790: 22 0a 70 75 74 73 20 22 5c 74 69 66 20 28 6f 75  ".puts "\tif (ou
27a0: 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 22  tbuf == NULL) {"
27b0: 0a 70 75 74 73 20 22 5c 74 5c 74 72 65 74 75 72  .puts "\t\tretur
27c0: 6e 28 6e 75 6d 5f 63 68 69 6c 64 72 65 6e 29 3b  n(num_children);
27d0: 22 0a 70 75 74 73 20 22 5c 74 7d 22 0a 70 75 74  ".puts "\t}".put
27e0: 73 20 22 22 0a 70 75 74 73 20 22 5c 74 69 66 20  s "".puts "\tif 
27f0: 28 6e 75 6d 5f 63 68 69 6c 64 72 65 6e 20 3e 20  (num_children > 
2800: 6f 75 74 62 75 66 5f 63 6f 75 6e 74 29 20 7b 22  outbuf_count) {"
2810: 0a 70 75 74 73 20 22 5c 74 5c 74 6e 75 6d 5f 63  .puts "\t\tnum_c
2820: 68 69 6c 64 72 65 6e 20 3d 20 6f 75 74 62 75 66  hildren = outbuf
2830: 5f 63 6f 75 6e 74 3b 22 0a 70 75 74 73 20 22 5c  _count;".puts "\
2840: 74 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74 73  t}".puts "".puts
2850: 20 22 5c 74 69 66 20 28 6e 75 6d 5f 63 68 69 6c   "\tif (num_chil
2860: 64 72 65 6e 20 3d 3d 20 30 29 20 7b 22 0a 70 75  dren == 0) {".pu
2870: 74 73 20 22 5c 74 5c 74 72 65 74 75 72 6e 28 6e  ts "\t\treturn(n
2880: 75 6d 5f 63 68 69 6c 64 72 65 6e 29 3b 22 0a 70  um_children);".p
2890: 75 74 73 20 22 5c 74 7d 22 0a 70 75 74 73 20 22  uts "\t}".puts "
28a0: 22 0a 70 75 74 73 20 22 5c 74 69 66 20 28 6f 75  ".puts "\tif (ou
28b0: 74 62 75 66 5f 63 6f 75 6e 74 20 3e 20 6e 75 6d  tbuf_count > num
28c0: 5f 63 68 69 6c 64 72 65 6e 29 20 7b 22 0a 70 75  _children) {".pu
28d0: 74 73 20 22 5c 74 5c 74 6f 75 74 62 75 66 5f 63  ts "\t\toutbuf_c
28e0: 6f 75 6e 74 20 3d 20 6e 75 6d 5f 63 68 69 6c 64  ount = num_child
28f0: 72 65 6e 3b 22 0a 70 75 74 73 20 22 5c 74 7d 22  ren;".puts "\t}"
2900: 0a 70 75 74 73 20 22 22 0a 70 75 74 73 20 22 5c  .puts "".puts "\
2910: 74 73 77 69 74 63 68 20 28 69 6e 64 65 78 29 20  tswitch (index) 
2920: 7b 22 0a 0a 66 6f 72 65 61 63 68 20 7b 69 64 78  {"..foreach {idx
2930: 20 63 68 69 6c 64 5f 69 64 78 5f 6c 69 73 74 7d   child_idx_list}
2940: 20 5b 61 72 72 61 79 20 67 65 74 20 63 68 69 6c   [array get chil
2950: 64 72 65 6e 5d 20 7b 0a 09 69 66 20 7b 5b 6c 6c  dren] {..if {[ll
2960: 65 6e 67 74 68 20 24 63 68 69 6c 64 5f 69 64 78  ength $child_idx
2970: 5f 6c 69 73 74 5d 20 3d 3d 20 30 7d 20 7b 0a 09  _list] == 0} {..
2980: 09 63 6f 6e 74 69 6e 75 65 0a 09 7d 0a 0a 09 70  .continue..}...p
2990: 75 74 73 20 22 5c 74 5c 74 63 61 73 65 20 24 69  uts "\t\tcase $i
29a0: 64 78 3a 22 0a 09 70 75 74 73 20 22 5c 74 5c 74  dx:"..puts "\t\t
29b0: 5c 74 73 77 69 74 63 68 28 6f 75 74 62 75 66 5f  \tswitch(outbuf_
29c0: 63 6f 75 6e 74 29 20 7b 22 0a 0a 09 66 6f 72 20  count) {"...for 
29d0: 7b 73 65 74 20 63 68 69 6c 64 5f 69 64 78 5f 69  {set child_idx_i
29e0: 64 78 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67  dx [expr {[lleng
29f0: 74 68 20 24 63 68 69 6c 64 5f 69 64 78 5f 6c 69  th $child_idx_li
2a00: 73 74 5d 20 2d 20 31 7d 5d 7d 20 7b 24 63 68 69  st] - 1}]} {$chi
2a10: 6c 64 5f 69 64 78 5f 69 64 78 20 3e 3d 20 30 7d  ld_idx_idx >= 0}
2a20: 20 7b 69 6e 63 72 20 63 68 69 6c 64 5f 69 64 78   {incr child_idx
2a30: 5f 69 64 78 20 2d 31 7d 20 7b 0a 09 09 73 65 74  _idx -1} {...set
2a40: 20 63 68 69 6c 64 5f 69 64 78 20 5b 6c 69 6e 64   child_idx [lind
2a50: 65 78 20 24 63 68 69 6c 64 5f 69 64 78 5f 6c 69  ex $child_idx_li
2a60: 73 74 20 24 63 68 69 6c 64 5f 69 64 78 5f 69 64  st $child_idx_id
2a70: 78 5d 0a 0a 09 09 70 75 74 73 20 22 5c 74 5c 74  x]....puts "\t\t
2a80: 5c 74 5c 74 63 61 73 65 20 5b 65 78 70 72 20 7b  \t\tcase [expr {
2a90: 24 63 68 69 6c 64 5f 69 64 78 5f 69 64 78 20 2b  $child_idx_idx +
2aa0: 20 31 7d 5d 3a 22 0a 09 09 70 75 74 73 20 22 5c   1}]:"...puts "\
2ab0: 74 5c 74 5c 74 5c 74 5c 74 6f 75 74 62 75 66 5c  t\t\t\t\toutbuf\
2ac0: 5b 24 63 68 69 6c 64 5f 69 64 78 5f 69 64 78 5c  [$child_idx_idx\
2ad0: 5d 20 3d 20 24 63 68 69 6c 64 5f 69 64 78 3b 22  ] = $child_idx;"
2ae0: 0a 09 7d 0a 0a 09 70 75 74 73 20 22 5c 74 5c 74  ..}...puts "\t\t
2af0: 5c 74 7d 22 0a 0a 09 70 75 74 73 20 22 5c 74 5c  \t}"...puts "\t\
2b00: 74 5c 74 62 72 65 61 6b 3b 22 0a 7d 0a 0a 70 75  t\tbreak;".}..pu
2b10: 74 73 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 22  ts "\t}".puts ""
2b20: 0a 70 75 74 73 20 22 5c 74 72 65 74 75 72 6e 28  .puts "\treturn(
2b30: 6e 75 6d 5f 63 68 69 6c 64 72 65 6e 29 3b 22 0a  num_children);".
2b40: 70 75 74 73 20 22 7d 22 0a 70 75 74 73 20 22 22  puts "}".puts ""
2b50: 0a 0a 69 66 20 7b 24 6f 62 73 66 75 63 61 74 65  ..if {$obsfucate
2b60: 7d 20 7b 0a 09 70 75 74 73 20 22 73 74 61 74 69  } {..puts "stati
2b70: 63 20 76 6f 69 64 20 24 7b 63 6f 64 65 5f 74 61  c void ${code_ta
2b80: 67 7d 5f 64 65 63 72 79 70 74 46 69 6c 65 28 63  g}_decryptFile(c
2b90: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
2ba0: 20 73 74 72 75 63 74 20 63 76 66 73 5f 64 61 74   struct cvfs_dat
2bb0: 61 20 2a 66 69 6e 66 6f 29 20 7b 22 0a 09 70 75  a *finfo) {"..pu
2bc0: 74 73 20 22 5c 74 73 74 61 74 69 63 20 73 74 72  ts "\tstatic str
2bd0: 75 63 74 20 63 76 66 73 5f 6b 65 79 20 6b 65 79  uct cvfs_key key
2be0: 20 3d 20 7b 20 5b 73 74 72 69 6e 67 20 6d 61 70   = { [string map
2bf0: 20 5b 6c 69 73 74 20 22 5c 6e 22 20 22 20 22 5d   [list "\n" " "]
2c00: 20 5b 65 6e 63 72 79 70 74 5f 6b 65 79 5f 65 78   [encrypt_key_ex
2c10: 70 6f 72 74 20 24 6f 62 73 66 75 63 61 74 69 6f  port $obsfucatio
2c20: 6e 5f 6b 65 79 20 22 63 22 5d 5d 20 7d 3b 22 0a  n_key "c"]] };".
2c30: 09 70 75 74 73 20 22 5c 74 75 6e 73 69 67 6e 65  .puts "\tunsigne
2c40: 64 20 63 68 61 72 20 2a 6e 65 77 5f 64 61 74 61  d char *new_data
2c50: 2c 20 2a 6f 6c 64 5f 64 61 74 61 3b 22 0a 09 70  , *old_data;"..p
2c60: 75 74 73 20 22 5c 74 69 6e 74 20 64 65 63 72 79  uts "\tint decry
2c70: 70 74 5f 72 65 74 2c 20 66 72 65 65 5f 6f 6c 64  pt_ret, free_old
2c80: 5f 64 61 74 61 3b 22 0a 09 70 75 74 73 20 22 22  _data;"..puts ""
2c90: 0a 09 70 75 74 73 20 22 5c 74 6e 65 77 5f 64 61  ..puts "\tnew_da
2ca0: 74 61 20 3d 20 28 76 6f 69 64 20 2a 29 20 54 63  ta = (void *) Tc
2cb0: 6c 5f 41 6c 6c 6f 63 28 66 69 6e 66 6f 2d 3e 73  l_Alloc(finfo->s
2cc0: 69 7a 65 29 3b 22 0a 09 70 75 74 73 20 22 5c 74  ize);"..puts "\t
2cd0: 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 63 76  decrypt_ret = cv
2ce0: 66 73 5f 64 65 63 72 79 70 74 28 6e 65 77 5f 64  fs_decrypt(new_d
2cf0: 61 74 61 2c 20 66 69 6e 66 6f 2d 3e 64 61 74 61  ata, finfo->data
2d00: 2c 20 66 69 6e 66 6f 2d 3e 73 69 7a 65 2c 20 26  , finfo->size, &
2d10: 6b 65 79 29 3b 22 0a 09 70 75 74 73 20 22 5c 74  key);"..puts "\t
2d20: 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20  if (decrypt_ret 
2d30: 21 3d 20 30 29 20 7b 22 0a 09 70 75 74 73 20 22  != 0) {"..puts "
2d40: 5c 74 5c 74 54 63 6c 5f 46 72 65 65 28 28 76 6f  \t\tTcl_Free((vo
2d50: 69 64 20 2a 29 20 6e 65 77 5f 64 61 74 61 29 3b  id *) new_data);
2d60: 22 0a 09 70 75 74 73 20 22 22 0a 09 70 75 74 73  "..puts ""..puts
2d70: 20 22 5c 74 5c 74 72 65 74 75 72 6e 3b 22 0a 09   "\t\treturn;"..
2d80: 70 75 74 73 20 22 5c 74 7d 22 0a 09 70 75 74 73  puts "\t}"..puts
2d90: 20 22 22 0a 09 70 75 74 73 20 22 5c 74 66 72 65   ""..puts "\tfre
2da0: 65 5f 6f 6c 64 5f 64 61 74 61 20 3d 20 66 69 6e  e_old_data = fin
2db0: 66 6f 2d 3e 66 72 65 65 3b 22 0a 09 70 75 74 73  fo->free;"..puts
2dc0: 20 22 5c 74 6f 6c 64 5f 64 61 74 61 20 3d 20 28   "\told_data = (
2dd0: 76 6f 69 64 20 2a 29 20 66 69 6e 66 6f 2d 3e 64  void *) finfo->d
2de0: 61 74 61 3b 22 0a 09 70 75 74 73 20 22 22 0a 09  ata;"..puts ""..
2df0: 70 75 74 73 20 22 5c 74 66 69 6e 66 6f 2d 3e 64  puts "\tfinfo->d
2e00: 61 74 61 20 3d 20 6e 65 77 5f 64 61 74 61 3b 22  ata = new_data;"
2e10: 0a 09 70 75 74 73 20 22 5c 74 66 69 6e 66 6f 2d  ..puts "\tfinfo-
2e20: 3e 66 72 65 65 20 3d 20 31 3b 22 0a 09 70 75 74  >free = 1;"..put
2e30: 73 20 22 5c 74 66 69 6e 66 6f 2d 3e 74 79 70 65  s "\tfinfo->type
2e40: 20 3d 20 43 56 46 53 5f 46 49 4c 45 54 59 50 45   = CVFS_FILETYPE
2e50: 5f 46 49 4c 45 3b 22 0a 09 70 75 74 73 20 22 22  _FILE;"..puts ""
2e60: 0a 09 70 75 74 73 20 22 5c 74 69 66 20 28 66 72  ..puts "\tif (fr
2e70: 65 65 5f 6f 6c 64 5f 64 61 74 61 29 20 7b 22 0a  ee_old_data) {".
2e80: 09 70 75 74 73 20 22 5c 74 5c 74 54 63 6c 5f 46  .puts "\t\tTcl_F
2e90: 72 65 65 28 28 76 6f 69 64 20 2a 29 20 6f 6c 64  ree((void *) old
2ea0: 5f 64 61 74 61 29 3b 22 0a 09 70 75 74 73 20 22  _data);"..puts "
2eb0: 5c 74 7d 22 0a 09 70 75 74 73 20 22 5c 74 72 65  \t}"..puts "\tre
2ec0: 74 75 72 6e 3b 22 0a 09 70 75 74 73 20 22 7d 22  turn;"..puts "}"
2ed0: 0a 09 70 75 74 73 20 22 22 0a 7d 0a 0a 70 75 74  ..puts "".}..put
2ee0: 73 20 22 23 20 20 69 66 64 65 66 20 43 56 46 53  s "#  ifdef CVFS
2ef0: 5f 4d 41 4b 45 5f 4c 4f 41 44 41 42 4c 45 22 0a  _MAKE_LOADABLE".
2f00: 0a 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 22 63  .set fd [open "c
2f10: 76 66 73 5f 64 61 74 61 2e 63 22 5d 0a 70 75 74  vfs_data.c"].put
2f20: 73 20 5b 72 65 61 64 20 24 66 64 5d 0a 63 6c 6f  s [read $fd].clo
2f30: 73 65 20 24 66 64 0a 0a 70 75 74 73 20 22 73 74  se $fd..puts "st
2f40: 61 74 69 63 20 63 6d 64 5f 67 65 74 44 61 74 61  atic cmd_getData
2f50: 5f 74 20 2a 67 65 74 43 6d 64 44 61 74 61 28 63  _t *getCmdData(c
2f60: 6f 6e 73 74 20 63 68 61 72 20 2a 68 61 73 68 6b  onst char *hashk
2f70: 65 79 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 72  ey) {".puts "\tr
2f80: 65 74 75 72 6e 28 24 7b 63 6f 64 65 5f 74 61 67  eturn(${code_tag
2f90: 7d 5f 67 65 74 44 61 74 61 29 3b 22 0a 70 75 74  }_getData);".put
2fa0: 73 20 22 7d 22 0a 70 75 74 73 20 22 22 0a 70 75  s "}".puts "".pu
2fb0: 74 73 20 22 73 74 61 74 69 63 20 63 6d 64 5f 67  ts "static cmd_g
2fc0: 65 74 43 68 69 6c 64 72 65 6e 5f 74 20 2a 67 65  etChildren_t *ge
2fd0: 74 43 6d 64 43 68 69 6c 64 72 65 6e 28 63 6f 6e  tCmdChildren(con
2fe0: 73 74 20 63 68 61 72 20 2a 68 61 73 68 6b 65 79  st char *hashkey
2ff0: 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 72 65 74  ) {".puts "\tret
3000: 75 72 6e 28 24 7b 63 6f 64 65 5f 74 61 67 7d 5f  urn(${code_tag}_
3010: 67 65 74 43 68 69 6c 64 72 65 6e 29 3b 22 0a 70  getChildren);".p
3020: 75 74 73 20 22 7d 22 0a 70 75 74 73 20 22 22 0a  uts "}".puts "".
3030: 70 75 74 73 20 22 73 74 61 74 69 63 20 63 6d 64  puts "static cmd
3040: 5f 64 65 63 72 79 70 74 46 69 6c 65 5f 74 20 2a  _decryptFile_t *
3050: 67 65 74 43 6d 64 44 65 63 72 79 70 74 46 69 6c  getCmdDecryptFil
3060: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 61  e(const char *ha
3070: 73 68 6b 65 79 29 20 7b 22 0a 69 66 20 7b 24 6f  shkey) {".if {$o
3080: 62 73 66 75 63 61 74 65 7d 20 7b 0a 09 70 75 74  bsfucate} {..put
3090: 73 20 22 5c 74 72 65 74 75 72 6e 28 24 7b 63 6f  s "\treturn(${co
30a0: 64 65 5f 74 61 67 7d 5f 64 65 63 72 79 70 74 46  de_tag}_decryptF
30b0: 69 6c 65 29 3b 22 0a 7d 20 65 6c 73 65 20 7b 0a  ile);".} else {.
30c0: 09 70 75 74 73 20 22 5c 74 72 65 74 75 72 6e 28  .puts "\treturn(
30d0: 4e 55 4c 4c 29 3b 22 0a 7d 0a 70 75 74 73 20 22  NULL);".}.puts "
30e0: 7d 22 0a 70 75 74 73 20 22 22 0a 0a 70 75 74 73  }".puts ""..puts
30f0: 20 22 69 6e 74 20 43 76 66 73 5f 64 61 74 61 5f   "int Cvfs_data_
3100: 24 7b 68 61 73 68 6b 65 79 7d 5f 49 6e 69 74 28  ${hashkey}_Init(
3110: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3120: 72 70 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 54  rp) {".puts "\tT
3130: 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 63 6c 43 72  cl_Command tclCr
3140: 65 61 74 43 6f 6d 6d 5f 72 65 74 3b 22 0a 70 75  eatComm_ret;".pu
3150: 74 73 20 22 5c 74 69 6e 74 20 74 63 6c 50 6b 67  ts "\tint tclPkg
3160: 50 72 6f 76 5f 72 65 74 3b 22 0a 70 75 74 73 20  Prov_ret;".puts 
3170: 22 22 0a 70 75 74 73 20 22 23 69 66 64 65 66 20  "".puts "#ifdef 
3180: 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 22 0a 70  USE_TCL_STUBS".p
3190: 75 74 73 20 22 5c 74 69 66 20 28 21 54 63 6c 5f  uts "\tif (!Tcl_
31a0: 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70  InitStubs(interp
31b0: 2c 20 54 43 4c 5f 56 45 52 53 49 4f 4e 2c 20 30  , TCL_VERSION, 0
31c0: 29 29 20 7b 22 0a 70 75 74 73 20 22 23 65 6c 73  )) {".puts "#els
31d0: 65 22 0a 70 75 74 73 20 22 5c 74 69 66 20 28 21  e".puts "\tif (!
31e0: 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69  Tcl_PkgRequire(i
31f0: 6e 74 65 72 70 2c 20 5c 22 54 63 6c 5c 22 2c 20  nterp, \"Tcl\", 
3200: 54 43 4c 5f 56 45 52 53 49 4f 4e 2c 20 30 29 29  TCL_VERSION, 0))
3210: 20 7b 22 0a 70 75 74 73 20 22 23 65 6e 64 69 66   {".puts "#endif
3220: 20 2f 2a 20 55 53 45 5f 54 43 4c 5f 53 54 55 42   /* USE_TCL_STUB
3230: 53 20 2a 2f 22 0a 70 75 74 73 20 22 5c 74 5c 74  S */".puts "\t\t
3240: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
3250: 29 3b 22 0a 70 75 74 73 20 22 5c 74 7d 22 0a 70  );".puts "\t}".p
3260: 75 74 73 20 22 22 0a 70 75 74 73 20 22 5c 74 74  uts "".puts "\tt
3270: 63 6c 43 72 65 61 74 43 6f 6d 6d 5f 72 65 74 20  clCreatComm_ret 
3280: 3d 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43  = Tcl_CreateObjC
3290: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 5c  ommand(interp, \
32a0: 22 3a 3a 76 66 73 3a 3a 63 76 66 73 3a 3a 64 61  "::vfs::cvfs::da
32b0: 74 61 3a 3a 24 7b 68 61 73 68 6b 65 79 7d 3a 3a  ta::${hashkey}::
32c0: 67 65 74 4d 65 74 61 64 61 74 61 5c 22 2c 20 67  getMetadata\", g
32d0: 65 74 4d 65 74 61 64 61 74 61 2c 20 4e 55 4c 4c  etMetadata, NULL
32e0: 2c 20 4e 55 4c 4c 29 3b 22 0a 70 75 74 73 20 22  , NULL);".puts "
32f0: 5c 74 69 66 20 28 21 74 63 6c 43 72 65 61 74 43  \tif (!tclCreatC
3300: 6f 6d 6d 5f 72 65 74 29 20 7b 22 0a 70 75 74 73  omm_ret) {".puts
3310: 20 22 5c 74 5c 74 72 65 74 75 72 6e 28 54 43 4c   "\t\treturn(TCL
3320: 5f 45 52 52 4f 52 29 3b 22 0a 70 75 74 73 20 22  _ERROR);".puts "
3330: 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74  \t}".puts "".put
3340: 73 20 22 5c 74 74 63 6c 43 72 65 61 74 43 6f 6d  s "\ttclCreatCom
3350: 6d 5f 72 65 74 20 3d 20 54 63 6c 5f 43 72 65 61  m_ret = Tcl_Crea
3360: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
3370: 65 72 70 2c 20 5c 22 3a 3a 76 66 73 3a 3a 63 76  erp, \"::vfs::cv
3380: 66 73 3a 3a 64 61 74 61 3a 3a 24 7b 68 61 73 68  fs::data::${hash
3390: 6b 65 79 7d 3a 3a 67 65 74 44 61 74 61 5c 22 2c  key}::getData\",
33a0: 20 67 65 74 44 61 74 61 2c 20 4e 55 4c 4c 2c 20   getData, NULL, 
33b0: 4e 55 4c 4c 29 3b 22 0a 70 75 74 73 20 22 5c 74  NULL);".puts "\t
33c0: 69 66 20 28 21 74 63 6c 43 72 65 61 74 43 6f 6d  if (!tclCreatCom
33d0: 6d 5f 72 65 74 29 20 7b 22 0a 70 75 74 73 20 22  m_ret) {".puts "
33e0: 5c 74 5c 74 72 65 74 75 72 6e 28 54 43 4c 5f 45  \t\treturn(TCL_E
33f0: 52 52 4f 52 29 3b 22 0a 70 75 74 73 20 22 5c 74  RROR);".puts "\t
3400: 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74 73 20  }".puts "".puts 
3410: 22 5c 74 74 63 6c 43 72 65 61 74 43 6f 6d 6d 5f  "\ttclCreatComm_
3420: 72 65 74 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  ret = Tcl_Create
3430: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
3440: 70 2c 20 5c 22 3a 3a 76 66 73 3a 3a 63 76 66 73  p, \"::vfs::cvfs
3450: 3a 3a 64 61 74 61 3a 3a 24 7b 68 61 73 68 6b 65  ::data::${hashke
3460: 79 7d 3a 3a 67 65 74 43 68 69 6c 64 72 65 6e 5c  y}::getChildren\
3470: 22 2c 20 67 65 74 43 68 69 6c 64 72 65 6e 2c 20  ", getChildren, 
3480: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 22 0a 70 75  NULL, NULL);".pu
3490: 74 73 20 22 5c 74 69 66 20 28 21 74 63 6c 43 72  ts "\tif (!tclCr
34a0: 65 61 74 43 6f 6d 6d 5f 72 65 74 29 20 7b 22 0a  eatComm_ret) {".
34b0: 70 75 74 73 20 22 5c 74 5c 74 72 65 74 75 72 6e  puts "\t\treturn
34c0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 22 0a 70 75  (TCL_ERROR);".pu
34d0: 74 73 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 22  ts "\t}".puts ""
34e0: 0a 70 75 74 73 20 22 5c 74 74 63 6c 50 6b 67 50  .puts "\ttclPkgP
34f0: 72 6f 76 5f 72 65 74 20 3d 20 54 63 6c 5f 50 6b  rov_ret = Tcl_Pk
3500: 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
3510: 20 5c 22 76 66 73 3a 3a 63 76 66 73 3a 3a 64 61   \"vfs::cvfs::da
3520: 74 61 3a 3a 24 7b 68 61 73 68 6b 65 79 7d 5c 22  ta::${hashkey}\"
3530: 2c 20 5c 22 31 2e 30 5c 22 29 3b 22 0a 70 75 74  , \"1.0\");".put
3540: 73 20 22 22 0a 70 75 74 73 20 22 5c 74 72 65 74  s "".puts "\tret
3550: 75 72 6e 28 74 63 6c 50 6b 67 50 72 6f 76 5f 72  urn(tclPkgProv_r
3560: 65 74 29 3b 22 0a 70 75 74 73 20 22 5c 74 7d 22  et);".puts "\t}"
3570: 0a 70 75 74 73 20 22 23 20 20 65 6e 64 69 66 20  .puts "#  endif 
3580: 2f 2a 20 43 56 46 53 5f 4d 41 4b 45 5f 4c 4f 41  /* CVFS_MAKE_LOA
3590: 44 41 42 4c 45 20 2a 2f 22 0a 0a 70 75 74 73 20  DABLE */"..puts 
35a0: 22 23 65 6e 64 69 66 20 2f 2a 20 21 24 63 70 70  "#endif /* !$cpp
35b0: 5f 74 61 67 20 2a 2f 22 0a                       _tag */".