Hex Artifact Content

Artifact 206ee97d585221534f79a0157ba68d7b9fd9d1cf:


0000: 23 64 65 66 69 6e 65 20 46 55 53 45 5f 55 53 45  #define FUSE_USE
0010: 5f 56 45 52 53 49 4f 4e 20 32 36 0a 0a 23 69 6e  _VERSION 26..#in
0020: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0030: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 74  .h>.#include <pt
0040: 68 72 65 61 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  hread.h>.#includ
0050: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e  e <string.h>.#in
0060: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0070: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
0080: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  b.h>.#include <u
0090: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
00a0: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e 63  e <errno.h>.#inc
00b0: 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23  lude <fcntl.h>.#
00c0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
00d0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 75 73 65  >.#include <fuse
00e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 77  .h>.#include <pw
00f0: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  d.h>.#include <t
0100: 63 6c 2e 68 3e 0a 0a 2f 2a 20 46 72 6f 6d 20 73  cl.h>../* From s
0110: 68 61 31 2e 63 20 2a 2f 0a 69 6e 74 20 53 68 61  ha1.c */.int Sha
0120: 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  1_Init(Tcl_Inter
0130: 70 20 2a 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66  p *interp);..#if
0140: 6e 64 65 66 20 41 50 50 46 53 5f 43 41 43 48 45  ndef APPFS_CACHE
0150: 44 49 52 0a 23 64 65 66 69 6e 65 20 41 50 50 46  DIR.#define APPF
0160: 53 5f 43 41 43 48 45 44 49 52 20 22 2f 76 61 72  S_CACHEDIR "/var
0170: 2f 63 61 63 68 65 2f 61 70 70 66 73 22 0a 23 65  /cache/appfs".#e
0180: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 44 45 42  ndif..#ifdef DEB
0190: 55 47 0a 23 64 65 66 69 6e 65 20 41 50 50 46 53  UG.#define APPFS
01a0: 5f 44 45 42 55 47 28 78 2e 2e 2e 29 20 7b 20 66  _DEBUG(x...) { f
01b0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
01c0: 5b 64 65 62 75 67 5d 20 25 73 3a 25 69 3a 25 73  [debug] %s:%i:%s
01d0: 3a 20 22 2c 20 5f 5f 46 49 4c 45 5f 5f 2c 20 5f  : ", __FILE__, _
01e0: 5f 4c 49 4e 45 5f 5f 2c 20 5f 5f 66 75 6e 63 5f  _LINE__, __func_
01f0: 5f 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65  _); fprintf(stde
0200: 72 72 2c 20 78 29 3b 20 66 70 72 69 6e 74 66 28  rr, x); fprintf(
0210: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 20 7d  stderr, "\n"); }
0220: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 41  .#else.#define A
0230: 50 50 46 53 5f 44 45 42 55 47 28 78 2e 2e 2e 29  PPFS_DEBUG(x...)
0240: 20 2f 2a 2a 2f 0a 23 65 6e 64 69 66 0a 0a 73 74   /**/.#endif..st
0250: 61 74 69 63 20 70 74 68 72 65 61 64 5f 6b 65 79  atic pthread_key
0260: 5f 74 20 69 6e 74 65 72 70 4b 65 79 3b 0a 0a 73  _t interpKey;..s
0270: 74 72 75 63 74 20 61 70 70 66 73 5f 74 68 72 65  truct appfs_thre
0280: 61 64 5f 64 61 74 61 20 7b 0a 09 63 6f 6e 73 74  ad_data {..const
0290: 20 63 68 61 72 20 2a 63 61 63 68 65 64 69 72 3b   char *cachedir;
02a0: 0a 09 74 69 6d 65 5f 74 20 62 6f 6f 74 74 69 6d  ..time_t boottim
02b0: 65 3b 0a 09 73 74 72 75 63 74 20 7b 0a 09 09 69  e;..struct {...i
02c0: 6e 74 20 77 72 69 74 61 62 6c 65 3b 0a 09 7d 20  nt writable;..} 
02d0: 6f 70 74 69 6f 6e 73 3b 0a 7d 3b 0a 0a 73 74 72  options;.};..str
02e0: 75 63 74 20 61 70 70 66 73 5f 74 68 72 65 61 64  uct appfs_thread
02f0: 5f 64 61 74 61 20 67 6c 6f 62 61 6c 54 68 72 65  _data globalThre
0300: 61 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  ad;..typedef enu
0310: 6d 20 7b 0a 09 41 50 50 46 53 5f 50 41 54 48 54  m {..APPFS_PATHT
0320: 59 50 45 5f 49 4e 56 41 4c 49 44 2c 0a 09 41 50  YPE_INVALID,..AP
0330: 50 46 53 5f 50 41 54 48 54 59 50 45 5f 46 49 4c  PFS_PATHTYPE_FIL
0340: 45 2c 0a 09 41 50 50 46 53 5f 50 41 54 48 54 59  E,..APPFS_PATHTY
0350: 50 45 5f 44 49 52 45 43 54 4f 52 59 2c 0a 09 41  PE_DIRECTORY,..A
0360: 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f 53 59  PPFS_PATHTYPE_SY
0370: 4d 4c 49 4e 4b 0a 7d 20 61 70 70 66 73 5f 70 61  MLINK.} appfs_pa
0380: 74 68 74 79 70 65 5f 74 3b 0a 0a 73 74 72 75 63  thtype_t;..struc
0390: 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e  t appfs_children
03a0: 20 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73   {..struct appfs
03b0: 5f 63 68 69 6c 64 72 65 6e 20 2a 5f 6e 65 78 74  _children *_next
03c0: 3b 0a 09 69 6e 74 20 63 6f 75 6e 74 65 72 3b 0a  ;..int counter;.
03d0: 0a 09 63 68 61 72 20 6e 61 6d 65 5b 32 35 36 5d  ..char name[256]
03e0: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 61 70 70  ;.};..struct app
03f0: 66 73 5f 70 61 74 68 69 6e 66 6f 20 7b 0a 09 61  fs_pathinfo {..a
0400: 70 70 66 73 5f 70 61 74 68 74 79 70 65 5f 74 20  ppfs_pathtype_t 
0410: 74 79 70 65 3b 0a 09 74 69 6d 65 5f 74 20 74 69  type;..time_t ti
0420: 6d 65 3b 0a 09 63 68 61 72 20 68 6f 73 74 6e 61  me;..char hostna
0430: 6d 65 5b 32 35 36 5d 3b 0a 09 69 6e 74 20 70 61  me[256];..int pa
0440: 63 6b 61 67 65 64 3b 0a 09 75 6e 73 69 67 6e 65  ckaged;..unsigne
0450: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 6f 64  d long long inod
0460: 65 3b 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74  e;..union {...st
0470: 72 75 63 74 20 7b 0a 09 09 09 69 6e 74 20 63 68  ruct {....int ch
0480: 69 6c 64 63 6f 75 6e 74 3b 0a 09 09 7d 20 64 69  ildcount;...} di
0490: 72 3b 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09  r;...struct {...
04a0: 09 69 6e 74 20 65 78 65 63 75 74 61 62 6c 65 3b  .int executable;
04b0: 0a 09 09 09 6f 66 66 5f 74 20 73 69 7a 65 3b 0a  ....off_t size;.
04c0: 09 09 7d 20 66 69 6c 65 3b 0a 09 09 73 74 72 75  ..} file;...stru
04d0: 63 74 20 7b 0a 09 09 09 6f 66 66 5f 74 20 73 69  ct {....off_t si
04e0: 7a 65 3b 0a 09 09 09 63 68 61 72 20 73 6f 75 72  ze;....char sour
04f0: 63 65 5b 32 35 36 5d 3b 0a 09 09 7d 20 73 79 6d  ce[256];...} sym
0500: 6c 69 6e 6b 3b 0a 09 7d 20 74 79 70 65 69 6e 66  link;..} typeinf
0510: 6f 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 54 63  o;.};..static Tc
0520: 6c 5f 49 6e 74 65 72 70 20 2a 61 70 70 66 73 5f  l_Interp *appfs_
0530: 63 72 65 61 74 65 5f 54 63 6c 49 6e 74 65 72 70  create_TclInterp
0540: 28 76 6f 69 64 29 20 7b 0a 09 54 63 6c 5f 49 6e  (void) {..Tcl_In
0550: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 09 63  terp *interp;..c
0560: 6f 6e 73 74 20 63 68 61 72 20 2a 63 61 63 68 65  onst char *cache
0570: 64 69 72 20 3d 20 67 6c 6f 62 61 6c 54 68 72 65  dir = globalThre
0580: 61 64 2e 63 61 63 68 65 64 69 72 3b 0a 09 69 6e  ad.cachedir;..in
0590: 74 20 74 63 6c 5f 72 65 74 3b 0a 0a 09 41 50 50  t tcl_ret;...APP
05a0: 46 53 5f 44 45 42 55 47 28 22 43 72 65 61 74 69  FS_DEBUG("Creati
05b0: 6e 67 20 6e 65 77 20 54 63 6c 20 69 6e 74 65 72  ng new Tcl inter
05c0: 70 72 65 74 65 72 20 66 6f 72 20 54 49 44 20 3d  preter for TID =
05d0: 20 30 78 25 6c 6c 78 22 2c 20 28 75 6e 73 69 67   0x%llx", (unsig
05e0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 70  ned long long) p
05f0: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 3b 0a  thread_self());.
0600: 0a 09 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43  ..interp = Tcl_C
0610: 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 09  reateInterp();..
0620: 69 66 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55  if (interp == NU
0630: 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  LL) {...fprintf(
0640: 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20  stderr, "Unable 
0650: 74 6f 20 63 72 65 61 74 65 20 54 63 6c 20 49 6e  to create Tcl In
0660: 74 65 72 70 72 65 74 65 72 2e 20 20 41 62 6f 72  terpreter.  Abor
0670: 74 69 6e 67 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65  ting.\n");....re
0680: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
0690: 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 49  .tcl_ret = Tcl_I
06a0: 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66  nit(interp);..if
06b0: 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c   (tcl_ret != TCL
06c0: 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  _OK) {...fprintf
06d0: 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65  (stderr, "Unable
06e0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 54   to initialize T
06f0: 63 6c 2e 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e  cl.  Aborting.\n
0700: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 73 74  ");...fprintf(st
0710: 64 65 72 72 2c 20 22 54 63 6c 20 45 72 72 6f 72  derr, "Tcl Error
0720: 20 69 73 3a 20 25 73 5c 6e 22 2c 20 54 63 6c 5f   is: %s\n", Tcl_
0730: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
0740: 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09 54 63 6c  interp));....Tcl
0750: 5f 44 65 6c 65 74 65 49 6e 74 65 72 70 28 69 6e  _DeleteInterp(in
0760: 74 65 72 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e  terp);....return
0770: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 63 6c  (NULL);..}...tcl
0780: 5f 72 65 74 20 3d 20 54 63 6c 5f 45 76 61 6c 28  _ret = Tcl_Eval(
0790: 69 6e 74 65 72 70 2c 20 22 70 61 63 6b 61 67 65  interp, "package
07a0: 20 69 66 6e 65 65 64 65 64 20 73 68 61 31 20 31   ifneeded sha1 1
07b0: 2e 30 20 5b 6c 69 73 74 20 6c 6f 61 64 20 7b 7d  .0 [list load {}
07c0: 20 73 68 61 31 5d 22 29 3b 0a 09 69 66 20 28 74   sha1]");..if (t
07d0: 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b  cl_ret != TCL_OK
07e0: 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74  ) {...fprintf(st
07f0: 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f  derr, "Unable to
0800: 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20   initialize Tcl 
0810: 53 48 41 31 2e 20 20 41 62 6f 72 74 69 6e 67 2e  SHA1.  Aborting.
0820: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
0830: 73 74 64 65 72 72 2c 20 22 54 63 6c 20 45 72 72  stderr, "Tcl Err
0840: 6f 72 20 69 73 3a 20 25 73 5c 6e 22 2c 20 54 63  or is: %s\n", Tc
0850: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
0860: 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09 54  t(interp));....T
0870: 63 6c 5f 44 65 6c 65 74 65 49 6e 74 65 72 70 28  cl_DeleteInterp(
0880: 69 6e 74 65 72 70 29 3b 0a 0a 09 09 72 65 74 75  interp);....retu
0890: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74  rn(NULL);..}...t
08a0: 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 45 76 61  cl_ret = Tcl_Eva
08b0: 6c 28 69 6e 74 65 72 70 2c 20 22 70 61 63 6b 61  l(interp, "packa
08c0: 67 65 20 69 66 6e 65 65 64 65 64 20 61 70 70 66  ge ifneeded appf
08d0: 73 64 20 31 2e 30 20 5b 6c 69 73 74 20 6c 6f 61  sd 1.0 [list loa
08e0: 64 20 7b 7d 20 61 70 70 66 73 64 5d 22 29 3b 0a  d {} appfsd]");.
08f0: 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20  .if (tcl_ret != 
0900: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69  TCL_OK) {...fpri
0910: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61  ntf(stderr, "Una
0920: 62 6c 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ble to initializ
0930: 65 20 54 63 6c 20 41 70 70 46 53 20 50 61 63 6b  e Tcl AppFS Pack
0940: 61 67 65 2e 20 20 41 62 6f 72 74 69 6e 67 2e 5c  age.  Aborting.\
0950: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 73  n");...fprintf(s
0960: 74 64 65 72 72 2c 20 22 54 63 6c 20 45 72 72 6f  tderr, "Tcl Erro
0970: 72 20 69 73 3a 20 25 73 5c 6e 22 2c 20 54 63 6c  r is: %s\n", Tcl
0980: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
0990: 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09 54 63  (interp));....Tc
09a0: 6c 5f 44 65 6c 65 74 65 49 6e 74 65 72 70 28 69  l_DeleteInterp(i
09b0: 6e 74 65 72 70 29 3b 0a 0a 09 09 72 65 74 75 72  nterp);....retur
09c0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 63  n(NULL);..}...tc
09d0: 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 45 76 61 6c  l_ret = Tcl_Eval
09e0: 28 69 6e 74 65 72 70 2c 20 22 22 0a 23 69 6e 63  (interp, "".#inc
09f0: 6c 75 64 65 20 22 61 70 70 66 73 64 2e 74 63 6c  lude "appfsd.tcl
0a00: 2e 68 22 0a 09 22 22 29 3b 0a 09 69 66 20 28 74  .h".."");..if (t
0a10: 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b  cl_ret != TCL_OK
0a20: 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74  ) {...fprintf(st
0a30: 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f  derr, "Unable to
0a40: 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20   initialize Tcl 
0a50: 41 70 70 46 53 20 73 63 72 69 70 74 2e 20 20 41  AppFS script.  A
0a60: 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 09 09  borting.\n");...
0a70: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
0a80: 22 54 63 6c 20 45 72 72 6f 72 20 69 73 3a 20 25  "Tcl Error is: %
0a90: 73 5c 6e 22 2c 20 54 63 6c 5f 47 65 74 53 74 72  s\n", Tcl_GetStr
0aa0: 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
0ab0: 29 29 3b 0a 0a 09 09 54 63 6c 5f 44 65 6c 65 74  ));....Tcl_Delet
0ac0: 65 49 6e 74 65 72 70 28 69 6e 74 65 72 70 29 3b  eInterp(interp);
0ad0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
0ae0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 54 63 6c 5f 53  ;..}...if (Tcl_S
0af0: 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 3a  etVar(interp, ":
0b00: 3a 61 70 70 66 73 3a 3a 63 61 63 68 65 64 69 72  :appfs::cachedir
0b10: 22 2c 20 63 61 63 68 65 64 69 72 2c 20 54 43 4c  ", cachedir, TCL
0b20: 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 20 3d 3d  _GLOBAL_ONLY) ==
0b30: 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e   NULL) {...fprin
0b40: 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62  tf(stderr, "Unab
0b50: 6c 65 20 74 6f 20 73 65 74 20 63 61 63 68 65 20  le to set cache 
0b60: 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 69 73  directory.  This
0b70: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 66 61   should never fa
0b80: 69 6c 2e 5c 6e 22 29 3b 0a 0a 09 09 54 63 6c 5f  il.\n");....Tcl_
0b90: 44 65 6c 65 74 65 49 6e 74 65 72 70 28 69 6e 74  DeleteInterp(int
0ba0: 65 72 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  erp);....return(
0bb0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f  NULL);..}...tcl_
0bc0: 72 65 74 20 3d 20 54 63 6c 5f 45 76 61 6c 28 69  ret = Tcl_Eval(i
0bd0: 6e 74 65 72 70 2c 20 22 3a 3a 61 70 70 66 73 3a  nterp, "::appfs:
0be0: 3a 69 6e 69 74 22 29 3b 0a 09 69 66 20 28 74 63  :init");..if (tc
0bf0: 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29  l_ret != TCL_OK)
0c00: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64   {...fprintf(std
0c10: 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20  err, "Unable to 
0c20: 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 41  initialize Tcl A
0c30: 70 70 46 53 20 73 63 72 69 70 74 20 28 3a 3a 61  ppFS script (::a
0c40: 70 70 66 73 3a 3a 69 6e 69 74 29 2e 20 20 41 62  ppfs::init).  Ab
0c50: 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 09 09 66  orting.\n");...f
0c60: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
0c70: 54 63 6c 20 45 72 72 6f 72 20 69 73 3a 20 25 73  Tcl Error is: %s
0c80: 5c 6e 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  \n", Tcl_GetStri
0c90: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
0ca0: 29 3b 0a 0a 09 09 54 63 6c 5f 44 65 6c 65 74 65  );....Tcl_Delete
0cb0: 49 6e 74 65 72 70 28 69 6e 74 65 72 70 29 3b 0a  Interp(interp);.
0cc0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
0cd0: 0a 09 7d 0a 0a 09 54 63 6c 5f 48 69 64 65 43 6f  ..}...Tcl_HideCo
0ce0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 67  mmand(interp, "g
0cf0: 6c 6f 62 22 2c 20 22 67 6c 6f 62 22 29 3b 0a 09  lob", "glob");..
0d00: 54 63 6c 5f 48 69 64 65 43 6f 6d 6d 61 6e 64 28  Tcl_HideCommand(
0d10: 69 6e 74 65 72 70 2c 20 22 65 78 65 63 22 2c 20  interp, "exec", 
0d20: 22 65 78 65 63 22 29 3b 0a 09 54 63 6c 5f 48 69  "exec");..Tcl_Hi
0d30: 64 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  deCommand(interp
0d40: 2c 20 22 70 69 64 22 2c 20 22 70 69 64 22 29 3b  , "pid", "pid");
0d50: 0a 09 54 63 6c 5f 48 69 64 65 43 6f 6d 6d 61 6e  ..Tcl_HideComman
0d60: 64 28 69 6e 74 65 72 70 2c 20 22 61 75 74 6f 5f  d(interp, "auto_
0d70: 6c 6f 61 64 5f 69 6e 64 65 78 22 2c 20 22 61 75  load_index", "au
0d80: 74 6f 5f 6c 6f 61 64 5f 69 6e 64 65 78 22 29 3b  to_load_index");
0d90: 0a 09 54 63 6c 5f 48 69 64 65 43 6f 6d 6d 61 6e  ..Tcl_HideComman
0da0: 64 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f  d(interp, "unkno
0db0: 77 6e 22 2c 20 22 75 6e 6b 6e 6f 77 6e 22 29 3b  wn", "unknown");
0dc0: 0a 0a 09 72 65 74 75 72 6e 28 69 6e 74 65 72 70  ...return(interp
0dd0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
0de0: 20 61 70 70 66 73 5f 54 63 6c 5f 45 76 61 6c 28   appfs_Tcl_Eval(
0df0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0e00: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 63 6f  rp, int objc, co
0e10: 6e 73 74 20 63 68 61 72 20 2a 63 6d 64 2c 20 2e  nst char *cmd, .
0e20: 2e 2e 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  ..) {..Tcl_Obj *
0e30: 2a 6f 62 6a 76 3b 0a 09 63 6f 6e 73 74 20 63 68  *objv;..const ch
0e40: 61 72 20 2a 61 72 67 3b 0a 09 76 61 5f 6c 69 73  ar *arg;..va_lis
0e50: 74 20 61 72 67 70 3b 0a 09 69 6e 74 20 72 65 74  t argp;..int ret
0e60: 76 61 6c 3b 0a 09 69 6e 74 20 69 3b 0a 0a 09 69  val;..int i;...i
0e70: 66 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c  f (interp == NUL
0e80: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 54 43  L) {...return(TC
0e90: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6f  L_ERROR);..}...o
0ea0: 62 6a 76 20 3d 20 28 76 6f 69 64 20 2a 29 20 63  bjv = (void *) c
0eb0: 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6f  kalloc(sizeof(*o
0ec0: 62 6a 76 29 20 2a 20 6f 62 6a 63 29 3b 0a 09 6f  bjv) * objc);..o
0ed0: 62 6a 76 5b 30 5d 20 3d 20 54 63 6c 5f 4e 65 77  bjv[0] = Tcl_New
0ee0: 53 74 72 69 6e 67 4f 62 6a 28 63 6d 64 2c 20 2d  StringObj(cmd, -
0ef0: 31 29 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66  1);..Tcl_IncrRef
0f00: 43 6f 75 6e 74 28 6f 62 6a 76 5b 30 5d 29 3b 0a  Count(objv[0]);.
0f10: 0a 09 76 61 5f 73 74 61 72 74 28 61 72 67 70 2c  ..va_start(argp,
0f20: 20 63 6d 64 29 3b 0a 09 66 6f 72 20 28 69 20 3d   cmd);..for (i =
0f30: 20 31 3b 20 69 20 3c 20 6f 62 6a 63 3b 20 69 2b   1; i < objc; i+
0f40: 2b 29 20 7b 0a 09 09 61 72 67 20 3d 20 76 61 5f  +) {...arg = va_
0f50: 61 72 67 28 61 72 67 70 2c 20 63 6f 6e 73 74 20  arg(argp, const 
0f60: 63 68 61 72 20 2a 29 3b 0a 09 09 6f 62 6a 76 5b  char *);...objv[
0f70: 69 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  i] = Tcl_NewStri
0f80: 6e 67 4f 62 6a 28 61 72 67 2c 20 2d 31 29 3b 0a  ngObj(arg, -1);.
0f90: 09 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75  ..Tcl_IncrRefCou
0fa0: 6e 74 28 6f 62 6a 76 5b 69 5d 29 3b 0a 09 7d 0a  nt(objv[i]);..}.
0fb0: 09 76 61 5f 65 6e 64 28 61 72 67 70 29 3b 0a 0a  .va_end(argp);..
0fc0: 09 72 65 74 76 61 6c 20 3d 20 54 63 6c 5f 45 76  .retval = Tcl_Ev
0fd0: 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 6f  alObjv(interp, o
0fe0: 62 6a 63 2c 20 6f 62 6a 76 2c 20 30 29 3b 0a 0a  bjc, objv, 0);..
0ff0: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
1000: 20 6f 62 6a 63 3b 20 69 2b 2b 29 20 7b 0a 09 09   objc; i++) {...
1010: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
1020: 28 6f 62 6a 76 5b 69 5d 29 3b 0a 09 7d 0a 0a 09  (objv[i]);..}...
1030: 63 6b 66 72 65 65 28 28 76 6f 69 64 20 2a 29 20  ckfree((void *) 
1040: 6f 62 6a 76 29 3b 0a 0a 09 69 66 20 28 72 65 74  objv);...if (ret
1050: 76 61 6c 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  val != TCL_OK) {
1060: 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22  ...APPFS_DEBUG("
1070: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 61 69 6c  Tcl command fail
1080: 65 64 2c 20 3a 3a 65 72 72 6f 72 49 6e 66 6f 20  ed, ::errorInfo 
1090: 63 6f 6e 74 61 69 6e 73 3a 20 25 73 5c 6e 22 2c  contains: %s\n",
10a0: 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65   Tcl_GetVar(inte
10b0: 72 70 2c 20 22 3a 3a 65 72 72 6f 72 49 6e 66 6f  rp, "::errorInfo
10c0: 22 2c 20 30 29 29 3b 0a 09 7d 0a 0a 09 72 65 74  ", 0));..}...ret
10d0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
10e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 66  static void appf
10f0: 73 5f 75 70 64 61 74 65 5f 69 6e 64 65 78 28 63  s_update_index(c
1100: 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f 73 74 6e  onst char *hostn
1110: 61 6d 65 29 20 7b 0a 09 54 63 6c 5f 49 6e 74 65  ame) {..Tcl_Inte
1120: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 09 69 6e 74  rp *interp;..int
1130: 20 74 63 6c 5f 72 65 74 3b 0a 0a 09 41 50 50 46   tcl_ret;...APPF
1140: 53 5f 44 45 42 55 47 28 22 45 6e 74 65 72 3a 20  S_DEBUG("Enter: 
1150: 68 6f 73 74 6e 61 6d 65 20 3d 20 25 73 22 2c 20  hostname = %s", 
1160: 68 6f 73 74 6e 61 6d 65 29 3b 0a 0a 09 69 6e 74  hostname);...int
1170: 65 72 70 20 3d 20 70 74 68 72 65 61 64 5f 67 65  erp = pthread_ge
1180: 74 73 70 65 63 69 66 69 63 28 69 6e 74 65 72 70  tspecific(interp
1190: 4b 65 79 29 3b 0a 09 69 66 20 28 69 6e 74 65 72  Key);..if (inter
11a0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  p == NULL) {...i
11b0: 6e 74 65 72 70 20 3d 20 61 70 70 66 73 5f 63 72  nterp = appfs_cr
11c0: 65 61 74 65 5f 54 63 6c 49 6e 74 65 72 70 28 29  eate_TclInterp()
11d0: 3b 0a 0a 09 09 69 66 20 28 69 6e 74 65 72 70 20  ;....if (interp 
11e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 72 65  == NULL) {....re
11f0: 74 75 72 6e 3b 0a 09 09 7d 0a 0a 09 09 70 74 68  turn;...}....pth
1200: 72 65 61 64 5f 73 65 74 73 70 65 63 69 66 69 63  read_setspecific
1210: 28 69 6e 74 65 72 70 4b 65 79 2c 20 69 6e 74 65  (interpKey, inte
1220: 72 70 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65  rp);..}...tcl_re
1230: 74 20 3d 20 61 70 70 66 73 5f 54 63 6c 5f 45 76  t = appfs_Tcl_Ev
1240: 61 6c 28 69 6e 74 65 72 70 2c 20 32 2c 20 22 3a  al(interp, 2, ":
1250: 3a 61 70 70 66 73 3a 3a 67 65 74 69 6e 64 65 78  :appfs::getindex
1260: 22 2c 20 68 6f 73 74 6e 61 6d 65 29 3b 0a 09 69  ", hostname);..i
1270: 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43  f (tcl_ret != TC
1280: 4c 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46 53 5f  L_OK) {...APPFS_
1290: 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20 3a  DEBUG("Call to :
12a0: 3a 61 70 70 66 73 3a 3a 67 65 74 69 6e 64 65 78  :appfs::getindex
12b0: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 54 63   failed: %s", Tc
12c0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
12d0: 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09 72  t(interp));....r
12e0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 72 65 74 75  eturn;..}...retu
12f0: 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f  rn;.}..static co
1300: 6e 73 74 20 63 68 61 72 20 2a 61 70 70 66 73 5f  nst char *appfs_
1310: 67 65 74 66 69 6c 65 28 63 6f 6e 73 74 20 63 68  getfile(const ch
1320: 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 63 6f  ar *hostname, co
1330: 6e 73 74 20 63 68 61 72 20 2a 73 68 61 31 29 20  nst char *sha1) 
1340: 7b 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  {..Tcl_Interp *i
1350: 6e 74 65 72 70 3b 0a 09 63 68 61 72 20 2a 72 65  nterp;..char *re
1360: 74 76 61 6c 3b 0a 09 69 6e 74 20 74 63 6c 5f 72  tval;..int tcl_r
1370: 65 74 3b 0a 0a 09 69 6e 74 65 72 70 20 3d 20 70  et;...interp = p
1380: 74 68 72 65 61 64 5f 67 65 74 73 70 65 63 69 66  thread_getspecif
1390: 69 63 28 69 6e 74 65 72 70 4b 65 79 29 3b 0a 09  ic(interpKey);..
13a0: 69 66 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55  if (interp == NU
13b0: 4c 4c 29 20 7b 0a 09 09 69 6e 74 65 72 70 20 3d  LL) {...interp =
13c0: 20 61 70 70 66 73 5f 63 72 65 61 74 65 5f 54 63   appfs_create_Tc
13d0: 6c 49 6e 74 65 72 70 28 29 3b 0a 0a 09 09 69 66  lInterp();....if
13e0: 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c   (interp == NULL
13f0: 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 4e 55  ) {....return(NU
1400: 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72  LL);...}....pthr
1410: 65 61 64 5f 73 65 74 73 70 65 63 69 66 69 63 28  ead_setspecific(
1420: 69 6e 74 65 72 70 4b 65 79 2c 20 69 6e 74 65 72  interpKey, inter
1430: 70 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74  p);..}...tcl_ret
1440: 20 3d 20 61 70 70 66 73 5f 54 63 6c 5f 45 76 61   = appfs_Tcl_Eva
1450: 6c 28 69 6e 74 65 72 70 2c 20 33 2c 20 22 3a 3a  l(interp, 3, "::
1460: 61 70 70 66 73 3a 3a 64 6f 77 6e 6c 6f 61 64 22  appfs::download"
1470: 2c 20 68 6f 73 74 6e 61 6d 65 2c 20 73 68 61 31  , hostname, sha1
1480: 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20  );..if (tcl_ret 
1490: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 41  != TCL_OK) {...A
14a0: 50 50 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c  PPFS_DEBUG("Call
14b0: 20 74 6f 20 3a 3a 61 70 70 66 73 3a 3a 64 6f 77   to ::appfs::dow
14c0: 6e 6c 6f 61 64 20 66 61 69 6c 65 64 3a 20 25 73  nload failed: %s
14d0: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
14e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b  Result(interp));
14f0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
1500: 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  ;..}...retval = 
1510: 73 74 72 64 75 70 28 54 63 6c 5f 47 65 74 53 74  strdup(Tcl_GetSt
1520: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
1530: 70 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  p));...return(re
1540: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
1550: 20 76 6f 69 64 20 61 70 70 66 73 5f 75 70 64 61   void appfs_upda
1560: 74 65 5f 6d 61 6e 69 66 65 73 74 28 63 6f 6e 73  te_manifest(cons
1570: 74 20 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65  t char *hostname
1580: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 68  , const char *sh
1590: 61 31 29 20 7b 0a 09 54 63 6c 5f 49 6e 74 65 72  a1) {..Tcl_Inter
15a0: 70 20 2a 69 6e 74 65 72 70 3b 0a 09 69 6e 74 20  p *interp;..int 
15b0: 74 63 6c 5f 72 65 74 3b 0a 0a 09 69 6e 74 65 72  tcl_ret;...inter
15c0: 70 20 3d 20 70 74 68 72 65 61 64 5f 67 65 74 73  p = pthread_gets
15d0: 70 65 63 69 66 69 63 28 69 6e 74 65 72 70 4b 65  pecific(interpKe
15e0: 79 29 3b 0a 09 69 66 20 28 69 6e 74 65 72 70 20  y);..if (interp 
15f0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 74  == NULL) {...int
1600: 65 72 70 20 3d 20 61 70 70 66 73 5f 63 72 65 61  erp = appfs_crea
1610: 74 65 5f 54 63 6c 49 6e 74 65 72 70 28 29 3b 0a  te_TclInterp();.
1620: 0a 09 09 69 66 20 28 69 6e 74 65 72 70 20 3d 3d  ...if (interp ==
1630: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 72 65 74 75   NULL) {....retu
1640: 72 6e 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65  rn;...}....pthre
1650: 61 64 5f 73 65 74 73 70 65 63 69 66 69 63 28 69  ad_setspecific(i
1660: 6e 74 65 72 70 4b 65 79 2c 20 69 6e 74 65 72 70  nterpKey, interp
1670: 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20  );..}...tcl_ret 
1680: 3d 20 61 70 70 66 73 5f 54 63 6c 5f 45 76 61 6c  = appfs_Tcl_Eval
1690: 28 69 6e 74 65 72 70 2c 20 33 2c 20 22 3a 3a 61  (interp, 3, "::a
16a0: 70 70 66 73 3a 3a 67 65 74 70 6b 67 6d 61 6e 69  ppfs::getpkgmani
16b0: 66 65 73 74 22 2c 20 68 6f 73 74 6e 61 6d 65 2c  fest", hostname,
16c0: 20 73 68 61 31 29 3b 0a 09 69 66 20 28 74 63 6c   sha1);..if (tcl
16d0: 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  _ret != TCL_OK) 
16e0: 7b 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47 28  {...APPFS_DEBUG(
16f0: 22 43 61 6c 6c 20 74 6f 20 3a 3a 61 70 70 66 73  "Call to ::appfs
1700: 3a 3a 67 65 74 70 6b 67 6d 61 6e 69 66 65 73 74  ::getpkgmanifest
1710: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 54 63   failed: %s", Tc
1720: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
1730: 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09 72  t(interp));....r
1740: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 72 65 74 75  eturn;..}...retu
1750: 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 69  rn;.}..static ui
1760: 64 5f 74 20 61 70 70 66 73 5f 67 65 74 5f 66 73  d_t appfs_get_fs
1770: 75 69 64 28 76 6f 69 64 29 20 7b 0a 09 73 74 72  uid(void) {..str
1780: 75 63 74 20 66 75 73 65 5f 63 6f 6e 74 65 78 74  uct fuse_context
1790: 20 2a 63 74 78 3b 0a 0a 09 63 74 78 20 3d 20 66   *ctx;...ctx = f
17a0: 75 73 65 5f 67 65 74 5f 63 6f 6e 74 65 78 74 28  use_get_context(
17b0: 29 3b 0a 09 69 66 20 28 63 74 78 20 3d 3d 20 4e  );..if (ctx == N
17c0: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
17d0: 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  1);..}...return(
17e0: 63 74 78 2d 3e 75 69 64 29 3b 0a 7d 0a 0a 73 74  ctx->uid);.}..st
17f0: 61 74 69 63 20 63 68 61 72 20 2a 61 70 70 66 73  atic char *appfs
1800: 5f 67 65 74 5f 68 6f 6d 65 64 69 72 28 75 69 64  _get_homedir(uid
1810: 5f 74 20 66 73 75 69 64 29 20 7b 0a 09 73 74 72  _t fsuid) {..str
1820: 75 63 74 20 70 61 73 73 77 64 20 65 6e 74 72 79  uct passwd entry
1830: 2c 20 2a 72 65 73 75 6c 74 3b 0a 09 73 74 72 75  , *result;..stru
1840: 63 74 20 73 74 61 74 20 73 74 62 75 66 3b 0a 09  ct stat stbuf;..
1850: 63 68 61 72 20 62 75 66 5b 31 30 32 34 5d 2c 20  char buf[1024], 
1860: 2a 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 67 70  *retval;..int gp
1870: 75 5f 72 65 74 2c 20 73 74 61 74 5f 72 65 74 3b  u_ret, stat_ret;
1880: 0a 0a 09 67 70 75 5f 72 65 74 20 3d 20 67 65 74  ...gpu_ret = get
1890: 70 77 75 69 64 5f 72 28 66 73 75 69 64 2c 20 26  pwuid_r(fsuid, &
18a0: 65 6e 74 72 79 2c 20 62 75 66 2c 20 73 69 7a 65  entry, buf, size
18b0: 6f 66 28 62 75 66 29 2c 20 26 72 65 73 75 6c 74  of(buf), &result
18c0: 29 3b 0a 09 69 66 20 28 67 70 75 5f 72 65 74 20  );..if (gpu_ret 
18d0: 21 3d 20 30 29 20 7b 0a 09 09 41 50 50 46 53 5f  != 0) {...APPFS_
18e0: 44 45 42 55 47 28 22 67 65 74 70 77 75 69 64 5f  DEBUG("getpwuid_
18f0: 72 28 25 6c 6c 75 2c 20 2e 2e 2e 29 20 72 65 74  r(%llu, ...) ret
1900: 75 72 6e 65 64 20 69 6e 20 66 61 69 6c 75 72 65  urned in failure
1910: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1920: 67 20 6c 6f 6e 67 29 20 66 73 75 69 64 29 3b 0a  g long) fsuid);.
1930: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
1940: 0a 09 7d 0a 0a 09 69 66 20 28 72 65 73 75 6c 74  ..}...if (result
1950: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 41 50   == NULL) {...AP
1960: 50 46 53 5f 44 45 42 55 47 28 22 67 65 74 70 77  PFS_DEBUG("getpw
1970: 75 69 64 5f 72 28 25 6c 6c 75 2c 20 2e 2e 2e 29  uid_r(%llu, ...)
1980: 20 72 65 74 75 72 6e 65 64 20 4e 55 4c 4c 20 72   returned NULL r
1990: 65 73 75 6c 74 22 2c 20 28 75 6e 73 69 67 6e 65  esult", (unsigne
19a0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 73 75  d long long) fsu
19b0: 69 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  id);....return(N
19c0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72  ULL);..}...if (r
19d0: 65 73 75 6c 74 2d 3e 70 77 5f 64 69 72 20 3d 3d  esult->pw_dir ==
19e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 41 50 50 46 53   NULL) {...APPFS
19f0: 5f 44 45 42 55 47 28 22 67 65 74 70 77 75 69 64  _DEBUG("getpwuid
1a00: 5f 72 28 25 6c 6c 75 2c 20 2e 2e 2e 29 20 72 65  _r(%llu, ...) re
1a10: 74 75 72 6e 65 64 20 4e 55 4c 4c 20 68 6f 6d 65  turned NULL home
1a20: 20 64 69 72 65 63 74 6f 72 79 22 2c 20 28 75 6e   directory", (un
1a30: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
1a40: 29 20 66 73 75 69 64 29 3b 0a 0a 09 09 72 65 74  ) fsuid);....ret
1a50: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
1a60: 73 74 61 74 5f 72 65 74 20 3d 20 73 74 61 74 28  stat_ret = stat(
1a70: 72 65 73 75 6c 74 2d 3e 70 77 5f 64 69 72 2c 20  result->pw_dir, 
1a80: 26 73 74 62 75 66 29 3b 0a 09 69 66 20 28 73 74  &stbuf);..if (st
1a90: 61 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  at_ret != 0) {..
1aa0: 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 73 74  .APPFS_DEBUG("st
1ab0: 61 74 28 25 73 29 20 72 65 74 75 72 6e 65 64 20  at(%s) returned 
1ac0: 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 72 65 73  in failure", res
1ad0: 75 6c 74 2d 3e 70 77 5f 64 69 72 29 3b 0a 0a 09  ult->pw_dir);...
1ae0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
1af0: 7d 0a 0a 09 69 66 20 28 73 74 62 75 66 2e 73 74  }...if (stbuf.st
1b00: 5f 75 69 64 20 21 3d 20 66 73 75 69 64 29 20 7b  _uid != fsuid) {
1b10: 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22  ...APPFS_DEBUG("
1b20: 55 49 44 20 6d 69 73 2d 6d 61 74 63 68 20 6f 6e  UID mis-match on
1b30: 20 75 73 65 72 20 25 6c 6c 75 27 73 20 68 6f 6d   user %llu's hom
1b40: 65 20 64 69 72 65 63 74 6f 72 79 20 28 25 73 29  e directory (%s)
1b50: 2e 20 20 49 74 27 73 20 6f 77 6e 65 64 20 62 79  .  It's owned by
1b60: 20 25 6c 6c 75 2e 22 2c 0a 09 09 20 20 20 20 28   %llu.",...    (
1b70: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
1b80: 6e 67 29 20 66 73 75 69 64 2c 0a 09 09 20 20 20  ng) fsuid,...   
1b90: 20 72 65 73 75 6c 74 2d 3e 70 77 5f 64 69 72 2c   result->pw_dir,
1ba0: 0a 09 09 20 20 20 20 28 75 6e 73 69 67 6e 65 64  ...    (unsigned
1bb0: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 73 74 62 75   long long) stbu
1bc0: 66 2e 73 74 5f 75 69 64 0a 09 09 29 3b 0a 0a 09  f.st_uid...);...
1bd0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
1be0: 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72  }...retval = str
1bf0: 64 75 70 28 72 65 73 75 6c 74 2d 3e 70 77 5f 64  dup(result->pw_d
1c00: 69 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  ir);...return(re
1c10: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
1c20: 20 69 6e 74 20 74 63 6c 5f 61 70 70 66 73 5f 67   int tcl_appfs_g
1c30: 65 74 5f 68 6f 6d 65 64 69 72 28 43 6c 69 65 6e  et_homedir(Clien
1c40: 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f 49 6e  tData cd, Tcl_In
1c50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
1c60: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
1c70: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 20 7b  *CONST objv[]) {
1c80: 0a 09 63 68 61 72 20 2a 68 6f 6d 65 64 69 72 3b  ..char *homedir;
1c90: 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 6f 62  ..        if (ob
1ca0: 6a 63 20 21 3d 20 31 29 20 7b 0a 20 20 20 20 20  jc != 1) {.     
1cb0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57             Tcl_W
1cc0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1cd0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 4e 55 4c  rp, 1, objv, NUL
1ce0: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  L);.            
1cf0: 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45      return(TCL_E
1d00: 52 52 4f 52 29 3b 0a 20 20 20 20 20 20 20 20 7d  RROR);.        }
1d10: 0a 0a 09 68 6f 6d 65 64 69 72 20 3d 20 61 70 70  ...homedir = app
1d20: 66 73 5f 67 65 74 5f 68 6f 6d 65 64 69 72 28 61  fs_get_homedir(a
1d30: 70 70 66 73 5f 67 65 74 5f 66 73 75 69 64 28 29  ppfs_get_fsuid()
1d40: 29 3b 0a 0a 09 69 66 20 28 68 6f 6d 65 64 69 72  );...if (homedir
1d50: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
1d60: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
1d70: 0a 09 7d 0a 0a 20 20 20 20 20 20 20 20 54 63 6c  ..}..        Tcl
1d80: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1d90: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
1da0: 69 6e 67 4f 62 6a 28 68 6f 6d 65 64 69 72 2c 20  ingObj(homedir, 
1db0: 2d 31 29 29 3b 0a 0a 09 66 72 65 65 28 68 6f 6d  -1));...free(hom
1dc0: 65 64 69 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  edir);..        
1dd0: 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
1de0: 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  }..static struct
1df0: 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20   appfs_children 
1e00: 2a 61 70 70 66 73 5f 67 65 74 63 68 69 6c 64 72  *appfs_getchildr
1e10: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 68  en(const char *h
1e20: 6f 73 74 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ostname, const c
1e30: 68 61 72 20 2a 70 61 63 6b 61 67 65 5f 68 61 73  har *package_has
1e40: 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  h, const char *p
1e50: 61 74 68 2c 20 69 6e 74 20 2a 63 68 69 6c 64 72  ath, int *childr
1e60: 65 6e 5f 63 6f 75 6e 74 5f 70 29 20 7b 0a 7d 0a  en_count_p) {.}.
1e70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 70  .static char *ap
1e80: 70 66 73 5f 6c 6f 6f 6b 75 70 5f 70 61 63 6b 61  pfs_lookup_packa
1e90: 67 65 5f 68 61 73 68 28 63 6f 6e 73 74 20 63 68  ge_hash(const ch
1ea0: 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 63 6f  ar *hostname, co
1eb0: 6e 73 74 20 63 68 61 72 20 2a 70 61 63 6b 61 67  nst char *packag
1ec0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f  e, const char *o
1ed0: 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  s, const char *c
1ee0: 70 75 41 72 63 68 2c 20 63 6f 6e 73 74 20 63 68  puArch, const ch
1ef0: 61 72 20 2a 76 65 72 73 69 6f 6e 29 20 7b 0a 7d  ar *version) {.}
1f00: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70  ..static int app
1f10: 66 73 5f 67 65 74 66 69 6c 65 69 6e 66 6f 28 63  fs_getfileinfo(c
1f20: 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f 73 74 6e  onst char *hostn
1f30: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1f40: 2a 70 61 63 6b 61 67 65 5f 68 61 73 68 2c 20 63  *package_hash, c
1f50: 6f 6e 73 74 20 63 68 61 72 20 2a 5f 70 61 74 68  onst char *_path
1f60: 2c 20 73 74 72 75 63 74 20 61 70 70 66 73 5f 70  , struct appfs_p
1f70: 61 74 68 69 6e 66 6f 20 2a 70 61 74 68 69 6e 66  athinfo *pathinf
1f80: 6f 29 20 7b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  o) {.}../* Gener
1f90: 61 74 65 20 61 6e 20 69 6e 6f 64 65 20 66 6f 72  ate an inode for
1fa0: 20 61 20 67 69 76 65 6e 20 70 61 74 68 20 2a 2f   a given path */
1fb0: 0a 73 74 61 74 69 63 20 6c 6f 6e 67 20 6c 6f 6e  .static long lon
1fc0: 67 20 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68  g appfs_get_path
1fd0: 5f 69 6e 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  _inode(const cha
1fe0: 72 20 2a 70 61 74 68 29 20 7b 0a 09 6c 6f 6e 67  r *path) {..long
1ff0: 20 6c 6f 6e 67 20 72 65 74 76 61 6c 3b 0a 09 63   long retval;..c
2000: 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0a 0a 09  onst char *p;...
2010: 72 65 74 76 61 6c 20 3d 20 31 30 3b 0a 0a 09 66  retval = 10;...f
2020: 6f 72 20 28 70 20 3d 20 70 61 74 68 3b 20 2a 70  or (p = path; *p
2030: 3b 20 70 2b 2b 29 20 7b 0a 09 09 72 65 74 76 61  ; p++) {...retva
2040: 6c 20 25 3d 20 34 32 39 30 39 36 30 32 39 30 55  l %= 4290960290U
2050: 4c 4c 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20  LL;...retval += 
2060: 2a 70 3b 0a 09 09 72 65 74 76 61 6c 20 3c 3c 3d  *p;...retval <<=
2070: 20 37 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20   7;..}...retval 
2080: 2b 3d 20 31 30 3b 0a 09 72 65 74 76 61 6c 20 25  += 10;..retval %
2090: 3d 20 34 32 39 34 39 36 37 32 39 36 55 4c 4c 3b  = 4294967296ULL;
20a0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
20b0: 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 74 20 69 6e 66  );.}../* Get inf
20c0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
20d0: 20 70 61 74 68 2c 20 61 6e 64 20 6f 70 74 69 6f   path, and optio
20e0: 6e 61 6c 6c 79 20 6c 69 73 74 20 63 68 69 6c 64  nally list child
20f0: 72 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ren */.static in
2100: 74 20 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68  t appfs_get_path
2110: 5f 69 6e 66 6f 28 63 6f 6e 73 74 20 63 68 61 72  _info(const char
2120: 20 2a 5f 70 61 74 68 2c 20 73 74 72 75 63 74 20   *_path, struct 
2130: 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20 2a  appfs_pathinfo *
2140: 70 61 74 68 69 6e 66 6f 2c 20 73 74 72 75 63 74  pathinfo, struct
2150: 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20   appfs_children 
2160: 2a 2a 63 68 69 6c 64 72 65 6e 29 20 7b 0a 7d 0a  **children) {.}.
2170: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
2180: 73 5f 66 75 73 65 5f 72 65 61 64 6c 69 6e 6b 28  s_fuse_readlink(
2190: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
21a0: 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a  , char *buf, siz
21b0: 65 5f 74 20 73 69 7a 65 29 20 7b 0a 09 73 74 72  e_t size) {..str
21c0: 75 63 74 20 61 70 70 66 73 5f 70 61 74 68 69 6e  uct appfs_pathin
21d0: 66 6f 20 70 61 74 68 69 6e 66 6f 3b 0a 09 69 6e  fo pathinfo;..in
21e0: 74 20 72 65 73 20 3d 20 30 3b 0a 0a 09 41 50 50  t res = 0;...APP
21f0: 46 53 5f 44 45 42 55 47 28 22 45 6e 74 65 72 20  FS_DEBUG("Enter 
2200: 28 70 61 74 68 20 3d 20 25 73 2c 20 2e 2e 2e 29  (path = %s, ...)
2210: 22 2c 20 70 61 74 68 29 3b 0a 0a 09 70 61 74 68  ", path);...path
2220: 69 6e 66 6f 2e 74 79 70 65 20 3d 20 41 50 50 46  info.type = APPF
2230: 53 5f 50 41 54 48 54 59 50 45 5f 49 4e 56 41 4c  S_PATHTYPE_INVAL
2240: 49 44 3b 0a 0a 09 72 65 73 20 3d 20 61 70 70 66  ID;...res = appf
2250: 73 5f 67 65 74 5f 70 61 74 68 5f 69 6e 66 6f 28  s_get_path_info(
2260: 70 61 74 68 2c 20 26 70 61 74 68 69 6e 66 6f 2c  path, &pathinfo,
2270: 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 72 65 73   NULL);..if (res
2280: 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72   != 0) {...retur
2290: 6e 28 72 65 73 29 3b 0a 09 7d 0a 0a 09 69 66 20  n(res);..}...if 
22a0: 28 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 20 21  (pathinfo.type !
22b0: 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  = APPFS_PATHTYPE
22c0: 5f 53 59 4d 4c 49 4e 4b 29 20 7b 0a 09 09 72 65  _SYMLINK) {...re
22d0: 74 75 72 6e 28 2d 45 49 4e 56 41 4c 29 3b 0a 09  turn(-EINVAL);..
22e0: 7d 0a 0a 09 69 66 20 28 28 73 74 72 6c 65 6e 28  }...if ((strlen(
22f0: 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 69 6e 66  pathinfo.typeinf
2300: 6f 2e 73 79 6d 6c 69 6e 6b 2e 73 6f 75 72 63 65  o.symlink.source
2310: 29 20 2b 20 31 29 20 3e 20 73 69 7a 65 29 20 7b  ) + 1) > size) {
2320: 0a 09 09 72 65 74 75 72 6e 28 2d 45 4e 41 4d 45  ...return(-ENAME
2330: 54 4f 4f 4c 4f 4e 47 29 3b 0a 09 7d 0a 0a 09 6d  TOOLONG);..}...m
2340: 65 6d 63 70 79 28 62 75 66 2c 20 70 61 74 68 69  emcpy(buf, pathi
2350: 6e 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 73 79 6d  nfo.typeinfo.sym
2360: 6c 69 6e 6b 2e 73 6f 75 72 63 65 2c 20 73 74 72  link.source, str
2370: 6c 65 6e 28 70 61 74 68 69 6e 66 6f 2e 74 79 70  len(pathinfo.typ
2380: 65 69 6e 66 6f 2e 73 79 6d 6c 69 6e 6b 2e 73 6f  einfo.symlink.so
2390: 75 72 63 65 29 20 2b 20 31 29 3b 0a 0a 09 72 65  urce) + 1);...re
23a0: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74  turn(0);.}..stat
23b0: 69 63 20 69 6e 74 20 61 70 70 66 73 5f 66 75 73  ic int appfs_fus
23c0: 65 5f 67 65 74 61 74 74 72 28 63 6f 6e 73 74 20  e_getattr(const 
23d0: 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74 72 75  char *path, stru
23e0: 63 74 20 73 74 61 74 20 2a 73 74 62 75 66 29 20  ct stat *stbuf) 
23f0: 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f  {..struct appfs_
2400: 70 61 74 68 69 6e 66 6f 20 70 61 74 68 69 6e 66  pathinfo pathinf
2410: 6f 3b 0a 09 69 6e 74 20 72 65 73 20 3d 20 30 3b  o;..int res = 0;
2420: 0a 0a 09 41 50 50 46 53 5f 44 45 42 55 47 28 22  ...APPFS_DEBUG("
2430: 45 6e 74 65 72 20 28 70 61 74 68 20 3d 20 25 73  Enter (path = %s
2440: 2c 20 2e 2e 2e 29 22 2c 20 70 61 74 68 29 3b 0a  , ...)", path);.
2450: 0a 09 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 20  ..pathinfo.type 
2460: 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  = APPFS_PATHTYPE
2470: 5f 49 4e 56 41 4c 49 44 3b 0a 0a 09 72 65 73 20  _INVALID;...res 
2480: 3d 20 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68  = appfs_get_path
2490: 5f 69 6e 66 6f 28 70 61 74 68 2c 20 26 70 61 74  _info(path, &pat
24a0: 68 69 6e 66 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 69  hinfo, NULL);..i
24b0: 66 20 28 72 65 73 20 21 3d 20 30 29 20 7b 0a 09  f (res != 0) {..
24c0: 09 72 65 74 75 72 6e 28 72 65 73 29 3b 0a 09 7d  .return(res);..}
24d0: 0a 0a 09 6d 65 6d 73 65 74 28 73 74 62 75 66 2c  ...memset(stbuf,
24e0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63   0, sizeof(struc
24f0: 74 20 73 74 61 74 29 29 3b 0a 0a 09 73 74 62 75  t stat));...stbu
2500: 66 2d 3e 73 74 5f 6d 74 69 6d 65 20 3d 20 70 61  f->st_mtime = pa
2510: 74 68 69 6e 66 6f 2e 74 69 6d 65 3b 0a 09 73 74  thinfo.time;..st
2520: 62 75 66 2d 3e 73 74 5f 63 74 69 6d 65 20 3d 20  buf->st_ctime = 
2530: 70 61 74 68 69 6e 66 6f 2e 74 69 6d 65 3b 0a 09  pathinfo.time;..
2540: 73 74 62 75 66 2d 3e 73 74 5f 61 74 69 6d 65 20  stbuf->st_atime 
2550: 3d 20 70 61 74 68 69 6e 66 6f 2e 74 69 6d 65 3b  = pathinfo.time;
2560: 0a 09 73 74 62 75 66 2d 3e 73 74 5f 69 6e 6f 20  ..stbuf->st_ino 
2570: 20 20 3d 20 70 61 74 68 69 6e 66 6f 2e 69 6e 6f    = pathinfo.ino
2580: 64 65 3b 0a 09 73 74 62 75 66 2d 3e 73 74 5f 6d  de;..stbuf->st_m
2590: 6f 64 65 20 20 3d 20 30 3b 0a 0a 09 73 77 69 74  ode  = 0;...swit
25a0: 63 68 20 28 70 61 74 68 69 6e 66 6f 2e 74 79 70  ch (pathinfo.typ
25b0: 65 29 20 7b 0a 09 09 63 61 73 65 20 41 50 50 46  e) {...case APPF
25c0: 53 5f 50 41 54 48 54 59 50 45 5f 44 49 52 45 43  S_PATHTYPE_DIREC
25d0: 54 4f 52 59 3a 0a 09 09 09 73 74 62 75 66 2d 3e  TORY:....stbuf->
25e0: 73 74 5f 6d 6f 64 65 20 3d 20 53 5f 49 46 44 49  st_mode = S_IFDI
25f0: 52 20 7c 20 30 35 35 35 3b 0a 09 09 09 73 74 62  R | 0555;....stb
2600: 75 66 2d 3e 73 74 5f 6e 6c 69 6e 6b 20 3d 20 32  uf->st_nlink = 2
2610: 20 2b 20 70 61 74 68 69 6e 66 6f 2e 74 79 70 65   + pathinfo.type
2620: 69 6e 66 6f 2e 64 69 72 2e 63 68 69 6c 64 63 6f  info.dir.childco
2630: 75 6e 74 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  unt;....break;..
2640: 09 63 61 73 65 20 41 50 50 46 53 5f 50 41 54 48  .case APPFS_PATH
2650: 54 59 50 45 5f 46 49 4c 45 3a 0a 09 09 09 69 66  TYPE_FILE:....if
2660: 20 28 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 69   (pathinfo.typei
2670: 6e 66 6f 2e 66 69 6c 65 2e 65 78 65 63 75 74 61  nfo.file.executa
2680: 62 6c 65 29 20 7b 0a 09 09 09 09 73 74 62 75 66  ble) {.....stbuf
2690: 2d 3e 73 74 5f 6d 6f 64 65 20 3d 20 53 5f 49 46  ->st_mode = S_IF
26a0: 52 45 47 20 7c 20 30 35 35 35 3b 0a 09 09 09 7d  REG | 0555;....}
26b0: 20 65 6c 73 65 20 7b 0a 09 09 09 09 73 74 62 75   else {.....stbu
26c0: 66 2d 3e 73 74 5f 6d 6f 64 65 20 3d 20 53 5f 49  f->st_mode = S_I
26d0: 46 52 45 47 20 7c 20 30 34 34 34 3b 0a 09 09 09  FREG | 0444;....
26e0: 7d 0a 0a 09 09 09 73 74 62 75 66 2d 3e 73 74 5f  }.....stbuf->st_
26f0: 6e 6c 69 6e 6b 20 3d 20 31 3b 0a 09 09 09 73 74  nlink = 1;....st
2700: 62 75 66 2d 3e 73 74 5f 73 69 7a 65 20 3d 20 70  buf->st_size = p
2710: 61 74 68 69 6e 66 6f 2e 74 79 70 65 69 6e 66 6f  athinfo.typeinfo
2720: 2e 66 69 6c 65 2e 73 69 7a 65 3b 0a 09 09 09 62  .file.size;....b
2730: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 41 50 50  reak;...case APP
2740: 46 53 5f 50 41 54 48 54 59 50 45 5f 53 59 4d 4c  FS_PATHTYPE_SYML
2750: 49 4e 4b 3a 0a 09 09 09 73 74 62 75 66 2d 3e 73  INK:....stbuf->s
2760: 74 5f 6d 6f 64 65 20 3d 20 53 5f 49 46 4c 4e 4b  t_mode = S_IFLNK
2770: 20 7c 20 30 35 35 35 3b 0a 09 09 09 73 74 62 75   | 0555;....stbu
2780: 66 2d 3e 73 74 5f 6e 6c 69 6e 6b 20 3d 20 31 3b  f->st_nlink = 1;
2790: 0a 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 73 69  ....stbuf->st_si
27a0: 7a 65 20 3d 20 70 61 74 68 69 6e 66 6f 2e 74 79  ze = pathinfo.ty
27b0: 70 65 69 6e 66 6f 2e 73 79 6d 6c 69 6e 6b 2e 73  peinfo.symlink.s
27c0: 69 7a 65 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ize;....break;..
27d0: 09 63 61 73 65 20 41 50 50 46 53 5f 50 41 54 48  .case APPFS_PATH
27e0: 54 59 50 45 5f 49 4e 56 41 4c 49 44 3a 0a 09 09  TYPE_INVALID:...
27f0: 09 72 65 73 20 3d 20 2d 45 49 4f 3b 0a 0a 09 09  .res = -EIO;....
2800: 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20  .break;..}...if 
2810: 28 70 61 74 68 69 6e 66 6f 2e 70 61 63 6b 61 67  (pathinfo.packag
2820: 65 64 29 20 7b 0a 09 09 69 66 20 28 67 6c 6f 62  ed) {...if (glob
2830: 61 6c 54 68 72 65 61 64 2e 6f 70 74 69 6f 6e 73  alThread.options
2840: 2e 77 72 69 74 61 62 6c 65 29 20 7b 0a 09 09 09  .writable) {....
2850: 73 74 62 75 66 2d 3e 73 74 5f 6d 6f 64 65 20 7c  stbuf->st_mode |
2860: 3d 20 30 32 32 32 3b 0a 09 09 7d 0a 09 7d 0a 0a  = 0222;...}..}..
2870: 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a  .return res;.}..
2880: 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66 73  static int appfs
2890: 5f 66 75 73 65 5f 72 65 61 64 64 69 72 28 63 6f  _fuse_readdir(co
28a0: 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
28b0: 76 6f 69 64 20 2a 62 75 66 2c 20 66 75 73 65 5f  void *buf, fuse_
28c0: 66 69 6c 6c 5f 64 69 72 5f 74 20 66 69 6c 6c 65  fill_dir_t fille
28d0: 72 2c 20 6f 66 66 5f 74 20 6f 66 66 73 65 74 2c  r, off_t offset,
28e0: 20 73 74 72 75 63 74 20 66 75 73 65 5f 66 69 6c   struct fuse_fil
28f0: 65 5f 69 6e 66 6f 20 2a 66 69 29 20 7b 0a 09 73  e_info *fi) {..s
2900: 74 72 75 63 74 20 61 70 70 66 73 5f 70 61 74 68  truct appfs_path
2910: 69 6e 66 6f 20 70 61 74 68 69 6e 66 6f 3b 0a 09  info pathinfo;..
2920: 73 74 72 75 63 74 20 61 70 70 66 73 5f 63 68 69  struct appfs_chi
2930: 6c 64 72 65 6e 20 2a 63 68 69 6c 64 72 65 6e 2c  ldren *children,
2940: 20 2a 63 68 69 6c 64 3b 0a 09 69 6e 74 20 72 65   *child;..int re
2950: 74 76 61 6c 3b 0a 0a 09 41 50 50 46 53 5f 44 45  tval;...APPFS_DE
2960: 42 55 47 28 22 45 6e 74 65 72 20 28 70 61 74 68  BUG("Enter (path
2970: 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c 20 70 61   = %s, ...)", pa
2980: 74 68 29 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  th);...retval = 
2990: 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f 69  appfs_get_path_i
29a0: 6e 66 6f 28 70 61 74 68 2c 20 26 70 61 74 68 69  nfo(path, &pathi
29b0: 6e 66 6f 2c 20 26 63 68 69 6c 64 72 65 6e 29 3b  nfo, &children);
29c0: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20  ..if (retval != 
29d0: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 72 65  0) {...return(re
29e0: 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 66 69 6c 6c  tval);..}...fill
29f0: 65 72 28 62 75 66 2c 20 22 2e 22 2c 20 4e 55 4c  er(buf, ".", NUL
2a00: 4c 2c 20 30 29 3b 0a 09 66 69 6c 6c 65 72 28 62  L, 0);..filler(b
2a10: 75 66 2c 20 22 2e 2e 22 2c 20 4e 55 4c 4c 2c 20  uf, "..", NULL, 
2a20: 30 29 3b 0a 0a 09 66 6f 72 20 28 63 68 69 6c 64  0);...for (child
2a30: 20 3d 20 63 68 69 6c 64 72 65 6e 3b 20 63 68 69   = children; chi
2a40: 6c 64 3b 20 63 68 69 6c 64 20 3d 20 63 68 69 6c  ld; child = chil
2a50: 64 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 66 69  d->_next) {...fi
2a60: 6c 6c 65 72 28 62 75 66 2c 20 63 68 69 6c 64 2d  ller(buf, child-
2a70: 3e 6e 61 6d 65 2c 20 4e 55 4c 4c 2c 20 30 29 3b  >name, NULL, 0);
2a80: 0a 09 7d 0a 0a 2f 2f 09 61 70 70 66 73 5f 66 72  ..}..//.appfs_fr
2a90: 65 65 5f 6c 69 73 74 5f 63 68 69 6c 64 72 65 6e  ee_list_children
2aa0: 28 63 68 69 6c 64 72 65 6e 29 3b 0a 0a 09 72 65  (children);...re
2ab0: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74  turn(0);.}..stat
2ac0: 69 63 20 69 6e 74 20 61 70 70 66 73 5f 66 75 73  ic int appfs_fus
2ad0: 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e_open(const cha
2ae0: 72 20 2a 70 61 74 68 2c 20 73 74 72 75 63 74 20  r *path, struct 
2af0: 66 75 73 65 5f 66 69 6c 65 5f 69 6e 66 6f 20 2a  fuse_file_info *
2b00: 66 69 29 20 7b 0a 09 73 74 72 75 63 74 20 61 70  fi) {..struct ap
2b10: 70 66 73 5f 70 61 74 68 69 6e 66 6f 20 70 61 74  pfs_pathinfo pat
2b20: 68 69 6e 66 6f 3b 0a 09 63 6f 6e 73 74 20 63 68  hinfo;..const ch
2b30: 61 72 20 2a 72 65 61 6c 5f 70 61 74 68 3b 0a 09  ar *real_path;..
2b40: 69 6e 74 20 66 68 3b 0a 09 69 6e 74 20 67 70 69  int fh;..int gpi
2b50: 5f 72 65 74 3b 0a 0a 09 41 50 50 46 53 5f 44 45  _ret;...APPFS_DE
2b60: 42 55 47 28 22 45 6e 74 65 72 20 28 70 61 74 68  BUG("Enter (path
2b70: 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c 20 70 61   = %s, ...)", pa
2b80: 74 68 29 3b 0a 0a 23 69 66 20 30 0a 0a 09 69 66  th);..#if 0...if
2b90: 20 28 28 66 69 2d 3e 66 6c 61 67 73 20 26 20 33   ((fi->flags & 3
2ba0: 29 20 21 3d 20 4f 5f 52 44 4f 4e 4c 59 29 20 7b  ) != O_RDONLY) {
2bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bc0: 20 72 65 74 75 72 6e 28 2d 45 41 43 43 45 53 29   return(-EACCES)
2bd0: 3b 0a 09 7d 0a 0a 09 67 70 69 5f 72 65 74 20 3d  ;..}...gpi_ret =
2be0: 20 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f   appfs_get_path_
2bf0: 69 6e 66 6f 28 70 61 74 68 2c 20 26 70 61 74 68  info(path, &path
2c00: 69 6e 66 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  info, NULL);..if
2c10: 20 28 67 70 69 5f 72 65 74 20 21 3d 20 30 29 20   (gpi_ret != 0) 
2c20: 7b 0a 09 09 72 65 74 75 72 6e 28 67 70 69 5f 72  {...return(gpi_r
2c30: 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 61  et);..}...if (pa
2c40: 74 68 69 6e 66 6f 2e 74 79 70 65 20 3d 3d 20 41  thinfo.type == A
2c50: 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f 44 49  PPFS_PATHTYPE_DI
2c60: 52 45 43 54 4f 52 59 29 20 7b 0a 09 09 72 65 74  RECTORY) {...ret
2c70: 75 72 6e 28 2d 45 49 53 44 49 52 29 3b 0a 09 7d  urn(-EISDIR);..}
2c80: 0a 0a 09 72 65 61 6c 5f 70 61 74 68 20 3d 20 61  ...real_path = a
2c90: 70 70 66 73 5f 67 65 74 66 69 6c 65 28 70 61 74  ppfs_getfile(pat
2ca0: 68 69 6e 66 6f 2e 68 6f 73 74 6e 61 6d 65 2c 20  hinfo.hostname, 
2cb0: 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 69 6e 66  pathinfo.typeinf
2cc0: 6f 2e 66 69 6c 65 2e 73 68 61 31 29 3b 0a 09 69  o.file.sha1);..i
2cd0: 66 20 28 72 65 61 6c 5f 70 61 74 68 20 3d 3d 20  f (real_path == 
2ce0: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
2cf0: 28 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 66 68 20  (-EIO);..}...fh 
2d00: 3d 20 6f 70 65 6e 28 72 65 61 6c 5f 70 61 74 68  = open(real_path
2d10: 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 66 72  , O_RDONLY);..fr
2d20: 65 65 28 28 76 6f 69 64 20 2a 29 20 72 65 61 6c  ee((void *) real
2d30: 5f 70 61 74 68 29 3b 0a 09 69 66 20 28 66 68 20  _path);..if (fh 
2d40: 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
2d50: 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 66 69 2d 3e  -EIO);..}...fi->
2d60: 66 68 20 3d 20 66 68 3b 0a 23 65 6e 64 69 66 0a  fh = fh;.#endif.
2d70: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
2d80: 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66 73  static int appfs
2d90: 5f 66 75 73 65 5f 63 6c 6f 73 65 28 63 6f 6e 73  _fuse_close(cons
2da0: 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74  t char *path, st
2db0: 72 75 63 74 20 66 75 73 65 5f 66 69 6c 65 5f 69  ruct fuse_file_i
2dc0: 6e 66 6f 20 2a 66 69 29 20 7b 0a 09 69 6e 74 20  nfo *fi) {..int 
2dd0: 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09 63 6c 6f  close_ret;...clo
2de0: 73 65 5f 72 65 74 20 3d 20 63 6c 6f 73 65 28 66  se_ret = close(f
2df0: 69 2d 3e 66 68 29 3b 0a 09 69 66 20 28 63 6c 6f  i->fh);..if (clo
2e00: 73 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  se_ret != 0) {..
2e10: 09 72 65 74 75 72 6e 28 2d 45 49 4f 29 3b 0a 09  .return(-EIO);..
2e20: 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  }...return(0);.}
2e30: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70  ..static int app
2e40: 66 73 5f 66 75 73 65 5f 72 65 61 64 28 63 6f 6e  fs_fuse_read(con
2e50: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 63  st char *path, c
2e60: 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74  har *buf, size_t
2e70: 20 73 69 7a 65 2c 20 6f 66 66 5f 74 20 6f 66 66   size, off_t off
2e80: 73 65 74 2c 20 73 74 72 75 63 74 20 66 75 73 65  set, struct fuse
2e90: 5f 66 69 6c 65 5f 69 6e 66 6f 20 2a 66 69 29 20  _file_info *fi) 
2ea0: 7b 0a 09 6f 66 66 5f 74 20 6c 73 65 65 6b 5f 72  {..off_t lseek_r
2eb0: 65 74 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61  et;..ssize_t rea
2ec0: 64 5f 72 65 74 3b 0a 0a 09 41 50 50 46 53 5f 44  d_ret;...APPFS_D
2ed0: 45 42 55 47 28 22 45 6e 74 65 72 20 28 70 61 74  EBUG("Enter (pat
2ee0: 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c 20 70  h = %s, ...)", p
2ef0: 61 74 68 29 3b 0a 0a 09 6c 73 65 65 6b 5f 72 65  ath);...lseek_re
2f00: 74 20 3d 20 6c 73 65 65 6b 28 66 69 2d 3e 66 68  t = lseek(fi->fh
2f10: 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
2f20: 45 54 29 3b 0a 09 69 66 20 28 6c 73 65 65 6b 5f  ET);..if (lseek_
2f30: 72 65 74 20 21 3d 20 6f 66 66 73 65 74 29 20 7b  ret != offset) {
2f40: 0a 09 09 72 65 74 75 72 6e 28 2d 45 49 4f 29 3b  ...return(-EIO);
2f50: 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ..}...read_ret =
2f60: 20 72 65 61 64 28 66 69 2d 3e 66 68 2c 20 62 75   read(fi->fh, bu
2f70: 66 2c 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75  f, size);...retu
2f80: 72 6e 28 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a  rn(read_ret);.}.
2f90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
2fa0: 73 5f 73 71 6c 69 74 65 33 28 63 6f 6e 73 74 20  s_sqlite3(const 
2fb0: 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a 09 54 63  char *sql) {..Tc
2fc0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2fd0: 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ;..const char *s
2fe0: 71 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 74 63 6c  ql_ret;..int tcl
2ff0: 5f 72 65 74 3b 0a 0a 09 69 6e 74 65 72 70 20 3d  _ret;...interp =
3000: 20 61 70 70 66 73 5f 63 72 65 61 74 65 5f 54 63   appfs_create_Tc
3010: 6c 49 6e 74 65 72 70 28 29 3b 0a 09 69 66 20 28  lInterp();..if (
3020: 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 29 20  interp == NULL) 
3030: 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65  {...fprintf(stde
3040: 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 63  rr, "Unable to c
3050: 72 65 61 74 65 20 61 20 54 63 6c 20 69 6e 74 65  reate a Tcl inte
3060: 72 70 72 65 74 65 72 2e 20 20 41 62 6f 72 74 69  rpreter.  Aborti
3070: 6e 67 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75  ng.\n");....retu
3080: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f  rn(1);..}...tcl_
3090: 72 65 74 20 3d 20 61 70 70 66 73 5f 54 63 6c 5f  ret = appfs_Tcl_
30a0: 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 35 2c 20  Eval(interp, 5, 
30b0: 22 3a 3a 61 70 70 66 73 3a 3a 64 62 22 2c 20 22  "::appfs::db", "
30c0: 65 76 61 6c 22 2c 20 73 71 6c 2c 20 22 72 6f 77  eval", sql, "row
30d0: 22 2c 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  ", "unset -nocom
30e0: 70 6c 61 69 6e 20 72 6f 77 28 2a 29 3b 20 70 61  plain row(*); pa
30f0: 72 72 61 79 20 72 6f 77 3b 20 70 75 74 73 20 5c  rray row; puts \
3100: 22 2d 2d 2d 2d 5c 22 22 29 3b 0a 09 73 71 6c 5f  "----\"");..sql_
3110: 72 65 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ret = Tcl_GetStr
3120: 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
3130: 29 3b 0a 0a 09 69 66 20 28 74 63 6c 5f 72 65 74  );...if (tcl_ret
3140: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
3150: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
3160: 22 5b 65 72 72 6f 72 5d 20 25 73 5c 6e 22 2c 20  "[error] %s\n", 
3170: 73 71 6c 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  sql_ret);....ret
3180: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 70 72 69  urn(1);..}...pri
3190: 6e 74 66 28 22 25 73 5c 6e 22 2c 20 73 71 6c 5f  ntf("%s\n", sql_
31a0: 72 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  ret);...return(0
31b0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
31c0: 20 41 70 70 66 73 64 5f 49 6e 69 74 28 54 63 6c   Appfsd_Init(Tcl
31d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
31e0: 20 7b 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43   {.#ifdef USE_TC
31f0: 4c 5f 53 54 55 42 53 0a 09 69 66 20 28 54 63 6c  L_STUBS..if (Tcl
3200: 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72  _InitStubs(inter
3210: 70 2c 20 54 43 4c 5f 56 45 52 53 49 4f 4e 2c 20  p, TCL_VERSION, 
3220: 30 29 20 3d 3d 20 30 4c 29 20 7b 0a 09 09 72 65  0) == 0L) {...re
3230: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
3240: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 54 63 6c  ..}.#endif...Tcl
3250: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
3260: 64 28 69 6e 74 65 72 70 2c 20 22 61 70 70 66 73  d(interp, "appfs
3270: 64 3a 3a 67 65 74 5f 68 6f 6d 65 64 69 72 22 2c  d::get_homedir",
3280: 20 74 63 6c 5f 61 70 70 66 73 5f 67 65 74 5f 68   tcl_appfs_get_h
3290: 6f 6d 65 64 69 72 2c 20 4e 55 4c 4c 2c 20 4e 55  omedir, NULL, NU
32a0: 4c 4c 29 3b 0a 0a 09 54 63 6c 5f 50 6b 67 50 72  LL);...Tcl_PkgPr
32b0: 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 61  ovide(interp, "a
32c0: 70 70 66 73 64 22 2c 20 22 31 2e 30 22 29 3b 0a  ppfsd", "1.0");.
32d0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29  ..return(TCL_OK)
32e0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75  ;.}..static stru
32f0: 63 74 20 66 75 73 65 5f 6f 70 65 72 61 74 69 6f  ct fuse_operatio
3300: 6e 73 20 61 70 70 66 73 5f 6f 70 65 72 20 3d 20  ns appfs_oper = 
3310: 7b 0a 09 2e 67 65 74 61 74 74 72 20 20 20 3d 20  {...getattr   = 
3320: 61 70 70 66 73 5f 66 75 73 65 5f 67 65 74 61 74  appfs_fuse_getat
3330: 74 72 2c 0a 09 2e 72 65 61 64 64 69 72 20 20 20  tr,...readdir   
3340: 3d 20 61 70 70 66 73 5f 66 75 73 65 5f 72 65 61  = appfs_fuse_rea
3350: 64 64 69 72 2c 0a 09 2e 72 65 61 64 6c 69 6e 6b  ddir,...readlink
3360: 20 20 3d 20 61 70 70 66 73 5f 66 75 73 65 5f 72    = appfs_fuse_r
3370: 65 61 64 6c 69 6e 6b 2c 0a 09 2e 6f 70 65 6e 20  eadlink,...open 
3380: 20 20 20 20 20 3d 20 61 70 70 66 73 5f 66 75 73       = appfs_fus
3390: 65 5f 6f 70 65 6e 2c 0a 09 2e 72 65 6c 65 61 73  e_open,...releas
33a0: 65 20 20 20 3d 20 61 70 70 66 73 5f 66 75 73 65  e   = appfs_fuse
33b0: 5f 63 6c 6f 73 65 2c 0a 09 2e 72 65 61 64 20 20  _close,...read  
33c0: 20 20 20 20 3d 20 61 70 70 66 73 5f 66 75 73 65      = appfs_fuse
33d0: 5f 72 65 61 64 0a 7d 3b 0a 0a 69 6e 74 20 6d 61  _read.};..int ma
33e0: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
33f0: 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09 63 6f 6e  r **argv) {..con
3400: 73 74 20 63 68 61 72 20 2a 63 61 63 68 65 64 69  st char *cachedi
3410: 72 20 3d 20 41 50 50 46 53 5f 43 41 43 48 45 44  r = APPFS_CACHED
3420: 49 52 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  IR;..int pthread
3430: 5f 72 65 74 3b 0a 0a 09 67 6c 6f 62 61 6c 54 68  _ret;...globalTh
3440: 72 65 61 64 2e 63 61 63 68 65 64 69 72 20 3d 20  read.cachedir = 
3450: 63 61 63 68 65 64 69 72 3b 0a 09 67 6c 6f 62 61  cachedir;..globa
3460: 6c 54 68 72 65 61 64 2e 62 6f 6f 74 74 69 6d 65  lThread.boottime
3470: 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a 09   = time(NULL);..
3480: 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 6f 70 74  globalThread.opt
3490: 69 6f 6e 73 2e 77 72 69 74 61 62 6c 65 20 3d 20  ions.writable = 
34a0: 31 3b 0a 0a 09 54 63 6c 5f 53 74 61 74 69 63 50  1;...Tcl_StaticP
34b0: 61 63 6b 61 67 65 28 4e 55 4c 4c 2c 20 22 73 68  ackage(NULL, "sh
34c0: 61 31 22 2c 20 53 68 61 31 5f 49 6e 69 74 2c 20  a1", Sha1_Init, 
34d0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 74 61 74  NULL);..Tcl_Stat
34e0: 69 63 50 61 63 6b 61 67 65 28 4e 55 4c 4c 2c 20  icPackage(NULL, 
34f0: 22 61 70 70 66 73 64 22 2c 20 41 70 70 66 73 64  "appfsd", Appfsd
3500: 5f 49 6e 69 74 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  _Init, NULL);...
3510: 70 74 68 72 65 61 64 5f 72 65 74 20 3d 20 70 74  pthread_ret = pt
3520: 68 72 65 61 64 5f 6b 65 79 5f 63 72 65 61 74 65  hread_key_create
3530: 28 26 69 6e 74 65 72 70 4b 65 79 2c 20 4e 55 4c  (&interpKey, NUL
3540: 4c 29 3b 0a 09 69 66 20 28 70 74 68 72 65 61 64  L);..if (pthread
3550: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 66  _ret != 0) {...f
3560: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
3570: 55 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65  Unable to create
3580: 20 54 53 44 20 6b 65 79 20 66 6f 72 20 54 63 6c   TSD key for Tcl
3590: 2e 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29  .  Aborting.\n")
35a0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
35b0: 09 7d 0a 0a 09 69 66 20 28 61 72 67 63 20 3d 3d  .}...if (argc ==
35c0: 20 33 20 26 26 20 73 74 72 63 6d 70 28 61 72 67   3 && strcmp(arg
35d0: 76 5b 31 5d 2c 20 22 2d 73 71 6c 69 74 65 33 22  v[1], "-sqlite3"
35e0: 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  ) == 0) {...retu
35f0: 72 6e 28 61 70 70 66 73 5f 73 71 6c 69 74 65 33  rn(appfs_sqlite3
3600: 28 61 72 67 76 5b 32 5d 29 29 3b 0a 09 7d 0a 0a  (argv[2]));..}..
3610: 09 72 65 74 75 72 6e 28 66 75 73 65 5f 6d 61 69  .return(fuse_mai
3620: 6e 28 61 72 67 63 2c 20 61 72 67 76 2c 20 26 61  n(argc, argv, &a
3630: 70 70 66 73 5f 6f 70 65 72 2c 20 4e 55 4c 4c 29  ppfs_oper, NULL)
3640: 29 3b 0a 7d 0a 20 0a                             );.}. .