Hex Artifact Content

Artifact fdbf11d0e35cc170046760e391221069bffc140e:


0000: 23 64 65 66 69 6e 65 20 48 41 56 45 5f 53 54 44  #define HAVE_STD
0010: 43 20 31 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 74  C 1..#include <t
0020: 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h>.#include <
0030: 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64  stdio.h>.#includ
0040: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 0a 23 69  e <stdlib.h>..#i
0050: 6e 63 6c 75 64 65 20 22 76 66 73 5f 6b 69 74 64  nclude "vfs_kitd
0060: 6c 6c 5f 64 61 74 61 2e 68 22 0a 0a 74 79 70 65  ll_data.h"..type
0070: 64 65 66 20 73 74 72 75 63 74 20 6b 69 74 64 6c  def struct kitdl
0080: 6c 5f 64 61 74 61 20 2a 28 63 6d 64 5f 67 65 74  l_data *(cmd_get
0090: 44 61 74 61 5f 74 29 28 63 6f 6e 73 74 20 63 68  Data_t)(const ch
00a0: 61 72 20 2a 2c 20 75 6e 73 69 67 6e 65 64 20 6c  ar *, unsigned l
00b0: 6f 6e 67 29 3b 0a 74 79 70 65 64 65 66 20 75 6e  ong);.typedef un
00c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 28 63 6d 64  signed long (cmd
00d0: 5f 67 65 74 43 68 69 6c 64 72 65 6e 5f 74 29 28  _getChildren_t)(
00e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 75 6e  const char *, un
00f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 2c 20 75  signed long *, u
0100: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 3b 0a 0a  nsigned long);..
0110: 73 74 61 74 69 63 20 63 6d 64 5f 67 65 74 44 61  static cmd_getDa
0120: 74 61 5f 74 20 2a 67 65 74 43 6d 64 44 61 74 61  ta_t *getCmdData
0130: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 61 73  (const char *has
0140: 68 6b 65 79 29 20 7b 0a 09 2f 2a 20 58 58 58 3a  hkey) {../* XXX:
0150: 20 54 4f 44 4f 3a 20 4c 6f 6f 6b 20 75 70 20 73   TODO: Look up s
0160: 79 6d 62 6f 6c 20 75 73 69 6e 67 20 64 6c 73 79  ymbol using dlsy
0170: 6d 28 29 20 2a 2f 0a 09 69 66 20 28 73 74 72 63  m() */..if (strc
0180: 6d 70 28 68 61 73 68 6b 65 79 2c 20 22 76 66 73  mp(hashkey, "vfs
0190: 5f 6b 69 74 64 6c 6c 5f 64 61 74 61 22 29 20 3d  _kitdll_data") =
01a0: 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  = 0) {...return(
01b0: 6b 69 74 64 6c 6c 5f 76 66 73 5f 6b 69 74 64 6c  kitdll_vfs_kitdl
01c0: 6c 5f 64 61 74 61 5f 67 65 74 44 61 74 61 29 3b  l_data_getData);
01d0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c  ..}...return(NUL
01e0: 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6d  L);.}..static cm
01f0: 64 5f 67 65 74 43 68 69 6c 64 72 65 6e 5f 74 20  d_getChildren_t 
0200: 2a 67 65 74 43 6d 64 43 68 69 6c 64 72 65 6e 28  *getCmdChildren(
0210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 61 73 68  const char *hash
0220: 6b 65 79 29 20 7b 0a 09 2f 2a 20 58 58 58 3a 20  key) {../* XXX: 
0230: 54 4f 44 4f 3a 20 4c 6f 6f 6b 20 75 70 20 73 79  TODO: Look up sy
0240: 6d 62 6f 6c 20 75 73 69 6e 67 20 64 6c 73 79 6d  mbol using dlsym
0250: 28 29 20 2a 2f 0a 09 69 66 20 28 73 74 72 63 6d  () */..if (strcm
0260: 70 28 68 61 73 68 6b 65 79 2c 20 22 76 66 73 5f  p(hashkey, "vfs_
0270: 6b 69 74 64 6c 6c 5f 64 61 74 61 22 29 20 3d 3d  kitdll_data") ==
0280: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6b   0) {...return(k
0290: 69 74 64 6c 6c 5f 76 66 73 5f 6b 69 74 64 6c 6c  itdll_vfs_kitdll
02a0: 5f 64 61 74 61 5f 67 65 74 43 68 69 6c 64 72 65  _data_getChildre
02b0: 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  n);..}...return(
02c0: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  NULL);.}..static
02d0: 20 69 6e 74 20 67 65 74 4d 65 74 61 64 61 74 61   int getMetadata
02e0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 20  (ClientData cd, 
02f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0300: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
0310: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
0320: 76 5b 5d 29 20 7b 0a 09 63 6d 64 5f 67 65 74 44  v[]) {..cmd_getD
0330: 61 74 61 5f 74 20 2a 63 6d 64 5f 67 65 74 44 61  ata_t *cmd_getDa
0340: 74 61 3b 0a 09 63 6d 64 5f 67 65 74 43 68 69 6c  ta;..cmd_getChil
0350: 64 72 65 6e 5f 74 20 2a 63 6d 64 5f 67 65 74 43  dren_t *cmd_getC
0360: 68 69 6c 64 72 65 6e 3b 0a 09 73 74 72 75 63 74  hildren;..struct
0370: 20 6b 69 74 64 6c 6c 5f 64 61 74 61 20 2a 66 69   kitdll_data *fi
0380: 6e 66 6f 20 3d 20 4e 55 4c 4c 3b 0a 09 54 63 6c  nfo = NULL;..Tcl
0390: 5f 4f 62 6a 20 2a 72 65 74 5f 6c 69 73 74 2c 20  _Obj *ret_list, 
03a0: 2a 72 65 74 5f 6c 69 73 74 5f 69 74 65 6d 73 5b  *ret_list_items[
03b0: 32 30 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  20];..unsigned l
03c0: 6f 6e 67 20 6e 75 6d 5f 63 68 69 6c 64 72 65 6e  ong num_children
03d0: 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 68  ;..const char *h
03e0: 61 73 68 6b 65 79 3b 0a 09 63 6f 6e 73 74 20 63  ashkey;..const c
03f0: 68 61 72 20 2a 66 69 6c 65 3b 0a 0a 09 69 66 20  har *file;...if 
0400: 28 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 09  (objc != 3) {...
0410: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
0420: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
0430: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
0440: 22 67 65 74 4d 65 74 61 64 61 74 61 20 68 61 73  "getMetadata has
0450: 68 4b 65 79 20 66 69 6c 65 4e 61 6d 65 5c 22 22  hKey fileName\""
0460: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 72 65 74 75  , NULL);....retu
0470: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
0480: 7d 0a 0a 09 68 61 73 68 6b 65 79 20 3d 20 54 63  }...hashkey = Tc
0490: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
04a0: 5b 31 5d 29 3b 0a 09 66 69 6c 65 20 3d 20 54 63  [1]);..file = Tc
04b0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
04c0: 5b 32 5d 29 3b 0a 0a 09 63 6d 64 5f 67 65 74 44  [2]);...cmd_getD
04d0: 61 74 61 20 3d 20 67 65 74 43 6d 64 44 61 74 61  ata = getCmdData
04e0: 28 68 61 73 68 6b 65 79 29 3b 0a 09 63 6d 64 5f  (hashkey);..cmd_
04f0: 67 65 74 43 68 69 6c 64 72 65 6e 20 3d 20 67 65  getChildren = ge
0500: 74 43 6d 64 43 68 69 6c 64 72 65 6e 28 68 61 73  tCmdChildren(has
0510: 68 6b 65 79 29 3b 0a 0a 09 69 66 20 28 63 6d 64  hkey);...if (cmd
0520: 5f 67 65 74 44 61 74 61 20 3d 3d 20 4e 55 4c 4c  _getData == NULL
0530: 20 7c 7c 20 63 6d 64 5f 67 65 74 43 68 69 6c 64   || cmd_getChild
0540: 72 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ren == NULL) {..
0550: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
0560: 6e 74 65 72 70 2c 20 22 4e 6f 20 73 75 63 68 20  nterp, "No such 
0570: 68 61 73 68 6b 65 79 22 2c 20 4e 55 4c 4c 29 3b  hashkey", NULL);
0580: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
0590: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 66 69 6e 66  RROR);..}...finf
05a0: 6f 20 3d 20 63 6d 64 5f 67 65 74 44 61 74 61 28  o = cmd_getData(
05b0: 66 69 6c 65 2c 20 30 29 3b 0a 0a 09 69 66 20 28  file, 0);...if (
05c0: 66 69 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b  finfo == NULL) {
05d0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
05e0: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 73 75 63  (interp, "No suc
05f0: 68 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74  h file or direct
0600: 6f 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09  ory", NULL);....
0610: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
0620: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 75 65  );..}.../* Value
0630: 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  s that can be de
0640: 72 69 76 65 64 20 66 72 6f 6d 20 22 66 69 6e 66  rived from "finf
0650: 6f 22 20 2a 2f 0a 09 72 65 74 5f 6c 69 73 74 5f  o" */..ret_list_
0660: 69 74 65 6d 73 5b 30 5d 20 3d 20 54 63 6c 5f 4e  items[0] = Tcl_N
0670: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 79 70  ewStringObj("typ
0680: 65 22 2c 20 34 29 3b 0a 09 72 65 74 5f 6c 69 73  e", 4);..ret_lis
0690: 74 5f 69 74 65 6d 73 5b 32 5d 20 3d 20 54 63 6c  t_items[2] = Tcl
06a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
06b0: 6f 64 65 22 2c 20 34 29 3b 0a 09 72 65 74 5f 6c  ode", 4);..ret_l
06c0: 69 73 74 5f 69 74 65 6d 73 5b 34 5d 20 3d 20 54  ist_items[4] = T
06d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
06e0: 22 6e 6c 69 6e 6b 22 2c 20 35 29 3b 0a 0a 09 69  "nlink", 5);...i
06f0: 66 20 28 66 69 6e 66 6f 2d 3e 74 79 70 65 20 3d  f (finfo->type =
0700: 3d 20 4b 49 54 44 4c 4c 5f 46 49 4c 45 54 59 50  = KITDLL_FILETYP
0710: 45 5f 44 49 52 29 20 7b 0a 09 09 6e 75 6d 5f 63  E_DIR) {...num_c
0720: 68 69 6c 64 72 65 6e 20 3d 20 63 6d 64 5f 67 65  hildren = cmd_ge
0730: 74 43 68 69 6c 64 72 65 6e 28 66 69 6c 65 2c 20  tChildren(file, 
0740: 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 09 72 65 74  NULL, 0);....ret
0750: 5f 6c 69 73 74 5f 69 74 65 6d 73 5b 31 5d 20 3d  _list_items[1] =
0760: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
0770: 6a 28 22 64 69 72 65 63 74 6f 72 79 22 2c 20 39  j("directory", 9
0780: 29 3b 0a 09 09 72 65 74 5f 6c 69 73 74 5f 69 74  );...ret_list_it
0790: 65 6d 73 5b 33 5d 20 3d 20 54 63 6c 5f 4e 65 77  ems[3] = Tcl_New
07a0: 4c 6f 6e 67 4f 62 6a 28 30 34 30 35 35 35 29 3b  LongObj(040555);
07b0: 0a 09 09 72 65 74 5f 6c 69 73 74 5f 69 74 65 6d  ...ret_list_item
07c0: 73 5b 35 5d 20 3d 20 54 63 6c 5f 4e 65 77 4c 6f  s[5] = Tcl_NewLo
07d0: 6e 67 4f 62 6a 28 6e 75 6d 5f 63 68 69 6c 64 72  ngObj(num_childr
07e0: 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  en);..} else {..
07f0: 09 72 65 74 5f 6c 69 73 74 5f 69 74 65 6d 73 5b  .ret_list_items[
0800: 31 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  1] = Tcl_NewStri
0810: 6e 67 4f 62 6a 28 22 66 69 6c 65 22 2c 20 34 29  ngObj("file", 4)
0820: 3b 0a 09 09 72 65 74 5f 6c 69 73 74 5f 69 74 65  ;...ret_list_ite
0830: 6d 73 5b 33 5d 20 3d 20 54 63 6c 5f 4e 65 77 4c  ms[3] = Tcl_NewL
0840: 6f 6e 67 4f 62 6a 28 30 34 34 34 29 3b 0a 09 09  ongObj(0444);...
0850: 72 65 74 5f 6c 69 73 74 5f 69 74 65 6d 73 5b 35  ret_list_items[5
0860: 5d 20 3d 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f  ] = Tcl_NewLongO
0870: 62 6a 28 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 5f  bj(1);..}...ret_
0880: 6c 69 73 74 5f 69 74 65 6d 73 5b 36 5d 20 3d 20  list_items[6] = 
0890: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
08a0: 28 22 69 6e 6f 22 2c 20 33 29 3b 0a 09 72 65 74  ("ino", 3);..ret
08b0: 5f 6c 69 73 74 5f 69 74 65 6d 73 5b 37 5d 20 3d  _list_items[7] =
08c0: 20 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28   Tcl_NewLongObj(
08d0: 66 69 6e 66 6f 2d 3e 69 6e 64 65 78 29 3b 0a 0a  finfo->index);..
08e0: 09 72 65 74 5f 6c 69 73 74 5f 69 74 65 6d 73 5b  .ret_list_items[
08f0: 38 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  8] = Tcl_NewStri
0900: 6e 67 4f 62 6a 28 22 73 69 7a 65 22 2c 20 34 29  ngObj("size", 4)
0910: 3b 0a 09 72 65 74 5f 6c 69 73 74 5f 69 74 65 6d  ;..ret_list_item
0920: 73 5b 39 5d 20 3d 20 54 63 6c 5f 4e 65 77 4c 6f  s[9] = Tcl_NewLo
0930: 6e 67 4f 62 6a 28 66 69 6e 66 6f 2d 3e 73 69 7a  ngObj(finfo->siz
0940: 65 29 3b 0a 0a 09 2f 2a 20 44 75 6d 6d 79 20 76  e);.../* Dummy v
0950: 61 6c 75 65 73 20 2a 2f 0a 09 72 65 74 5f 6c 69  alues */..ret_li
0960: 73 74 5f 69 74 65 6d 73 5b 31 30 5d 20 3d 20 54  st_items[10] = T
0970: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
0980: 22 75 69 64 22 2c 20 33 29 3b 0a 09 72 65 74 5f  "uid", 3);..ret_
0990: 6c 69 73 74 5f 69 74 65 6d 73 5b 31 31 5d 20 3d  list_items[11] =
09a0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
09b0: 6a 28 22 30 22 2c 20 31 29 3b 0a 0a 09 72 65 74  j("0", 1);...ret
09c0: 5f 6c 69 73 74 5f 69 74 65 6d 73 5b 31 32 5d 20  _list_items[12] 
09d0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
09e0: 62 6a 28 22 67 69 64 22 2c 20 33 29 3b 0a 09 72  bj("gid", 3);..r
09f0: 65 74 5f 6c 69 73 74 5f 69 74 65 6d 73 5b 31 33  et_list_items[13
0a00: 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ] = Tcl_NewStrin
0a10: 67 4f 62 6a 28 22 30 22 2c 20 31 29 3b 0a 0a 09  gObj("0", 1);...
0a20: 72 65 74 5f 6c 69 73 74 5f 69 74 65 6d 73 5b 31  ret_list_items[1
0a30: 34 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  4] = Tcl_NewStri
0a40: 6e 67 4f 62 6a 28 22 61 74 69 6d 65 22 2c 20 35  ngObj("atime", 5
0a50: 29 3b 0a 09 72 65 74 5f 6c 69 73 74 5f 69 74 65  );..ret_list_ite
0a60: 6d 73 5b 31 35 5d 20 3d 20 54 63 6c 5f 4e 65 77  ms[15] = Tcl_New
0a70: 53 74 72 69 6e 67 4f 62 6a 28 22 30 22 2c 20 31  StringObj("0", 1
0a80: 29 3b 0a 0a 09 72 65 74 5f 6c 69 73 74 5f 69 74  );...ret_list_it
0a90: 65 6d 73 5b 31 36 5d 20 3d 20 54 63 6c 5f 4e 65  ems[16] = Tcl_Ne
0aa0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 74 69 6d  wStringObj("mtim
0ab0: 65 22 2c 20 35 29 3b 0a 09 72 65 74 5f 6c 69 73  e", 5);..ret_lis
0ac0: 74 5f 69 74 65 6d 73 5b 31 37 5d 20 3d 20 54 63  t_items[17] = Tc
0ad0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
0ae0: 30 22 2c 20 31 29 3b 0a 0a 09 72 65 74 5f 6c 69  0", 1);...ret_li
0af0: 73 74 5f 69 74 65 6d 73 5b 31 38 5d 20 3d 20 54  st_items[18] = T
0b00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
0b10: 22 63 74 69 6d 65 22 2c 20 35 29 3b 0a 09 72 65  "ctime", 5);..re
0b20: 74 5f 6c 69 73 74 5f 69 74 65 6d 73 5b 31 39 5d  t_list_items[19]
0b30: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
0b40: 4f 62 6a 28 22 30 22 2c 20 31 29 3b 0a 0a 09 72  Obj("0", 1);...r
0b50: 65 74 5f 6c 69 73 74 20 3d 20 54 63 6c 5f 4e 65  et_list = Tcl_Ne
0b60: 77 4c 69 73 74 4f 62 6a 28 73 69 7a 65 6f 66 28  wListObj(sizeof(
0b70: 72 65 74 5f 6c 69 73 74 5f 69 74 65 6d 73 29 20  ret_list_items) 
0b80: 2f 20 73 69 7a 65 6f 66 28 72 65 74 5f 6c 69 73  / sizeof(ret_lis
0b90: 74 5f 69 74 65 6d 73 5b 30 5d 29 2c 20 72 65 74  t_items[0]), ret
0ba0: 5f 6c 69 73 74 5f 69 74 65 6d 73 29 3b 0a 0a 09  _list_items);...
0bb0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
0bc0: 28 69 6e 74 65 72 70 2c 20 72 65 74 5f 6c 69 73  (interp, ret_lis
0bd0: 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c  t);...return(TCL
0be0: 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  _OK);.}..static 
0bf0: 69 6e 74 20 67 65 74 44 61 74 61 28 43 6c 69 65  int getData(Clie
0c00: 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49  ntData cd, Tcl_I
0c10: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
0c20: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
0c30: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20   *CONST objv[]) 
0c40: 7b 0a 09 69 66 20 28 6f 62 6a 63 20 3c 20 33 20  {..if (objc < 3 
0c50: 7c 7c 20 6f 62 6a 63 20 3e 20 35 29 20 7b 0a 09  || objc > 5) {..
0c60: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
0c70: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
0c80: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
0c90: 5c 22 67 65 74 44 61 74 61 20 68 61 73 68 4b 65  \"getData hashKe
0ca0: 79 20 66 69 6c 65 4e 61 6d 65 20 3f 73 74 61 72  y fileName ?star
0cb0: 74 3f 20 3f 65 6e 64 3f 5c 22 22 2c 20 4e 55 4c  t? ?end?\"", NUL
0cc0: 4c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43  L);....return(TC
0cd0: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 09 72 65  L_ERROR);..}..re
0ce0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
0cf0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .}..static int g
0d00: 65 74 43 68 69 6c 64 72 65 6e 28 43 6c 69 65 6e  etChildren(Clien
0d10: 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e  tData cd, Tcl_In
0d20: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
0d30: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
0d40: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b  *CONST objv[]) {
0d50: 0a 09 63 6d 64 5f 67 65 74 43 68 69 6c 64 72 65  ..cmd_getChildre
0d60: 6e 5f 74 20 2a 63 6d 64 5f 67 65 74 43 68 69 6c  n_t *cmd_getChil
0d70: 64 72 65 6e 3b 0a 09 63 6d 64 5f 67 65 74 44 61  dren;..cmd_getDa
0d80: 74 61 5f 74 20 2a 63 6d 64 5f 67 65 74 44 61 74  ta_t *cmd_getDat
0d90: 61 3b 0a 09 73 74 72 75 63 74 20 6b 69 74 64 6c  a;..struct kitdl
0da0: 6c 5f 64 61 74 61 20 2a 66 69 6e 66 6f 20 3d 20  l_data *finfo = 
0db0: 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20  NULL;..unsigned 
0dc0: 6c 6f 6e 67 20 6e 75 6d 5f 63 68 69 6c 64 72 65  long num_childre
0dd0: 6e 2c 20 69 64 78 3b 0a 09 75 6e 73 69 67 6e 65  n, idx;..unsigne
0de0: 64 20 6c 6f 6e 67 20 2a 63 68 69 6c 64 72 65 6e  d long *children
0df0: 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 68  ;..const char *h
0e00: 61 73 68 6b 65 79 3b 0a 09 63 6f 6e 73 74 20 63  ashkey;..const c
0e10: 68 61 72 20 2a 66 69 6c 65 3b 0a 09 63 6f 6e 73  har *file;..cons
0e20: 74 20 63 68 61 72 20 2a 63 68 69 6c 64 3b 0a 09  t char *child;..
0e30: 54 63 6c 5f 4f 62 6a 20 2a 72 65 74 5f 6c 69 73  Tcl_Obj *ret_lis
0e40: 74 2c 20 2a 72 65 74 5f 63 75 72 72 5f 6f 62 6a  t, *ret_curr_obj
0e50: 3b 0a 0a 09 69 66 20 28 6f 62 6a 63 20 21 3d 20  ;...if (objc != 
0e60: 33 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 52 65  3) {...Tcl_SetRe
0e70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
0e80: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
0e90: 6c 64 20 62 65 20 5c 22 67 65 74 43 68 69 6c 64  ld be \"getChild
0ea0: 72 65 6e 20 68 61 73 68 4b 65 79 20 66 69 6c 65  ren hashKey file
0eb0: 4e 61 6d 65 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a  Name\"", NULL);.
0ec0: 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ...return(TCL_ER
0ed0: 52 4f 52 29 3b 0a 09 7d 0a 0a 09 68 61 73 68 6b  ROR);..}...hashk
0ee0: 65 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ey = Tcl_GetStri
0ef0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 09 66 69  ng(objv[1]);..fi
0f00: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
0f10: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 09 63  ng(objv[2]);...c
0f20: 6d 64 5f 67 65 74 44 61 74 61 20 3d 20 67 65 74  md_getData = get
0f30: 43 6d 64 44 61 74 61 28 68 61 73 68 6b 65 79 29  CmdData(hashkey)
0f40: 3b 0a 09 63 6d 64 5f 67 65 74 43 68 69 6c 64 72  ;..cmd_getChildr
0f50: 65 6e 20 3d 20 67 65 74 43 6d 64 43 68 69 6c 64  en = getCmdChild
0f60: 72 65 6e 28 68 61 73 68 6b 65 79 29 3b 0a 0a 09  ren(hashkey);...
0f70: 69 66 20 28 63 6d 64 5f 67 65 74 44 61 74 61 20  if (cmd_getData 
0f80: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 6d 64 5f 67  == NULL || cmd_g
0f90: 65 74 43 68 69 6c 64 72 65 6e 20 3d 3d 20 4e 55  etChildren == NU
0fa0: 4c 4c 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 52  LL) {...Tcl_SetR
0fb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e  esult(interp, "N
0fc0: 6f 20 73 75 63 68 20 68 61 73 68 6b 65 79 22 2c  o such hashkey",
0fd0: 20 4e 55 4c 4c 29 3b 0a 0a 09 09 72 65 74 75 72   NULL);....retur
0fe0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  n(TCL_ERROR);..}
0ff0: 0a 0a 09 66 69 6e 66 6f 20 3d 20 63 6d 64 5f 67  ...finfo = cmd_g
1000: 65 74 44 61 74 61 28 66 69 6c 65 2c 20 30 29 3b  etData(file, 0);
1010: 0a 0a 09 69 66 20 28 66 69 6e 66 6f 20 3d 3d 20  ...if (finfo == 
1020: 4e 55 4c 4c 29 20 7b 0a 09 09 54 63 6c 5f 53 65  NULL) {...Tcl_Se
1030: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1040: 22 4e 6f 20 73 75 63 68 20 66 69 6c 65 20 6f 72  "No such file or
1050: 20 64 69 72 65 63 74 6f 72 79 22 2c 20 4e 55 4c   directory", NUL
1060: 4c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 54 43  L);....return(TC
1070: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1080: 66 20 28 66 69 6e 66 6f 2d 3e 74 79 70 65 20 21  f (finfo->type !
1090: 3d 20 4b 49 54 44 4c 4c 5f 46 49 4c 45 54 59 50  = KITDLL_FILETYP
10a0: 45 5f 44 49 52 29 20 7b 0a 09 09 54 63 6c 5f 53  E_DIR) {...Tcl_S
10b0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
10c0: 20 22 4e 6f 74 20 61 20 64 69 72 65 63 74 6f 72   "Not a director
10d0: 79 22 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 72 65  y", NULL);....re
10e0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
10f0: 0a 09 7d 0a 0a 09 6e 75 6d 5f 63 68 69 6c 64 72  ..}...num_childr
1100: 65 6e 20 3d 20 63 6d 64 5f 67 65 74 43 68 69 6c  en = cmd_getChil
1110: 64 72 65 6e 28 66 69 6c 65 2c 20 4e 55 4c 4c 2c  dren(file, NULL,
1120: 20 30 29 3b 0a 0a 09 69 66 20 28 6e 75 6d 5f 63   0);...if (num_c
1130: 68 69 6c 64 72 65 6e 20 3d 3d 20 30 29 20 7b 0a  hildren == 0) {.
1140: 09 09 2f 2a 20 52 65 74 75 72 6e 20 69 6d 6d 65  ../* Return imme
1150: 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 72 65  diately if there
1160: 20 61 72 65 20 6e 6f 20 63 68 69 6c 64 72 65 6e   are no children
1170: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73   */...Tcl_SetRes
1180: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 22 2c 20  ult(interp, "", 
1190: 4e 55 4c 4c 29 3b 0a 0a 09 09 72 65 74 75 72 6e  NULL);....return
11a0: 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 72  (TCL_OK);..}...r
11b0: 65 74 5f 6c 69 73 74 20 3d 20 54 63 6c 5f 4e 65  et_list = Tcl_Ne
11c0: 77 4f 62 6a 28 29 3b 0a 09 69 66 20 28 72 65 74  wObj();..if (ret
11d0: 5f 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  _list == NULL) {
11e0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
11f0: 28 69 6e 74 65 72 70 2c 20 22 46 61 69 6c 65 64  (interp, "Failed
1200: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77   to allocate new
1210: 20 6f 62 6a 65 63 74 22 2c 20 4e 55 4c 4c 29 3b   object", NULL);
1220: 0a 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  ....return(TCL_E
1230: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 68 69 6c  RROR);..}...chil
1240: 64 72 65 6e 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  dren = malloc(si
1250: 7a 65 6f 66 28 2a 63 68 69 6c 64 72 65 6e 29 20  zeof(*children) 
1260: 2a 20 6e 75 6d 5f 63 68 69 6c 64 72 65 6e 29 3b  * num_children);
1270: 0a 0a 09 6e 75 6d 5f 63 68 69 6c 64 72 65 6e 20  ...num_children 
1280: 3d 20 63 6d 64 5f 67 65 74 43 68 69 6c 64 72 65  = cmd_getChildre
1290: 6e 28 66 69 6c 65 2c 20 63 68 69 6c 64 72 65 6e  n(file, children
12a0: 2c 20 6e 75 6d 5f 63 68 69 6c 64 72 65 6e 29 3b  , num_children);
12b0: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
12c0: 20 69 64 78 20 3c 20 6e 75 6d 5f 63 68 69 6c 64   idx < num_child
12d0: 72 65 6e 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ren; idx++) {...
12e0: 66 69 6e 66 6f 20 3d 20 63 6d 64 5f 67 65 74 44  finfo = cmd_getD
12f0: 61 74 61 28 4e 55 4c 4c 2c 20 63 68 69 6c 64 72  ata(NULL, childr
1300: 65 6e 5b 69 64 78 5d 29 3b 0a 0a 09 09 69 66 20  en[idx]);....if 
1310: 28 66 69 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 20 7c  (finfo == NULL |
1320: 7c 20 66 69 6e 66 6f 2d 3e 6e 61 6d 65 20 3d 3d  | finfo->name ==
1330: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 6f 6e 74   NULL) {....cont
1340: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 63 68 69  inue;...}....chi
1350: 6c 64 20 3d 20 66 69 6e 66 6f 2d 3e 6e 61 6d 65  ld = finfo->name
1360: 3b 0a 0a 09 09 72 65 74 5f 63 75 72 72 5f 6f 62  ;....ret_curr_ob
1370: 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  j = Tcl_NewStrin
1380: 67 4f 62 6a 28 63 68 69 6c 64 2c 20 73 74 72 6c  gObj(child, strl
1390: 65 6e 28 63 68 69 6c 64 29 29 3b 0a 0a 09 09 54  en(child));....T
13a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
13b0: 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 72 65 74  List(interp, ret
13c0: 5f 6c 69 73 74 2c 20 72 65 74 5f 63 75 72 72 5f  _list, ret_curr_
13d0: 6f 62 6a 29 3b 0a 09 7d 0a 0a 09 66 72 65 65 28  obj);..}...free(
13e0: 63 68 69 6c 64 72 65 6e 29 3b 0a 0a 09 54 63 6c  children);...Tcl
13f0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1400: 74 65 72 70 2c 20 72 65 74 5f 6c 69 73 74 29 3b  terp, ret_list);
1410: 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b  ...return(TCL_OK
1420: 29 3b 0a 7d 0a 0a 69 6e 74 20 56 66 73 5f 6b 69  );.}..int Vfs_ki
1430: 74 64 6c 6c 5f 64 61 74 61 5f 49 6e 69 74 28 54  tdll_data_Init(T
1440: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1450: 70 29 20 7b 20 20 20 0a 09 54 63 6c 5f 43 6f 6d  p) {   ..Tcl_Com
1460: 6d 61 6e 64 20 74 63 6c 43 72 65 61 74 43 6f 6d  mand tclCreatCom
1470: 6d 5f 72 65 74 3b 0a 09 69 6e 74 20 74 63 6c 50  m_ret;..int tclP
1480: 6b 67 50 72 6f 76 5f 72 65 74 3b 0a 0a 09 74 63  kgProv_ret;...tc
1490: 6c 43 72 65 61 74 43 6f 6d 6d 5f 72 65 74 20 3d  lCreatComm_ret =
14a0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
14b0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
14c0: 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a 64 61  :vfs::kitdll::da
14d0: 74 61 3a 3a 67 65 74 4d 65 74 61 64 61 74 61 22  ta::getMetadata"
14e0: 2c 20 67 65 74 4d 65 74 61 64 61 74 61 2c 20 4e  , getMetadata, N
14f0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ULL, NULL);..if 
1500: 28 21 74 63 6c 43 72 65 61 74 43 6f 6d 6d 5f 72  (!tclCreatComm_r
1510: 65 74 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 54  et) {...return(T
1520: 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  CL_ERROR);..}...
1530: 74 63 6c 43 72 65 61 74 43 6f 6d 6d 5f 72 65 74  tclCreatComm_ret
1540: 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a   = Tcl_CreateObj
1550: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1560: 22 3a 3a 76 66 73 3a 3a 6b 69 74 64 6c 6c 3a 3a  "::vfs::kitdll::
1570: 64 61 74 61 3a 3a 67 65 74 44 61 74 61 22 2c 20  data::getData", 
1580: 67 65 74 44 61 74 61 2c 20 4e 55 4c 4c 2c 20 4e  getData, NULL, N
1590: 55 4c 4c 29 3b 0a 09 69 66 20 28 21 74 63 6c 43  ULL);..if (!tclC
15a0: 72 65 61 74 43 6f 6d 6d 5f 72 65 74 29 20 7b 0a  reatComm_ret) {.
15b0: 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
15c0: 4f 52 29 3b 0a 09 7d 0a 0a 09 74 63 6c 43 72 65  OR);..}...tclCre
15d0: 61 74 43 6f 6d 6d 5f 72 65 74 20 3d 20 54 63 6c  atComm_ret = Tcl
15e0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15f0: 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 76 66 73  d(interp, "::vfs
1600: 3a 3a 6b 69 74 64 6c 6c 3a 3a 64 61 74 61 3a 3a  ::kitdll::data::
1610: 67 65 74 43 68 69 6c 64 72 65 6e 22 2c 20 67 65  getChildren", ge
1620: 74 43 68 69 6c 64 72 65 6e 2c 20 4e 55 4c 4c 2c  tChildren, NULL,
1630: 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 21 74 63   NULL);..if (!tc
1640: 6c 43 72 65 61 74 43 6f 6d 6d 5f 72 65 74 29 20  lCreatComm_ret) 
1650: 7b 0a 09 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  {...return(TCL_E
1660: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 74 63 6c 50  RROR);..}...tclP
1670: 6b 67 50 72 6f 76 5f 72 65 74 20 3d 20 54 63 6c  kgProv_ret = Tcl
1680: 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
1690: 72 70 2c 20 22 76 66 73 3a 3a 6b 69 74 64 6c 6c  rp, "vfs::kitdll
16a0: 3a 3a 64 61 74 61 22 2c 20 22 31 2e 30 22 29 3b  ::data", "1.0");
16b0: 0a 0a 09 72 65 74 75 72 6e 28 74 63 6c 50 6b 67  ...return(tclPkg
16c0: 50 72 6f 76 5f 72 65 74 29 3b 0a 7d 0a           Prov_ret);.}.