Hex Artifact Content

Artifact 8dc47d059d99ba66a0e6c836b5029939a8967032:


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 09 63 68 61 72 20 73 68 61 31 5b 34 31 5d  ...char sha1[41]
04d0: 3b 0a 09 09 7d 20 66 69 6c 65 3b 0a 09 09 73 74  ;...} file;...st
04e0: 72 75 63 74 20 7b 0a 09 09 09 6f 66 66 5f 74 20  ruct {....off_t 
04f0: 73 69 7a 65 3b 0a 09 09 09 63 68 61 72 20 73 6f  size;....char so
0500: 75 72 63 65 5b 32 35 36 5d 3b 0a 09 09 7d 20 73  urce[256];...} s
0510: 79 6d 6c 69 6e 6b 3b 0a 09 7d 20 74 79 70 65 69  ymlink;..} typei
0520: 6e 66 6f 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  nfo;.};..static 
0530: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 61 70 70 66  Tcl_Interp *appf
0540: 73 5f 63 72 65 61 74 65 5f 54 63 6c 49 6e 74 65  s_create_TclInte
0550: 72 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  rp(const char *c
0560: 61 63 68 65 64 69 72 29 20 7b 0a 09 54 63 6c 5f  achedir) {..Tcl_
0570: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
0580: 09 69 6e 74 20 74 63 6c 5f 72 65 74 3b 0a 0a 09  .int tcl_ret;...
0590: 41 50 50 46 53 5f 44 45 42 55 47 28 22 43 72 65  APPFS_DEBUG("Cre
05a0: 61 74 69 6e 67 20 6e 65 77 20 54 63 6c 20 69 6e  ating new Tcl in
05b0: 74 65 72 70 72 65 74 65 72 20 66 6f 72 20 54 49  terpreter for TI
05c0: 44 20 3d 20 30 78 25 6c 6c 78 22 2c 20 28 75 6e  D = 0x%llx", (un
05d0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
05e0: 29 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  ) pthread_self()
05f0: 29 3b 0a 0a 09 69 6e 74 65 72 70 20 3d 20 54 63  );...interp = Tc
0600: 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
0610: 3b 0a 09 69 66 20 28 69 6e 74 65 72 70 20 3d 3d  ;..if (interp ==
0620: 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e   NULL) {...fprin
0630: 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62  tf(stderr, "Unab
0640: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 54 63 6c  le to create Tcl
0650: 20 49 6e 74 65 72 70 72 65 74 65 72 2e 20 20 41   Interpreter.  A
0660: 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 0a 09  borting.\n");...
0670: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
0680: 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54 63  }...tcl_ret = Tc
0690: 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  l_Init(interp);.
06a0: 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20  .if (tcl_ret != 
06b0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69  TCL_OK) {...fpri
06c0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61  ntf(stderr, "Una
06d0: 62 6c 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ble to initializ
06e0: 65 20 54 63 6c 2e 20 20 41 62 6f 72 74 69 6e 67  e Tcl.  Aborting
06f0: 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  .\n");...fprintf
0700: 28 73 74 64 65 72 72 2c 20 22 54 63 6c 20 45 72  (stderr, "Tcl Er
0710: 72 6f 72 20 69 73 3a 20 25 73 5c 6e 22 2c 20 54  ror is: %s\n", T
0720: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
0730: 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09  lt(interp));....
0740: 54 63 6c 5f 44 65 6c 65 74 65 49 6e 74 65 72 70  Tcl_DeleteInterp
0750: 28 69 6e 74 65 72 70 29 3b 0a 0a 09 09 72 65 74  (interp);....ret
0760: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
0770: 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 45 76  tcl_ret = Tcl_Ev
0780: 61 6c 28 69 6e 74 65 72 70 2c 20 22 70 61 63 6b  al(interp, "pack
0790: 61 67 65 20 69 66 6e 65 65 64 65 64 20 73 68 61  age ifneeded sha
07a0: 31 20 31 2e 30 20 5b 6c 69 73 74 20 6c 6f 61 64  1 1.0 [list load
07b0: 20 7b 7d 20 73 68 61 31 5d 22 29 3b 0a 09 69 66   {} sha1]");..if
07c0: 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c   (tcl_ret != TCL
07d0: 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  _OK) {...fprintf
07e0: 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65  (stderr, "Unable
07f0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 54   to initialize T
0800: 63 6c 20 53 48 41 31 2e 20 20 41 62 6f 72 74 69  cl SHA1.  Aborti
0810: 6e 67 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ng.\n");...fprin
0820: 74 66 28 73 74 64 65 72 72 2c 20 22 54 63 6c 20  tf(stderr, "Tcl 
0830: 45 72 72 6f 72 20 69 73 3a 20 25 73 5c 6e 22 2c  Error is: %s\n",
0840: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
0850: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a  sult(interp));..
0860: 09 09 54 63 6c 5f 44 65 6c 65 74 65 49 6e 74 65  ..Tcl_DeleteInte
0870: 72 70 28 69 6e 74 65 72 70 29 3b 0a 0a 09 09 72  rp(interp);....r
0880: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
0890: 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f  ..tcl_ret = Tcl_
08a0: 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 22 70 61  Eval(interp, "pa
08b0: 63 6b 61 67 65 20 69 66 6e 65 65 64 65 64 20 61  ckage ifneeded a
08c0: 70 70 66 73 64 20 31 2e 30 20 5b 6c 69 73 74 20  ppfsd 1.0 [list 
08d0: 6c 6f 61 64 20 7b 7d 20 61 70 70 66 73 64 5d 22  load {} appfsd]"
08e0: 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20  );..if (tcl_ret 
08f0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 66  != TCL_OK) {...f
0900: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
0910: 55 6e 61 62 6c 65 20 74 6f 20 69 6e 69 74 69 61  Unable to initia
0920: 6c 69 7a 65 20 54 63 6c 20 41 70 70 46 53 20 50  lize Tcl AppFS P
0930: 61 63 6b 61 67 65 2e 20 20 41 62 6f 72 74 69 6e  ackage.  Abortin
0940: 67 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  g.\n");...fprint
0950: 66 28 73 74 64 65 72 72 2c 20 22 54 63 6c 20 45  f(stderr, "Tcl E
0960: 72 72 6f 72 20 69 73 3a 20 25 73 5c 6e 22 2c 20  rror is: %s\n", 
0970: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
0980: 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09  ult(interp));...
0990: 09 54 63 6c 5f 44 65 6c 65 74 65 49 6e 74 65 72  .Tcl_DeleteInter
09a0: 70 28 69 6e 74 65 72 70 29 3b 0a 0a 09 09 72 65  p(interp);....re
09b0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
09c0: 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 45  .tcl_ret = Tcl_E
09d0: 76 61 6c 28 69 6e 74 65 72 70 2c 20 22 22 0a 23  val(interp, "".#
09e0: 69 6e 63 6c 75 64 65 20 22 61 70 70 66 73 64 2e  include "appfsd.
09f0: 74 63 6c 2e 68 22 0a 09 22 22 29 3b 0a 09 69 66  tcl.h".."");..if
0a00: 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c   (tcl_ret != TCL
0a10: 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  _OK) {...fprintf
0a20: 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65  (stderr, "Unable
0a30: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 54   to initialize T
0a40: 63 6c 20 41 70 70 46 53 20 73 63 72 69 70 74 2e  cl AppFS script.
0a50: 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b    Aborting.\n");
0a60: 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ...fprintf(stder
0a70: 72 2c 20 22 54 63 6c 20 45 72 72 6f 72 20 69 73  r, "Tcl Error is
0a80: 3a 20 25 73 5c 6e 22 2c 20 54 63 6c 5f 47 65 74  : %s\n", Tcl_Get
0a90: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
0aa0: 65 72 70 29 29 3b 0a 0a 09 09 54 63 6c 5f 44 65  erp));....Tcl_De
0ab0: 6c 65 74 65 49 6e 74 65 72 70 28 69 6e 74 65 72  leteInterp(inter
0ac0: 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  p);....return(NU
0ad0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 54 63  LL);..}...if (Tc
0ae0: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
0af0: 20 22 3a 3a 61 70 70 66 73 3a 3a 63 61 63 68 65   "::appfs::cache
0b00: 64 69 72 22 2c 20 63 61 63 68 65 64 69 72 2c 20  dir", cachedir, 
0b10: 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
0b20: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 70   == NULL) {...fp
0b30: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
0b40: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 61 63  nable to set cac
0b50: 68 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54  he directory.  T
0b60: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
0b70: 20 66 61 69 6c 2e 5c 6e 22 29 3b 0a 0a 09 09 54   fail.\n");....T
0b80: 63 6c 5f 44 65 6c 65 74 65 49 6e 74 65 72 70 28  cl_DeleteInterp(
0b90: 69 6e 74 65 72 70 29 3b 0a 0a 09 09 72 65 74 75  interp);....retu
0ba0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74  rn(NULL);..}...t
0bb0: 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 45 76 61  cl_ret = Tcl_Eva
0bc0: 6c 28 69 6e 74 65 72 70 2c 20 22 3a 3a 61 70 70  l(interp, "::app
0bd0: 66 73 3a 3a 69 6e 69 74 22 29 3b 0a 09 69 66 20  fs::init");..if 
0be0: 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f  (tcl_ret != TCL_
0bf0: 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  OK) {...fprintf(
0c00: 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20  stderr, "Unable 
0c10: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63  to initialize Tc
0c20: 6c 20 41 70 70 46 53 20 73 63 72 69 70 74 20 28  l AppFS script (
0c30: 3a 3a 61 70 70 66 73 3a 3a 69 6e 69 74 29 2e 20  ::appfs::init). 
0c40: 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a   Aborting.\n");.
0c50: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
0c60: 2c 20 22 54 63 6c 20 45 72 72 6f 72 20 69 73 3a  , "Tcl Error is:
0c70: 20 25 73 5c 6e 22 2c 20 54 63 6c 5f 47 65 74 53   %s\n", Tcl_GetS
0c80: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
0c90: 72 70 29 29 3b 0a 0a 09 09 54 63 6c 5f 44 65 6c  rp));....Tcl_Del
0ca0: 65 74 65 49 6e 74 65 72 70 28 69 6e 74 65 72 70  eteInterp(interp
0cb0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
0cc0: 4c 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 48 69 64  L);..}...Tcl_Hid
0cd0: 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
0ce0: 20 22 67 6c 6f 62 22 2c 20 22 67 6c 6f 62 22 29   "glob", "glob")
0cf0: 3b 0a 09 54 63 6c 5f 48 69 64 65 43 6f 6d 6d 61  ;..Tcl_HideComma
0d00: 6e 64 28 69 6e 74 65 72 70 2c 20 22 65 78 65 63  nd(interp, "exec
0d10: 22 2c 20 22 65 78 65 63 22 29 3b 0a 09 54 63 6c  ", "exec");..Tcl
0d20: 5f 48 69 64 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  _HideCommand(int
0d30: 65 72 70 2c 20 22 70 69 64 22 2c 20 22 70 69 64  erp, "pid", "pid
0d40: 22 29 3b 0a 09 54 63 6c 5f 48 69 64 65 43 6f 6d  ");..Tcl_HideCom
0d50: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 61 75  mand(interp, "au
0d60: 74 6f 5f 6c 6f 61 64 5f 69 6e 64 65 78 22 2c 20  to_load_index", 
0d70: 22 61 75 74 6f 5f 6c 6f 61 64 5f 69 6e 64 65 78  "auto_load_index
0d80: 22 29 3b 0a 09 54 63 6c 5f 48 69 64 65 43 6f 6d  ");..Tcl_HideCom
0d90: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 75 6e  mand(interp, "un
0da0: 6b 6e 6f 77 6e 22 2c 20 22 75 6e 6b 6e 6f 77 6e  known", "unknown
0db0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 69 6e 74  ");...return(int
0dc0: 65 72 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  erp);.}..static 
0dd0: 69 6e 74 20 61 70 70 66 73 5f 54 63 6c 5f 45 76  int appfs_Tcl_Ev
0de0: 61 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  al(Tcl_Interp *i
0df0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
0e00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6d 64   const char *cmd
0e10: 2c 20 2e 2e 2e 29 20 7b 0a 09 54 63 6c 5f 4f 62  , ...) {..Tcl_Ob
0e20: 6a 20 2a 2a 6f 62 6a 76 3b 0a 09 63 6f 6e 73 74  j **objv;..const
0e30: 20 63 68 61 72 20 2a 61 72 67 3b 0a 09 76 61 5f   char *arg;..va_
0e40: 6c 69 73 74 20 61 72 67 70 3b 0a 09 69 6e 74 20  list argp;..int 
0e50: 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 69 3b 0a  retval;..int i;.
0e60: 0a 09 69 66 20 28 69 6e 74 65 72 70 20 3d 3d 20  ..if (interp == 
0e70: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
0e80: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  (TCL_ERROR);..}.
0e90: 0a 09 6f 62 6a 76 20 3d 20 28 76 6f 69 64 20 2a  ..objv = (void *
0ea0: 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  ) ckalloc(sizeof
0eb0: 28 2a 6f 62 6a 76 29 20 2a 20 6f 62 6a 63 29 3b  (*objv) * objc);
0ec0: 0a 09 6f 62 6a 76 5b 30 5d 20 3d 20 54 63 6c 5f  ..objv[0] = Tcl_
0ed0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6d 64  NewStringObj(cmd
0ee0: 2c 20 2d 31 29 3b 0a 09 54 63 6c 5f 49 6e 63 72  , -1);..Tcl_Incr
0ef0: 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 30 5d  RefCount(objv[0]
0f00: 29 3b 0a 0a 09 76 61 5f 73 74 61 72 74 28 61 72  );...va_start(ar
0f10: 67 70 2c 20 63 6d 64 29 3b 0a 09 66 6f 72 20 28  gp, cmd);..for (
0f20: 69 20 3d 20 31 3b 20 69 20 3c 20 6f 62 6a 63 3b  i = 1; i < objc;
0f30: 20 69 2b 2b 29 20 7b 0a 09 09 61 72 67 20 3d 20   i++) {...arg = 
0f40: 76 61 5f 61 72 67 28 61 72 67 70 2c 20 63 6f 6e  va_arg(argp, con
0f50: 73 74 20 63 68 61 72 20 2a 29 3b 0a 09 09 6f 62  st char *);...ob
0f60: 6a 76 5b 69 5d 20 3d 20 54 63 6c 5f 4e 65 77 53  jv[i] = Tcl_NewS
0f70: 74 72 69 6e 67 4f 62 6a 28 61 72 67 2c 20 2d 31  tringObj(arg, -1
0f80: 29 3b 0a 09 09 54 63 6c 5f 49 6e 63 72 52 65 66  );...Tcl_IncrRef
0f90: 43 6f 75 6e 74 28 6f 62 6a 76 5b 69 5d 29 3b 0a  Count(objv[i]);.
0fa0: 09 7d 0a 09 76 61 5f 65 6e 64 28 61 72 67 70 29  .}..va_end(argp)
0fb0: 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 54 63 6c  ;...retval = Tcl
0fc0: 5f 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70  _EvalObjv(interp
0fd0: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 30 29  , objc, objv, 0)
0fe0: 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20  ;...for (i = 0; 
0ff0: 69 20 3c 20 6f 62 6a 63 3b 20 69 2b 2b 29 20 7b  i < objc; i++) {
1000: 0a 09 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  ...Tcl_DecrRefCo
1010: 75 6e 74 28 6f 62 6a 76 5b 69 5d 29 3b 0a 09 7d  unt(objv[i]);..}
1020: 0a 0a 09 63 6b 66 72 65 65 28 28 76 6f 69 64 20  ...ckfree((void 
1030: 2a 29 20 6f 62 6a 76 29 3b 0a 0a 09 69 66 20 28  *) objv);...if (
1040: 72 65 74 76 61 6c 20 21 3d 20 54 43 4c 5f 4f 4b  retval != TCL_OK
1050: 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42 55  ) {...APPFS_DEBU
1060: 47 28 22 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66  G("Tcl command f
1070: 61 69 6c 65 64 2c 20 3a 3a 65 72 72 6f 72 49 6e  ailed, ::errorIn
1080: 66 6f 20 63 6f 6e 74 61 69 6e 73 3a 20 25 73 5c  fo contains: %s\
1090: 6e 22 2c 20 54 63 6c 5f 47 65 74 56 61 72 28 69  n", Tcl_GetVar(i
10a0: 6e 74 65 72 70 2c 20 22 3a 3a 65 72 72 6f 72 49  nterp, "::errorI
10b0: 6e 66 6f 22 2c 20 30 29 29 3b 0a 09 7d 0a 0a 09  nfo", 0));..}...
10c0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
10d0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  }..static void a
10e0: 70 70 66 73 5f 75 70 64 61 74 65 5f 69 6e 64 65  ppfs_update_inde
10f0: 78 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f  x(const char *ho
1100: 73 74 6e 61 6d 65 29 20 7b 0a 09 54 63 6c 5f 49  stname) {..Tcl_I
1110: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 09  nterp *interp;..
1120: 69 6e 74 20 74 63 6c 5f 72 65 74 3b 0a 0a 09 41  int tcl_ret;...A
1130: 50 50 46 53 5f 44 45 42 55 47 28 22 45 6e 74 65  PPFS_DEBUG("Ente
1140: 72 3a 20 68 6f 73 74 6e 61 6d 65 20 3d 20 25 73  r: hostname = %s
1150: 22 2c 20 68 6f 73 74 6e 61 6d 65 29 3b 0a 0a 09  ", hostname);...
1160: 69 6e 74 65 72 70 20 3d 20 70 74 68 72 65 61 64  interp = pthread
1170: 5f 67 65 74 73 70 65 63 69 66 69 63 28 69 6e 74  _getspecific(int
1180: 65 72 70 4b 65 79 29 3b 0a 09 69 66 20 28 69 6e  erpKey);..if (in
1190: 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  terp == NULL) {.
11a0: 09 09 69 6e 74 65 72 70 20 3d 20 61 70 70 66 73  ..interp = appfs
11b0: 5f 63 72 65 61 74 65 5f 54 63 6c 49 6e 74 65 72  _create_TclInter
11c0: 70 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 63  p(globalThread.c
11d0: 61 63 68 65 64 69 72 29 3b 0a 0a 09 09 69 66 20  achedir);....if 
11e0: 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 29  (interp == NULL)
11f0: 20 7b 0a 09 09 09 72 65 74 75 72 6e 3b 0a 09 09   {....return;...
1200: 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 73 65 74  }....pthread_set
1210: 73 70 65 63 69 66 69 63 28 69 6e 74 65 72 70 4b  specific(interpK
1220: 65 79 2c 20 69 6e 74 65 72 70 29 3b 0a 09 7d 0a  ey, interp);..}.
1230: 0a 09 74 63 6c 5f 72 65 74 20 3d 20 61 70 70 66  ..tcl_ret = appf
1240: 73 5f 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72  s_Tcl_Eval(inter
1250: 70 2c 20 32 2c 20 22 3a 3a 61 70 70 66 73 3a 3a  p, 2, "::appfs::
1260: 67 65 74 69 6e 64 65 78 22 2c 20 68 6f 73 74 6e  getindex", hostn
1270: 61 6d 65 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72  ame);..if (tcl_r
1280: 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  et != TCL_OK) {.
1290: 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 43  ..APPFS_DEBUG("C
12a0: 61 6c 6c 20 74 6f 20 3a 3a 61 70 70 66 73 3a 3a  all to ::appfs::
12b0: 67 65 74 69 6e 64 65 78 20 66 61 69 6c 65 64 3a  getindex failed:
12c0: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 53 74 72   %s", Tcl_GetStr
12d0: 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
12e0: 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09  ));....return;..
12f0: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73  }...return;.}..s
1300: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1310: 20 2a 61 70 70 66 73 5f 67 65 74 66 69 6c 65 28   *appfs_getfile(
1320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f 73 74  const char *host
1330: 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  name, const char
1340: 20 2a 73 68 61 31 29 20 7b 0a 09 54 63 6c 5f 49   *sha1) {..Tcl_I
1350: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 09  nterp *interp;..
1360: 63 68 61 72 20 2a 72 65 74 76 61 6c 3b 0a 09 69  char *retval;..i
1370: 6e 74 20 74 63 6c 5f 72 65 74 3b 0a 0a 09 69 6e  nt tcl_ret;...in
1380: 74 65 72 70 20 3d 20 70 74 68 72 65 61 64 5f 67  terp = pthread_g
1390: 65 74 73 70 65 63 69 66 69 63 28 69 6e 74 65 72  etspecific(inter
13a0: 70 4b 65 79 29 3b 0a 09 69 66 20 28 69 6e 74 65  pKey);..if (inte
13b0: 72 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rp == NULL) {...
13c0: 69 6e 74 65 72 70 20 3d 20 61 70 70 66 73 5f 63  interp = appfs_c
13d0: 72 65 61 74 65 5f 54 63 6c 49 6e 74 65 72 70 28  reate_TclInterp(
13e0: 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 63 61 63  globalThread.cac
13f0: 68 65 64 69 72 29 3b 0a 0a 09 09 69 66 20 28 69  hedir);....if (i
1400: 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  nterp == NULL) {
1410: 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
1420: 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64  ;...}....pthread
1430: 5f 73 65 74 73 70 65 63 69 66 69 63 28 69 6e 74  _setspecific(int
1440: 65 72 70 4b 65 79 2c 20 69 6e 74 65 72 70 29 3b  erpKey, interp);
1450: 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20  ..}...tcl_ret = 
1460: 61 70 70 66 73 5f 54 63 6c 5f 45 76 61 6c 28 69  appfs_Tcl_Eval(i
1470: 6e 74 65 72 70 2c 20 33 2c 20 22 3a 3a 61 70 70  nterp, 3, "::app
1480: 66 73 3a 3a 64 6f 77 6e 6c 6f 61 64 22 2c 20 68  fs::download", h
1490: 6f 73 74 6e 61 6d 65 2c 20 73 68 61 31 29 3b 0a  ostname, sha1);.
14a0: 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20  .if (tcl_ret != 
14b0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46  TCL_OK) {...APPF
14c0: 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f  S_DEBUG("Call to
14d0: 20 3a 3a 61 70 70 66 73 3a 3a 64 6f 77 6e 6c 6f   ::appfs::downlo
14e0: 61 64 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20  ad failed: %s", 
14f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
1500: 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09  ult(interp));...
1510: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
1520: 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72  }...retval = str
1530: 64 75 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  dup(Tcl_GetStrin
1540: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 29  gResult(interp))
1550: 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
1560: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  l);.}..static vo
1570: 69 64 20 61 70 70 66 73 5f 75 70 64 61 74 65 5f  id appfs_update_
1580: 6d 61 6e 69 66 65 73 74 28 63 6f 6e 73 74 20 63  manifest(const c
1590: 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 63  har *hostname, c
15a0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 68 61 31 29  onst char *sha1)
15b0: 20 7b 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a   {..Tcl_Interp *
15c0: 69 6e 74 65 72 70 3b 0a 09 69 6e 74 20 74 63 6c  interp;..int tcl
15d0: 5f 72 65 74 3b 0a 0a 09 69 6e 74 65 72 70 20 3d  _ret;...interp =
15e0: 20 70 74 68 72 65 61 64 5f 67 65 74 73 70 65 63   pthread_getspec
15f0: 69 66 69 63 28 69 6e 74 65 72 70 4b 65 79 29 3b  ific(interpKey);
1600: 0a 09 69 66 20 28 69 6e 74 65 72 70 20 3d 3d 20  ..if (interp == 
1610: 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 74 65 72 70  NULL) {...interp
1620: 20 3d 20 61 70 70 66 73 5f 63 72 65 61 74 65 5f   = appfs_create_
1630: 54 63 6c 49 6e 74 65 72 70 28 67 6c 6f 62 61 6c  TclInterp(global
1640: 54 68 72 65 61 64 2e 63 61 63 68 65 64 69 72 29  Thread.cachedir)
1650: 3b 0a 0a 09 09 69 66 20 28 69 6e 74 65 72 70 20  ;....if (interp 
1660: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 72 65  == NULL) {....re
1670: 74 75 72 6e 3b 0a 09 09 7d 0a 0a 09 09 70 74 68  turn;...}....pth
1680: 72 65 61 64 5f 73 65 74 73 70 65 63 69 66 69 63  read_setspecific
1690: 28 69 6e 74 65 72 70 4b 65 79 2c 20 69 6e 74 65  (interpKey, inte
16a0: 72 70 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65  rp);..}...tcl_re
16b0: 74 20 3d 20 61 70 70 66 73 5f 54 63 6c 5f 45 76  t = appfs_Tcl_Ev
16c0: 61 6c 28 69 6e 74 65 72 70 2c 20 33 2c 20 22 3a  al(interp, 3, ":
16d0: 3a 61 70 70 66 73 3a 3a 67 65 74 70 6b 67 6d 61  :appfs::getpkgma
16e0: 6e 69 66 65 73 74 22 2c 20 68 6f 73 74 6e 61 6d  nifest", hostnam
16f0: 65 2c 20 73 68 61 31 29 3b 0a 09 69 66 20 28 74  e, sha1);..if (t
1700: 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b  cl_ret != TCL_OK
1710: 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42 55  ) {...APPFS_DEBU
1720: 47 28 22 43 61 6c 6c 20 74 6f 20 3a 3a 61 70 70  G("Call to ::app
1730: 66 73 3a 3a 67 65 74 70 6b 67 6d 61 6e 69 66 65  fs::getpkgmanife
1740: 73 74 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20  st failed: %s", 
1750: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
1760: 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09  ult(interp));...
1770: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 72 65  .return;..}...re
1780: 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  turn;.}..static 
1790: 75 69 64 5f 74 20 61 70 70 66 73 5f 67 65 74 5f  uid_t appfs_get_
17a0: 66 73 75 69 64 28 76 6f 69 64 29 20 7b 0a 09 73  fsuid(void) {..s
17b0: 74 72 75 63 74 20 66 75 73 65 5f 63 6f 6e 74 65  truct fuse_conte
17c0: 78 74 20 2a 63 74 78 3b 0a 0a 09 63 74 78 20 3d  xt *ctx;...ctx =
17d0: 20 66 75 73 65 5f 67 65 74 5f 63 6f 6e 74 65 78   fuse_get_contex
17e0: 74 28 29 3b 0a 09 69 66 20 28 63 74 78 20 3d 3d  t();..if (ctx ==
17f0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
1800: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  n(1);..}...retur
1810: 6e 28 63 74 78 2d 3e 75 69 64 29 3b 0a 7d 0a 0a  n(ctx->uid);.}..
1820: 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 70 70  static char *app
1830: 66 73 5f 67 65 74 5f 68 6f 6d 65 64 69 72 28 75  fs_get_homedir(u
1840: 69 64 5f 74 20 66 73 75 69 64 29 20 7b 0a 09 73  id_t fsuid) {..s
1850: 74 72 75 63 74 20 70 61 73 73 77 64 20 65 6e 74  truct passwd ent
1860: 72 79 2c 20 2a 72 65 73 75 6c 74 3b 0a 09 73 74  ry, *result;..st
1870: 72 75 63 74 20 73 74 61 74 20 73 74 62 75 66 3b  ruct stat stbuf;
1880: 0a 09 63 68 61 72 20 62 75 66 5b 31 30 32 34 5d  ..char buf[1024]
1890: 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  , *retval;..int 
18a0: 67 70 75 5f 72 65 74 2c 20 73 74 61 74 5f 72 65  gpu_ret, stat_re
18b0: 74 3b 0a 0a 09 67 70 75 5f 72 65 74 20 3d 20 67  t;...gpu_ret = g
18c0: 65 74 70 77 75 69 64 5f 72 28 66 73 75 69 64 2c  etpwuid_r(fsuid,
18d0: 20 26 65 6e 74 72 79 2c 20 62 75 66 2c 20 73 69   &entry, buf, si
18e0: 7a 65 6f 66 28 62 75 66 29 2c 20 26 72 65 73 75  zeof(buf), &resu
18f0: 6c 74 29 3b 0a 09 69 66 20 28 67 70 75 5f 72 65  lt);..if (gpu_re
1900: 74 20 21 3d 20 30 29 20 7b 0a 09 09 41 50 50 46  t != 0) {...APPF
1910: 53 5f 44 45 42 55 47 28 22 67 65 74 70 77 75 69  S_DEBUG("getpwui
1920: 64 5f 72 28 25 6c 6c 75 2c 20 2e 2e 2e 29 20 72  d_r(%llu, ...) r
1930: 65 74 75 72 6e 65 64 20 69 6e 20 66 61 69 6c 75  eturned in failu
1940: 72 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  re", (unsigned l
1950: 6f 6e 67 20 6c 6f 6e 67 29 20 66 73 75 69 64 29  ong long) fsuid)
1960: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
1970: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 73 75  );..}...if (resu
1980: 6c 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  lt == NULL) {...
1990: 41 50 50 46 53 5f 44 45 42 55 47 28 22 67 65 74  APPFS_DEBUG("get
19a0: 70 77 75 69 64 5f 72 28 25 6c 6c 75 2c 20 2e 2e  pwuid_r(%llu, ..
19b0: 2e 29 20 72 65 74 75 72 6e 65 64 20 4e 55 4c 4c  .) returned NULL
19c0: 20 72 65 73 75 6c 74 22 2c 20 28 75 6e 73 69 67   result", (unsig
19d0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66  ned long long) f
19e0: 73 75 69 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e  suid);....return
19f0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
1a00: 28 72 65 73 75 6c 74 2d 3e 70 77 5f 64 69 72 20  (result->pw_dir 
1a10: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 41 50 50  == NULL) {...APP
1a20: 46 53 5f 44 45 42 55 47 28 22 67 65 74 70 77 75  FS_DEBUG("getpwu
1a30: 69 64 5f 72 28 25 6c 6c 75 2c 20 2e 2e 2e 29 20  id_r(%llu, ...) 
1a40: 72 65 74 75 72 6e 65 64 20 4e 55 4c 4c 20 68 6f  returned NULL ho
1a50: 6d 65 20 64 69 72 65 63 74 6f 72 79 22 2c 20 28  me directory", (
1a60: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
1a70: 6e 67 29 20 66 73 75 69 64 29 3b 0a 0a 09 09 72  ng) fsuid);....r
1a80: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
1a90: 0a 09 73 74 61 74 5f 72 65 74 20 3d 20 73 74 61  ..stat_ret = sta
1aa0: 74 28 72 65 73 75 6c 74 2d 3e 70 77 5f 64 69 72  t(result->pw_dir
1ab0: 2c 20 26 73 74 62 75 66 29 3b 0a 09 69 66 20 28  , &stbuf);..if (
1ac0: 73 74 61 74 5f 72 65 74 20 21 3d 20 30 29 20 7b  stat_ret != 0) {
1ad0: 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22  ...APPFS_DEBUG("
1ae0: 73 74 61 74 28 25 73 29 20 72 65 74 75 72 6e 65  stat(%s) returne
1af0: 64 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 72  d in failure", r
1b00: 65 73 75 6c 74 2d 3e 70 77 5f 64 69 72 29 3b 0a  esult->pw_dir);.
1b10: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
1b20: 0a 09 7d 0a 0a 09 69 66 20 28 73 74 62 75 66 2e  ..}...if (stbuf.
1b30: 73 74 5f 75 69 64 20 21 3d 20 66 73 75 69 64 29  st_uid != fsuid)
1b40: 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47   {...APPFS_DEBUG
1b50: 28 22 55 49 44 20 6d 69 73 2d 6d 61 74 63 68 20  ("UID mis-match 
1b60: 6f 6e 20 75 73 65 72 20 25 6c 6c 75 27 73 20 68  on user %llu's h
1b70: 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 20 28 25  ome directory (%
1b80: 73 29 2e 20 20 49 74 27 73 20 6f 77 6e 65 64 20  s).  It's owned 
1b90: 62 79 20 25 6c 6c 75 2e 22 2c 0a 09 09 20 20 20  by %llu.",...   
1ba0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20   (unsigned long 
1bb0: 6c 6f 6e 67 29 20 66 73 75 69 64 2c 0a 09 09 20  long) fsuid,... 
1bc0: 20 20 20 72 65 73 75 6c 74 2d 3e 70 77 5f 64 69     result->pw_di
1bd0: 72 2c 0a 09 09 20 20 20 20 28 75 6e 73 69 67 6e  r,...    (unsign
1be0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 73 74  ed long long) st
1bf0: 62 75 66 2e 73 74 5f 75 69 64 0a 09 09 29 3b 0a  buf.st_uid...);.
1c00: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
1c10: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73  ..}...retval = s
1c20: 74 72 64 75 70 28 72 65 73 75 6c 74 2d 3e 70 77  trdup(result->pw
1c30: 5f 64 69 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28  _dir);...return(
1c40: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74  retval);.}..stat
1c50: 69 63 20 69 6e 74 20 74 63 6c 5f 61 70 70 66 73  ic int tcl_appfs
1c60: 5f 67 65 74 5f 68 6f 6d 65 64 69 72 28 43 6c 69  _get_homedir(Cli
1c70: 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f  entData cd, Tcl_
1c80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1c90: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
1ca0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29  j *CONST objv[])
1cb0: 20 7b 0a 09 63 68 61 72 20 2a 68 6f 6d 65 64 69   {..char *homedi
1cc0: 72 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28  r;..        if (
1cd0: 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 20 20 20  objc != 1) {.   
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
1cf0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1d00: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 4e  terp, 1, objv, N
1d10: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULL);.          
1d20: 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c        return(TCL
1d30: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 20 20 20  _ERROR);.       
1d40: 20 7d 0a 0a 09 68 6f 6d 65 64 69 72 20 3d 20 61   }...homedir = a
1d50: 70 70 66 73 5f 67 65 74 5f 68 6f 6d 65 64 69 72  ppfs_get_homedir
1d60: 28 61 70 70 66 73 5f 67 65 74 5f 66 73 75 69 64  (appfs_get_fsuid
1d70: 28 29 29 3b 0a 0a 09 69 66 20 28 68 6f 6d 65 64  ());...if (homed
1d80: 69 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ir == NULL) {...
1d90: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
1da0: 29 3b 0a 09 7d 0a 0a 20 20 20 20 20 20 20 20 54  );..}..        T
1db0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1dc0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
1dd0: 74 72 69 6e 67 4f 62 6a 28 68 6f 6d 65 64 69 72  tringObj(homedir
1de0: 2c 20 2d 31 29 29 3b 0a 0a 09 66 72 65 65 28 68  , -1));...free(h
1df0: 6f 6d 65 64 69 72 29 3b 0a 0a 20 20 20 20 20 20  omedir);..      
1e00: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
1e10: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75  ;.}..static stru
1e20: 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65  ct appfs_childre
1e30: 6e 20 2a 61 70 70 66 73 5f 67 65 74 63 68 69 6c  n *appfs_getchil
1e40: 64 72 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  dren(const char 
1e50: 2a 68 6f 73 74 6e 61 6d 65 2c 20 63 6f 6e 73 74  *hostname, const
1e60: 20 63 68 61 72 20 2a 70 61 63 6b 61 67 65 5f 68   char *package_h
1e70: 61 73 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ash, const char 
1e80: 2a 70 61 74 68 2c 20 69 6e 74 20 2a 63 68 69 6c  *path, int *chil
1e90: 64 72 65 6e 5f 63 6f 75 6e 74 5f 70 29 20 7b 0a  dren_count_p) {.
1ea0: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
1eb0: 61 70 70 66 73 5f 6c 6f 6f 6b 75 70 5f 70 61 63  appfs_lookup_pac
1ec0: 6b 61 67 65 5f 68 61 73 68 28 63 6f 6e 73 74 20  kage_hash(const 
1ed0: 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20  char *hostname, 
1ee0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 63 6b  const char *pack
1ef0: 61 67 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  age, const char 
1f00: 2a 6f 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *os, const char 
1f10: 2a 63 70 75 41 72 63 68 2c 20 63 6f 6e 73 74 20  *cpuArch, const 
1f20: 63 68 61 72 20 2a 76 65 72 73 69 6f 6e 29 20 7b  char *version) {
1f30: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
1f40: 70 70 66 73 5f 67 65 74 66 69 6c 65 69 6e 66 6f  ppfs_getfileinfo
1f50: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f 73  (const char *hos
1f60: 74 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  tname, const cha
1f70: 72 20 2a 70 61 63 6b 61 67 65 5f 68 61 73 68 2c  r *package_hash,
1f80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 70 61   const char *_pa
1f90: 74 68 2c 20 73 74 72 75 63 74 20 61 70 70 66 73  th, struct appfs
1fa0: 5f 70 61 74 68 69 6e 66 6f 20 2a 70 61 74 68 69  _pathinfo *pathi
1fb0: 6e 66 6f 29 20 7b 0a 7d 0a 0a 2f 2a 20 47 65 6e  nfo) {.}../* Gen
1fc0: 65 72 61 74 65 20 61 6e 20 69 6e 6f 64 65 20 66  erate an inode f
1fd0: 6f 72 20 61 20 67 69 76 65 6e 20 70 61 74 68 20  or a given path 
1fe0: 2a 2f 0a 73 74 61 74 69 63 20 6c 6f 6e 67 20 6c  */.static long l
1ff0: 6f 6e 67 20 61 70 70 66 73 5f 67 65 74 5f 70 61  ong appfs_get_pa
2000: 74 68 5f 69 6e 6f 64 65 28 63 6f 6e 73 74 20 63  th_inode(const c
2010: 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 09 6c 6f  har *path) {..lo
2020: 6e 67 20 6c 6f 6e 67 20 72 65 74 76 61 6c 3b 0a  ng long retval;.
2030: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0a  .const char *p;.
2040: 0a 09 72 65 74 76 61 6c 20 3d 20 31 30 3b 0a 0a  ..retval = 10;..
2050: 09 66 6f 72 20 28 70 20 3d 20 70 61 74 68 3b 20  .for (p = path; 
2060: 2a 70 3b 20 70 2b 2b 29 20 7b 0a 09 09 72 65 74  *p; p++) {...ret
2070: 76 61 6c 20 25 3d 20 34 32 39 30 39 36 30 32 39  val %= 429096029
2080: 30 55 4c 4c 3b 0a 09 09 72 65 74 76 61 6c 20 2b  0ULL;...retval +
2090: 3d 20 2a 70 3b 0a 09 09 72 65 74 76 61 6c 20 3c  = *p;...retval <
20a0: 3c 3d 20 37 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  <= 7;..}...retva
20b0: 6c 20 2b 3d 20 31 30 3b 0a 09 72 65 74 76 61 6c  l += 10;..retval
20c0: 20 25 3d 20 34 32 39 34 39 36 37 32 39 36 55 4c   %= 4294967296UL
20d0: 4c 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  L;...return(retv
20e0: 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 74 20 69  al);.}../* Get i
20f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
2100: 20 61 20 70 61 74 68 2c 20 61 6e 64 20 6f 70 74   a path, and opt
2110: 69 6f 6e 61 6c 6c 79 20 6c 69 73 74 20 63 68 69  ionally list chi
2120: 6c 64 72 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ldren */.static 
2130: 69 6e 74 20 61 70 70 66 73 5f 67 65 74 5f 70 61  int appfs_get_pa
2140: 74 68 5f 69 6e 66 6f 28 63 6f 6e 73 74 20 63 68  th_info(const ch
2150: 61 72 20 2a 5f 70 61 74 68 2c 20 73 74 72 75 63  ar *_path, struc
2160: 74 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f  t appfs_pathinfo
2170: 20 2a 70 61 74 68 69 6e 66 6f 2c 20 73 74 72 75   *pathinfo, stru
2180: 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65  ct appfs_childre
2190: 6e 20 2a 2a 63 68 69 6c 64 72 65 6e 29 20 7b 0a  n **children) {.
21a0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  }..static int ap
21b0: 70 66 73 5f 66 75 73 65 5f 67 65 74 61 74 74 72  pfs_fuse_getattr
21c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74  (const char *pat
21d0: 68 2c 20 73 74 72 75 63 74 20 73 74 61 74 20 2a  h, struct stat *
21e0: 73 74 62 75 66 29 20 7b 0a 09 73 74 72 75 63 74  stbuf) {..struct
21f0: 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20   appfs_pathinfo 
2200: 70 61 74 68 69 6e 66 6f 3b 0a 09 69 6e 74 20 72  pathinfo;..int r
2210: 65 73 20 3d 20 30 3b 0a 0a 09 41 50 50 46 53 5f  es = 0;...APPFS_
2220: 44 45 42 55 47 28 22 45 6e 74 65 72 20 28 70 61  DEBUG("Enter (pa
2230: 74 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c 20  th = %s, ...)", 
2240: 70 61 74 68 29 3b 0a 0a 09 70 61 74 68 69 6e 66  path);...pathinf
2250: 6f 2e 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50  o.type = APPFS_P
2260: 41 54 48 54 59 50 45 5f 49 4e 56 41 4c 49 44 3b  ATHTYPE_INVALID;
2270: 0a 0a 09 72 65 73 20 3d 20 61 70 70 66 73 5f 67  ...res = appfs_g
2280: 65 74 5f 70 61 74 68 5f 69 6e 66 6f 28 70 61 74  et_path_info(pat
2290: 68 2c 20 26 70 61 74 68 69 6e 66 6f 2c 20 4e 55  h, &pathinfo, NU
22a0: 4c 4c 29 3b 0a 09 69 66 20 28 72 65 73 20 21 3d  LL);..if (res !=
22b0: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 72   0) {...return(r
22c0: 65 73 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74  es);..}...memset
22d0: 28 73 74 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  (stbuf, 0, sizeo
22e0: 66 28 73 74 72 75 63 74 20 73 74 61 74 29 29 3b  f(struct stat));
22f0: 0a 0a 09 73 74 62 75 66 2d 3e 73 74 5f 6d 74 69  ...stbuf->st_mti
2300: 6d 65 20 3d 20 70 61 74 68 69 6e 66 6f 2e 74 69  me = pathinfo.ti
2310: 6d 65 3b 0a 09 73 74 62 75 66 2d 3e 73 74 5f 63  me;..stbuf->st_c
2320: 74 69 6d 65 20 3d 20 70 61 74 68 69 6e 66 6f 2e  time = pathinfo.
2330: 74 69 6d 65 3b 0a 09 73 74 62 75 66 2d 3e 73 74  time;..stbuf->st
2340: 5f 61 74 69 6d 65 20 3d 20 70 61 74 68 69 6e 66  _atime = pathinf
2350: 6f 2e 74 69 6d 65 3b 0a 09 73 74 62 75 66 2d 3e  o.time;..stbuf->
2360: 73 74 5f 69 6e 6f 20 20 20 3d 20 70 61 74 68 69  st_ino   = pathi
2370: 6e 66 6f 2e 69 6e 6f 64 65 3b 0a 09 73 74 62 75  nfo.inode;..stbu
2380: 66 2d 3e 73 74 5f 6d 6f 64 65 20 20 3d 20 30 3b  f->st_mode  = 0;
2390: 0a 0a 09 73 77 69 74 63 68 20 28 70 61 74 68 69  ...switch (pathi
23a0: 6e 66 6f 2e 74 79 70 65 29 20 7b 0a 09 09 63 61  nfo.type) {...ca
23b0: 73 65 20 41 50 50 46 53 5f 50 41 54 48 54 59 50  se APPFS_PATHTYP
23c0: 45 5f 44 49 52 45 43 54 4f 52 59 3a 0a 09 09 09  E_DIRECTORY:....
23d0: 73 74 62 75 66 2d 3e 73 74 5f 6d 6f 64 65 20 3d  stbuf->st_mode =
23e0: 20 53 5f 49 46 44 49 52 20 7c 20 30 35 35 35 3b   S_IFDIR | 0555;
23f0: 0a 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 6e 6c  ....stbuf->st_nl
2400: 69 6e 6b 20 3d 20 32 20 2b 20 70 61 74 68 69 6e  ink = 2 + pathin
2410: 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 64 69 72 2e  fo.typeinfo.dir.
2420: 63 68 69 6c 64 63 6f 75 6e 74 3b 0a 09 09 09 62  childcount;....b
2430: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 41 50 50  reak;...case APP
2440: 46 53 5f 50 41 54 48 54 59 50 45 5f 46 49 4c 45  FS_PATHTYPE_FILE
2450: 3a 0a 09 09 09 69 66 20 28 70 61 74 68 69 6e 66  :....if (pathinf
2460: 6f 2e 74 79 70 65 69 6e 66 6f 2e 66 69 6c 65 2e  o.typeinfo.file.
2470: 65 78 65 63 75 74 61 62 6c 65 29 20 7b 0a 09 09  executable) {...
2480: 09 09 73 74 62 75 66 2d 3e 73 74 5f 6d 6f 64 65  ..stbuf->st_mode
2490: 20 3d 20 53 5f 49 46 52 45 47 20 7c 20 30 35 35   = S_IFREG | 055
24a0: 35 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  5;....} else {..
24b0: 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 6d 6f 64  ...stbuf->st_mod
24c0: 65 20 3d 20 53 5f 49 46 52 45 47 20 7c 20 30 34  e = S_IFREG | 04
24d0: 34 34 3b 0a 09 09 09 7d 0a 0a 09 09 09 73 74 62  44;....}.....stb
24e0: 75 66 2d 3e 73 74 5f 6e 6c 69 6e 6b 20 3d 20 31  uf->st_nlink = 1
24f0: 3b 0a 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 73  ;....stbuf->st_s
2500: 69 7a 65 20 3d 20 70 61 74 68 69 6e 66 6f 2e 74  ize = pathinfo.t
2510: 79 70 65 69 6e 66 6f 2e 66 69 6c 65 2e 73 69 7a  ypeinfo.file.siz
2520: 65 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  e;....break;...c
2530: 61 73 65 20 41 50 50 46 53 5f 50 41 54 48 54 59  ase APPFS_PATHTY
2540: 50 45 5f 53 59 4d 4c 49 4e 4b 3a 0a 09 09 09 73  PE_SYMLINK:....s
2550: 74 62 75 66 2d 3e 73 74 5f 6d 6f 64 65 20 3d 20  tbuf->st_mode = 
2560: 53 5f 49 46 4c 4e 4b 20 7c 20 30 35 35 35 3b 0a  S_IFLNK | 0555;.
2570: 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 6e 6c 69  ...stbuf->st_nli
2580: 6e 6b 20 3d 20 31 3b 0a 09 09 09 73 74 62 75 66  nk = 1;....stbuf
2590: 2d 3e 73 74 5f 73 69 7a 65 20 3d 20 70 61 74 68  ->st_size = path
25a0: 69 6e 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 73 79  info.typeinfo.sy
25b0: 6d 6c 69 6e 6b 2e 73 69 7a 65 3b 0a 09 09 09 62  mlink.size;....b
25c0: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 41 50 50  reak;...case APP
25d0: 46 53 5f 50 41 54 48 54 59 50 45 5f 49 4e 56 41  FS_PATHTYPE_INVA
25e0: 4c 49 44 3a 0a 09 09 09 72 65 73 20 3d 20 2d 45  LID:....res = -E
25f0: 49 4f 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IO;.....break;..
2600: 7d 0a 0a 09 69 66 20 28 70 61 74 68 69 6e 66 6f  }...if (pathinfo
2610: 2e 70 61 63 6b 61 67 65 64 29 20 7b 0a 09 09 69  .packaged) {...i
2620: 66 20 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e  f (globalThread.
2630: 6f 70 74 69 6f 6e 73 2e 77 72 69 74 61 62 6c 65  options.writable
2640: 29 20 7b 0a 09 09 09 73 74 62 75 66 2d 3e 73 74  ) {....stbuf->st
2650: 5f 6d 6f 64 65 20 7c 3d 20 30 32 32 32 3b 0a 09  _mode |= 0222;..
2660: 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 72  .}..}...return r
2670: 65 73 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  es;.}..static in
2680: 74 20 61 70 70 66 73 5f 66 75 73 65 5f 72 65 61  t appfs_fuse_rea
2690: 64 64 69 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ddir(const char 
26a0: 2a 70 61 74 68 2c 20 76 6f 69 64 20 2a 62 75 66  *path, void *buf
26b0: 2c 20 66 75 73 65 5f 66 69 6c 6c 5f 64 69 72 5f  , fuse_fill_dir_
26c0: 74 20 66 69 6c 6c 65 72 2c 20 6f 66 66 5f 74 20  t filler, off_t 
26d0: 6f 66 66 73 65 74 2c 20 73 74 72 75 63 74 20 66  offset, struct f
26e0: 75 73 65 5f 66 69 6c 65 5f 69 6e 66 6f 20 2a 66  use_file_info *f
26f0: 69 29 20 7b 0a 09 73 74 72 75 63 74 20 61 70 70  i) {..struct app
2700: 66 73 5f 70 61 74 68 69 6e 66 6f 20 70 61 74 68  fs_pathinfo path
2710: 69 6e 66 6f 3b 0a 09 73 74 72 75 63 74 20 61 70  info;..struct ap
2720: 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a 63 68  pfs_children *ch
2730: 69 6c 64 72 65 6e 2c 20 2a 63 68 69 6c 64 3b 0a  ildren, *child;.
2740: 09 69 6e 74 20 72 65 74 76 61 6c 3b 0a 0a 09 41  .int retval;...A
2750: 50 50 46 53 5f 44 45 42 55 47 28 22 45 6e 74 65  PPFS_DEBUG("Ente
2760: 72 20 28 70 61 74 68 20 3d 20 25 73 2c 20 2e 2e  r (path = %s, ..
2770: 2e 29 22 2c 20 70 61 74 68 29 3b 0a 0a 09 72 65  .)", path);...re
2780: 74 76 61 6c 20 3d 20 61 70 70 66 73 5f 67 65 74  tval = appfs_get
2790: 5f 70 61 74 68 5f 69 6e 66 6f 28 70 61 74 68 2c  _path_info(path,
27a0: 20 26 70 61 74 68 69 6e 66 6f 2c 20 26 63 68 69   &pathinfo, &chi
27b0: 6c 64 72 65 6e 29 3b 0a 09 69 66 20 28 72 65 74  ldren);..if (ret
27c0: 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 72 65  val != 0) {...re
27d0: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d  turn(retval);..}
27e0: 0a 0a 09 66 69 6c 6c 65 72 28 62 75 66 2c 20 22  ...filler(buf, "
27f0: 2e 22 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 66  .", NULL, 0);..f
2800: 69 6c 6c 65 72 28 62 75 66 2c 20 22 2e 2e 22 2c  iller(buf, "..",
2810: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 66 6f 72   NULL, 0);...for
2820: 20 28 63 68 69 6c 64 20 3d 20 63 68 69 6c 64 72   (child = childr
2830: 65 6e 3b 20 63 68 69 6c 64 3b 20 63 68 69 6c 64  en; child; child
2840: 20 3d 20 63 68 69 6c 64 2d 3e 5f 6e 65 78 74 29   = child->_next)
2850: 20 7b 0a 09 09 66 69 6c 6c 65 72 28 62 75 66 2c   {...filler(buf,
2860: 20 63 68 69 6c 64 2d 3e 6e 61 6d 65 2c 20 4e 55   child->name, NU
2870: 4c 4c 2c 20 30 29 3b 0a 09 7d 0a 0a 09 61 70 70  LL, 0);..}...app
2880: 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f 63 68 69  fs_free_list_chi
2890: 6c 64 72 65 6e 28 63 68 69 6c 64 72 65 6e 29 3b  ldren(children);
28a0: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
28b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
28c0: 73 5f 66 75 73 65 5f 6f 70 65 6e 28 63 6f 6e 73  s_fuse_open(cons
28d0: 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74  t char *path, st
28e0: 72 75 63 74 20 66 75 73 65 5f 66 69 6c 65 5f 69  ruct fuse_file_i
28f0: 6e 66 6f 20 2a 66 69 29 20 7b 0a 09 73 74 72 75  nfo *fi) {..stru
2900: 63 74 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66  ct appfs_pathinf
2910: 6f 20 70 61 74 68 69 6e 66 6f 3b 0a 09 63 6f 6e  o pathinfo;..con
2920: 73 74 20 63 68 61 72 20 2a 72 65 61 6c 5f 70 61  st char *real_pa
2930: 74 68 3b 0a 09 69 6e 74 20 66 68 3b 0a 09 69 6e  th;..int fh;..in
2940: 74 20 67 70 69 5f 72 65 74 3b 0a 0a 09 41 50 50  t gpi_ret;...APP
2950: 46 53 5f 44 45 42 55 47 28 22 45 6e 74 65 72 20  FS_DEBUG("Enter 
2960: 28 70 61 74 68 20 3d 20 25 73 2c 20 2e 2e 2e 29  (path = %s, ...)
2970: 22 2c 20 70 61 74 68 29 3b 0a 0a 09 69 66 20 28  ", path);...if (
2980: 28 66 69 2d 3e 66 6c 61 67 73 20 26 20 33 29 20  (fi->flags & 3) 
2990: 21 3d 20 4f 5f 52 44 4f 4e 4c 59 29 20 7b 0a 20  != O_RDONLY) {. 
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
29b0: 65 74 75 72 6e 28 2d 45 41 43 43 45 53 29 3b 0a  eturn(-EACCES);.
29c0: 09 7d 0a 0a 09 67 70 69 5f 72 65 74 20 3d 20 61  .}...gpi_ret = a
29d0: 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f 69 6e  ppfs_get_path_in
29e0: 66 6f 28 70 61 74 68 2c 20 26 70 61 74 68 69 6e  fo(path, &pathin
29f0: 66 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  fo, NULL);..if (
2a00: 67 70 69 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  gpi_ret != 0) {.
2a10: 09 09 72 65 74 75 72 6e 28 67 70 69 5f 72 65 74  ..return(gpi_ret
2a20: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 61 74 68  );..}...if (path
2a30: 69 6e 66 6f 2e 74 79 70 65 20 3d 3d 20 41 50 50  info.type == APP
2a40: 46 53 5f 50 41 54 48 54 59 50 45 5f 44 49 52 45  FS_PATHTYPE_DIRE
2a50: 43 54 4f 52 59 29 20 7b 0a 09 09 72 65 74 75 72  CTORY) {...retur
2a60: 6e 28 2d 45 49 53 44 49 52 29 3b 0a 09 7d 0a 0a  n(-EISDIR);..}..
2a70: 09 72 65 61 6c 5f 70 61 74 68 20 3d 20 61 70 70  .real_path = app
2a80: 66 73 5f 67 65 74 66 69 6c 65 28 70 61 74 68 69  fs_getfile(pathi
2a90: 6e 66 6f 2e 68 6f 73 74 6e 61 6d 65 2c 20 70 61  nfo.hostname, pa
2aa0: 74 68 69 6e 66 6f 2e 74 79 70 65 69 6e 66 6f 2e  thinfo.typeinfo.
2ab0: 66 69 6c 65 2e 73 68 61 31 29 3b 0a 09 69 66 20  file.sha1);..if 
2ac0: 28 72 65 61 6c 5f 70 61 74 68 20 3d 3d 20 4e 55  (real_path == NU
2ad0: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d  LL) {...return(-
2ae0: 45 49 4f 29 3b 0a 09 7d 0a 0a 09 66 68 20 3d 20  EIO);..}...fh = 
2af0: 6f 70 65 6e 28 72 65 61 6c 5f 70 61 74 68 2c 20  open(real_path, 
2b00: 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 66 72 65 65  O_RDONLY);..free
2b10: 28 28 76 6f 69 64 20 2a 29 20 72 65 61 6c 5f 70  ((void *) real_p
2b20: 61 74 68 29 3b 0a 09 69 66 20 28 66 68 20 3c 20  ath);..if (fh < 
2b30: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45  0) {...return(-E
2b40: 49 4f 29 3b 0a 09 7d 0a 0a 09 66 69 2d 3e 66 68  IO);..}...fi->fh
2b50: 20 3d 20 66 68 3b 0a 0a 09 72 65 74 75 72 6e 28   = fh;...return(
2b60: 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  0);.}..static in
2b70: 74 20 61 70 70 66 73 5f 66 75 73 65 5f 63 6c 6f  t appfs_fuse_clo
2b80: 73 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  se(const char *p
2b90: 61 74 68 2c 20 73 74 72 75 63 74 20 66 75 73 65  ath, struct fuse
2ba0: 5f 66 69 6c 65 5f 69 6e 66 6f 20 2a 66 69 29 20  _file_info *fi) 
2bb0: 7b 0a 09 69 6e 74 20 63 6c 6f 73 65 5f 72 65 74  {..int close_ret
2bc0: 3b 0a 0a 09 63 6c 6f 73 65 5f 72 65 74 20 3d 20  ;...close_ret = 
2bd0: 63 6c 6f 73 65 28 66 69 2d 3e 66 68 29 3b 0a 09  close(fi->fh);..
2be0: 69 66 20 28 63 6c 6f 73 65 5f 72 65 74 20 21 3d  if (close_ret !=
2bf0: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d   0) {...return(-
2c00: 45 49 4f 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  EIO);..}...retur
2c10: 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(0);.}..static 
2c20: 69 6e 74 20 61 70 70 66 73 5f 66 75 73 65 5f 72  int appfs_fuse_r
2c30: 65 61 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ead(const char *
2c40: 70 61 74 68 2c 20 63 68 61 72 20 2a 62 75 66 2c  path, char *buf,
2c50: 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 6f 66   size_t size, of
2c60: 66 5f 74 20 6f 66 66 73 65 74 2c 20 73 74 72 75  f_t offset, stru
2c70: 63 74 20 66 75 73 65 5f 66 69 6c 65 5f 69 6e 66  ct fuse_file_inf
2c80: 6f 20 2a 66 69 29 20 7b 0a 09 6f 66 66 5f 74 20  o *fi) {..off_t 
2c90: 6c 73 65 65 6b 5f 72 65 74 3b 0a 09 73 73 69 7a  lseek_ret;..ssiz
2ca0: 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 0a 09  e_t read_ret;...
2cb0: 41 50 50 46 53 5f 44 45 42 55 47 28 22 45 6e 74  APPFS_DEBUG("Ent
2cc0: 65 72 20 28 70 61 74 68 20 3d 20 25 73 2c 20 2e  er (path = %s, .
2cd0: 2e 2e 29 22 2c 20 70 61 74 68 29 3b 0a 0a 09 6c  ..)", path);...l
2ce0: 73 65 65 6b 5f 72 65 74 20 3d 20 6c 73 65 65 6b  seek_ret = lseek
2cf0: 28 66 69 2d 3e 66 68 2c 20 6f 66 66 73 65 74 2c  (fi->fh, offset,
2d00: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 09 69 66 20   SEEK_SET);..if 
2d10: 28 6c 73 65 65 6b 5f 72 65 74 20 21 3d 20 6f 66  (lseek_ret != of
2d20: 66 73 65 74 29 20 7b 0a 09 09 72 65 74 75 72 6e  fset) {...return
2d30: 28 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 72 65 61  (-EIO);..}...rea
2d40: 64 5f 72 65 74 20 3d 20 72 65 61 64 28 66 69 2d  d_ret = read(fi-
2d50: 3e 66 68 2c 20 62 75 66 2c 20 73 69 7a 65 29 3b  >fh, buf, size);
2d60: 0a 0a 09 72 65 74 75 72 6e 28 72 65 61 64 5f 72  ...return(read_r
2d70: 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73  et);.}..static s
2d80: 74 72 75 63 74 20 66 75 73 65 5f 6f 70 65 72 61  truct fuse_opera
2d90: 74 69 6f 6e 73 20 61 70 70 66 73 5f 6f 70 65 72  tions appfs_oper
2da0: 20 3d 20 7b 0a 09 2e 67 65 74 61 74 74 72 20 20   = {...getattr  
2db0: 20 3d 20 61 70 70 66 73 5f 66 75 73 65 5f 67 65   = appfs_fuse_ge
2dc0: 74 61 74 74 72 2c 0a 09 2e 72 65 61 64 64 69 72  tattr,...readdir
2dd0: 20 20 20 3d 20 61 70 70 66 73 5f 66 75 73 65 5f     = appfs_fuse_
2de0: 72 65 61 64 64 69 72 2c 0a 09 2e 72 65 61 64 6c  readdir,...readl
2df0: 69 6e 6b 20 20 3d 20 61 70 70 66 73 5f 66 75 73  ink  = appfs_fus
2e00: 65 5f 72 65 61 64 6c 69 6e 6b 2c 0a 09 2e 6f 70  e_readlink,...op
2e10: 65 6e 20 20 20 20 20 20 3d 20 61 70 70 66 73 5f  en      = appfs_
2e20: 66 75 73 65 5f 6f 70 65 6e 2c 0a 09 2e 72 65 6c  fuse_open,...rel
2e30: 65 61 73 65 20 20 20 3d 20 61 70 70 66 73 5f 66  ease   = appfs_f
2e40: 75 73 65 5f 63 6c 6f 73 65 2c 0a 09 2e 72 65 61  use_close,...rea
2e50: 64 20 20 20 20 20 20 3d 20 61 70 70 66 73 5f 66  d      = appfs_f
2e60: 75 73 65 5f 72 65 61 64 0a 7d 3b 0a 0a 69 6e 74  use_read.};..int
2e70: 20 41 70 70 66 73 64 5f 49 6e 69 74 28 54 63 6c   Appfsd_Init(Tcl
2e80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
2e90: 20 7b 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43   {.#ifdef USE_TC
2ea0: 4c 5f 53 54 55 42 53 0a 09 69 66 20 28 54 63 6c  L_STUBS..if (Tcl
2eb0: 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72  _InitStubs(inter
2ec0: 70 2c 20 54 43 4c 5f 56 45 52 53 49 4f 4e 2c 20  p, TCL_VERSION, 
2ed0: 30 29 20 3d 3d 20 30 4c 29 20 7b 0a 09 09 72 65  0) == 0L) {...re
2ee0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
2ef0: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 54 63 6c  ..}.#endif...Tcl
2f00: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
2f10: 64 28 69 6e 74 65 72 70 2c 20 22 61 70 70 66 73  d(interp, "appfs
2f20: 64 3a 3a 67 65 74 5f 68 6f 6d 65 64 69 72 22 2c  d::get_homedir",
2f30: 20 74 63 6c 5f 61 70 70 66 73 5f 67 65 74 5f 68   tcl_appfs_get_h
2f40: 6f 6d 65 64 69 72 2c 20 4e 55 4c 4c 2c 20 4e 55  omedir, NULL, NU
2f50: 4c 4c 29 3b 0a 0a 09 54 63 6c 5f 50 6b 67 50 72  LL);...Tcl_PkgPr
2f60: 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 61  ovide(interp, "a
2f70: 70 70 66 73 64 22 2c 20 22 31 2e 30 22 29 3b 0a  ppfsd", "1.0");.
2f80: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29  ..return(TCL_OK)
2f90: 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e  ;.}..int main(in
2fa0: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
2fb0: 72 67 76 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68  rgv) {..const ch
2fc0: 61 72 20 2a 63 61 63 68 65 64 69 72 20 3d 20 41  ar *cachedir = A
2fd0: 50 50 46 53 5f 43 41 43 48 45 44 49 52 3b 0a 09  PPFS_CACHEDIR;..
2fe0: 63 68 61 72 20 64 62 66 69 6c 65 6e 61 6d 65 5b  char dbfilename[
2ff0: 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 74 68 72  1024];..int pthr
3000: 65 61 64 5f 72 65 74 2c 20 73 6e 70 72 69 6e 74  ead_ret, snprint
3010: 66 5f 72 65 74 3b 0a 0a 09 67 6c 6f 62 61 6c 54  f_ret;...globalT
3020: 68 72 65 61 64 2e 63 61 63 68 65 64 69 72 20 3d  hread.cachedir =
3030: 20 63 61 63 68 65 64 69 72 3b 0a 09 67 6c 6f 62   cachedir;..glob
3040: 61 6c 54 68 72 65 61 64 2e 62 6f 6f 74 74 69 6d  alThread.boottim
3050: 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a  e = time(NULL);.
3060: 09 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 6f 70  .globalThread.op
3070: 74 69 6f 6e 73 2e 77 72 69 74 61 62 6c 65 20 3d  tions.writable =
3080: 20 31 3b 0a 0a 09 54 63 6c 5f 53 74 61 74 69 63   1;...Tcl_Static
3090: 50 61 63 6b 61 67 65 28 4e 55 4c 4c 2c 20 22 73  Package(NULL, "s
30a0: 68 61 31 22 2c 20 53 68 61 31 5f 49 6e 69 74 2c  ha1", Sha1_Init,
30b0: 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 74 61   NULL);..Tcl_Sta
30c0: 74 69 63 50 61 63 6b 61 67 65 28 4e 55 4c 4c 2c  ticPackage(NULL,
30d0: 20 22 61 70 70 66 73 64 22 2c 20 41 70 70 66 73   "appfsd", Appfs
30e0: 64 5f 49 6e 69 74 2c 20 4e 55 4c 4c 29 3b 0a 0a  d_Init, NULL);..
30f0: 09 70 74 68 72 65 61 64 5f 72 65 74 20 3d 20 70  .pthread_ret = p
3100: 74 68 72 65 61 64 5f 6b 65 79 5f 63 72 65 61 74  thread_key_creat
3110: 65 28 26 69 6e 74 65 72 70 4b 65 79 2c 20 4e 55  e(&interpKey, NU
3120: 4c 4c 29 3b 0a 09 69 66 20 28 70 74 68 72 65 61  LL);..if (pthrea
3130: 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  d_ret != 0) {...
3140: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
3150: 22 55 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74  "Unable to creat
3160: 65 20 54 53 44 20 6b 65 79 20 66 6f 72 20 54 63  e TSD key for Tc
3170: 6c 2e 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22  l.  Aborting.\n"
3180: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
3190: 0a 09 7d 0a 0a 09 73 6e 70 72 69 6e 74 66 5f 72  ..}...snprintf_r
31a0: 65 74 20 3d 20 73 6e 70 72 69 6e 74 66 28 64 62  et = snprintf(db
31b0: 66 69 6c 65 6e 61 6d 65 2c 20 73 69 7a 65 6f 66  filename, sizeof
31c0: 28 64 62 66 69 6c 65 6e 61 6d 65 29 2c 20 22 25  (dbfilename), "%
31d0: 73 2f 25 73 22 2c 20 63 61 63 68 65 64 69 72 2c  s/%s", cachedir,
31e0: 20 22 63 61 63 68 65 2e 64 62 22 29 3b 0a 09 69   "cache.db");..i
31f0: 66 20 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20  f (snprintf_ret 
3200: 3e 3d 20 73 69 7a 65 6f 66 28 64 62 66 69 6c 65  >= sizeof(dbfile
3210: 6e 61 6d 65 29 29 20 7b 0a 09 09 66 70 72 69 6e  name)) {...fprin
3220: 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62  tf(stderr, "Unab
3230: 6c 65 20 74 6f 20 73 65 74 20 64 61 74 61 62 61  le to set databa
3240: 73 65 20 66 69 6c 65 6e 61 6d 65 2e 20 20 41 62  se filename.  Ab
3250: 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 0a 09 09  orting.\n");....
3260: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
3270: 72 65 74 75 72 6e 28 66 75 73 65 5f 6d 61 69 6e  return(fuse_main
3280: 28 61 72 67 63 2c 20 61 72 67 76 2c 20 26 61 70  (argc, argv, &ap
3290: 70 66 73 5f 6f 70 65 72 2c 20 4e 55 4c 4c 29 29  pfs_oper, NULL))
32a0: 3b 0a 7d 0a 20 0a                                ;.}. .