Hex Artifact Content

Artifact 990f9a7e475bfedaac7dcbdcee823e9e747efbd8:


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 6f 66 66 73 65 74  gned long offset
16c0: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
16d0: 69 6e 5f 6f 75 74 5f 6c 65 6e 67 74 68 2c 20 73  in_out_length, s
16e0: 74 72 75 63 74 20 63 76 66 73 5f 6b 65 79 20 2a  truct cvfs_key *
16f0: 6b 65 79 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  key) {..unsigned
1700: 20 6c 6f 6e 67 20 69 3b 0a 09 75 6e 73 69 67 6e   long i;..unsign
1710: 65 64 20 63 68 61 72 20 69 6e 5f 63 68 2c 20 6f  ed char in_ch, o
1720: 75 74 5f 63 68 3b 0a 09 69 6e 74 20 63 68 5f 69  ut_ch;..int ch_i
1730: 64 78 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 6f  dx;...for (i = o
1740: 66 66 73 65 74 3b 20 69 20 3c 20 69 6e 5f 6f 75  ffset; i < in_ou
1750: 74 5f 6c 65 6e 67 74 68 3b 20 69 2b 2b 29 20 7b  t_length; i++) {
1760: 0a 09 09 69 6e 5f 63 68 20 3d 20 69 6e 5b 69 5d  ...in_ch = in[i]
1770: 3b 0a 0a 09 09 63 68 5f 69 64 78 20 3d 20 28 69  ;....ch_idx = (i
1780: 6e 5f 63 68 20 2b 20 28 69 20 2f 20 6b 65 79 2d  n_ch + (i / key-
1790: 3e 74 79 70 65 64 61 74 61 2e 72 6f 74 61 74 65  >typedata.rotate
17a0: 5f 73 75 62 73 74 2e 72 6f 74 61 74 65 5f 6c 65  _subst.rotate_le
17b0: 6e 67 74 68 29 29 20 25 20 32 35 36 3b 0a 0a 09  ngth)) % 256;...
17c0: 09 6f 75 74 5f 63 68 20 3d 20 6b 65 79 2d 3e 74  .out_ch = key->t
17d0: 79 70 65 64 61 74 61 2e 72 6f 74 61 74 65 5f 73  ypedata.rotate_s
17e0: 75 62 73 74 2e 73 75 62 73 74 5b 63 68 5f 69 64  ubst.subst[ch_id
17f0: 78 5d 3b 0a 09 09 6f 75 74 5b 69 5d 20 3d 20 6f  x];...out[i] = o
1800: 75 74 5f 63 68 3b 0a 09 7d 0a 0a 09 72 65 74 75  ut_ch;..}...retu
1810: 72 6e 28 30 29 3b 0a 7d 0a 0a 23 20 20 65 6e 64  rn(0);.}..#  end
1820: 69 66 20 2f 2a 20 21 4c 4f 41 44 45 44 5f 43 56  if /* !LOADED_CV
1830: 46 53 5f 43 4f 4d 4d 4f 4e 20 2a 2f 7d 0a 70 75  FS_COMMON */}.pu
1840: 74 73 20 22 22 0a 0a 70 75 74 73 20 22 73 74 61  ts ""..puts "sta
1850: 74 69 63 20 73 74 72 75 63 74 20 63 76 66 73 5f  tic struct cvfs_
1860: 64 61 74 61 20 24 7b 63 6f 64 65 5f 74 61 67 7d  data ${code_tag}
1870: 5f 64 61 74 61 5c 5b 5c 5d 20 3d 20 7b 22 0a 70  _data\[\] = {".p
1880: 75 74 73 20 22 5c 74 7b 22 0a 70 75 74 73 20 22  uts "\t{".puts "
1890: 5c 74 5c 74 2f 2a 20 49 6e 64 65 78 20 30 20 63  \t\t/* Index 0 c
18a0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 62 65  annot be used be
18b0: 63 61 75 73 65 20 77 65 20 75 73 65 20 74 68 65  cause we use the
18c0: 20 76 61 6c 75 65 20 30 20 74 6f 20 72 65 70 72   value 0 to repr
18d0: 65 73 65 6e 74 20 66 61 69 6c 75 72 65 20 2a 2f  esent failure */
18e0: 22 0a 70 75 74 73 20 22 5c 74 5c 74 2e 6e 61 6d  ".puts "\t\t.nam
18f0: 65 20 20 3d 20 4e 55 4c 4c 2c 22 0a 70 75 74 73  e  = NULL,".puts
1900: 20 22 5c 74 5c 74 2e 69 6e 64 65 78 20 3d 20 30   "\t\t.index = 0
1910: 2c 22 0a 70 75 74 73 20 22 5c 74 5c 74 2e 74 79  ,".puts "\t\t.ty
1920: 70 65 20 20 3d 20 30 2c 22 0a 70 75 74 73 20 22  pe  = 0,".puts "
1930: 5c 74 5c 74 2e 73 69 7a 65 20 20 3d 20 30 2c 22  \t\t.size  = 0,"
1940: 0a 70 75 74 73 20 22 5c 74 5c 74 2e 64 61 74 61  .puts "\t\t.data
1950: 20 20 3d 20 4e 55 4c 4c 2c 22 0a 70 75 74 73 20    = NULL,".puts 
1960: 22 5c 74 5c 74 2e 66 72 65 65 20 20 3d 20 30 2c  "\t\t.free  = 0,
1970: 22 0a 70 75 74 73 20 22 5c 74 7d 2c 22 0a 66 6f  ".puts "\t},".fo
1980: 72 20 7b 73 65 74 20 69 64 78 20 31 7d 20 7b 24  r {set idx 1} {$
1990: 69 64 78 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24  idx < [llength $
19a0: 66 69 6c 65 73 5d 7d 20 7b 69 6e 63 72 20 69 64  files]} {incr id
19b0: 78 7d 20 7b 0a 09 73 65 74 20 66 69 6c 65 20 5b  x} {..set file [
19c0: 6c 69 6e 64 65 78 20 24 66 69 6c 65 73 20 24 69  lindex $files $i
19d0: 64 78 5d 0a 09 73 65 74 20 73 68 6f 72 74 66 69  dx]..set shortfi
19e0: 6c 65 20 5b 73 68 6f 72 74 65 6e 5f 66 69 6c 65  le [shorten_file
19f0: 20 24 73 74 61 72 74 64 69 72 20 24 66 69 6c 65   $startdir $file
1a00: 5d 0a 0a 09 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  ]...unset -nocom
1a10: 70 6c 61 69 6e 20 66 69 6e 66 6f 20 74 79 70 65  plain finfo type
1a20: 0a 09 66 69 6c 65 20 73 74 61 74 20 24 66 69 6c  ..file stat $fil
1a30: 65 20 66 69 6e 66 6f 0a 0a 09 73 77 69 74 63 68  e finfo...switch
1a40: 20 2d 2d 20 24 66 69 6e 66 6f 28 74 79 70 65 29   -- $finfo(type)
1a50: 20 7b 0a 09 09 22 66 69 6c 65 22 20 7b 0a 09 09   {..."file" {...
1a60: 09 73 65 74 20 73 69 7a 65 20 24 66 69 6e 66 6f  .set size $finfo
1a70: 28 73 69 7a 65 29 0a 0a 09 09 09 73 65 74 20 66  (size).....set f
1a80: 64 20 5b 6f 70 65 6e 20 24 66 69 6c 65 5d 0a 09  d [open $file]..
1a90: 09 09 66 63 6f 6e 66 69 67 75 72 65 20 24 66 64  ..fconfigure $fd
1aa0: 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69   -translation bi
1ab0: 6e 61 72 79 0a 09 09 09 73 65 74 20 64 61 74 61  nary....set data
1ac0: 20 5b 72 65 61 64 20 24 66 64 5d 0a 09 09 09 63   [read $fd]....c
1ad0: 6c 6f 73 65 20 24 66 64 0a 0a 09 09 09 69 66 20  lose $fd.....if 
1ae0: 7b 24 6f 62 73 66 75 63 61 74 65 7d 20 7b 0a 09  {$obsfucate} {..
1af0: 09 09 09 73 65 74 20 74 79 70 65 20 22 43 56 46  ...set type "CVF
1b00: 53 5f 46 49 4c 45 54 59 50 45 5f 45 4e 43 52 59  S_FILETYPE_ENCRY
1b10: 50 54 45 44 5f 46 49 4c 45 22 0a 09 09 09 09 73  PTED_FILE".....s
1b20: 65 74 20 64 61 74 61 20 22 28 75 6e 73 69 67 6e  et data "(unsign
1b30: 65 64 20 63 68 61 72 20 2a 29 20 5b 73 74 72 69  ed char *) [stri
1b40: 6e 67 69 66 79 20 5b 65 6e 63 72 79 70 74 20 24  ngify [encrypt $
1b50: 64 61 74 61 20 24 6f 62 73 66 75 63 61 74 69 6f  data $obsfucatio
1b60: 6e 5f 6b 65 79 5d 5d 22 0a 09 09 09 7d 20 65 6c  n_key]]"....} el
1b70: 73 65 20 7b 0a 09 09 09 09 73 65 74 20 74 79 70  se {.....set typ
1b80: 65 20 22 43 56 46 53 5f 46 49 4c 45 54 59 50 45  e "CVFS_FILETYPE
1b90: 5f 46 49 4c 45 22 0a 09 09 09 09 73 65 74 20 64  _FILE".....set d
1ba0: 61 74 61 20 22 28 75 6e 73 69 67 6e 65 64 20 63  ata "(unsigned c
1bb0: 68 61 72 20 2a 29 20 5b 73 74 72 69 6e 67 69 66  har *) [stringif
1bc0: 79 20 24 64 61 74 61 5d 22 0a 09 09 09 7d 0a 09  y $data]"....}..
1bd0: 09 7d 0a 09 09 22 64 69 72 65 63 74 6f 72 79 22  .}..."directory"
1be0: 20 7b 0a 09 09 09 73 65 74 20 74 79 70 65 20 22   {....set type "
1bf0: 43 56 46 53 5f 46 49 4c 45 54 59 50 45 5f 44 49  CVFS_FILETYPE_DI
1c00: 52 22 0a 09 09 09 73 65 74 20 64 61 74 61 20 22  R"....set data "
1c10: 4e 55 4c 4c 22 0a 09 09 09 73 65 74 20 73 69 7a  NULL"....set siz
1c20: 65 20 30 0a 09 09 7d 0a 09 7d 0a 0a 09 70 75 74  e 0...}..}...put
1c30: 73 20 22 5c 74 7b 22 0a 09 70 75 74 73 20 22 5c  s "\t{"..puts "\
1c40: 74 5c 74 2e 6e 61 6d 65 20 20 3d 20 5c 22 24 73  t\t.name  = \"$s
1c50: 68 6f 72 74 66 69 6c 65 5c 22 2c 22 0a 09 70 75  hortfile\","..pu
1c60: 74 73 20 22 5c 74 5c 74 2e 69 6e 64 65 78 20 3d  ts "\t\t.index =
1c70: 20 24 69 64 78 2c 22 0a 09 70 75 74 73 20 22 5c   $idx,"..puts "\
1c80: 74 5c 74 2e 74 79 70 65 20 20 3d 20 24 74 79 70  t\t.type  = $typ
1c90: 65 2c 22 0a 09 70 75 74 73 20 22 5c 74 5c 74 2e  e,"..puts "\t\t.
1ca0: 73 69 7a 65 20 20 3d 20 24 73 69 7a 65 2c 22 0a  size  = $size,".
1cb0: 09 70 75 74 73 20 22 5c 74 5c 74 2e 64 61 74 61  .puts "\t\t.data
1cc0: 20 20 3d 20 24 64 61 74 61 2c 22 0a 09 70 75 74    = $data,"..put
1cd0: 73 20 22 5c 74 5c 74 2e 66 72 65 65 20 20 3d 20  s "\t\t.free  = 
1ce0: 30 2c 22 0a 09 70 75 74 73 20 22 5c 74 7d 2c 22  0,"..puts "\t},"
1cf0: 0a 7d 0a 70 75 74 73 20 22 7d 3b 22 0a 70 75 74  .}.puts "};".put
1d00: 73 20 22 22 0a 0a 70 75 74 73 20 22 73 74 61 74  s ""..puts "stat
1d10: 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ic unsigned long
1d20: 20 24 7b 63 6f 64 65 5f 74 61 67 7d 5f 6c 6f 6f   ${code_tag}_loo
1d30: 6b 75 70 5f 69 6e 64 65 78 28 63 6f 6e 73 74 20  kup_index(const 
1d40: 63 68 61 72 20 2a 70 61 74 68 29 20 7b 22 0a 70  char *path) {".p
1d50: 75 74 73 20 22 5c 74 73 77 69 74 63 68 20 28 63  uts "\tswitch (c
1d60: 76 66 73 5f 68 61 73 68 28 28 75 6e 73 69 67 6e  vfs_hash((unsign
1d70: 65 64 20 63 68 61 72 20 2a 29 20 70 61 74 68 29  ed char *) path)
1d80: 29 20 7b 22 0a 0a 66 6f 72 20 7b 73 65 74 20 69  ) {"..for {set i
1d90: 64 78 20 31 7d 20 7b 24 69 64 78 20 3c 20 5b 6c  dx 1} {$idx < [l
1da0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 73 5d 7d 20  length $files]} 
1db0: 7b 69 6e 63 72 20 69 64 78 7d 20 7b 0a 09 73 65  {incr idx} {..se
1dc0: 74 20 66 69 6c 65 20 5b 6c 69 6e 64 65 78 20 24  t file [lindex $
1dd0: 66 69 6c 65 73 20 24 69 64 78 5d 0a 09 73 65 74  files $idx]..set
1de0: 20 73 68 6f 72 74 66 69 6c 65 20 5b 73 68 6f 72   shortfile [shor
1df0: 74 65 6e 5f 66 69 6c 65 20 24 73 74 61 72 74 64  ten_file $startd
1e00: 69 72 20 24 66 69 6c 65 5d 0a 09 73 65 74 20 68  ir $file]..set h
1e10: 61 73 68 20 5b 63 76 66 73 5f 68 61 73 68 20 24  ash [cvfs_hash $
1e20: 73 68 6f 72 74 66 69 6c 65 5d 0a 0a 09 6c 61 70  shortfile]...lap
1e30: 70 65 6e 64 20 69 6e 64 65 78 65 73 5f 70 65 72  pend indexes_per
1e40: 5f 68 61 73 68 28 24 68 61 73 68 29 20 5b 6c 69  _hash($hash) [li
1e50: 73 74 20 24 73 68 6f 72 74 66 69 6c 65 20 24 69  st $shortfile $i
1e60: 64 78 5d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b  dx].}..foreach {
1e70: 68 61 73 68 20 69 64 78 5f 6c 69 73 74 7d 20 5b  hash idx_list} [
1e80: 61 72 72 61 79 20 67 65 74 20 69 6e 64 65 78 65  array get indexe
1e90: 73 5f 70 65 72 5f 68 61 73 68 5d 20 7b 0a 09 70  s_per_hash] {..p
1ea0: 75 74 73 20 22 5c 74 5c 74 63 61 73 65 20 24 68  uts "\t\tcase $h
1eb0: 61 73 68 3a 22 0a 0a 09 69 66 20 7b 5b 6c 6c 65  ash:"...if {[lle
1ec0: 6e 67 74 68 20 24 69 64 78 5f 6c 69 73 74 5d 20  ngth $idx_list] 
1ed0: 3d 3d 20 31 7d 20 7b 0a 09 09 73 65 74 20 69 64  == 1} {...set id
1ee0: 78 20 5b 6c 69 6e 64 65 78 20 24 69 64 78 5f 6c  x [lindex $idx_l
1ef0: 69 73 74 20 30 20 31 5d 0a 0a 09 09 70 75 74 73  ist 0 1]....puts
1f00: 20 22 5c 74 5c 74 5c 74 72 65 74 75 72 6e 28 24   "\t\t\treturn($
1f10: 69 64 78 29 3b 22 0a 09 7d 20 65 6c 73 65 20 7b  idx);"..} else {
1f20: 0a 09 09 66 6f 72 65 61 63 68 20 69 64 78 5f 65  ...foreach idx_e
1f30: 6e 74 20 24 69 64 78 5f 6c 69 73 74 20 7b 0a 09  nt $idx_list {..
1f40: 09 09 73 65 74 20 73 68 6f 72 74 66 69 6c 65 20  ..set shortfile 
1f50: 5b 6c 69 6e 64 65 78 20 24 69 64 78 5f 65 6e 74  [lindex $idx_ent
1f60: 20 30 5d 0a 09 09 09 73 65 74 20 69 64 78 20 5b   0]....set idx [
1f70: 6c 69 6e 64 65 78 20 24 69 64 78 5f 65 6e 74 20  lindex $idx_ent 
1f80: 31 5d 0a 0a 09 09 09 70 75 74 73 20 22 5c 74 5c  1].....puts "\t\
1f90: 74 5c 74 69 66 20 28 73 74 72 63 6d 70 28 70 61  t\tif (strcmp(pa
1fa0: 74 68 2c 20 5c 22 24 73 68 6f 72 74 66 69 6c 65  th, \"$shortfile
1fb0: 5c 22 29 20 3d 3d 20 30 29 20 72 65 74 75 72 6e  \") == 0) return
1fc0: 28 24 69 64 78 29 3b 22 0a 09 09 7d 0a 09 09 70  ($idx);"...}...p
1fd0: 75 74 73 20 22 5c 74 5c 74 5c 74 62 72 65 61 6b  uts "\t\t\tbreak
1fe0: 3b 22 0a 09 7d 0a 7d 0a 0a 70 75 74 73 20 22 5c  ;"..}.}..puts "\
1ff0: 74 7d 22 0a 70 75 74 73 20 22 5c 74 72 65 74 75  t}".puts "\tretu
2000: 72 6e 28 30 29 3b 22 0a 70 75 74 73 20 22 7d 22  rn(0);".puts "}"
2010: 0a 70 75 74 73 20 22 22 0a 0a 70 75 74 73 20 22  .puts ""..puts "
2020: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 76  static struct cv
2030: 66 73 5f 64 61 74 61 20 2a 24 7b 63 6f 64 65 5f  fs_data *${code_
2040: 74 61 67 7d 5f 67 65 74 44 61 74 61 28 63 6f 6e  tag}_getData(con
2050: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 75  st char *path, u
2060: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 6e 64  nsigned long ind
2070: 65 78 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 69  ex) {".puts "\ti
2080: 66 20 28 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29  f (path != NULL)
2090: 20 7b 22 0a 70 75 74 73 20 22 5c 74 5c 74 69 6e   {".puts "\t\tin
20a0: 64 65 78 20 3d 20 24 7b 63 6f 64 65 5f 74 61 67  dex = ${code_tag
20b0: 7d 5f 6c 6f 6f 6b 75 70 5f 69 6e 64 65 78 28 70  }_lookup_index(p
20c0: 61 74 68 29 3b 22 0a 70 75 74 73 20 22 5c 74 7d  ath);".puts "\t}
20d0: 22 0a 70 75 74 73 20 22 22 0a 70 75 74 73 20 22  ".puts "".puts "
20e0: 5c 74 69 66 20 28 69 6e 64 65 78 20 3d 3d 20 30  \tif (index == 0
20f0: 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 5c 74 72  ) {".puts "\t\tr
2100: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 22 0a 70 75  eturn(NULL);".pu
2110: 74 73 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 22  ts "\t}".puts ""
2120: 0a 70 75 74 73 20 22 5c 74 69 66 20 28 70 61 74  .puts "\tif (pat
2130: 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 22 0a 70 75  h != NULL) {".pu
2140: 74 73 20 22 5c 74 5c 74 69 66 20 28 73 74 72 63  ts "\t\tif (strc
2150: 6d 70 28 70 61 74 68 2c 20 24 7b 63 6f 64 65 5f  mp(path, ${code_
2160: 74 61 67 7d 5f 64 61 74 61 5c 5b 69 6e 64 65 78  tag}_data\[index
2170: 5c 5d 2e 6e 61 6d 65 29 20 21 3d 20 30 29 20 7b  \].name) != 0) {
2180: 22 0a 70 75 74 73 20 22 5c 74 5c 74 5c 74 72 65  ".puts "\t\t\tre
2190: 74 75 72 6e 28 4e 55 4c 4c 29 3b 22 0a 70 75 74  turn(NULL);".put
21a0: 73 20 22 5c 74 5c 74 7d 22 0a 70 75 74 73 20 22  s "\t\t}".puts "
21b0: 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74  \t}".puts "".put
21c0: 73 20 22 5c 74 72 65 74 75 72 6e 28 26 24 7b 63  s "\treturn(&${c
21d0: 6f 64 65 5f 74 61 67 7d 5f 64 61 74 61 5c 5b 69  ode_tag}_data\[i
21e0: 6e 64 65 78 5c 5d 29 3b 22 0a 70 75 74 73 20 22  ndex\]);".puts "
21f0: 7d 22 0a 70 75 74 73 20 22 22 0a 0a 70 75 74 73  }".puts ""..puts
2200: 20 22 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65   "static unsigne
2210: 64 20 6c 6f 6e 67 20 24 7b 63 6f 64 65 5f 74 61  d long ${code_ta
2220: 67 7d 5f 67 65 74 43 68 69 6c 64 72 65 6e 28 63  g}_getChildren(c
2230: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
2240: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a   unsigned long *
2250: 6f 75 74 62 75 66 2c 20 75 6e 73 69 67 6e 65 64  outbuf, unsigned
2260: 20 6c 6f 6e 67 20 6f 75 74 62 75 66 5f 63 6f 75   long outbuf_cou
2270: 6e 74 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 75  nt) {".puts "\tu
2280: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 6e 64  nsigned long ind
2290: 65 78 3b 22 0a 70 75 74 73 20 22 5c 74 75 6e 73  ex;".puts "\tuns
22a0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
22b0: 68 69 6c 64 72 65 6e 20 3d 20 30 3b 22 0a 70 75  hildren = 0;".pu
22c0: 74 73 20 22 22 0a 70 75 74 73 20 22 5c 74 69 6e  ts "".puts "\tin
22d0: 64 65 78 20 3d 20 24 7b 63 6f 64 65 5f 74 61 67  dex = ${code_tag
22e0: 7d 5f 6c 6f 6f 6b 75 70 5f 69 6e 64 65 78 28 70  }_lookup_index(p
22f0: 61 74 68 29 3b 22 0a 70 75 74 73 20 22 5c 74 69  ath);".puts "\ti
2300: 66 20 28 69 6e 64 65 78 20 3d 3d 20 30 29 20 7b  f (index == 0) {
2310: 22 0a 70 75 74 73 20 22 5c 74 5c 74 72 65 74 75  ".puts "\t\tretu
2320: 72 6e 28 30 29 3b 22 0a 70 75 74 73 20 22 5c 74  rn(0);".puts "\t
2330: 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74 73 20  }".puts "".puts 
2340: 22 5c 74 69 66 20 28 24 7b 63 6f 64 65 5f 74 61  "\tif (${code_ta
2350: 67 7d 5f 64 61 74 61 5c 5b 69 6e 64 65 78 5c 5d  g}_data\[index\]
2360: 2e 74 79 70 65 20 21 3d 20 43 56 46 53 5f 46 49  .type != CVFS_FI
2370: 4c 45 54 59 50 45 5f 44 49 52 29 20 7b 22 0a 70  LETYPE_DIR) {".p
2380: 75 74 73 20 22 5c 74 5c 74 72 65 74 75 72 6e 28  uts "\t\treturn(
2390: 30 29 3b 22 0a 70 75 74 73 20 22 5c 74 7d 22 0a  0);".puts "\t}".
23a0: 70 75 74 73 20 22 22 0a 70 75 74 73 20 22 5c 74  puts "".puts "\t
23b0: 69 66 20 28 73 74 72 63 6d 70 28 70 61 74 68 2c  if (strcmp(path,
23c0: 20 24 7b 63 6f 64 65 5f 74 61 67 7d 5f 64 61 74   ${code_tag}_dat
23d0: 61 5c 5b 69 6e 64 65 78 5c 5d 2e 6e 61 6d 65 29  a\[index\].name)
23e0: 20 21 3d 20 30 29 20 7b 22 0a 70 75 74 73 20 22   != 0) {".puts "
23f0: 5c 74 5c 74 72 65 74 75 72 6e 28 30 29 3b 22 0a  \t\treturn(0);".
2400: 70 75 74 73 20 22 5c 74 7d 22 0a 70 75 74 73 20  puts "\t}".puts 
2410: 22 22 0a 70 75 74 73 20 22 5c 74 73 77 69 74 63  "".puts "\tswitc
2420: 68 20 28 69 6e 64 65 78 29 20 7b 22 0a 0a 75 6e  h (index) {"..un
2430: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
2440: 63 68 69 6c 64 72 65 6e 0a 61 72 72 61 79 20 73  children.array s
2450: 65 74 20 63 68 69 6c 64 72 65 6e 20 5b 6c 69 73  et children [lis
2460: 74 5d 0a 66 6f 72 20 7b 73 65 74 20 69 64 78 20  t].for {set idx 
2470: 31 7d 20 7b 24 69 64 78 20 3c 20 5b 6c 6c 65 6e  1} {$idx < [llen
2480: 67 74 68 20 24 66 69 6c 65 73 5d 7d 20 7b 69 6e  gth $files]} {in
2490: 63 72 20 69 64 78 7d 20 7b 0a 09 73 65 74 20 66  cr idx} {..set f
24a0: 69 6c 65 20 5b 6c 69 6e 64 65 78 20 24 66 69 6c  ile [lindex $fil
24b0: 65 73 20 24 69 64 78 5d 0a 09 73 65 74 20 73 68  es $idx]..set sh
24c0: 6f 72 74 66 69 6c 65 20 5b 73 68 6f 72 74 65 6e  ortfile [shorten
24d0: 5f 66 69 6c 65 20 24 73 74 61 72 74 64 69 72 20  _file $startdir 
24e0: 24 66 69 6c 65 5d 0a 0a 09 75 6e 73 65 74 20 2d  $file]...unset -
24f0: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 66 69 6e 66 6f  nocomplain finfo
2500: 20 74 79 70 65 0a 09 66 69 6c 65 20 73 74 61 74   type..file stat
2510: 20 24 66 69 6c 65 20 66 69 6e 66 6f 0a 0a 09 69   $file finfo...i
2520: 66 20 7b 24 66 69 6e 66 6f 28 74 79 70 65 29 20  f {$finfo(type) 
2530: 21 3d 20 22 64 69 72 65 63 74 6f 72 79 22 7d 20  != "directory"} 
2540: 7b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 7d  {...continue;..}
2550: 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 20 77  ...# Determine w
2560: 68 69 63 68 20 63 68 69 6c 64 72 65 6e 20 61 72  hich children ar
2570: 65 20 75 6e 64 65 72 20 74 68 69 73 20 64 69 72  e under this dir
2580: 65 63 74 6f 72 79 0a 09 23 23 20 43 6f 6e 76 65  ectory..## Conve
2590: 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
25a0: 61 74 68 6e 61 6d 65 20 74 6f 20 61 20 72 65 67  athname to a reg
25b0: 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
25c0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 65 78 61  that matches exa
25d0: 63 74 6c 79 0a 09 73 65 74 20 66 69 6c 65 5f 72  ctly..set file_r
25e0: 65 67 65 78 70 20 5b 73 74 72 69 6e 67 20 6d 61  egexp [string ma
25f0: 70 20 5b 6c 69 73 74 20 22 5c 5c 22 20 22 5c 5c  p [list "\\" "\\
2600: 5c 5c 22 20 22 2e 22 20 22 5c 5c 2e 22 20 22 5c  \\" "." "\\." "\
2610: 7b 22 20 22 5c 5c 5c 7b 22 20 22 5c 7d 22 20 22  {" "\\\{" "\}" "
2620: 5c 5c 5c 7d 22 20 22 2a 22 20 22 5c 5c 2a 22 5d  \\\}" "*" "\\*"]
2630: 20 24 66 69 6c 65 5d 0a 0a 09 23 23 20 53 65 61   $file]...## Sea
2640: 72 63 68 20 66 6f 72 20 70 61 74 68 6e 61 6d 65  rch for pathname
2650: 73 20 77 68 69 63 68 20 73 74 61 72 74 20 77 69  s which start wi
2660: 74 68 20 65 78 61 63 74 6c 79 20 6f 75 72 20 6e  th exactly our n
2670: 61 6d 65 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  ame, followed by
2680: 20 61 20 73 6c 61 73 68 0a 09 23 23 20 66 6f 6c   a slash..## fol
2690: 6c 6f 77 65 64 20 62 79 20 6e 6f 20 6d 6f 72 65  lowed by no more
26a0: 20 73 6c 61 73 68 65 73 20 28 64 69 72 65 63 74   slashes (direct
26b0: 20 64 65 73 63 65 6e 64 61 6e 74 73 29 0a 09 73   descendants)..s
26c0: 65 74 20 63 68 69 6c 64 5f 69 64 78 5f 6c 69 73  et child_idx_lis
26d0: 74 20 5b 6c 73 65 61 72 63 68 20 2d 72 65 67 65  t [lsearch -rege
26e0: 78 70 20 2d 61 6c 6c 20 24 66 69 6c 65 73 20 22  xp -all $files "
26f0: 5e 24 7b 66 69 6c 65 5f 72 65 67 65 78 70 7d 2f  ^${file_regexp}/
2700: 5c 5b 5e 2f 5c 5d 2a 24 22 5d 0a 0a 09 73 65 74  \[^/\]*$"]...set
2710: 20 63 68 69 6c 64 72 65 6e 28 24 69 64 78 29 20   children($idx) 
2720: 24 63 68 69 6c 64 5f 69 64 78 5f 6c 69 73 74 0a  $child_idx_list.
2730: 0a 09 70 75 74 73 20 22 5c 74 5c 74 63 61 73 65  ..puts "\t\tcase
2740: 20 24 69 64 78 3a 22 0a 09 70 75 74 73 20 22 5c   $idx:"..puts "\
2750: 74 5c 74 5c 74 6e 75 6d 5f 63 68 69 6c 64 72 65  t\t\tnum_childre
2760: 6e 20 3d 20 5b 6c 6c 65 6e 67 74 68 20 24 63 68  n = [llength $ch
2770: 69 6c 64 5f 69 64 78 5f 6c 69 73 74 5d 3b 22 0a  ild_idx_list];".
2780: 09 70 75 74 73 20 22 5c 74 5c 74 5c 74 62 72 65  .puts "\t\t\tbre
2790: 61 6b 3b 22 0a 09 0a 7d 0a 0a 70 75 74 73 20 22  ak;"...}..puts "
27a0: 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74  \t}".puts "".put
27b0: 73 20 22 5c 74 69 66 20 28 6f 75 74 62 75 66 20  s "\tif (outbuf 
27c0: 3d 3d 20 4e 55 4c 4c 29 20 7b 22 0a 70 75 74 73  == NULL) {".puts
27d0: 20 22 5c 74 5c 74 72 65 74 75 72 6e 28 6e 75 6d   "\t\treturn(num
27e0: 5f 63 68 69 6c 64 72 65 6e 29 3b 22 0a 70 75 74  _children);".put
27f0: 73 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a  s "\t}".puts "".
2800: 70 75 74 73 20 22 5c 74 69 66 20 28 6e 75 6d 5f  puts "\tif (num_
2810: 63 68 69 6c 64 72 65 6e 20 3e 20 6f 75 74 62 75  children > outbu
2820: 66 5f 63 6f 75 6e 74 29 20 7b 22 0a 70 75 74 73  f_count) {".puts
2830: 20 22 5c 74 5c 74 6e 75 6d 5f 63 68 69 6c 64 72   "\t\tnum_childr
2840: 65 6e 20 3d 20 6f 75 74 62 75 66 5f 63 6f 75 6e  en = outbuf_coun
2850: 74 3b 22 0a 70 75 74 73 20 22 5c 74 7d 22 0a 70  t;".puts "\t}".p
2860: 75 74 73 20 22 22 0a 70 75 74 73 20 22 5c 74 69  uts "".puts "\ti
2870: 66 20 28 6e 75 6d 5f 63 68 69 6c 64 72 65 6e 20  f (num_children 
2880: 3d 3d 20 30 29 20 7b 22 0a 70 75 74 73 20 22 5c  == 0) {".puts "\
2890: 74 5c 74 72 65 74 75 72 6e 28 6e 75 6d 5f 63 68  t\treturn(num_ch
28a0: 69 6c 64 72 65 6e 29 3b 22 0a 70 75 74 73 20 22  ildren);".puts "
28b0: 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74  \t}".puts "".put
28c0: 73 20 22 5c 74 69 66 20 28 6f 75 74 62 75 66 5f  s "\tif (outbuf_
28d0: 63 6f 75 6e 74 20 3e 20 6e 75 6d 5f 63 68 69 6c  count > num_chil
28e0: 64 72 65 6e 29 20 7b 22 0a 70 75 74 73 20 22 5c  dren) {".puts "\
28f0: 74 5c 74 6f 75 74 62 75 66 5f 63 6f 75 6e 74 20  t\toutbuf_count 
2900: 3d 20 6e 75 6d 5f 63 68 69 6c 64 72 65 6e 3b 22  = num_children;"
2910: 0a 70 75 74 73 20 22 5c 74 7d 22 0a 70 75 74 73  .puts "\t}".puts
2920: 20 22 22 0a 70 75 74 73 20 22 5c 74 73 77 69 74   "".puts "\tswit
2930: 63 68 20 28 69 6e 64 65 78 29 20 7b 22 0a 0a 66  ch (index) {"..f
2940: 6f 72 65 61 63 68 20 7b 69 64 78 20 63 68 69 6c  oreach {idx chil
2950: 64 5f 69 64 78 5f 6c 69 73 74 7d 20 5b 61 72 72  d_idx_list} [arr
2960: 61 79 20 67 65 74 20 63 68 69 6c 64 72 65 6e 5d  ay get children]
2970: 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68   {..if {[llength
2980: 20 24 63 68 69 6c 64 5f 69 64 78 5f 6c 69 73 74   $child_idx_list
2990: 5d 20 3d 3d 20 30 7d 20 7b 0a 09 09 63 6f 6e 74  ] == 0} {...cont
29a0: 69 6e 75 65 0a 09 7d 0a 0a 09 70 75 74 73 20 22  inue..}...puts "
29b0: 5c 74 5c 74 63 61 73 65 20 24 69 64 78 3a 22 0a  \t\tcase $idx:".
29c0: 09 70 75 74 73 20 22 5c 74 5c 74 5c 74 73 77 69  .puts "\t\t\tswi
29d0: 74 63 68 28 6f 75 74 62 75 66 5f 63 6f 75 6e 74  tch(outbuf_count
29e0: 29 20 7b 22 0a 0a 09 66 6f 72 20 7b 73 65 74 20  ) {"...for {set 
29f0: 63 68 69 6c 64 5f 69 64 78 5f 69 64 78 20 5b 65  child_idx_idx [e
2a00: 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 63  xpr {[llength $c
2a10: 68 69 6c 64 5f 69 64 78 5f 6c 69 73 74 5d 20 2d  hild_idx_list] -
2a20: 20 31 7d 5d 7d 20 7b 24 63 68 69 6c 64 5f 69 64   1}]} {$child_id
2a30: 78 5f 69 64 78 20 3e 3d 20 30 7d 20 7b 69 6e 63  x_idx >= 0} {inc
2a40: 72 20 63 68 69 6c 64 5f 69 64 78 5f 69 64 78 20  r child_idx_idx 
2a50: 2d 31 7d 20 7b 0a 09 09 73 65 74 20 63 68 69 6c  -1} {...set chil
2a60: 64 5f 69 64 78 20 5b 6c 69 6e 64 65 78 20 24 63  d_idx [lindex $c
2a70: 68 69 6c 64 5f 69 64 78 5f 6c 69 73 74 20 24 63  hild_idx_list $c
2a80: 68 69 6c 64 5f 69 64 78 5f 69 64 78 5d 0a 0a 09  hild_idx_idx]...
2a90: 09 70 75 74 73 20 22 5c 74 5c 74 5c 74 5c 74 63  .puts "\t\t\t\tc
2aa0: 61 73 65 20 5b 65 78 70 72 20 7b 24 63 68 69 6c  ase [expr {$chil
2ab0: 64 5f 69 64 78 5f 69 64 78 20 2b 20 31 7d 5d 3a  d_idx_idx + 1}]:
2ac0: 22 0a 09 09 70 75 74 73 20 22 5c 74 5c 74 5c 74  "...puts "\t\t\t
2ad0: 5c 74 5c 74 6f 75 74 62 75 66 5c 5b 24 63 68 69  \t\toutbuf\[$chi
2ae0: 6c 64 5f 69 64 78 5f 69 64 78 5c 5d 20 3d 20 24  ld_idx_idx\] = $
2af0: 63 68 69 6c 64 5f 69 64 78 3b 22 0a 09 7d 0a 0a  child_idx;"..}..
2b00: 09 70 75 74 73 20 22 5c 74 5c 74 5c 74 7d 22 0a  .puts "\t\t\t}".
2b10: 0a 09 70 75 74 73 20 22 5c 74 5c 74 5c 74 62 72  ..puts "\t\t\tbr
2b20: 65 61 6b 3b 22 0a 7d 0a 0a 70 75 74 73 20 22 5c  eak;".}..puts "\
2b30: 74 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74 73  t}".puts "".puts
2b40: 20 22 5c 74 72 65 74 75 72 6e 28 6e 75 6d 5f 63   "\treturn(num_c
2b50: 68 69 6c 64 72 65 6e 29 3b 22 0a 70 75 74 73 20  hildren);".puts 
2b60: 22 7d 22 0a 70 75 74 73 20 22 22 0a 0a 69 66 20  "}".puts ""..if 
2b70: 7b 24 6f 62 73 66 75 63 61 74 65 7d 20 7b 0a 09  {$obsfucate} {..
2b80: 70 75 74 73 20 22 73 74 61 74 69 63 20 76 6f 69  puts "static voi
2b90: 64 20 24 7b 63 6f 64 65 5f 74 61 67 7d 5f 64 65  d ${code_tag}_de
2ba0: 63 72 79 70 74 46 69 6c 65 28 63 6f 6e 73 74 20  cryptFile(const 
2bb0: 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74 72 75  char *path, stru
2bc0: 63 74 20 63 76 66 73 5f 64 61 74 61 20 2a 66 69  ct cvfs_data *fi
2bd0: 6e 66 6f 29 20 7b 22 0a 09 70 75 74 73 20 22 5c  nfo) {"..puts "\
2be0: 74 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  tstatic struct c
2bf0: 76 66 73 5f 6b 65 79 20 6b 65 79 20 3d 20 7b 20  vfs_key key = { 
2c00: 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
2c10: 74 20 22 5c 6e 22 20 22 20 22 5d 20 5b 65 6e 63  t "\n" " "] [enc
2c20: 72 79 70 74 5f 6b 65 79 5f 65 78 70 6f 72 74 20  rypt_key_export 
2c30: 24 6f 62 73 66 75 63 61 74 69 6f 6e 5f 6b 65 79  $obsfucation_key
2c40: 20 22 63 22 5d 5d 20 7d 3b 22 0a 09 70 75 74 73   "c"]] };"..puts
2c50: 20 22 5c 74 75 6e 73 69 67 6e 65 64 20 63 68 61   "\tunsigned cha
2c60: 72 20 2a 6e 65 77 5f 64 61 74 61 2c 20 2a 6f 6c  r *new_data, *ol
2c70: 64 5f 64 61 74 61 3b 22 0a 09 70 75 74 73 20 22  d_data;"..puts "
2c80: 5c 74 69 6e 74 20 64 65 63 72 79 70 74 5f 72 65  \tint decrypt_re
2c90: 74 2c 20 66 72 65 65 5f 6f 6c 64 5f 64 61 74 61  t, free_old_data
2ca0: 3b 22 0a 09 70 75 74 73 20 22 22 0a 09 70 75 74  ;"..puts ""..put
2cb0: 73 20 22 5c 74 6e 65 77 5f 64 61 74 61 20 3d 20  s "\tnew_data = 
2cc0: 28 76 6f 69 64 20 2a 29 20 54 63 6c 5f 41 6c 6c  (void *) Tcl_All
2cd0: 6f 63 28 66 69 6e 66 6f 2d 3e 73 69 7a 65 29 3b  oc(finfo->size);
2ce0: 22 0a 09 70 75 74 73 20 22 5c 74 64 65 63 72 79  "..puts "\tdecry
2cf0: 70 74 5f 72 65 74 20 3d 20 63 76 66 73 5f 64 65  pt_ret = cvfs_de
2d00: 63 72 79 70 74 28 6e 65 77 5f 64 61 74 61 2c 20  crypt(new_data, 
2d10: 66 69 6e 66 6f 2d 3e 64 61 74 61 2c 20 30 2c 20  finfo->data, 0, 
2d20: 66 69 6e 66 6f 2d 3e 73 69 7a 65 2c 20 26 6b 65  finfo->size, &ke
2d30: 79 29 3b 22 0a 09 70 75 74 73 20 22 5c 74 69 66  y);"..puts "\tif
2d40: 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d   (decrypt_ret !=
2d50: 20 30 29 20 7b 22 0a 09 70 75 74 73 20 22 5c 74   0) {"..puts "\t
2d60: 5c 74 54 63 6c 5f 46 72 65 65 28 28 76 6f 69 64  \tTcl_Free((void
2d70: 20 2a 29 20 6e 65 77 5f 64 61 74 61 29 3b 22 0a   *) new_data);".
2d80: 09 70 75 74 73 20 22 22 0a 09 70 75 74 73 20 22  .puts ""..puts "
2d90: 5c 74 5c 74 72 65 74 75 72 6e 3b 22 0a 09 70 75  \t\treturn;"..pu
2da0: 74 73 20 22 5c 74 7d 22 0a 09 70 75 74 73 20 22  ts "\t}"..puts "
2db0: 22 0a 09 70 75 74 73 20 22 5c 74 66 72 65 65 5f  "..puts "\tfree_
2dc0: 6f 6c 64 5f 64 61 74 61 20 3d 20 66 69 6e 66 6f  old_data = finfo
2dd0: 2d 3e 66 72 65 65 3b 22 0a 09 70 75 74 73 20 22  ->free;"..puts "
2de0: 5c 74 6f 6c 64 5f 64 61 74 61 20 3d 20 28 76 6f  \told_data = (vo
2df0: 69 64 20 2a 29 20 66 69 6e 66 6f 2d 3e 64 61 74  id *) finfo->dat
2e00: 61 3b 22 0a 09 70 75 74 73 20 22 22 0a 09 70 75  a;"..puts ""..pu
2e10: 74 73 20 22 5c 74 66 69 6e 66 6f 2d 3e 64 61 74  ts "\tfinfo->dat
2e20: 61 20 3d 20 6e 65 77 5f 64 61 74 61 3b 22 0a 09  a = new_data;"..
2e30: 70 75 74 73 20 22 5c 74 66 69 6e 66 6f 2d 3e 66  puts "\tfinfo->f
2e40: 72 65 65 20 3d 20 31 3b 22 0a 09 70 75 74 73 20  ree = 1;"..puts 
2e50: 22 5c 74 66 69 6e 66 6f 2d 3e 74 79 70 65 20 3d  "\tfinfo->type =
2e60: 20 43 56 46 53 5f 46 49 4c 45 54 59 50 45 5f 46   CVFS_FILETYPE_F
2e70: 49 4c 45 3b 22 0a 09 70 75 74 73 20 22 22 0a 09  ILE;"..puts ""..
2e80: 70 75 74 73 20 22 5c 74 69 66 20 28 66 72 65 65  puts "\tif (free
2e90: 5f 6f 6c 64 5f 64 61 74 61 29 20 7b 22 0a 09 70  _old_data) {"..p
2ea0: 75 74 73 20 22 5c 74 5c 74 54 63 6c 5f 46 72 65  uts "\t\tTcl_Fre
2eb0: 65 28 28 76 6f 69 64 20 2a 29 20 6f 6c 64 5f 64  e((void *) old_d
2ec0: 61 74 61 29 3b 22 0a 09 70 75 74 73 20 22 5c 74  ata);"..puts "\t
2ed0: 7d 22 0a 09 70 75 74 73 20 22 5c 74 72 65 74 75  }"..puts "\tretu
2ee0: 72 6e 3b 22 0a 09 70 75 74 73 20 22 7d 22 0a 09  rn;"..puts "}"..
2ef0: 70 75 74 73 20 22 22 0a 7d 0a 0a 70 75 74 73 20  puts "".}..puts 
2f00: 22 23 20 20 69 66 64 65 66 20 43 56 46 53 5f 4d  "#  ifdef CVFS_M
2f10: 41 4b 45 5f 4c 4f 41 44 41 42 4c 45 22 0a 0a 73  AKE_LOADABLE"..s
2f20: 65 74 20 66 64 20 5b 6f 70 65 6e 20 22 63 76 66  et fd [open "cvf
2f30: 73 5f 64 61 74 61 2e 63 22 5d 0a 70 75 74 73 20  s_data.c"].puts 
2f40: 5b 72 65 61 64 20 24 66 64 5d 0a 63 6c 6f 73 65  [read $fd].close
2f50: 20 24 66 64 0a 0a 70 75 74 73 20 22 73 74 61 74   $fd..puts "stat
2f60: 69 63 20 63 6d 64 5f 67 65 74 44 61 74 61 5f 74  ic cmd_getData_t
2f70: 20 2a 67 65 74 43 6d 64 44 61 74 61 28 63 6f 6e   *getCmdData(con
2f80: 73 74 20 63 68 61 72 20 2a 68 61 73 68 6b 65 79  st char *hashkey
2f90: 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 72 65 74  ) {".puts "\tret
2fa0: 75 72 6e 28 24 7b 63 6f 64 65 5f 74 61 67 7d 5f  urn(${code_tag}_
2fb0: 67 65 74 44 61 74 61 29 3b 22 0a 70 75 74 73 20  getData);".puts 
2fc0: 22 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74 73  "}".puts "".puts
2fd0: 20 22 73 74 61 74 69 63 20 63 6d 64 5f 67 65 74   "static cmd_get
2fe0: 43 68 69 6c 64 72 65 6e 5f 74 20 2a 67 65 74 43  Children_t *getC
2ff0: 6d 64 43 68 69 6c 64 72 65 6e 28 63 6f 6e 73 74  mdChildren(const
3000: 20 63 68 61 72 20 2a 68 61 73 68 6b 65 79 29 20   char *hashkey) 
3010: 7b 22 0a 70 75 74 73 20 22 5c 74 72 65 74 75 72  {".puts "\tretur
3020: 6e 28 24 7b 63 6f 64 65 5f 74 61 67 7d 5f 67 65  n(${code_tag}_ge
3030: 74 43 68 69 6c 64 72 65 6e 29 3b 22 0a 70 75 74  tChildren);".put
3040: 73 20 22 7d 22 0a 70 75 74 73 20 22 22 0a 70 75  s "}".puts "".pu
3050: 74 73 20 22 73 74 61 74 69 63 20 63 6d 64 5f 64  ts "static cmd_d
3060: 65 63 72 79 70 74 46 69 6c 65 5f 74 20 2a 67 65  ecryptFile_t *ge
3070: 74 43 6d 64 44 65 63 72 79 70 74 46 69 6c 65 28  tCmdDecryptFile(
3080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 61 73 68  const char *hash
3090: 6b 65 79 29 20 7b 22 0a 69 66 20 7b 24 6f 62 73  key) {".if {$obs
30a0: 66 75 63 61 74 65 7d 20 7b 0a 09 70 75 74 73 20  fucate} {..puts 
30b0: 22 5c 74 72 65 74 75 72 6e 28 24 7b 63 6f 64 65  "\treturn(${code
30c0: 5f 74 61 67 7d 5f 64 65 63 72 79 70 74 46 69 6c  _tag}_decryptFil
30d0: 65 29 3b 22 0a 7d 20 65 6c 73 65 20 7b 0a 09 70  e);".} else {..p
30e0: 75 74 73 20 22 5c 74 72 65 74 75 72 6e 28 4e 55  uts "\treturn(NU
30f0: 4c 4c 29 3b 22 0a 7d 0a 70 75 74 73 20 22 7d 22  LL);".}.puts "}"
3100: 0a 70 75 74 73 20 22 22 0a 0a 70 75 74 73 20 22  .puts ""..puts "
3110: 69 6e 74 20 43 76 66 73 5f 64 61 74 61 5f 24 7b  int Cvfs_data_${
3120: 68 61 73 68 6b 65 79 7d 5f 49 6e 69 74 28 54 63  hashkey}_Init(Tc
3130: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3140: 29 20 7b 22 0a 70 75 74 73 20 22 5c 74 54 63 6c  ) {".puts "\tTcl
3150: 5f 43 6f 6d 6d 61 6e 64 20 74 63 6c 43 72 65 61  _Command tclCrea
3160: 74 43 6f 6d 6d 5f 72 65 74 3b 22 0a 70 75 74 73  tComm_ret;".puts
3170: 20 22 5c 74 69 6e 74 20 74 63 6c 50 6b 67 50 72   "\tint tclPkgPr
3180: 6f 76 5f 72 65 74 3b 22 0a 70 75 74 73 20 22 22  ov_ret;".puts ""
3190: 0a 70 75 74 73 20 22 23 69 66 64 65 66 20 55 53  .puts "#ifdef US
31a0: 45 5f 54 43 4c 5f 53 54 55 42 53 22 0a 70 75 74  E_TCL_STUBS".put
31b0: 73 20 22 5c 74 69 66 20 28 21 54 63 6c 5f 49 6e  s "\tif (!Tcl_In
31c0: 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
31d0: 54 43 4c 5f 56 45 52 53 49 4f 4e 2c 20 30 29 29  TCL_VERSION, 0))
31e0: 20 7b 22 0a 70 75 74 73 20 22 23 65 6c 73 65 22   {".puts "#else"
31f0: 0a 70 75 74 73 20 22 5c 74 69 66 20 28 21 54 63  .puts "\tif (!Tc
3200: 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74  l_PkgRequire(int
3210: 65 72 70 2c 20 5c 22 54 63 6c 5c 22 2c 20 54 43  erp, \"Tcl\", TC
3220: 4c 5f 56 45 52 53 49 4f 4e 2c 20 30 29 29 20 7b  L_VERSION, 0)) {
3230: 22 0a 70 75 74 73 20 22 23 65 6e 64 69 66 20 2f  ".puts "#endif /
3240: 2a 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 20  * USE_TCL_STUBS 
3250: 2a 2f 22 0a 70 75 74 73 20 22 5c 74 5c 74 72 65  */".puts "\t\tre
3260: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
3270: 22 0a 70 75 74 73 20 22 5c 74 7d 22 0a 70 75 74  ".puts "\t}".put
3280: 73 20 22 22 0a 70 75 74 73 20 22 5c 74 74 63 6c  s "".puts "\ttcl
3290: 43 72 65 61 74 43 6f 6d 6d 5f 72 65 74 20 3d 20  CreatComm_ret = 
32a0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
32b0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 5c 22 3a  mand(interp, \":
32c0: 3a 76 66 73 3a 3a 63 76 66 73 3a 3a 64 61 74 61  :vfs::cvfs::data
32d0: 3a 3a 24 7b 68 61 73 68 6b 65 79 7d 3a 3a 67 65  ::${hashkey}::ge
32e0: 74 4d 65 74 61 64 61 74 61 5c 22 2c 20 67 65 74  tMetadata\", get
32f0: 4d 65 74 61 64 61 74 61 2c 20 4e 55 4c 4c 2c 20  Metadata, NULL, 
3300: 4e 55 4c 4c 29 3b 22 0a 70 75 74 73 20 22 5c 74  NULL);".puts "\t
3310: 69 66 20 28 21 74 63 6c 43 72 65 61 74 43 6f 6d  if (!tclCreatCom
3320: 6d 5f 72 65 74 29 20 7b 22 0a 70 75 74 73 20 22  m_ret) {".puts "
3330: 5c 74 5c 74 72 65 74 75 72 6e 28 54 43 4c 5f 45  \t\treturn(TCL_E
3340: 52 52 4f 52 29 3b 22 0a 70 75 74 73 20 22 5c 74  RROR);".puts "\t
3350: 7d 22 0a 70 75 74 73 20 22 22 0a 70 75 74 73 20  }".puts "".puts 
3360: 22 5c 74 74 63 6c 43 72 65 61 74 43 6f 6d 6d 5f  "\ttclCreatComm_
3370: 72 65 74 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  ret = Tcl_Create
3380: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
3390: 70 2c 20 5c 22 3a 3a 76 66 73 3a 3a 63 76 66 73  p, \"::vfs::cvfs
33a0: 3a 3a 64 61 74 61 3a 3a 24 7b 68 61 73 68 6b 65  ::data::${hashke
33b0: 79 7d 3a 3a 67 65 74 44 61 74 61 5c 22 2c 20 67  y}::getData\", g
33c0: 65 74 44 61 74 61 2c 20 4e 55 4c 4c 2c 20 4e 55  etData, NULL, NU
33d0: 4c 4c 29 3b 22 0a 70 75 74 73 20 22 5c 74 69 66  LL);".puts "\tif
33e0: 20 28 21 74 63 6c 43 72 65 61 74 43 6f 6d 6d 5f   (!tclCreatComm_
33f0: 72 65 74 29 20 7b 22 0a 70 75 74 73 20 22 5c 74  ret) {".puts "\t
3400: 5c 74 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  \treturn(TCL_ERR
3410: 4f 52 29 3b 22 0a 70 75 74 73 20 22 5c 74 7d 22  OR);".puts "\t}"
3420: 0a 70 75 74 73 20 22 22 0a 70 75 74 73 20 22 5c  .puts "".puts "\
3430: 74 74 63 6c 43 72 65 61 74 43 6f 6d 6d 5f 72 65  ttclCreatComm_re
3440: 74 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  t = Tcl_CreateOb
3450: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
3460: 20 5c 22 3a 3a 76 66 73 3a 3a 63 76 66 73 3a 3a   \"::vfs::cvfs::
3470: 64 61 74 61 3a 3a 24 7b 68 61 73 68 6b 65 79 7d  data::${hashkey}
3480: 3a 3a 67 65 74 43 68 69 6c 64 72 65 6e 5c 22 2c  ::getChildren\",
3490: 20 67 65 74 43 68 69 6c 64 72 65 6e 2c 20 4e 55   getChildren, NU
34a0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 22 0a 70 75 74 73  LL, NULL);".puts
34b0: 20 22 5c 74 69 66 20 28 21 74 63 6c 43 72 65 61   "\tif (!tclCrea
34c0: 74 43 6f 6d 6d 5f 72 65 74 29 20 7b 22 0a 70 75  tComm_ret) {".pu
34d0: 74 73 20 22 5c 74 5c 74 72 65 74 75 72 6e 28 54  ts "\t\treturn(T
34e0: 43 4c 5f 45 52 52 4f 52 29 3b 22 0a 70 75 74 73  CL_ERROR);".puts
34f0: 20 22 5c 74 7d 22 0a 70 75 74 73 20 22 22 0a 70   "\t}".puts "".p
3500: 75 74 73 20 22 5c 74 74 63 6c 50 6b 67 50 72 6f  uts "\ttclPkgPro
3510: 76 5f 72 65 74 20 3d 20 54 63 6c 5f 50 6b 67 50  v_ret = Tcl_PkgP
3520: 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 5c  rovide(interp, \
3530: 22 76 66 73 3a 3a 63 76 66 73 3a 3a 64 61 74 61  "vfs::cvfs::data
3540: 3a 3a 24 7b 68 61 73 68 6b 65 79 7d 5c 22 2c 20  ::${hashkey}\", 
3550: 5c 22 31 2e 30 5c 22 29 3b 22 0a 70 75 74 73 20  \"1.0\");".puts 
3560: 22 22 0a 70 75 74 73 20 22 5c 74 72 65 74 75 72  "".puts "\tretur
3570: 6e 28 74 63 6c 50 6b 67 50 72 6f 76 5f 72 65 74  n(tclPkgProv_ret
3580: 29 3b 22 0a 70 75 74 73 20 22 5c 74 7d 22 0a 70  );".puts "\t}".p
3590: 75 74 73 20 22 23 20 20 65 6e 64 69 66 20 2f 2a  uts "#  endif /*
35a0: 20 43 56 46 53 5f 4d 41 4b 45 5f 4c 4f 41 44 41   CVFS_MAKE_LOADA
35b0: 42 4c 45 20 2a 2f 22 0a 0a 70 75 74 73 20 22 23  BLE */"..puts "#
35c0: 65 6e 64 69 66 20 2f 2a 20 21 24 63 70 70 5f 74  endif /* !$cpp_t
35d0: 61 67 20 2a 2f 22 0a                             ag */".