Hex Artifact Content

Artifact aa949e8f6f9dfb1d1eb3c516c30ca1a98e57b993:


0000: 23 21 20 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20  #! /usr/bin/env 
0010: 74 63 6c 0a 0a 70 61 63 6b 61 67 65 20 72 65 71  tcl..package req
0020: 75 69 72 65 20 76 66 73 0a 23 70 61 63 6b 61 67  uire vfs.#packag
0030: 65 20 72 65 71 75 69 72 65 20 6b 69 74 64 6c 6c  e require kitdll
0040: 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  ..namespace eval
0050: 20 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 20 7b   ::vfs::kitdll {
0060: 7d 0a 0a 23 20 43 6f 6e 76 69 65 6e 63 65 20 66  }..# Convience f
0070: 75 6e 63 74 69 6f 6e 73 0a 70 72 6f 63 20 3a 3a  unctions.proc ::
0080: 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 4d 6f 75  vfs::kitdll::Mou
0090: 6e 74 20 7b 68 61 73 68 6b 65 79 20 6c 6f 63 61  nt {hashkey loca
00a0: 6c 7d 20 7b 0a 09 76 66 73 3a 3a 66 69 6c 65 73  l} {..vfs::files
00b0: 79 73 74 65 6d 20 6d 6f 75 6e 74 20 24 6c 6f 63  ystem mount $loc
00c0: 61 6c 20 5b 6c 69 73 74 20 3a 3a 76 66 73 3a 3a  al [list ::vfs::
00d0: 6b 69 74 64 6c 6c 3a 3a 76 66 73 68 61 6e 64 6c  kitdll::vfshandl
00e0: 65 72 20 24 68 61 73 68 6b 65 79 5d 0a 09 76 66  er $hashkey]..vf
00f0: 73 3a 3a 52 65 67 69 73 74 65 72 4d 6f 75 6e 74  s::RegisterMount
0100: 20 24 6c 6f 63 61 6c 20 5b 6c 69 73 74 20 3a 3a   $local [list ::
0110: 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 55 6e 6d  vfs::kitdll::Unm
0120: 6f 75 6e 74 5d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a  ount].}..proc ::
0130: 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 55 6e 6d  vfs::kitdll::Unm
0140: 6f 75 6e 74 20 7b 6c 6f 63 61 6c 7d 20 7b 0a 09  ount {local} {..
0150: 76 66 73 3a 3a 66 69 6c 65 73 79 73 74 65 6d 20  vfs::filesystem 
0160: 75 6e 6d 6f 75 6e 74 20 24 6c 6f 63 61 6c 0a 7d  unmount $local.}
0170: 0a 0a 23 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  ..# Implementati
0180: 6f 6e 0a 0a 23 23 20 46 69 6c 65 73 79 73 74 65  on..## Filesyste
0190: 6d 20 44 61 74 61 0a 6e 61 6d 65 73 70 61 63 65  m Data.namespace
01a0: 20 65 76 61 6c 20 3a 3a 76 66 73 3a 3a 6b 69 74   eval ::vfs::kit
01b0: 64 6c 6c 3a 3a 64 61 74 61 20 7b 7d 0a 73 65 74  dll::data {}.set
01c0: 20 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a   ::vfs::kitdll::
01d0: 64 61 74 61 28 6a 6f 65 29 20 22 54 65 73 74 5c  data(joe) "Test\
01e0: 6e 22 0a 73 65 74 20 7b 3a 3a 76 66 73 3a 3a 6b  n".set {::vfs::k
01f0: 69 74 64 6c 6c 3a 3a 6d 65 74 61 64 61 74 61 28  itdll::metadata(
0200: 29 7d 20 5b 6c 69 73 74 20 74 79 70 65 20 64 69  )} [list type di
0210: 72 65 63 74 6f 72 79 20 69 6e 6f 20 30 20 6d 6f  rectory ino 0 mo
0220: 64 65 20 30 35 35 35 20 6e 6c 69 6e 6b 20 32 20  de 0555 nlink 2 
0230: 75 69 64 20 30 20 67 69 64 20 30 20 73 69 7a 65  uid 0 gid 0 size
0240: 20 30 20 61 74 69 6d 65 20 30 20 6d 74 69 6d 65   0 atime 0 mtime
0250: 20 30 20 63 74 69 6d 65 20 30 5d 0a 73 65 74 20   0 ctime 0].set 
0260: 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 6d  ::vfs::kitdll::m
0270: 65 74 61 64 61 74 61 28 6a 6f 65 29 20 5b 6c 69  etadata(joe) [li
0280: 73 74 20 74 79 70 65 20 66 69 6c 65 20 69 6e 6f  st type file ino
0290: 20 31 20 6d 6f 64 65 20 30 34 34 34 20 6e 6c 69   1 mode 0444 nli
02a0: 6e 6b 20 31 20 75 69 64 20 30 20 67 69 64 20 30  nk 1 uid 0 gid 0
02b0: 20 73 69 7a 65 20 35 20 61 74 69 6d 65 20 30 20   size 5 atime 0 
02c0: 6d 74 69 6d 65 20 30 20 63 74 69 6d 65 20 30 5d  mtime 0 ctime 0]
02d0: 0a 73 65 74 20 3a 3a 76 66 73 3a 3a 6b 69 74 64  .set ::vfs::kitd
02e0: 6c 6c 3a 3a 6d 65 74 61 64 61 74 61 28 73 75 62  ll::metadata(sub
02f0: 29 20 5b 6c 69 73 74 20 74 79 70 65 20 64 69 72  ) [list type dir
0300: 65 63 74 6f 72 79 20 69 6e 6f 20 32 20 6d 6f 64  ectory ino 2 mod
0310: 65 20 30 35 35 35 20 6e 6c 69 6e 6b 20 31 20 75  e 0555 nlink 1 u
0320: 69 64 20 30 20 67 69 64 20 30 20 73 69 7a 65 20  id 0 gid 0 size 
0330: 30 20 61 74 69 6d 65 20 30 20 6d 74 69 6d 65 20  0 atime 0 mtime 
0340: 30 20 63 74 69 6d 65 20 30 5d 0a 73 65 74 20 3a  0 ctime 0].set :
0350: 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 6d 65  :vfs::kitdll::me
0360: 74 61 64 61 74 61 28 73 75 62 2f 73 75 62 32 29  tadata(sub/sub2)
0370: 20 5b 6c 69 73 74 20 74 79 70 65 20 64 69 72 65   [list type dire
0380: 63 74 6f 72 79 20 69 6e 6f 20 33 20 6d 6f 64 65  ctory ino 3 mode
0390: 20 30 35 35 35 20 6e 6c 69 6e 6b 20 31 20 75 69   0555 nlink 1 ui
03a0: 64 20 30 20 67 69 64 20 30 20 73 69 7a 65 20 30  d 0 gid 0 size 0
03b0: 20 61 74 69 6d 65 20 30 20 6d 74 69 6d 65 20 30   atime 0 mtime 0
03c0: 20 63 74 69 6d 65 20 30 5d 0a 0a 70 72 6f 63 20   ctime 0]..proc 
03d0: 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 64  ::vfs::kitdll::d
03e0: 61 74 61 3a 3a 67 65 74 44 61 74 61 20 7b 68 61  ata::getData {ha
03f0: 73 68 6b 65 79 20 66 69 6c 65 20 7b 73 74 61 72  shkey file {star
0400: 74 20 30 7d 20 7b 65 6e 64 20 22 65 6e 64 22 7d  t 0} {end "end"}
0410: 7d 20 7b 0a 09 69 66 20 7b 21 5b 69 6e 66 6f 20  } {..if {![info 
0420: 65 78 69 73 74 73 20 3a 3a 76 66 73 3a 3a 6b 69  exists ::vfs::ki
0430: 74 64 6c 6c 3a 3a 64 61 74 61 28 24 66 69 6c 65  tdll::data($file
0440: 29 5d 7d 20 7b 0a 09 09 72 65 74 75 72 6e 20 2d  )]} {...return -
0450: 63 6f 64 65 20 65 72 72 6f 72 20 22 49 6e 76 61  code error "Inva
0460: 6c 69 64 20 6f 70 65 72 61 74 69 6f 6e 22 0a 09  lid operation"..
0470: 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 69  }...return [stri
0480: 6e 67 20 72 61 6e 67 65 20 24 3a 3a 76 66 73 3a  ng range $::vfs:
0490: 3a 6b 69 74 64 6c 6c 3a 3a 64 61 74 61 28 24 66  :kitdll::data($f
04a0: 69 6c 65 29 20 24 73 74 61 72 74 20 24 65 6e 64  ile) $start $end
04b0: 5d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 66 73 3a  ].}..proc ::vfs:
04c0: 3a 6b 69 74 64 6c 6c 3a 3a 64 61 74 61 3a 3a 67  :kitdll::data::g
04d0: 65 74 4d 65 74 61 64 61 74 61 20 7b 68 61 73 68  etMetadata {hash
04e0: 6b 65 79 20 66 69 6c 65 7d 20 7b 0a 09 69 66 20  key file} {..if 
04f0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
0500: 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 6d 65  :vfs::kitdll::me
0510: 74 61 64 61 74 61 28 24 66 69 6c 65 29 5d 7d 20  tadata($file)]} 
0520: 7b 0a 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 65  {...return -code
0530: 20 65 72 72 6f 72 20 22 4e 6f 20 73 75 63 68 20   error "No such 
0540: 66 69 6c 65 22 0a 09 7d 0a 0a 09 72 65 74 75 72  file"..}...retur
0550: 6e 20 24 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c  n $::vfs::kitdll
0560: 3a 3a 6d 65 74 61 64 61 74 61 28 24 66 69 6c 65  ::metadata($file
0570: 29 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 66 73 3a  ).}..proc ::vfs:
0580: 3a 6b 69 74 64 6c 6c 3a 3a 64 61 74 61 3a 3a 67  :kitdll::data::g
0590: 65 74 43 68 69 6c 64 72 65 6e 20 7b 68 61 73 68  etChildren {hash
05a0: 6b 65 79 20 64 69 72 65 63 74 6f 72 79 7d 20 7b  key directory} {
05b0: 0a 09 73 65 74 20 70 61 74 74 65 72 6e 20 5b 66  ..set pattern [f
05c0: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
05d0: 6f 72 79 20 7b 5b 5e 2f 5d 2a 7d 5d 0a 0a 09 73  ory {[^/]*}]...s
05e0: 65 74 20 63 68 69 6c 64 72 65 6e 20 5b 61 72 72  et children [arr
05f0: 61 79 20 6e 61 6d 65 73 20 3a 3a 76 66 73 3a 3a  ay names ::vfs::
0600: 6b 69 74 64 6c 6c 3a 3a 6d 65 74 61 64 61 74 61  kitdll::metadata
0610: 20 2d 72 65 67 65 78 70 20 22 5e 24 7b 70 61 74   -regexp "^${pat
0620: 74 65 72 6e 7d 5c 24 22 5d 0a 0a 09 73 65 74 20  tern}\$"]...set 
0630: 6e 65 77 63 68 69 6c 64 72 65 6e 20 5b 6c 69 73  newchildren [lis
0640: 74 5d 0a 09 66 6f 72 65 61 63 68 20 63 68 69 6c  t]..foreach chil
0650: 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09  d $children {...
0660: 69 66 20 7b 24 63 68 69 6c 64 20 3d 3d 20 22 22  if {$child == ""
0670: 7d 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 0a  } {....continue.
0680: 09 09 7d 0a 0a 09 09 73 65 74 20 74 61 69 6c 20  ..}....set tail 
0690: 5b 6c 69 6e 64 65 78 20 5b 73 70 6c 69 74 20 24  [lindex [split $
06a0: 63 68 69 6c 64 20 2f 5d 20 65 6e 64 5d 0a 0a 09  child /] end]...
06b0: 09 6c 61 70 70 65 6e 64 20 6e 65 77 63 68 69 6c  .lappend newchil
06c0: 64 72 65 6e 20 24 74 61 69 6c 0a 09 7d 0a 0a 09  dren $tail..}...
06d0: 72 65 74 75 72 6e 20 24 6e 65 77 63 68 69 6c 64  return $newchild
06e0: 72 65 6e 0a 7d 0a 0a 23 23 20 56 46 53 20 61 6e  ren.}..## VFS an
06f0: 64 20 43 68 61 6e 20 49 2f 4f 0a 23 23 23 20 44  d Chan I/O.### D
0700: 69 73 70 61 74 63 68 65 72 73 0a 70 72 6f 63 20  ispatchers.proc 
0710: 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 76  ::vfs::kitdll::v
0720: 66 73 68 61 6e 64 6c 65 72 20 7b 68 61 73 68 6b  fshandler {hashk
0730: 65 79 20 73 75 62 63 6d 64 20 61 72 67 73 7d 20  ey subcmd args} 
0740: 7b 0a 09 73 65 74 20 63 6d 64 20 24 61 72 67 73  {..set cmd $args
0750: 0a 09 73 65 74 20 63 6d 64 20 5b 6c 69 6e 73 65  ..set cmd [linse
0760: 72 74 20 24 63 6d 64 20 30 20 22 3a 3a 76 66 73  rt $cmd 0 "::vfs
0770: 3a 3a 6b 69 74 64 6c 6c 3a 3a 76 66 73 6f 70 5f  ::kitdll::vfsop_
0780: 24 7b 73 75 62 63 6d 64 7d 22 20 24 68 61 73 68  ${subcmd}" $hash
0790: 6b 65 79 5d 0a 0a 09 72 65 74 75 72 6e 20 5b 65  key]...return [e
07a0: 76 61 6c 20 24 63 6d 64 5d 0a 7d 0a 0a 70 72 6f  val $cmd].}..pro
07b0: 63 20 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a  c ::vfs::kitdll:
07c0: 3a 63 68 61 6e 68 61 6e 64 6c 65 72 20 7b 68 61  :chanhandler {ha
07d0: 73 68 6b 65 79 20 73 75 62 63 6d 64 20 61 72 67  shkey subcmd arg
07e0: 73 7d 20 7b 0a 09 73 65 74 20 63 6d 64 20 24 61  s} {..set cmd $a
07f0: 72 67 73 0a 09 73 65 74 20 63 6d 64 20 5b 6c 69  rgs..set cmd [li
0800: 6e 73 65 72 74 20 24 63 6d 64 20 30 20 22 3a 3a  nsert $cmd 0 "::
0810: 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 63 68 61  vfs::kitdll::cha
0820: 6e 6f 70 5f 24 7b 73 75 62 63 6d 64 7d 22 20 24  nop_${subcmd}" $
0830: 68 61 73 68 6b 65 79 5d 0a 0a 09 72 65 74 75 72  hashkey]...retur
0840: 6e 20 5b 65 76 61 6c 20 24 63 6d 64 5d 0a 7d 0a  n [eval $cmd].}.
0850: 0a 23 23 23 20 41 63 74 75 61 6c 20 68 61 6e 64  .### Actual hand
0860: 6c 65 72 73 0a 23 23 23 23 20 43 68 61 6e 6e 65  lers.#### Channe
0870: 6c 20 6f 70 65 72 61 74 69 6f 6e 20 68 61 6e 64  l operation hand
0880: 6c 65 72 73 0a 70 72 6f 63 20 3a 3a 76 66 73 3a  lers.proc ::vfs:
0890: 3a 6b 69 74 64 6c 6c 3a 3a 63 68 61 6e 6f 70 5f  :kitdll::chanop_
08a0: 69 6e 69 74 69 61 6c 69 7a 65 20 7b 68 61 73 68  initialize {hash
08b0: 6b 65 79 20 63 68 61 6e 49 64 20 6d 6f 64 65 7d  key chanId mode}
08c0: 20 7b 0a 09 72 65 74 75 72 6e 20 5b 6c 69 73 74   {..return [list
08d0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 6e 61   initialize fina
08e0: 6c 69 7a 65 20 77 61 74 63 68 20 72 65 61 64 20  lize watch read 
08f0: 73 65 65 6b 5d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a  seek].}..proc ::
0900: 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 63 68 61  vfs::kitdll::cha
0910: 6e 6f 70 5f 66 69 6e 61 6c 69 7a 65 20 7b 68 61  nop_finalize {ha
0920: 73 68 6b 65 79 20 63 68 61 6e 49 64 7d 20 7b 0a  shkey chanId} {.
0930: 09 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61  .unset -nocompla
0940: 69 6e 20 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c  in ::vfs::kitdll
0950: 3a 3a 63 68 61 6e 64 61 74 61 28 5b 6c 69 73 74  ::chandata([list
0960: 20 24 68 61 73 68 6b 65 79 20 24 63 68 61 6e 49   $hashkey $chanI
0970: 64 5d 29 0a 0a 09 72 65 74 75 72 6e 0a 7d 0a 0a  d])...return.}..
0980: 70 72 6f 63 20 3a 3a 76 66 73 3a 3a 6b 69 74 64  proc ::vfs::kitd
0990: 6c 6c 3a 3a 63 68 61 6e 6f 70 5f 77 61 74 63 68  ll::chanop_watch
09a0: 20 7b 68 61 73 68 6b 65 79 20 63 68 61 6e 49 64   {hashkey chanId
09b0: 20 65 76 65 6e 74 53 70 65 63 7d 20 7b 0a 09 61   eventSpec} {..a
09c0: 72 72 61 79 20 73 65 74 20 63 68 61 6e 69 6e 66  rray set chaninf
09d0: 6f 20 24 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c  o $::vfs::kitdll
09e0: 3a 3a 63 68 61 6e 64 61 74 61 28 5b 6c 69 73 74  ::chandata([list
09f0: 20 24 68 61 73 68 6b 65 79 20 24 63 68 61 6e 49   $hashkey $chanI
0a00: 64 5d 29 0a 0a 09 73 65 74 20 63 68 61 6e 69 6e  d])...set chanin
0a10: 66 6f 28 77 61 74 63 68 69 6e 67 29 20 24 65 76  fo(watching) $ev
0a20: 65 6e 74 53 70 65 63 0a 0a 09 73 65 74 20 3a 3a  entSpec...set ::
0a30: 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 63 68 61  vfs::kitdll::cha
0a40: 6e 64 61 74 61 28 5b 6c 69 73 74 20 24 68 61 73  ndata([list $has
0a50: 68 6b 65 79 20 24 63 68 61 6e 49 64 5d 29 20 5b  hkey $chanId]) [
0a60: 61 72 72 61 79 20 67 65 74 20 63 68 61 6e 69 6e  array get chanin
0a70: 66 6f 5d 0a 0a 09 69 66 20 7b 5b 6c 73 65 61 72  fo]...if {[lsear
0a80: 63 68 20 2d 65 78 61 63 74 20 24 63 68 61 6e 69  ch -exact $chani
0a90: 6e 66 6f 28 77 61 74 63 68 69 6e 67 29 20 22 72  nfo(watching) "r
0aa0: 65 61 64 22 5d 20 21 3d 20 2d 31 7d 20 7b 0a 09  ead"] != -1} {..
0ab0: 09 61 66 74 65 72 20 30 20 5b 6c 69 73 74 20 63  .after 0 [list c
0ac0: 61 74 63 68 20 22 63 68 61 6e 20 70 6f 73 74 65  atch "chan poste
0ad0: 76 65 6e 74 20 24 63 68 61 6e 49 64 20 5b 6c 69  vent $chanId [li
0ae0: 73 74 20 7b 72 65 61 64 7d 5d 22 5d 0a 09 7d 0a  st {read}]"]..}.
0af0: 0a 09 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63  ..return.}..proc
0b00: 20 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a   ::vfs::kitdll::
0b10: 63 68 61 6e 6f 70 5f 72 65 61 64 20 7b 68 61 73  chanop_read {has
0b20: 68 6b 65 79 20 63 68 61 6e 49 64 20 62 79 74 65  hkey chanId byte
0b30: 73 7d 20 7b 0a 09 61 72 72 61 79 20 73 65 74 20  s} {..array set 
0b40: 63 68 61 6e 69 6e 66 6f 20 24 3a 3a 76 66 73 3a  chaninfo $::vfs:
0b50: 3a 6b 69 74 64 6c 6c 3a 3a 63 68 61 6e 64 61 74  :kitdll::chandat
0b60: 61 28 5b 6c 69 73 74 20 24 68 61 73 68 6b 65 79  a([list $hashkey
0b70: 20 24 63 68 61 6e 49 64 5d 29 0a 0a 09 73 65 74   $chanId])...set
0b80: 20 70 6f 73 20 24 63 68 61 6e 69 6e 66 6f 28 70   pos $chaninfo(p
0b90: 6f 73 29 0a 09 73 65 74 20 6c 65 6e 20 24 63 68  os)..set len $ch
0ba0: 61 6e 69 6e 66 6f 28 6c 65 6e 29 0a 0a 09 69 66  aninfo(len)...if
0bb0: 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63   {[lsearch -exac
0bc0: 74 20 24 63 68 61 6e 69 6e 66 6f 28 77 61 74 63  t $chaninfo(watc
0bd0: 68 69 6e 67 29 20 22 72 65 61 64 22 5d 20 21 3d  hing) "read"] !=
0be0: 20 2d 31 7d 20 7b 0a 09 09 61 66 74 65 72 20 30   -1} {...after 0
0bf0: 20 5b 6c 69 73 74 20 63 61 74 63 68 20 22 63 68   [list catch "ch
0c00: 61 6e 20 70 6f 73 74 65 76 65 6e 74 20 24 63 68  an postevent $ch
0c10: 61 6e 49 64 20 5b 6c 69 73 74 20 7b 72 65 61 64  anId [list {read
0c20: 7d 5d 22 5d 0a 09 7d 0a 0a 09 69 66 20 7b 24 70  }]"]..}...if {$p
0c30: 6f 73 20 3d 3d 20 24 6c 65 6e 7d 20 7b 0a 09 09  os == $len} {...
0c40: 72 65 74 75 72 6e 20 22 22 0a 09 7d 0a 0a 09 73  return ""..}...s
0c50: 65 74 20 65 6e 64 20 5b 65 78 70 72 20 7b 24 70  et end [expr {$p
0c60: 6f 73 20 2b 20 24 62 79 74 65 73 7d 5d 0a 09 69  os + $bytes}]..i
0c70: 66 20 7b 24 65 6e 64 20 3e 20 24 6c 65 6e 7d 20  f {$end > $len} 
0c80: 7b 0a 09 09 73 65 74 20 65 6e 64 20 24 6c 65 6e  {...set end $len
0c90: 0a 09 7d 0a 0a 09 73 65 74 20 64 61 74 61 20 5b  ..}...set data [
0ca0: 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 64  ::vfs::kitdll::d
0cb0: 61 74 61 3a 3a 67 65 74 44 61 74 61 20 24 68 61  ata::getData $ha
0cc0: 73 68 6b 65 79 20 24 63 68 61 6e 69 6e 66 6f 28  shkey $chaninfo(
0cd0: 66 69 6c 65 29 20 24 70 6f 73 20 24 65 6e 64 5d  file) $pos $end]
0ce0: 0a 0a 09 73 65 74 20 64 61 74 61 4c 65 6e 20 5b  ...set dataLen [
0cf0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
0d00: 61 74 61 5d 0a 09 69 6e 63 72 20 70 6f 73 20 24  ata]..incr pos $
0d10: 64 61 74 61 4c 65 6e 0a 0a 09 73 65 74 20 63 68  dataLen...set ch
0d20: 61 6e 69 6e 66 6f 28 70 6f 73 29 20 24 70 6f 73  aninfo(pos) $pos
0d30: 0a 0a 09 73 65 74 20 3a 3a 76 66 73 3a 3a 6b 69  ...set ::vfs::ki
0d40: 74 64 6c 6c 3a 3a 63 68 61 6e 64 61 74 61 28 5b  tdll::chandata([
0d50: 6c 69 73 74 20 24 68 61 73 68 6b 65 79 20 24 63  list $hashkey $c
0d60: 68 61 6e 49 64 5d 29 20 5b 61 72 72 61 79 20 67  hanId]) [array g
0d70: 65 74 20 63 68 61 6e 69 6e 66 6f 5d 0a 0a 09 72  et chaninfo]...r
0d80: 65 74 75 72 6e 20 24 64 61 74 61 0a 7d 0a 0a 23  eturn $data.}..#
0d90: 23 23 23 20 56 46 53 20 6f 70 65 72 61 74 69 6f  ### VFS operatio
0da0: 6e 20 68 61 6e 64 6c 65 72 73 0a 70 72 6f 63 20  n handlers.proc 
0db0: 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 76  ::vfs::kitdll::v
0dc0: 66 73 6f 70 5f 73 74 61 74 20 7b 68 61 73 68 6b  fsop_stat {hashk
0dd0: 65 79 20 72 6f 6f 74 20 72 65 6c 61 74 69 76 65  ey root relative
0de0: 20 61 63 74 75 61 6c 70 61 74 68 7d 20 7b 0a 09   actualpath} {..
0df0: 63 61 74 63 68 20 7b 0a 09 09 73 65 74 20 72 65  catch {...set re
0e00: 74 20 5b 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c  t [::vfs::kitdll
0e10: 3a 3a 64 61 74 61 3a 3a 67 65 74 4d 65 74 61 64  ::data::getMetad
0e20: 61 74 61 20 24 68 61 73 68 6b 65 79 20 24 72 65  ata $hashkey $re
0e30: 6c 61 74 69 76 65 5d 0a 09 7d 0a 0a 09 69 66 20  lative]..}...if 
0e40: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 72  {![info exists r
0e50: 65 74 5d 7d 20 7b 0a 09 09 76 66 73 3a 3a 66 69  et]} {...vfs::fi
0e60: 6c 65 73 79 73 74 65 6d 20 70 6f 73 69 78 65 72  lesystem posixer
0e70: 72 6f 72 20 24 3a 3a 76 66 73 3a 3a 70 6f 73 69  ror $::vfs::posi
0e80: 78 28 45 4e 4f 45 4e 54 29 0a 09 7d 0a 0a 09 72  x(ENOENT)..}...r
0e90: 65 74 75 72 6e 20 24 72 65 74 0a 7d 0a 0a 70 72  eturn $ret.}..pr
0ea0: 6f 63 20 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c  oc ::vfs::kitdll
0eb0: 3a 3a 76 66 73 6f 70 5f 61 63 63 65 73 73 20 7b  ::vfsop_access {
0ec0: 68 61 73 68 6b 65 79 20 72 6f 6f 74 20 72 65 6c  hashkey root rel
0ed0: 61 74 69 76 65 20 61 63 74 75 61 6c 70 61 74 68  ative actualpath
0ee0: 20 6d 6f 64 65 7d 20 7b 0a 09 73 65 74 20 72 65   mode} {..set re
0ef0: 74 20 5b 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c  t [::vfs::kitdll
0f00: 3a 3a 64 61 74 61 3a 3a 67 65 74 4d 65 74 61 64  ::data::getMetad
0f10: 61 74 61 20 24 68 61 73 68 6b 65 79 20 24 72 65  ata $hashkey $re
0f20: 6c 61 74 69 76 65 5d 0a 0a 09 69 66 20 7b 24 6d  lative]...if {$m
0f30: 6f 64 65 20 26 20 30 78 32 7d 20 7b 0a 09 09 76  ode & 0x2} {...v
0f40: 66 73 3a 3a 66 69 6c 65 73 79 73 74 65 6d 20 70  fs::filesystem p
0f50: 6f 73 69 78 65 72 72 6f 72 20 24 3a 3a 76 66 73  osixerror $::vfs
0f60: 3a 3a 70 6f 73 69 78 28 45 52 4f 46 53 29 0a 09  ::posix(EROFS)..
0f70: 7d 0a 0a 09 72 65 74 75 72 6e 20 31 0a 7d 0a 0a  }...return 1.}..
0f80: 70 72 6f 63 20 3a 3a 76 66 73 3a 3a 6b 69 74 64  proc ::vfs::kitd
0f90: 6c 6c 3a 3a 76 66 73 6f 70 5f 6d 61 74 63 68 69  ll::vfsop_matchi
0fa0: 6e 64 69 72 65 63 74 6f 72 79 20 7b 68 61 73 68  ndirectory {hash
0fb0: 6b 65 79 20 72 6f 6f 74 20 72 65 6c 61 74 69 76  key root relativ
0fc0: 65 20 61 63 74 75 61 6c 70 61 74 68 20 70 61 74  e actualpath pat
0fd0: 74 65 72 6e 20 74 79 70 65 73 7d 20 7b 0a 09 73  tern types} {..s
0fe0: 65 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 0a 09  et ret [list]...
0ff0: 63 61 74 63 68 20 7b 0a 09 09 61 72 72 61 79 20  catch {...array 
1000: 73 65 74 20 6d 65 74 61 64 61 74 61 20 5b 3a 3a  set metadata [::
1010: 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 64 61 74  vfs::kitdll::dat
1020: 61 3a 3a 67 65 74 4d 65 74 61 64 61 74 61 20 24  a::getMetadata $
1030: 68 61 73 68 6b 65 79 20 24 72 65 6c 61 74 69 76  hashkey $relativ
1040: 65 5d 0a 09 7d 0a 0a 09 69 66 20 7b 21 5b 69 6e  e]..}...if {![in
1050: 66 6f 20 65 78 69 73 74 73 20 6d 65 74 61 64 61  fo exists metada
1060: 74 61 5d 7d 20 7b 0a 09 09 72 65 74 75 72 6e 20  ta]} {...return 
1070: 5b 6c 69 73 74 5d 0a 09 7d 0a 0a 09 69 66 20 7b  [list]..}...if {
1080: 24 70 61 74 74 65 72 6e 20 3d 3d 20 22 22 7d 20  $pattern == ""} 
1090: 7b 0a 0a 09 09 73 65 74 20 63 68 69 6c 64 72 65  {....set childre
10a0: 6e 20 5b 6c 69 73 74 20 24 72 65 6c 61 74 69 76  n [list $relativ
10b0: 65 5d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73  e]..} else {...s
10c0: 65 74 20 63 68 69 6c 64 72 65 6e 20 5b 3a 3a 76  et children [::v
10d0: 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 64 61 74 61  fs::kitdll::data
10e0: 3a 3a 67 65 74 43 68 69 6c 64 72 65 6e 20 24 68  ::getChildren $h
10f0: 61 73 68 6b 65 79 20 24 72 65 6c 61 74 69 76 65  ashkey $relative
1100: 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63  ]..}...foreach c
1110: 68 69 6c 64 20 24 63 68 69 6c 64 72 65 6e 20 7b  hild $children {
1120: 0a 09 09 69 66 20 7b 21 5b 73 74 72 69 6e 67 20  ...if {![string 
1130: 6d 61 74 63 68 20 24 70 61 74 74 65 72 6e 20 24  match $pattern $
1140: 63 68 69 6c 64 5d 7d 20 7b 0a 09 09 09 63 6f 6e  child]} {....con
1150: 74 69 6e 75 65 0a 09 09 7d 0a 0a 09 09 75 6e 73  tinue...}....uns
1160: 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6d  et -nocomplain m
1170: 65 74 61 64 61 74 61 0a 09 09 63 61 74 63 68 20  etadata...catch 
1180: 7b 0a 09 09 09 61 72 72 61 79 20 73 65 74 20 6d  {....array set m
1190: 65 74 61 64 61 74 61 20 5b 3a 3a 76 66 73 3a 3a  etadata [::vfs::
11a0: 6b 69 74 64 6c 6c 3a 3a 64 61 74 61 3a 3a 67 65  kitdll::data::ge
11b0: 74 4d 65 74 61 64 61 74 61 20 24 68 61 73 68 6b  tMetadata $hashk
11c0: 65 79 20 24 63 68 69 6c 64 5d 0a 09 09 7d 0a 0a  ey $child]...}..
11d0: 09 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 6e  ..if {[string in
11e0: 64 65 78 20 24 61 63 74 75 61 6c 70 61 74 68 20  dex $actualpath 
11f0: 65 6e 64 5d 20 3d 3d 20 22 2f 22 7d 20 7b 0a 09  end] == "/"} {..
1200: 09 09 73 65 74 20 63 68 69 6c 64 20 22 24 7b 61  ..set child "${a
1210: 63 74 75 61 6c 70 61 74 68 7d 24 7b 63 68 69 6c  ctualpath}${chil
1220: 64 7d 22 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  d}"...} else {..
1230: 09 09 73 65 74 20 63 68 69 6c 64 20 22 24 7b 61  ..set child "${a
1240: 63 74 75 61 6c 70 61 74 68 7d 2f 24 7b 63 68 69  ctualpath}/${chi
1250: 6c 64 7d 22 0a 09 09 7d 0a 09 09 69 66 20 7b 5b  ld}"...}...if {[
1260: 73 74 72 69 6e 67 20 69 6e 64 65 78 20 24 63 68  string index $ch
1270: 69 6c 64 20 65 6e 64 5d 20 3d 3d 20 22 22 7d 20  ild end] == ""} 
1280: 7b 0a 09 09 09 73 65 74 20 63 68 69 6c 64 20 5b  {....set child [
1290: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 63 68  string range $ch
12a0: 69 6c 64 20 30 20 65 6e 64 2d 31 5d 0a 09 09 7d  ild 0 end-1]...}
12b0: 0a 0a 09 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65  ....if {![info e
12c0: 78 69 73 74 73 20 6d 65 74 61 64 61 74 61 28 74  xists metadata(t
12d0: 79 70 65 29 5d 7d 20 7b 0a 09 09 09 63 6f 6e 74  ype)]} {....cont
12e0: 69 6e 75 65 0a 09 09 7d 0a 0a 09 09 73 65 74 20  inue...}....set 
12f0: 66 69 6c 65 74 79 70 65 20 30 0a 09 09 73 77 69  filetype 0...swi
1300: 74 63 68 20 2d 2d 20 24 6d 65 74 61 64 61 74 61  tch -- $metadata
1310: 28 74 79 70 65 29 20 7b 0a 09 09 09 22 64 69 72  (type) {...."dir
1320: 65 63 74 6f 72 79 22 20 7b 0a 09 09 09 09 73 65  ectory" {.....se
1330: 74 20 66 69 6c 65 74 79 70 65 20 5b 65 78 70 72  t filetype [expr
1340: 20 7b 24 66 69 6c 65 74 79 70 65 20 7c 20 30 78   {$filetype | 0x
1350: 30 34 7d 5d 0a 09 09 09 7d 0a 09 09 09 22 66 69  04}]....}...."fi
1360: 6c 65 22 20 7b 0a 09 09 09 09 73 65 74 20 66 69  le" {.....set fi
1370: 6c 65 74 79 70 65 20 5b 65 78 70 72 20 7b 24 66  letype [expr {$f
1380: 69 6c 65 74 79 70 65 20 7c 20 30 78 31 30 7d 5d  iletype | 0x10}]
1390: 0a 09 09 09 7d 0a 09 09 09 22 6c 69 6e 6b 22 20  ....}...."link" 
13a0: 7b 0a 09 09 09 09 73 65 74 20 66 69 6c 65 74 79  {.....set filety
13b0: 70 65 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 74  pe [expr {$filet
13c0: 79 70 65 20 7c 20 30 78 32 30 7d 5d 0a 09 09 09  ype | 0x20}]....
13d0: 7d 0a 09 09 09 64 65 66 61 75 6c 74 20 7b 0a 09  }....default {..
13e0: 09 09 09 63 6f 6e 74 69 6e 75 65 0a 09 09 09 7d  ...continue....}
13f0: 0a 09 09 7d 0a 0a 09 09 69 66 20 7b 28 24 66 69  ...}....if {($fi
1400: 6c 65 74 79 70 65 20 26 20 24 74 79 70 65 73 29  letype & $types)
1410: 20 21 3d 20 24 74 79 70 65 73 7d 20 7b 0a 09 09   != $types} {...
1420: 09 63 6f 6e 74 69 6e 75 65 0a 09 09 7d 0a 0a 09  .continue...}...
1430: 09 6c 61 70 70 65 6e 64 20 72 65 74 20 24 63 68  .lappend ret $ch
1440: 69 6c 64 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20  ild..}...return 
1450: 24 72 65 74 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76  $ret.}..proc ::v
1460: 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 76 66 73 6f  fs::kitdll::vfso
1470: 70 5f 66 69 6c 65 61 74 74 72 69 62 75 74 65 73  p_fileattributes
1480: 20 7b 68 61 73 68 6b 65 79 20 72 6f 6f 74 20 72   {hashkey root r
1490: 65 6c 61 74 69 76 65 20 61 63 74 75 61 6c 70 61  elative actualpa
14a0: 74 68 20 7b 69 6e 64 65 78 20 2d 31 7d 20 7b 76  th {index -1} {v
14b0: 61 6c 75 65 20 22 22 7d 7d 20 7b 0a 09 73 65 74  alue ""}} {..set
14c0: 20 61 74 74 72 73 20 5b 6c 69 73 74 20 2d 6f 77   attrs [list -ow
14d0: 6e 65 72 20 2d 67 72 6f 75 70 20 2d 70 65 72 6d  ner -group -perm
14e0: 69 73 73 69 6f 6e 73 5d 0a 0a 09 69 66 20 7b 24  issions]...if {$
14f0: 76 61 6c 75 65 20 21 3d 20 22 22 7d 20 7b 0a 09  value != ""} {..
1500: 09 76 66 73 3a 3a 66 69 6c 65 73 79 73 74 65 6d  .vfs::filesystem
1510: 20 70 6f 73 69 78 65 72 72 6f 72 20 24 3a 3a 76   posixerror $::v
1520: 66 73 3a 3a 70 6f 73 69 78 28 45 52 4f 46 53 29  fs::posix(EROFS)
1530: 0a 09 7d 0a 0a 09 69 66 20 7b 24 69 6e 64 65 78  ..}...if {$index
1540: 20 3d 3d 20 2d 31 7d 20 7b 0a 09 09 72 65 74 75   == -1} {...retu
1550: 72 6e 20 24 61 74 74 72 73 0a 09 7d 0a 0a 09 61  rn $attrs..}...a
1560: 72 72 61 79 20 73 65 74 20 6d 65 74 61 64 61 74  rray set metadat
1570: 61 20 5b 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c  a [::vfs::kitdll
1580: 3a 3a 64 61 74 61 3a 3a 67 65 74 4d 65 74 61 64  ::data::getMetad
1590: 61 74 61 20 24 68 61 73 68 6b 65 79 20 24 72 65  ata $hashkey $re
15a0: 6c 61 74 69 76 65 5d 0a 0a 09 73 65 74 20 61 74  lative]...set at
15b0: 74 72 20 5b 6c 69 6e 64 65 78 20 24 61 74 74 72  tr [lindex $attr
15c0: 73 20 24 69 6e 64 65 78 5d 0a 0a 09 73 77 69 74  s $index]...swit
15d0: 63 68 20 2d 2d 20 24 61 74 74 72 20 7b 0a 09 09  ch -- $attr {...
15e0: 22 2d 6f 77 6e 65 72 22 20 7b 0a 09 09 09 72 65  "-owner" {....re
15f0: 74 75 72 6e 20 24 6d 65 74 61 64 61 74 61 28 75  turn $metadata(u
1600: 69 64 29 0a 09 09 7d 0a 09 09 22 2d 67 72 6f 75  id)...}..."-grou
1610: 70 22 20 7b 0a 09 09 09 72 65 74 75 72 6e 20 24  p" {....return $
1620: 6d 65 74 61 64 61 74 61 28 67 69 64 29 0a 09 09  metadata(gid)...
1630: 7d 0a 09 09 22 2d 70 65 72 6d 69 73 73 69 6f 6e  }..."-permission
1640: 73 22 20 7b 0a 09 09 09 69 66 20 7b 24 6d 65 74  s" {....if {$met
1650: 61 64 61 74 61 28 74 79 70 65 29 20 3d 3d 20 22  adata(type) == "
1660: 64 69 72 65 63 74 6f 72 79 22 7d 20 7b 0a 09 09  directory"} {...
1670: 09 09 73 65 74 20 6d 65 74 61 64 61 74 61 28 6d  ..set metadata(m
1680: 6f 64 65 29 20 5b 65 78 70 72 20 7b 24 6d 65 74  ode) [expr {$met
1690: 61 64 61 74 61 28 6d 6f 64 65 29 20 7c 20 30 34  adata(mode) | 04
16a0: 30 30 30 30 7d 5d 0a 09 09 09 7d 0a 0a 09 09 09  0000}]....}.....
16b0: 72 65 74 75 72 6e 20 5b 66 6f 72 6d 61 74 20 7b  return [format {
16c0: 30 25 6f 7d 20 24 6d 65 74 61 64 61 74 61 28 6d  0%o} $metadata(m
16d0: 6f 64 65 29 5d 0a 09 09 7d 0a 09 7d 0a 0a 09 72  ode)]...}..}...r
16e0: 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f  eturn -code erro
16f0: 72 20 22 49 6e 76 61 6c 69 64 20 69 6e 64 65 78  r "Invalid index
1700: 22 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 66 73 3a  ".}..proc ::vfs:
1710: 3a 6b 69 74 64 6c 6c 3a 3a 76 66 73 6f 70 5f 6f  :kitdll::vfsop_o
1720: 70 65 6e 20 7b 68 61 73 68 6b 65 79 20 72 6f 6f  pen {hashkey roo
1730: 74 20 72 65 6c 61 74 69 76 65 20 61 63 74 75 61  t relative actua
1740: 6c 70 61 74 68 20 6d 6f 64 65 20 70 65 72 6d 69  lpath mode permi
1750: 73 73 69 6f 6e 73 7d 20 7b 0a 09 69 66 20 7b 24  ssions} {..if {$
1760: 6d 6f 64 65 20 21 3d 20 22 22 20 26 26 20 24 6d  mode != "" && $m
1770: 6f 64 65 20 21 3d 20 22 72 22 7d 20 7b 0a 09 09  ode != "r"} {...
1780: 76 66 73 3a 3a 66 69 6c 65 73 79 73 74 65 6d 20  vfs::filesystem 
1790: 70 6f 73 69 78 65 72 72 6f 72 20 24 3a 3a 76 66  posixerror $::vf
17a0: 73 3a 3a 70 6f 73 69 78 28 45 52 4f 46 53 29 0a  s::posix(EROFS).
17b0: 09 7d 0a 0a 09 63 61 74 63 68 20 7b 0a 09 09 61  .}...catch {...a
17c0: 72 72 61 79 20 73 65 74 20 6d 65 74 61 64 61 74  rray set metadat
17d0: 61 20 5b 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c  a [::vfs::kitdll
17e0: 3a 3a 64 61 74 61 3a 3a 67 65 74 4d 65 74 61 64  ::data::getMetad
17f0: 61 74 61 20 24 68 61 73 68 6b 65 79 20 24 72 65  ata $hashkey $re
1800: 6c 61 74 69 76 65 5d 0a 09 7d 0a 0a 09 69 66 20  lative]..}...if 
1810: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6d  {![info exists m
1820: 65 74 61 64 61 74 61 5d 7d 20 7b 0a 09 09 76 66  etadata]} {...vf
1830: 73 3a 3a 66 69 6c 65 73 79 73 74 65 6d 20 70 6f  s::filesystem po
1840: 73 69 78 65 72 72 6f 72 20 24 3a 3a 76 66 73 3a  sixerror $::vfs:
1850: 3a 70 6f 73 69 78 28 45 4e 4f 45 4e 54 29 0a 09  :posix(ENOENT)..
1860: 7d 0a 0a 09 69 66 20 7b 24 6d 65 74 61 64 61 74  }...if {$metadat
1870: 61 28 74 79 70 65 29 20 3d 3d 20 22 64 69 72 65  a(type) == "dire
1880: 63 74 6f 72 79 22 7d 20 7b 0a 09 09 76 66 73 3a  ctory"} {...vfs:
1890: 3a 66 69 6c 65 73 79 73 74 65 6d 20 70 6f 73 69  :filesystem posi
18a0: 78 65 72 72 6f 72 20 24 3a 3a 76 66 73 3a 3a 70  xerror $::vfs::p
18b0: 6f 73 69 78 28 45 49 53 44 49 52 29 0a 09 7d 0a  osix(EISDIR)..}.
18c0: 0a 09 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 6d  ..if {[info comm
18d0: 61 6e 64 20 63 68 61 6e 5d 20 21 3d 20 22 22 7d  and chan] != ""}
18e0: 20 7b 0a 09 09 73 65 74 20 63 68 61 6e 20 5b 63   {...set chan [c
18f0: 68 61 6e 20 63 72 65 61 74 65 20 5b 6c 69 73 74  han create [list
1900: 20 22 72 65 61 64 22 5d 20 5b 6c 69 73 74 20 3a   "read"] [list :
1910: 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 63 68  :vfs::kitdll::ch
1920: 61 6e 68 61 6e 64 6c 65 72 20 24 68 61 73 68 6b  anhandler $hashk
1930: 65 79 5d 5d 0a 0a 09 09 73 65 74 20 3a 3a 76 66  ey]]....set ::vf
1940: 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 63 68 61 6e 64  s::kitdll::chand
1950: 61 74 61 28 5b 6c 69 73 74 20 24 68 61 73 68 6b  ata([list $hashk
1960: 65 79 20 24 63 68 61 6e 5d 29 20 5b 6c 69 73 74  ey $chan]) [list
1970: 20 66 69 6c 65 20 24 72 65 6c 61 74 69 76 65 20   file $relative 
1980: 70 6f 73 20 30 20 6c 65 6e 20 24 6d 65 74 61 64  pos 0 len $metad
1990: 61 74 61 28 73 69 7a 65 29 20 77 61 74 63 68 69  ata(size) watchi
19a0: 6e 67 20 22 22 5d 0a 0a 09 09 72 65 74 75 72 6e  ng ""]....return
19b0: 20 5b 6c 69 73 74 20 24 63 68 61 6e 5d 0a 09 7d   [list $chan]..}
19c0: 0a 0a 09 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d  ...if {[info com
19d0: 6d 61 6e 64 20 72 65 63 68 61 6e 5d 20 3d 3d 20  mand rechan] == 
19e0: 22 22 7d 20 7b 0a 09 09 63 61 74 63 68 20 7b 0a  ""} {...catch {.
19f0: 09 09 09 70 61 63 6b 61 67 65 20 72 65 71 75 69  ...package requi
1a00: 72 65 20 72 65 63 68 61 6e 0a 09 09 7d 0a 09 7d  re rechan...}..}
1a10: 0a 0a 09 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d  ...if {[info com
1a20: 6d 61 6e 64 20 72 65 63 68 61 6e 5d 20 21 3d 20  mand rechan] != 
1a30: 22 22 7d 20 7b 0a 09 09 73 65 74 20 63 68 61 6e  ""} {...set chan
1a40: 20 5b 72 65 63 68 61 6e 20 5b 6c 69 73 74 20 3a   [rechan [list :
1a50: 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 63 68  :vfs::kitdll::ch
1a60: 61 6e 68 61 6e 64 6c 65 72 20 24 68 61 73 68 6b  anhandler $hashk
1a70: 65 79 5d 20 32 5d 0a 0a 09 09 73 65 74 20 3a 3a  ey] 2]....set ::
1a80: 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 63 68 61  vfs::kitdll::cha
1a90: 6e 64 61 74 61 28 5b 6c 69 73 74 20 24 68 61 73  ndata([list $has
1aa0: 68 6b 65 79 20 24 63 68 61 6e 5d 29 20 5b 6c 69  hkey $chan]) [li
1ab0: 73 74 20 66 69 6c 65 20 24 72 65 6c 61 74 69 76  st file $relativ
1ac0: 65 20 70 6f 73 20 30 20 6c 65 6e 20 24 6d 65 74  e pos 0 len $met
1ad0: 61 64 61 74 61 28 73 69 7a 65 29 20 77 61 74 63  adata(size) watc
1ae0: 68 69 6e 67 20 22 22 5d 0a 0a 09 09 72 65 74 75  hing ""]....retu
1af0: 72 6e 20 5b 6c 69 73 74 20 24 63 68 61 6e 5d 0a  rn [list $chan].
1b00: 09 7d 0a 0a 09 72 65 74 75 72 6e 20 2d 63 6f 64  .}...return -cod
1b10: 65 20 65 72 72 6f 72 20 22 4e 6f 20 77 61 79 20  e error "No way 
1b20: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 63 68  to generate a ch
1b30: 61 6e 6e 65 6c 2c 20 6e 65 65 64 20 65 69 74 68  annel, need eith
1b40: 65 72 20 54 63 6c 20 38 2e 35 2b 2c 20 5c 22 72  er Tcl 8.5+, \"r
1b50: 65 63 68 61 6e 5c 22 22 0a 7d 0a 0a 23 23 23 23  echan\"".}..####
1b60: 23 20 4e 6f 2d 4f 70 73 20 73 69 6e 63 65 20 77  # No-Ops since w
1b70: 65 20 61 72 65 20 61 20 72 65 61 64 6f 6e 6c 79  e are a readonly
1b80: 20 66 69 6c 65 73 79 73 74 65 6d 0a 70 72 6f 63   filesystem.proc
1b90: 20 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a   ::vfs::kitdll::
1ba0: 76 66 73 6f 70 5f 63 72 65 61 74 65 64 69 72 65  vfsop_createdire
1bb0: 63 74 6f 72 79 20 7b 61 72 67 73 7d 20 7b 0a 09  ctory {args} {..
1bc0: 76 66 73 3a 3a 66 69 6c 65 73 79 73 74 65 6d 20  vfs::filesystem 
1bd0: 70 6f 73 69 78 65 72 72 6f 72 20 24 3a 3a 76 66  posixerror $::vf
1be0: 73 3a 3a 70 6f 73 69 78 28 45 52 4f 46 53 29 0a  s::posix(EROFS).
1bf0: 7d 0a 70 72 6f 63 20 3a 3a 76 66 73 3a 3a 6b 69  }.proc ::vfs::ki
1c00: 74 64 6c 6c 3a 3a 76 66 73 6f 70 5f 64 65 6c 65  tdll::vfsop_dele
1c10: 74 65 66 69 6c 65 20 7b 61 72 67 73 7d 20 7b 0a  tefile {args} {.
1c20: 09 76 66 73 3a 3a 66 69 6c 65 73 79 73 74 65 6d  .vfs::filesystem
1c30: 20 70 6f 73 69 78 65 72 72 6f 72 20 24 3a 3a 76   posixerror $::v
1c40: 66 73 3a 3a 70 6f 73 69 78 28 45 52 4f 46 53 29  fs::posix(EROFS)
1c50: 0a 7d 0a 70 72 6f 63 20 3a 3a 76 66 73 3a 3a 6b  .}.proc ::vfs::k
1c60: 69 74 64 6c 6c 3a 3a 76 66 73 6f 70 5f 72 65 6d  itdll::vfsop_rem
1c70: 6f 76 65 64 69 72 65 63 74 6f 72 79 20 7b 61 72  ovedirectory {ar
1c80: 67 73 7d 20 7b 0a 09 76 66 73 3a 3a 66 69 6c 65  gs} {..vfs::file
1c90: 73 79 73 74 65 6d 20 70 6f 73 69 78 65 72 72 6f  system posixerro
1ca0: 72 20 24 3a 3a 76 66 73 3a 3a 70 6f 73 69 78 28  r $::vfs::posix(
1cb0: 45 52 4f 46 53 29 0a 7d 0a 70 72 6f 63 20 3a 3a  EROFS).}.proc ::
1cc0: 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 76 66 73  vfs::kitdll::vfs
1cd0: 6f 70 5f 75 74 69 6d 65 20 7b 7d 20 7b 0a 09 76  op_utime {} {..v
1ce0: 66 73 3a 3a 66 69 6c 65 73 79 73 74 65 6d 20 70  fs::filesystem p
1cf0: 6f 73 69 78 65 72 72 6f 72 20 24 3a 3a 76 66 73  osixerror $::vfs
1d00: 3a 3a 70 6f 73 69 78 28 45 52 4f 46 53 29 0a 7d  ::posix(EROFS).}
1d10: 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64  ..package provid
1d20: 65 20 76 66 73 3a 3a 6b 69 74 64 6c 6c 20 31 2e  e vfs::kitdll 1.
1d30: 30 0a                                            0.