Hex Artifact Content

Artifact a8794a71457cd6f9dc1358e65ba0d0ed154e66a3:


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 73 71  .h>.#include <sq
0040: 6c 69 74 65 33 2e 68 3e 0a 23 69 6e 63 6c 75 64  lite3.h>.#includ
0050: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 69  e <pthread.h>.#i
0060: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0070: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61  >.#include <stda
0080: 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  rg.h>.#include <
0090: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
00a0: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69  de <unistd.h>.#i
00b0: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
00c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
00d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
00e0: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
00f0: 3c 66 75 73 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  <fuse.h>.#includ
0100: 65 20 3c 70 77 64 2e 68 3e 0a 23 69 6e 63 6c 75  e <pwd.h>.#inclu
0110: 64 65 20 3c 74 63 6c 2e 68 3e 0a 0a 2f 2a 20 46  de <tcl.h>../* F
0120: 72 6f 6d 20 73 68 61 31 2e 63 20 2a 2f 0a 69 6e  rom sha1.c */.in
0130: 74 20 53 68 61 31 5f 49 6e 69 74 28 54 63 6c 5f  t Sha1_Init(Tcl_
0140: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b  Interp *interp);
0150: 0a 0a 23 69 66 6e 64 65 66 20 41 50 50 46 53 5f  ..#ifndef APPFS_
0160: 43 41 43 48 45 44 49 52 0a 23 64 65 66 69 6e 65  CACHEDIR.#define
0170: 20 41 50 50 46 53 5f 43 41 43 48 45 44 49 52 20   APPFS_CACHEDIR 
0180: 22 2f 76 61 72 2f 63 61 63 68 65 2f 61 70 70 66  "/var/cache/appf
0190: 73 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  s".#endif..#ifde
01a0: 66 20 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20  f DEBUG.#define 
01b0: 41 50 50 46 53 5f 44 45 42 55 47 28 78 2e 2e 2e  APPFS_DEBUG(x...
01c0: 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65  ) { fprintf(stde
01d0: 72 72 2c 20 22 5b 64 65 62 75 67 5d 20 25 73 3a  rr, "[debug] %s:
01e0: 25 69 3a 25 73 3a 20 22 2c 20 5f 5f 46 49 4c 45  %i:%s: ", __FILE
01f0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 5f 5f  __, __LINE__, __
0200: 66 75 6e 63 5f 5f 29 3b 20 66 70 72 69 6e 74 66  func__); fprintf
0210: 28 73 74 64 65 72 72 2c 20 78 29 3b 20 66 70 72  (stderr, x); fpr
0220: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e  intf(stderr, "\n
0230: 22 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 64 65 66  "); }.#else.#def
0240: 69 6e 65 20 41 50 50 46 53 5f 44 45 42 55 47 28  ine APPFS_DEBUG(
0250: 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 65 6e 64 69  x...) /**/.#endi
0260: 66 0a 0a 73 74 61 74 69 63 20 70 74 68 72 65 61  f..static pthrea
0270: 64 5f 6b 65 79 5f 74 20 69 6e 74 65 72 70 4b 65  d_key_t interpKe
0280: 79 3b 0a 0a 73 74 72 75 63 74 20 61 70 70 66 73  y;..struct appfs
0290: 5f 74 68 72 65 61 64 5f 64 61 74 61 20 7b 0a 09  _thread_data {..
02a0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 09 63 6f  sqlite3 *db;..co
02b0: 6e 73 74 20 63 68 61 72 20 2a 63 61 63 68 65 64  nst char *cached
02c0: 69 72 3b 0a 09 74 69 6d 65 5f 74 20 62 6f 6f 74  ir;..time_t boot
02d0: 74 69 6d 65 3b 0a 09 63 6f 6e 73 74 20 63 68 61  time;..const cha
02e0: 72 20 2a 70 6c 61 74 66 6f 72 6d 3b 0a 09 73 74  r *platform;..st
02f0: 72 75 63 74 20 7b 0a 09 09 69 6e 74 20 77 72 69  ruct {...int wri
0300: 74 61 62 6c 65 3b 0a 09 7d 20 6f 70 74 69 6f 6e  table;..} option
0310: 73 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 61 70  s;.};..struct ap
0320: 70 66 73 5f 74 68 72 65 61 64 5f 64 61 74 61 20  pfs_thread_data 
0330: 67 6c 6f 62 61 6c 54 68 72 65 61 64 3b 0a 0a 74  globalThread;..t
0340: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 41  ypedef enum {..A
0350: 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f 49 4e  PPFS_PATHTYPE_IN
0360: 56 41 4c 49 44 2c 0a 09 41 50 50 46 53 5f 50 41  VALID,..APPFS_PA
0370: 54 48 54 59 50 45 5f 46 49 4c 45 2c 0a 09 41 50  THTYPE_FILE,..AP
0380: 50 46 53 5f 50 41 54 48 54 59 50 45 5f 44 49 52  PFS_PATHTYPE_DIR
0390: 45 43 54 4f 52 59 2c 0a 09 41 50 50 46 53 5f 50  ECTORY,..APPFS_P
03a0: 41 54 48 54 59 50 45 5f 53 59 4d 4c 49 4e 4b 0a  ATHTYPE_SYMLINK.
03b0: 7d 20 61 70 70 66 73 5f 70 61 74 68 74 79 70 65  } appfs_pathtype
03c0: 5f 74 3b 0a 0a 73 74 72 75 63 74 20 61 70 70 66  _t;..struct appf
03d0: 73 5f 63 68 69 6c 64 72 65 6e 20 7b 0a 09 73 74  s_children {..st
03e0: 72 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64  ruct appfs_child
03f0: 72 65 6e 20 2a 5f 6e 65 78 74 3b 0a 09 69 6e 74  ren *_next;..int
0400: 20 63 6f 75 6e 74 65 72 3b 0a 0a 09 63 68 61 72   counter;...char
0410: 20 6e 61 6d 65 5b 32 35 36 5d 3b 0a 7d 3b 0a 0a   name[256];.};..
0420: 73 74 72 75 63 74 20 61 70 70 66 73 5f 70 61 74  struct appfs_pat
0430: 68 69 6e 66 6f 20 7b 0a 09 61 70 70 66 73 5f 70  hinfo {..appfs_p
0440: 61 74 68 74 79 70 65 5f 74 20 74 79 70 65 3b 0a  athtype_t type;.
0450: 09 74 69 6d 65 5f 74 20 74 69 6d 65 3b 0a 09 63  .time_t time;..c
0460: 68 61 72 20 68 6f 73 74 6e 61 6d 65 5b 32 35 36  har hostname[256
0470: 5d 3b 0a 09 69 6e 74 20 70 61 63 6b 61 67 65 64  ];..int packaged
0480: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
0490: 20 6c 6f 6e 67 20 69 6e 6f 64 65 3b 0a 09 75 6e   long inode;..un
04a0: 69 6f 6e 20 7b 0a 09 09 73 74 72 75 63 74 20 7b  ion {...struct {
04b0: 0a 09 09 09 69 6e 74 20 63 68 69 6c 64 63 6f 75  ....int childcou
04c0: 6e 74 3b 0a 09 09 7d 20 64 69 72 3b 0a 09 09 73  nt;...} dir;...s
04d0: 74 72 75 63 74 20 7b 0a 09 09 09 69 6e 74 20 65  truct {....int e
04e0: 78 65 63 75 74 61 62 6c 65 3b 0a 09 09 09 6f 66  xecutable;....of
04f0: 66 5f 74 20 73 69 7a 65 3b 0a 09 09 09 63 68 61  f_t size;....cha
0500: 72 20 73 68 61 31 5b 34 31 5d 3b 0a 09 09 7d 20  r sha1[41];...} 
0510: 66 69 6c 65 3b 0a 09 09 73 74 72 75 63 74 20 7b  file;...struct {
0520: 0a 09 09 09 6f 66 66 5f 74 20 73 69 7a 65 3b 0a  ....off_t size;.
0530: 09 09 09 63 68 61 72 20 73 6f 75 72 63 65 5b 32  ...char source[2
0540: 35 36 5d 3b 0a 09 09 7d 20 73 79 6d 6c 69 6e 6b  56];...} symlink
0550: 3b 0a 09 7d 20 74 79 70 65 69 6e 66 6f 3b 0a 7d  ;..} typeinfo;.}
0560: 3b 0a 0a 73 74 72 75 63 74 20 61 70 70 66 73 5f  ;..struct appfs_
0570: 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 63 62  sqlite3_query_cb
0580: 5f 68 61 6e 64 6c 65 20 7b 0a 09 73 74 72 75 63  _handle {..struc
0590: 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e  t appfs_children
05a0: 20 2a 68 65 61 64 3b 0a 09 69 6e 74 20 61 72 67   *head;..int arg
05b0: 63 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  c;..const char *
05c0: 66 6d 74 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  fmt;.};..static 
05d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 61 70 70 66  Tcl_Interp *appf
05e0: 73 5f 63 72 65 61 74 65 5f 54 63 6c 49 6e 74 65  s_create_TclInte
05f0: 72 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  rp(const char *c
0600: 61 63 68 65 64 69 72 29 20 7b 0a 09 54 63 6c 5f  achedir) {..Tcl_
0610: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
0620: 09 69 6e 74 20 74 63 6c 5f 72 65 74 3b 0a 0a 09  .int tcl_ret;...
0630: 41 50 50 46 53 5f 44 45 42 55 47 28 22 43 72 65  APPFS_DEBUG("Cre
0640: 61 74 69 6e 67 20 6e 65 77 20 54 63 6c 20 69 6e  ating new Tcl in
0650: 74 65 72 70 72 65 74 65 72 20 66 6f 72 20 54 49  terpreter for TI
0660: 44 20 3d 20 30 78 25 6c 6c 78 22 2c 20 28 75 6e  D = 0x%llx", (un
0670: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
0680: 29 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  ) pthread_self()
0690: 29 3b 0a 0a 09 69 6e 74 65 72 70 20 3d 20 54 63  );...interp = Tc
06a0: 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
06b0: 3b 0a 09 69 66 20 28 69 6e 74 65 72 70 20 3d 3d  ;..if (interp ==
06c0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e   NULL) {...fprin
06d0: 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62  tf(stderr, "Unab
06e0: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 54 63 6c  le to create Tcl
06f0: 20 49 6e 74 65 72 70 72 65 74 65 72 2e 20 20 41   Interpreter.  A
0700: 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 0a 09  borting.\n");...
0710: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
0720: 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54 63  }...tcl_ret = Tc
0730: 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  l_Init(interp);.
0740: 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20  .if (tcl_ret != 
0750: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69  TCL_OK) {...fpri
0760: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61  ntf(stderr, "Una
0770: 62 6c 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ble to initializ
0780: 65 20 54 63 6c 2e 20 20 41 62 6f 72 74 69 6e 67  e Tcl.  Aborting
0790: 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  .\n");...fprintf
07a0: 28 73 74 64 65 72 72 2c 20 22 54 63 6c 20 45 72  (stderr, "Tcl Er
07b0: 72 6f 72 20 69 73 3a 20 25 73 5c 6e 22 2c 20 54  ror is: %s\n", T
07c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
07d0: 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09  lt(interp));....
07e0: 54 63 6c 5f 44 65 6c 65 74 65 49 6e 74 65 72 70  Tcl_DeleteInterp
07f0: 28 69 6e 74 65 72 70 29 3b 0a 0a 09 09 72 65 74  (interp);....ret
0800: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
0810: 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 45 76  tcl_ret = Tcl_Ev
0820: 61 6c 28 69 6e 74 65 72 70 2c 20 22 70 61 63 6b  al(interp, "pack
0830: 61 67 65 20 69 66 6e 65 65 64 65 64 20 73 68 61  age ifneeded sha
0840: 31 20 31 2e 30 20 5b 6c 69 73 74 20 6c 6f 61 64  1 1.0 [list load
0850: 20 7b 7d 20 73 68 61 31 5d 22 29 3b 0a 09 69 66   {} sha1]");..if
0860: 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c   (tcl_ret != TCL
0870: 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  _OK) {...fprintf
0880: 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65  (stderr, "Unable
0890: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 54   to initialize T
08a0: 63 6c 20 53 48 41 31 2e 20 20 41 62 6f 72 74 69  cl SHA1.  Aborti
08b0: 6e 67 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ng.\n");...fprin
08c0: 74 66 28 73 74 64 65 72 72 2c 20 22 54 63 6c 20  tf(stderr, "Tcl 
08d0: 45 72 72 6f 72 20 69 73 3a 20 25 73 5c 6e 22 2c  Error is: %s\n",
08e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
08f0: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a  sult(interp));..
0900: 09 09 54 63 6c 5f 44 65 6c 65 74 65 49 6e 74 65  ..Tcl_DeleteInte
0910: 72 70 28 69 6e 74 65 72 70 29 3b 0a 0a 09 09 72  rp(interp);....r
0920: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
0930: 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f  ..tcl_ret = Tcl_
0940: 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 22 22 0a  Eval(interp, "".
0950: 23 69 6e 63 6c 75 64 65 20 22 61 70 70 66 73 64  #include "appfsd
0960: 2e 74 63 6c 2e 68 22 0a 09 22 22 29 3b 0a 09 69  .tcl.h".."");..i
0970: 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43  f (tcl_ret != TC
0980: 4c 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74  L_OK) {...fprint
0990: 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c  f(stderr, "Unabl
09a0: 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
09b0: 54 63 6c 20 41 70 70 46 53 20 73 63 72 69 70 74  Tcl AppFS script
09c0: 2e 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29  .  Aborting.\n")
09d0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65  ;...fprintf(stde
09e0: 72 72 2c 20 22 54 63 6c 20 45 72 72 6f 72 20 69  rr, "Tcl Error i
09f0: 73 3a 20 25 73 5c 6e 22 2c 20 54 63 6c 5f 47 65  s: %s\n", Tcl_Ge
0a00: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
0a10: 74 65 72 70 29 29 3b 0a 0a 09 09 54 63 6c 5f 44  terp));....Tcl_D
0a20: 65 6c 65 74 65 49 6e 74 65 72 70 28 69 6e 74 65  eleteInterp(inte
0a30: 72 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  rp);....return(N
0a40: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 54  ULL);..}...if (T
0a50: 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
0a60: 2c 20 22 3a 3a 61 70 70 66 73 3a 3a 63 61 63 68  , "::appfs::cach
0a70: 65 64 69 72 22 2c 20 63 61 63 68 65 64 69 72 2c  edir", cachedir,
0a80: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
0a90: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66  ) == NULL) {...f
0aa0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
0ab0: 55 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 61  Unable to set ca
0ac0: 63 68 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20  che directory.  
0ad0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
0ae0: 72 20 66 61 69 6c 2e 5c 6e 22 29 3b 0a 0a 09 09  r fail.\n");....
0af0: 54 63 6c 5f 44 65 6c 65 74 65 49 6e 74 65 72 70  Tcl_DeleteInterp
0b00: 28 69 6e 74 65 72 70 29 3b 0a 0a 09 09 72 65 74  (interp);....ret
0b10: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
0b20: 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 45 76  tcl_ret = Tcl_Ev
0b30: 61 6c 28 69 6e 74 65 72 70 2c 20 22 3a 3a 61 70  al(interp, "::ap
0b40: 70 66 73 3a 3a 69 6e 69 74 22 29 3b 0a 09 69 66  pfs::init");..if
0b50: 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c   (tcl_ret != TCL
0b60: 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  _OK) {...fprintf
0b70: 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65  (stderr, "Unable
0b80: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 54   to initialize T
0b90: 63 6c 20 41 70 70 46 53 20 73 63 72 69 70 74 20  cl AppFS script 
0ba0: 28 3a 3a 61 70 70 66 73 3a 3a 69 6e 69 74 29 2e  (::appfs::init).
0bb0: 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b    Aborting.\n");
0bc0: 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ...fprintf(stder
0bd0: 72 2c 20 22 54 63 6c 20 45 72 72 6f 72 20 69 73  r, "Tcl Error is
0be0: 3a 20 25 73 5c 6e 22 2c 20 54 63 6c 5f 47 65 74  : %s\n", Tcl_Get
0bf0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
0c00: 65 72 70 29 29 3b 0a 0a 09 09 54 63 6c 5f 44 65  erp));....Tcl_De
0c10: 6c 65 74 65 49 6e 74 65 72 70 28 69 6e 74 65 72  leteInterp(inter
0c20: 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  p);....return(NU
0c30: 4c 4c 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 48 69  LL);..}...Tcl_Hi
0c40: 64 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  deCommand(interp
0c50: 2c 20 22 67 6c 6f 62 22 2c 20 22 67 6c 6f 62 22  , "glob", "glob"
0c60: 29 3b 0a 09 54 63 6c 5f 48 69 64 65 43 6f 6d 6d  );..Tcl_HideComm
0c70: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 65 78 65  and(interp, "exe
0c80: 63 22 2c 20 22 65 78 65 63 22 29 3b 0a 09 54 63  c", "exec");..Tc
0c90: 6c 5f 48 69 64 65 43 6f 6d 6d 61 6e 64 28 69 6e  l_HideCommand(in
0ca0: 74 65 72 70 2c 20 22 70 69 64 22 2c 20 22 70 69  terp, "pid", "pi
0cb0: 64 22 29 3b 0a 09 54 63 6c 5f 48 69 64 65 43 6f  d");..Tcl_HideCo
0cc0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 61  mmand(interp, "a
0cd0: 75 74 6f 5f 6c 6f 61 64 5f 69 6e 64 65 78 22 2c  uto_load_index",
0ce0: 20 22 61 75 74 6f 5f 6c 6f 61 64 5f 69 6e 64 65   "auto_load_inde
0cf0: 78 22 29 3b 0a 09 54 63 6c 5f 48 69 64 65 43 6f  x");..Tcl_HideCo
0d00: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 75  mmand(interp, "u
0d10: 6e 6b 6e 6f 77 6e 22 2c 20 22 75 6e 6b 6e 6f 77  nknown", "unknow
0d20: 6e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 69 6e  n");...return(in
0d30: 74 65 72 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  terp);.}..static
0d40: 20 69 6e 74 20 61 70 70 66 73 5f 54 63 6c 5f 45   int appfs_Tcl_E
0d50: 76 61 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  val(Tcl_Interp *
0d60: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
0d70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6d  , const char *cm
0d80: 64 2c 20 2e 2e 2e 29 20 7b 0a 09 54 63 6c 5f 4f  d, ...) {..Tcl_O
0d90: 62 6a 20 2a 2a 6f 62 6a 76 3b 0a 09 63 6f 6e 73  bj **objv;..cons
0da0: 74 20 63 68 61 72 20 2a 61 72 67 3b 0a 09 76 61  t char *arg;..va
0db0: 5f 6c 69 73 74 20 61 72 67 70 3b 0a 09 69 6e 74  _list argp;..int
0dc0: 20 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 69 3b   retval;..int i;
0dd0: 0a 0a 09 69 66 20 28 69 6e 74 65 72 70 20 3d 3d  ...if (interp ==
0de0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
0df0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  n(TCL_ERROR);..}
0e00: 0a 0a 09 6f 62 6a 76 20 3d 20 28 76 6f 69 64 20  ...objv = (void 
0e10: 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f  *) ckalloc(sizeo
0e20: 66 28 2a 6f 62 6a 76 29 20 2a 20 6f 62 6a 63 29  f(*objv) * objc)
0e30: 3b 0a 09 6f 62 6a 76 5b 30 5d 20 3d 20 54 63 6c  ;..objv[0] = Tcl
0e40: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6d  _NewStringObj(cm
0e50: 64 2c 20 2d 31 29 3b 0a 09 54 63 6c 5f 49 6e 63  d, -1);..Tcl_Inc
0e60: 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 30  rRefCount(objv[0
0e70: 5d 29 3b 0a 0a 09 76 61 5f 73 74 61 72 74 28 61  ]);...va_start(a
0e80: 72 67 70 2c 20 63 6d 64 29 3b 0a 09 66 6f 72 20  rgp, cmd);..for 
0e90: 28 69 20 3d 20 31 3b 20 69 20 3c 20 6f 62 6a 63  (i = 1; i < objc
0ea0: 3b 20 69 2b 2b 29 20 7b 0a 09 09 61 72 67 20 3d  ; i++) {...arg =
0eb0: 20 76 61 5f 61 72 67 28 61 72 67 70 2c 20 63 6f   va_arg(argp, co
0ec0: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 09 09 6f  nst char *);...o
0ed0: 62 6a 76 5b 69 5d 20 3d 20 54 63 6c 5f 4e 65 77  bjv[i] = Tcl_New
0ee0: 53 74 72 69 6e 67 4f 62 6a 28 61 72 67 2c 20 2d  StringObj(arg, -
0ef0: 31 29 3b 0a 09 09 54 63 6c 5f 49 6e 63 72 52 65  1);...Tcl_IncrRe
0f00: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 69 5d 29 3b  fCount(objv[i]);
0f10: 0a 09 7d 0a 09 76 61 5f 65 6e 64 28 61 72 67 70  ..}..va_end(argp
0f20: 29 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 54 63  );...retval = Tc
0f30: 6c 5f 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72  l_EvalObjv(inter
0f40: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 30  p, objc, objv, 0
0f50: 29 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b  );...for (i = 0;
0f60: 20 69 20 3c 20 6f 62 6a 63 3b 20 69 2b 2b 29 20   i < objc; i++) 
0f70: 7b 0a 09 09 54 63 6c 5f 44 65 63 72 52 65 66 43  {...Tcl_DecrRefC
0f80: 6f 75 6e 74 28 6f 62 6a 76 5b 69 5d 29 3b 0a 09  ount(objv[i]);..
0f90: 7d 0a 0a 09 63 6b 66 72 65 65 28 28 76 6f 69 64  }...ckfree((void
0fa0: 20 2a 29 20 6f 62 6a 76 29 3b 0a 0a 09 69 66 20   *) objv);...if 
0fb0: 28 72 65 74 76 61 6c 20 21 3d 20 54 43 4c 5f 4f  (retval != TCL_O
0fc0: 4b 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42  K) {...APPFS_DEB
0fd0: 55 47 28 22 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  UG("Tcl command 
0fe0: 66 61 69 6c 65 64 2c 20 3a 3a 65 72 72 6f 72 49  failed, ::errorI
0ff0: 6e 66 6f 20 63 6f 6e 74 61 69 6e 73 3a 20 25 73  nfo contains: %s
1000: 5c 6e 22 2c 20 54 63 6c 5f 47 65 74 56 61 72 28  \n", Tcl_GetVar(
1010: 69 6e 74 65 72 70 2c 20 22 3a 3a 65 72 72 6f 72  interp, "::error
1020: 49 6e 66 6f 22 2c 20 30 29 29 3b 0a 09 7d 0a 0a  Info", 0));..}..
1030: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1040: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1050: 61 70 70 66 73 5f 75 70 64 61 74 65 5f 69 6e 64  appfs_update_ind
1060: 65 78 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 68  ex(const char *h
1070: 6f 73 74 6e 61 6d 65 29 20 7b 0a 09 54 63 6c 5f  ostname) {..Tcl_
1080: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
1090: 09 69 6e 74 20 74 63 6c 5f 72 65 74 3b 0a 0a 09  .int tcl_ret;...
10a0: 41 50 50 46 53 5f 44 45 42 55 47 28 22 45 6e 74  APPFS_DEBUG("Ent
10b0: 65 72 3a 20 68 6f 73 74 6e 61 6d 65 20 3d 20 25  er: hostname = %
10c0: 73 22 2c 20 68 6f 73 74 6e 61 6d 65 29 3b 0a 0a  s", hostname);..
10d0: 09 69 6e 74 65 72 70 20 3d 20 70 74 68 72 65 61  .interp = pthrea
10e0: 64 5f 67 65 74 73 70 65 63 69 66 69 63 28 69 6e  d_getspecific(in
10f0: 74 65 72 70 4b 65 79 29 3b 0a 09 69 66 20 28 69  terpKey);..if (i
1100: 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  nterp == NULL) {
1110: 0a 09 09 69 6e 74 65 72 70 20 3d 20 61 70 70 66  ...interp = appf
1120: 73 5f 63 72 65 61 74 65 5f 54 63 6c 49 6e 74 65  s_create_TclInte
1130: 72 70 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e  rp(globalThread.
1140: 63 61 63 68 65 64 69 72 29 3b 0a 0a 09 09 69 66  cachedir);....if
1150: 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c   (interp == NULL
1160: 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 3b 0a 09  ) {....return;..
1170: 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 73 65  .}....pthread_se
1180: 74 73 70 65 63 69 66 69 63 28 69 6e 74 65 72 70  tspecific(interp
1190: 4b 65 79 2c 20 69 6e 74 65 72 70 29 3b 0a 09 7d  Key, interp);..}
11a0: 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20 61 70 70  ...tcl_ret = app
11b0: 66 73 5f 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65  fs_Tcl_Eval(inte
11c0: 72 70 2c 20 32 2c 20 22 3a 3a 61 70 70 66 73 3a  rp, 2, "::appfs:
11d0: 3a 67 65 74 69 6e 64 65 78 22 2c 20 68 6f 73 74  :getindex", host
11e0: 6e 61 6d 65 29 3b 0a 09 69 66 20 28 74 63 6c 5f  name);..if (tcl_
11f0: 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ret != TCL_OK) {
1200: 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22  ...APPFS_DEBUG("
1210: 43 61 6c 6c 20 74 6f 20 3a 3a 61 70 70 66 73 3a  Call to ::appfs:
1220: 3a 67 65 74 69 6e 64 65 78 20 66 61 69 6c 65 64  :getindex failed
1230: 3a 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 53 74  : %s", Tcl_GetSt
1240: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
1250: 70 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a  p));....return;.
1260: 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .}...return;.}..
1270: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1280: 72 20 2a 61 70 70 66 73 5f 67 65 74 66 69 6c 65  r *appfs_getfile
1290: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f 73  (const char *hos
12a0: 74 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  tname, const cha
12b0: 72 20 2a 73 68 61 31 29 20 7b 0a 09 54 63 6c 5f  r *sha1) {..Tcl_
12c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
12d0: 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b 0a 09  .char *retval;..
12e0: 69 6e 74 20 74 63 6c 5f 72 65 74 3b 0a 0a 09 69  int tcl_ret;...i
12f0: 6e 74 65 72 70 20 3d 20 70 74 68 72 65 61 64 5f  nterp = pthread_
1300: 67 65 74 73 70 65 63 69 66 69 63 28 69 6e 74 65  getspecific(inte
1310: 72 70 4b 65 79 29 3b 0a 09 69 66 20 28 69 6e 74  rpKey);..if (int
1320: 65 72 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  erp == NULL) {..
1330: 09 69 6e 74 65 72 70 20 3d 20 61 70 70 66 73 5f  .interp = appfs_
1340: 63 72 65 61 74 65 5f 54 63 6c 49 6e 74 65 72 70  create_TclInterp
1350: 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 63 61  (globalThread.ca
1360: 63 68 65 64 69 72 29 3b 0a 0a 09 09 69 66 20 28  chedir);....if (
1370: 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 29 20  interp == NULL) 
1380: 7b 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  {....return(NULL
1390: 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61  );...}....pthrea
13a0: 64 5f 73 65 74 73 70 65 63 69 66 69 63 28 69 6e  d_setspecific(in
13b0: 74 65 72 70 4b 65 79 2c 20 69 6e 74 65 72 70 29  terpKey, interp)
13c0: 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d  ;..}...tcl_ret =
13d0: 20 61 70 70 66 73 5f 54 63 6c 5f 45 76 61 6c 28   appfs_Tcl_Eval(
13e0: 69 6e 74 65 72 70 2c 20 33 2c 20 22 3a 3a 61 70  interp, 3, "::ap
13f0: 70 66 73 3a 3a 64 6f 77 6e 6c 6f 61 64 22 2c 20  pfs::download", 
1400: 68 6f 73 74 6e 61 6d 65 2c 20 73 68 61 31 29 3b  hostname, sha1);
1410: 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d  ..if (tcl_ret !=
1420: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 41 50 50   TCL_OK) {...APP
1430: 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74  FS_DEBUG("Call t
1440: 6f 20 3a 3a 61 70 70 66 73 3a 3a 64 6f 77 6e 6c  o ::appfs::downl
1450: 6f 61 64 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  oad failed: %s",
1460: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
1470: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a  sult(interp));..
1480: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
1490: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74  .}...retval = st
14a0: 72 64 75 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rdup(Tcl_GetStri
14b0: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
14c0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
14d0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  al);.}..static v
14e0: 6f 69 64 20 61 70 70 66 73 5f 75 70 64 61 74 65  oid appfs_update
14f0: 5f 6d 61 6e 69 66 65 73 74 28 63 6f 6e 73 74 20  _manifest(const 
1500: 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20  char *hostname, 
1510: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 68 61 31  const char *sha1
1520: 29 20 7b 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20  ) {..Tcl_Interp 
1530: 2a 69 6e 74 65 72 70 3b 0a 09 69 6e 74 20 74 63  *interp;..int tc
1540: 6c 5f 72 65 74 3b 0a 0a 09 69 6e 74 65 72 70 20  l_ret;...interp 
1550: 3d 20 70 74 68 72 65 61 64 5f 67 65 74 73 70 65  = pthread_getspe
1560: 63 69 66 69 63 28 69 6e 74 65 72 70 4b 65 79 29  cific(interpKey)
1570: 3b 0a 09 69 66 20 28 69 6e 74 65 72 70 20 3d 3d  ;..if (interp ==
1580: 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 74 65 72   NULL) {...inter
1590: 70 20 3d 20 61 70 70 66 73 5f 63 72 65 61 74 65  p = appfs_create
15a0: 5f 54 63 6c 49 6e 74 65 72 70 28 67 6c 6f 62 61  _TclInterp(globa
15b0: 6c 54 68 72 65 61 64 2e 63 61 63 68 65 64 69 72  lThread.cachedir
15c0: 29 3b 0a 0a 09 09 69 66 20 28 69 6e 74 65 72 70  );....if (interp
15d0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 72   == NULL) {....r
15e0: 65 74 75 72 6e 3b 0a 09 09 7d 0a 0a 09 09 70 74  eturn;...}....pt
15f0: 68 72 65 61 64 5f 73 65 74 73 70 65 63 69 66 69  hread_setspecifi
1600: 63 28 69 6e 74 65 72 70 4b 65 79 2c 20 69 6e 74  c(interpKey, int
1610: 65 72 70 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72  erp);..}...tcl_r
1620: 65 74 20 3d 20 61 70 70 66 73 5f 54 63 6c 5f 45  et = appfs_Tcl_E
1630: 76 61 6c 28 69 6e 74 65 72 70 2c 20 33 2c 20 22  val(interp, 3, "
1640: 3a 3a 61 70 70 66 73 3a 3a 67 65 74 70 6b 67 6d  ::appfs::getpkgm
1650: 61 6e 69 66 65 73 74 22 2c 20 68 6f 73 74 6e 61  anifest", hostna
1660: 6d 65 2c 20 73 68 61 31 29 3b 0a 09 69 66 20 28  me, sha1);..if (
1670: 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f  tcl_ret != TCL_O
1680: 4b 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42  K) {...APPFS_DEB
1690: 55 47 28 22 43 61 6c 6c 20 74 6f 20 3a 3a 61 70  UG("Call to ::ap
16a0: 70 66 73 3a 3a 67 65 74 70 6b 67 6d 61 6e 69 66  pfs::getpkgmanif
16b0: 65 73 74 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  est failed: %s",
16c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
16d0: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a  sult(interp));..
16e0: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 72  ..return;..}...r
16f0: 65 74 75 72 6e 3b 0a 7d 0a 0a 23 64 65 66 69 6e  eturn;.}..#defin
1700: 65 20 61 70 70 66 73 5f 66 72 65 65 5f 6c 69 73  e appfs_free_lis
1710: 74 5f 74 79 70 65 28 69 64 2c 20 74 79 70 65 29  t_type(id, type)
1720: 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70   static void app
1730: 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f 20 23 23  fs_free_list_ ##
1740: 20 69 64 28 74 79 70 65 20 2a 68 65 61 64 29 20   id(type *head) 
1750: 7b 20 5c 0a 09 74 79 70 65 20 2a 6f 62 6a 2c 20  { \..type *obj, 
1760: 2a 6e 65 78 74 3b 20 5c 0a 09 66 6f 72 20 28 6f  *next; \..for (o
1770: 62 6a 20 3d 20 68 65 61 64 3b 20 6f 62 6a 3b 20  bj = head; obj; 
1780: 6f 62 6a 20 3d 20 6e 65 78 74 29 20 7b 20 5c 0a  obj = next) { \.
1790: 09 09 6e 65 78 74 20 3d 20 6f 62 6a 2d 3e 5f 6e  ..next = obj->_n
17a0: 65 78 74 3b 20 5c 0a 09 09 63 6b 66 72 65 65 28  ext; \...ckfree(
17b0: 28 76 6f 69 64 20 2a 29 20 6f 62 6a 29 3b 20 5c  (void *) obj); \
17c0: 0a 09 7d 20 5c 0a 7d 0a 0a 61 70 70 66 73 5f 66  ..} \.}..appfs_f
17d0: 72 65 65 5f 6c 69 73 74 5f 74 79 70 65 28 63 68  ree_list_type(ch
17e0: 69 6c 64 72 65 6e 2c 20 73 74 72 75 63 74 20 61  ildren, struct a
17f0: 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 29 0a 0a  ppfs_children)..
1800: 73 74 61 74 69 63 20 75 69 64 5f 74 20 61 70 70  static uid_t app
1810: 66 73 5f 67 65 74 5f 66 73 75 69 64 28 76 6f 69  fs_get_fsuid(voi
1820: 64 29 20 7b 0a 09 73 74 72 75 63 74 20 66 75 73  d) {..struct fus
1830: 65 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 3b 0a  e_context *ctx;.
1840: 0a 09 63 74 78 20 3d 20 66 75 73 65 5f 67 65 74  ..ctx = fuse_get
1850: 5f 63 6f 6e 74 65 78 74 28 29 3b 0a 09 69 66 20  _context();..if 
1860: 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ctx == NULL) {.
1870: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
1880: 0a 09 72 65 74 75 72 6e 28 63 74 78 2d 3e 75 69  ..return(ctx->ui
1890: 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f  d);.}..static co
18a0: 6e 73 74 20 63 68 61 72 20 2a 61 70 70 66 73 5f  nst char *appfs_
18b0: 67 65 74 5f 68 6f 6d 65 64 69 72 28 75 69 64 5f  get_homedir(uid_
18c0: 74 20 66 73 75 69 64 29 20 7b 0a 09 73 74 72 75  t fsuid) {..stru
18d0: 63 74 20 70 61 73 73 77 64 20 65 6e 74 72 79 2c  ct passwd entry,
18e0: 20 2a 72 65 73 75 6c 74 3b 0a 09 73 74 72 75 63   *result;..struc
18f0: 74 20 73 74 61 74 20 73 74 62 75 66 3b 0a 09 63  t stat stbuf;..c
1900: 68 61 72 20 62 75 66 5b 31 30 32 34 5d 2c 20 2a  har buf[1024], *
1910: 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 67 70 75  retval;..int gpu
1920: 5f 72 65 74 2c 20 73 74 61 74 5f 72 65 74 3b 0a  _ret, stat_ret;.
1930: 0a 09 67 70 75 5f 72 65 74 20 3d 20 67 65 74 70  ..gpu_ret = getp
1940: 77 75 69 64 5f 72 28 66 73 75 69 64 2c 20 26 65  wuid_r(fsuid, &e
1950: 6e 74 72 79 2c 20 62 75 66 2c 20 73 69 7a 65 6f  ntry, buf, sizeo
1960: 66 28 62 75 66 29 2c 20 26 72 65 73 75 6c 74 29  f(buf), &result)
1970: 3b 0a 09 69 66 20 28 67 70 75 5f 72 65 74 20 21  ;..if (gpu_ret !
1980: 3d 20 30 29 20 7b 0a 09 09 41 50 50 46 53 5f 44  = 0) {...APPFS_D
1990: 45 42 55 47 28 22 67 65 74 70 77 75 69 64 5f 72  EBUG("getpwuid_r
19a0: 28 25 6c 6c 75 2c 20 2e 2e 2e 29 20 72 65 74 75  (%llu, ...) retu
19b0: 72 6e 65 64 20 69 6e 20 66 61 69 6c 75 72 65 22  rned in failure"
19c0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19d0: 20 6c 6f 6e 67 29 20 66 73 75 69 64 29 3b 0a 0a   long) fsuid);..
19e0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
19f0: 09 7d 0a 0a 09 69 66 20 28 72 65 73 75 6c 74 20  .}...if (result 
1a00: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 41 50 50  == NULL) {...APP
1a10: 46 53 5f 44 45 42 55 47 28 22 67 65 74 70 77 75  FS_DEBUG("getpwu
1a20: 69 64 5f 72 28 25 6c 6c 75 2c 20 2e 2e 2e 29 20  id_r(%llu, ...) 
1a30: 72 65 74 75 72 6e 65 64 20 4e 55 4c 4c 20 72 65  returned NULL re
1a40: 73 75 6c 74 22 2c 20 28 75 6e 73 69 67 6e 65 64  sult", (unsigned
1a50: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 73 75 69   long long) fsui
1a60: 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  d);....return(NU
1a70: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  LL);..}...if (re
1a80: 73 75 6c 74 2d 3e 70 77 5f 64 69 72 20 3d 3d 20  sult->pw_dir == 
1a90: 4e 55 4c 4c 29 20 7b 0a 09 09 41 50 50 46 53 5f  NULL) {...APPFS_
1aa0: 44 45 42 55 47 28 22 67 65 74 70 77 75 69 64 5f  DEBUG("getpwuid_
1ab0: 72 28 25 6c 6c 75 2c 20 2e 2e 2e 29 20 72 65 74  r(%llu, ...) ret
1ac0: 75 72 6e 65 64 20 4e 55 4c 4c 20 68 6f 6d 65 20  urned NULL home 
1ad0: 64 69 72 65 63 74 6f 72 79 22 2c 20 28 75 6e 73  directory", (uns
1ae0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
1af0: 20 66 73 75 69 64 29 3b 0a 0a 09 09 72 65 74 75   fsuid);....retu
1b00: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 73  rn(NULL);..}...s
1b10: 74 61 74 5f 72 65 74 20 3d 20 73 74 61 74 28 72  tat_ret = stat(r
1b20: 65 73 75 6c 74 2d 3e 70 77 5f 64 69 72 2c 20 26  esult->pw_dir, &
1b30: 73 74 62 75 66 29 3b 0a 09 69 66 20 28 73 74 61  stbuf);..if (sta
1b40: 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  t_ret != 0) {...
1b50: 41 50 50 46 53 5f 44 45 42 55 47 28 22 73 74 61  APPFS_DEBUG("sta
1b60: 74 28 25 73 29 20 72 65 74 75 72 6e 65 64 20 69  t(%s) returned i
1b70: 6e 20 66 61 69 6c 75 72 65 22 2c 20 72 65 73 75  n failure", resu
1b80: 6c 74 2d 3e 70 77 5f 64 69 72 29 3b 0a 0a 09 09  lt->pw_dir);....
1b90: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
1ba0: 0a 0a 09 69 66 20 28 73 74 62 75 66 2e 73 74 5f  ...if (stbuf.st_
1bb0: 75 69 64 20 21 3d 20 66 73 75 69 64 29 20 7b 0a  uid != fsuid) {.
1bc0: 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 55  ..APPFS_DEBUG("U
1bd0: 49 44 20 6d 69 73 2d 6d 61 74 63 68 20 6f 6e 20  ID mis-match on 
1be0: 75 73 65 72 20 25 6c 6c 75 27 73 20 68 6f 6d 65  user %llu's home
1bf0: 20 64 69 72 65 63 74 6f 72 79 20 28 25 73 29 2e   directory (%s).
1c00: 20 20 49 74 27 73 20 6f 77 6e 65 64 20 62 79 20    It's owned by 
1c10: 25 6c 6c 75 2e 22 2c 0a 09 09 20 20 20 20 28 75  %llu.",...    (u
1c20: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
1c30: 67 29 20 66 73 75 69 64 2c 0a 09 09 20 20 20 20  g) fsuid,...    
1c40: 72 65 73 75 6c 74 2d 3e 70 77 5f 64 69 72 2c 0a  result->pw_dir,.
1c50: 09 09 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20  ..    (unsigned 
1c60: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 73 74 62 75 66  long long) stbuf
1c70: 2e 73 74 5f 75 69 64 0a 09 09 29 3b 0a 0a 09 09  .st_uid...);....
1c80: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
1c90: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 71 6c 69  ...retval = sqli
1ca0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1cb0: 2c 20 72 65 73 75 6c 74 2d 3e 70 77 5f 64 69 72  , result->pw_dir
1cc0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
1cd0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  al);.}..static i
1ce0: 6e 74 20 61 70 70 66 73 5f 67 65 74 70 61 63 6b  nt appfs_getpack
1cf0: 61 67 65 5f 6e 61 6d 65 5f 63 62 28 76 6f 69 64  age_name_cb(void
1d00: 20 2a 5f 70 61 63 6b 61 67 65 5f 6e 61 6d 65 2c   *_package_name,
1d10: 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 68   int columns, ch
1d20: 61 72 20 2a 2a 76 61 6c 75 65 73 2c 20 63 68 61  ar **values, cha
1d30: 72 20 2a 2a 6e 61 6d 65 73 29 20 7b 0a 09 63 68  r **names) {..ch
1d40: 61 72 20 2a 2a 70 61 63 6b 61 67 65 5f 6e 61 6d  ar **package_nam
1d50: 65 3b 0a 0a 09 69 66 20 28 63 6f 6c 75 6d 6e 73  e;...if (columns
1d60: 20 21 3d 20 31 29 20 7b 0a 09 09 72 65 74 75 72   != 1) {...retur
1d70: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 70 61 63 6b 61  n(1);..}...packa
1d80: 67 65 5f 6e 61 6d 65 20 3d 20 5f 70 61 63 6b 61  ge_name = _packa
1d90: 67 65 5f 6e 61 6d 65 3b 0a 0a 09 2a 70 61 63 6b  ge_name;...*pack
1da0: 61 67 65 5f 6e 61 6d 65 20 3d 20 73 71 6c 69 74  age_name = sqlit
1db0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
1dc0: 20 76 61 6c 75 65 73 5b 30 5d 29 3b 0a 0a 09 72   values[0]);...r
1dd0: 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61  eturn(0);.}..sta
1de0: 74 69 63 20 63 68 61 72 20 2a 61 70 70 66 73 5f  tic char *appfs_
1df0: 67 65 74 70 61 63 6b 61 67 65 5f 6e 61 6d 65 28  getpackage_name(
1e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f 73 74  const char *host
1e10: 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  name, const char
1e20: 20 2a 70 61 63 6b 61 67 65 5f 68 61 73 68 29 20   *package_hash) 
1e30: 7b 0a 09 63 68 61 72 20 2a 73 71 6c 3b 0a 09 69  {..char *sql;..i
1e40: 6e 74 20 73 71 6c 69 74 65 5f 72 65 74 3b 0a 09  nt sqlite_ret;..
1e50: 63 68 61 72 20 2a 70 61 63 6b 61 67 65 5f 6e 61  char *package_na
1e60: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 73 71 6c  me = NULL;...sql
1e70: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1e80: 74 66 28 22 53 45 4c 45 43 54 20 70 61 63 6b 61  tf("SELECT packa
1e90: 67 65 20 46 52 4f 4d 20 70 61 63 6b 61 67 65 73  ge FROM packages
1ea0: 20 57 48 45 52 45 20 68 6f 73 74 6e 61 6d 65 20   WHERE hostname 
1eb0: 3d 20 25 51 20 41 4e 44 20 73 68 61 31 20 3d 20  = %Q AND sha1 = 
1ec0: 25 51 20 4c 49 4d 49 54 20 31 3b 22 2c 20 68 6f  %Q LIMIT 1;", ho
1ed0: 73 74 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65 5f  stname, package_
1ee0: 68 61 73 68 29 3b 0a 09 69 66 20 28 73 71 6c 20  hash);..if (sql 
1ef0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 41 50 50  == NULL) {...APP
1f00: 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74  FS_DEBUG("Call t
1f10: 6f 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  o sqlite3_mprint
1f20: 66 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  f failed.");....
1f30: 72 65 74 75 72 6e 28 73 71 6c 69 74 65 33 5f 6d  return(sqlite3_m
1f40: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22 75 6e  printf("%s", "un
1f50: 6b 6e 6f 77 6e 2d 70 61 63 6b 61 67 65 2d 6e 61  known-package-na
1f60: 6d 65 22 29 29 3b 0a 09 7d 0a 09 73 71 6c 69 74  me"));..}..sqlit
1f70: 65 5f 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f  e_ret = sqlite3_
1f80: 65 78 65 63 28 67 6c 6f 62 61 6c 54 68 72 65 61  exec(globalThrea
1f90: 64 2e 64 62 2c 20 73 71 6c 2c 20 61 70 70 66 73  d.db, sql, appfs
1fa0: 5f 67 65 74 70 61 63 6b 61 67 65 5f 6e 61 6d 65  _getpackage_name
1fb0: 5f 63 62 2c 20 26 70 61 63 6b 61 67 65 5f 6e 61  _cb, &package_na
1fc0: 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 09 73 71 6c 69  me, NULL);..sqli
1fd0: 74 65 33 5f 66 72 65 65 28 73 71 6c 29 3b 0a 0a  te3_free(sql);..
1fe0: 09 69 66 20 28 73 71 6c 69 74 65 5f 72 65 74 20  .if (sqlite_ret 
1ff0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  != SQLITE_OK) {.
2000: 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 43  ..APPFS_DEBUG("C
2010: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
2020: 78 65 63 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  xec failed.");..
2030: 09 09 72 65 74 75 72 6e 28 73 71 6c 69 74 65 33  ..return(sqlite3
2040: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22  _mprintf("%s", "
2050: 75 6e 6b 6e 6f 77 6e 2d 70 61 63 6b 61 67 65 2d  unknown-package-
2060: 6e 61 6d 65 22 29 29 3b 0a 09 7d 0a 0a 09 72 65  name"));..}...re
2070: 74 75 72 6e 28 70 61 63 6b 61 67 65 5f 6e 61 6d  turn(package_nam
2080: 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74  e);.}..static st
2090: 72 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64  ruct appfs_child
20a0: 72 65 6e 20 2a 61 70 70 66 73 5f 67 65 74 63 68  ren *appfs_getch
20b0: 69 6c 64 72 65 6e 5f 66 73 28 73 74 72 75 63 74  ildren_fs(struct
20c0: 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20   appfs_children 
20d0: 2a 69 6e 5f 63 68 69 6c 64 72 65 6e 2c 20 63 6f  *in_children, co
20e0: 6e 73 74 20 63 68 61 72 20 2a 66 73 70 61 74 68  nst char *fspath
20f0: 29 20 7b 0a 09 41 50 50 46 53 5f 44 45 42 55 47  ) {..APPFS_DEBUG
2100: 28 22 53 65 61 72 63 68 69 6e 67 20 25 73 22 2c  ("Searching %s",
2110: 20 66 73 70 61 74 68 29 3b 0a 0a 09 72 65 74 75   fspath);...retu
2120: 72 6e 28 69 6e 5f 63 68 69 6c 64 72 65 6e 29 3b  rn(in_children);
2130: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
2140: 70 70 66 73 5f 67 65 74 63 68 69 6c 64 72 65 6e  ppfs_getchildren
2150: 5f 63 62 28 76 6f 69 64 20 2a 5f 68 65 61 64 2c  _cb(void *_head,
2160: 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 68   int columns, ch
2170: 61 72 20 2a 2a 76 61 6c 75 65 73 2c 20 63 68 61  ar **values, cha
2180: 72 20 2a 2a 6e 61 6d 65 73 29 20 7b 0a 09 73 74  r **names) {..st
2190: 72 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64  ruct appfs_child
21a0: 72 65 6e 20 2a 2a 68 65 61 64 5f 70 2c 20 2a 6f  ren **head_p, *o
21b0: 62 6a 3b 0a 0a 09 68 65 61 64 5f 70 20 3d 20 5f  bj;...head_p = _
21c0: 68 65 61 64 3b 0a 0a 09 6f 62 6a 20 3d 20 28 76  head;...obj = (v
21d0: 6f 69 64 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73  oid *) ckalloc(s
21e0: 69 7a 65 6f 66 28 2a 6f 62 6a 29 29 3b 0a 0a 09  izeof(*obj));...
21f0: 73 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 6e 61  snprintf(obj->na
2200: 6d 65 2c 20 73 69 7a 65 6f 66 28 6f 62 6a 2d 3e  me, sizeof(obj->
2210: 6e 61 6d 65 29 2c 20 22 25 73 22 2c 20 76 61 6c  name), "%s", val
2220: 75 65 73 5b 30 5d 29 3b 0a 0a 09 69 66 20 28 2a  ues[0]);...if (*
2230: 68 65 61 64 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  head_p == NULL) 
2240: 7b 0a 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74 65 72  {...obj->counter
2250: 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 0;..} else {.
2260: 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74 65 72 20 3d  ..obj->counter =
2270: 20 28 2a 68 65 61 64 5f 70 29 2d 3e 63 6f 75 6e   (*head_p)->coun
2280: 74 65 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09 6f 62  ter + 1;..}...ob
2290: 6a 2d 3e 5f 6e 65 78 74 20 3d 20 2a 68 65 61 64  j->_next = *head
22a0: 5f 70 3b 0a 09 2a 68 65 61 64 5f 70 20 3d 20 6f  _p;..*head_p = o
22b0: 62 6a 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  bj;...return(0);
22c0: 0a 09 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72  ...}..static str
22d0: 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72  uct appfs_childr
22e0: 65 6e 20 2a 61 70 70 66 73 5f 67 65 74 63 68 69  en *appfs_getchi
22f0: 6c 64 72 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  ldren(const char
2300: 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 63 6f 6e 73   *hostname, cons
2310: 74 20 63 68 61 72 20 2a 70 61 63 6b 61 67 65 5f  t char *package_
2320: 68 61 73 68 2c 20 63 6f 6e 73 74 20 63 68 61 72  hash, const char
2330: 20 2a 70 61 74 68 2c 20 69 6e 74 20 2a 63 68 69   *path, int *chi
2340: 6c 64 72 65 6e 5f 63 6f 75 6e 74 5f 70 29 20 7b  ldren_count_p) {
2350: 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 63  ..struct appfs_c
2360: 68 69 6c 64 72 65 6e 20 2a 68 65 61 64 20 3d 20  hildren *head = 
2370: 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 73 71 6c  NULL;..char *sql
2380: 2c 20 2a 66 69 6c 65 62 75 66 2c 20 2a 68 6f 6d  , *filebuf, *hom
2390: 65 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e  edir = NULL;..in
23a0: 74 20 73 71 6c 69 74 65 5f 72 65 74 3b 0a 09 75  t sqlite_ret;..u
23b0: 69 64 5f 74 20 66 73 75 69 64 3b 0a 0a 09 69 66  id_t fsuid;...if
23c0: 20 28 63 68 69 6c 64 72 65 6e 5f 63 6f 75 6e 74   (children_count
23d0: 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  _p == NULL) {...
23e0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
23f0: 0a 0a 09 61 70 70 66 73 5f 75 70 64 61 74 65 5f  ...appfs_update_
2400: 69 6e 64 65 78 28 68 6f 73 74 6e 61 6d 65 29 3b  index(hostname);
2410: 0a 09 61 70 70 66 73 5f 75 70 64 61 74 65 5f 6d  ..appfs_update_m
2420: 61 6e 69 66 65 73 74 28 68 6f 73 74 6e 61 6d 65  anifest(hostname
2430: 2c 20 70 61 63 6b 61 67 65 5f 68 61 73 68 29 3b  , package_hash);
2440: 0a 0a 09 73 71 6c 20 3d 20 73 71 6c 69 74 65 33  ...sql = sqlite3
2450: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
2460: 20 66 69 6c 65 5f 6e 61 6d 65 20 46 52 4f 4d 20   file_name FROM 
2470: 66 69 6c 65 73 20 57 48 45 52 45 20 70 61 63 6b  files WHERE pack
2480: 61 67 65 5f 73 68 61 31 20 3d 20 25 51 20 41 4e  age_sha1 = %Q AN
2490: 44 20 66 69 6c 65 5f 64 69 72 65 63 74 6f 72 79  D file_directory
24a0: 20 3d 20 25 51 3b 22 2c 20 70 61 63 6b 61 67 65   = %Q;", package
24b0: 5f 68 61 73 68 2c 20 70 61 74 68 29 3b 0a 09 69  _hash, path);..i
24c0: 66 20 28 73 71 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (sql == NULL) 
24d0: 7b 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47 28  {...APPFS_DEBUG(
24e0: 22 43 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33  "Call to sqlite3
24f0: 5f 6d 70 72 69 6e 74 66 20 66 61 69 6c 65 64 2e  _mprintf failed.
2500: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
2510: 4c 4c 29 3b 0a 09 7d 0a 0a 09 41 50 50 46 53 5f  LL);..}...APPFS_
2520: 44 45 42 55 47 28 22 53 51 4c 3a 20 25 73 22 2c  DEBUG("SQL: %s",
2530: 20 73 71 6c 29 3b 0a 09 73 71 6c 69 74 65 5f 72   sql);..sqlite_r
2540: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  et = sqlite3_exe
2550: 63 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 64  c(globalThread.d
2560: 62 2c 20 73 71 6c 2c 20 61 70 70 66 73 5f 67 65  b, sql, appfs_ge
2570: 74 63 68 69 6c 64 72 65 6e 5f 63 62 2c 20 26 68  tchildren_cb, &h
2580: 65 61 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 71 6c  ead, NULL);..sql
2590: 69 74 65 33 5f 66 72 65 65 28 73 71 6c 29 3b 0a  ite3_free(sql);.
25a0: 0a 09 69 66 20 28 73 71 6c 69 74 65 5f 72 65 74  ..if (sqlite_ret
25b0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b   != SQLITE_OK) {
25c0: 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22  ...APPFS_DEBUG("
25d0: 43 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  Call to sqlite3_
25e0: 65 78 65 63 20 66 61 69 6c 65 64 2e 22 29 3b 0a  exec failed.");.
25f0: 0a 09 09 61 70 70 66 73 5f 66 72 65 65 5f 6c 69  ...appfs_free_li
2600: 73 74 5f 63 68 69 6c 64 72 65 6e 28 68 65 61 64  st_children(head
2610: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
2620: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 6c 6f  L);..}...if (glo
2630: 62 61 6c 54 68 72 65 61 64 2e 6f 70 74 69 6f 6e  balThread.option
2640: 73 2e 77 72 69 74 61 62 6c 65 29 20 7b 0a 09 09  s.writable) {...
2650: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 75 73 65  /* Determine use
2660: 72 20 6f 66 20 70 72 6f 63 65 73 73 20 61 63 63  r of process acc
2670: 65 73 73 69 6e 67 20 74 68 69 73 20 66 69 6c 65  essing this file
2680: 20 2a 2f 0a 09 09 66 73 75 69 64 20 3d 20 61 70   */...fsuid = ap
2690: 70 66 73 5f 67 65 74 5f 66 73 75 69 64 28 29 3b  pfs_get_fsuid();
26a0: 0a 0a 09 09 2f 2a 20 43 68 65 63 6b 20 66 69 6c  ..../* Check fil
26b0: 65 73 79 73 74 65 6d 20 70 61 74 68 73 20 66 6f  esystem paths fo
26c0: 72 20 75 70 64 61 74 65 64 20 66 69 6c 65 73 20  r updated files 
26d0: 2a 2f 0a 09 09 2f 2a 2a 20 43 68 65 63 6b 20 74  */.../** Check t
26e0: 68 65 20 67 6c 6f 62 61 6c 20 64 69 72 65 63 74  he global direct
26f0: 6f 72 79 20 28 2f 65 74 63 29 20 2a 2a 2f 0a 09  ory (/etc) **/..
2700: 09 66 69 6c 65 62 75 66 20 3d 20 73 71 6c 69 74  .filebuf = sqlit
2710: 65 33 5f 6d 70 72 69 6e 74 66 28 22 2f 65 74 63  e3_mprintf("/etc
2720: 2f 61 70 70 66 73 2f 25 7a 40 25 73 2f 25 73 22  /appfs/%z@%s/%s"
2730: 2c 20 61 70 70 66 73 5f 67 65 74 70 61 63 6b 61  , appfs_getpacka
2740: 67 65 5f 6e 61 6d 65 28 68 6f 73 74 6e 61 6d 65  ge_name(hostname
2750: 2c 20 70 61 63 6b 61 67 65 5f 68 61 73 68 29 2c  , package_hash),
2760: 20 68 6f 73 74 6e 61 6d 65 2c 20 70 61 74 68 29   hostname, path)
2770: 3b 0a 09 09 69 66 20 28 66 69 6c 65 62 75 66 20  ;...if (filebuf 
2780: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 41 50  == NULL) {....AP
2790: 50 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20  PFS_DEBUG("Call 
27a0: 74 6f 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  to sqlite3_mprin
27b0: 74 66 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  tf failed.");...
27c0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
27d0: 09 09 7d 0a 0a 09 09 68 65 61 64 20 3d 20 61 70  ..}....head = ap
27e0: 70 66 73 5f 67 65 74 63 68 69 6c 64 72 65 6e 5f  pfs_getchildren_
27f0: 66 73 28 68 65 61 64 2c 20 66 69 6c 65 62 75 66  fs(head, filebuf
2800: 29 3b 0a 0a 09 09 73 71 6c 69 74 65 33 5f 66 72  );....sqlite3_fr
2810: 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 0a 09 09  ee(filebuf);....
2820: 2f 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 75 73  /** Check the us
2830: 65 72 27 73 20 64 69 72 65 63 74 6f 72 79 2c 20  er's directory, 
2840: 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 72 6f  if we are not ro
2850: 6f 74 20 2a 2a 2f 0a 09 09 69 66 20 28 66 73 75  ot **/...if (fsu
2860: 69 64 20 21 3d 20 30 29 20 7b 0a 09 09 09 68 6f  id != 0) {....ho
2870: 6d 65 64 69 72 20 3d 20 28 63 68 61 72 20 2a 29  medir = (char *)
2880: 20 61 70 70 66 73 5f 67 65 74 5f 68 6f 6d 65 64   appfs_get_homed
2890: 69 72 28 66 73 75 69 64 29 3b 0a 09 09 7d 0a 0a  ir(fsuid);...}..
28a0: 09 09 69 66 20 28 68 6f 6d 65 64 69 72 20 21 3d  ..if (homedir !=
28b0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 69 6c 65   NULL) {....file
28c0: 62 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  buf = sqlite3_mp
28d0: 72 69 6e 74 66 28 22 25 7a 2f 2e 61 70 70 66 73  rintf("%z/.appfs
28e0: 2f 25 7a 40 25 73 2f 25 73 22 2c 20 68 6f 6d 65  /%z@%s/%s", home
28f0: 64 69 72 2c 20 61 70 70 66 73 5f 67 65 74 70 61  dir, appfs_getpa
2900: 63 6b 61 67 65 5f 6e 61 6d 65 28 68 6f 73 74 6e  ckage_name(hostn
2910: 61 6d 65 2c 20 70 61 63 6b 61 67 65 5f 68 61 73  ame, package_has
2920: 68 29 2c 20 68 6f 73 74 6e 61 6d 65 2c 20 70 61  h), hostname, pa
2930: 74 68 29 3b 0a 0a 09 09 09 69 66 20 28 66 69 6c  th);.....if (fil
2940: 65 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ebuf == NULL) {.
2950: 09 09 09 09 41 50 50 46 53 5f 44 45 42 55 47 28  ....APPFS_DEBUG(
2960: 22 43 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33  "Call to sqlite3
2970: 5f 6d 70 72 69 6e 74 66 20 66 61 69 6c 65 64 2e  _mprintf failed.
2980: 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
2990: 4e 55 4c 4c 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  NULL);....}.....
29a0: 68 65 61 64 20 3d 20 61 70 70 66 73 5f 67 65 74  head = appfs_get
29b0: 63 68 69 6c 64 72 65 6e 5f 66 73 28 68 65 61 64  children_fs(head
29c0: 2c 20 66 69 6c 65 62 75 66 29 3b 0a 0a 09 09 09  , filebuf);.....
29d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 66 69 6c  sqlite3_free(fil
29e0: 65 62 75 66 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  ebuf);...}..}...
29f0: 69 66 20 28 68 65 61 64 20 21 3d 20 4e 55 4c 4c  if (head != NULL
2a00: 29 20 7b 0a 09 09 2a 63 68 69 6c 64 72 65 6e 5f  ) {...*children_
2a10: 63 6f 75 6e 74 5f 70 20 3d 20 68 65 61 64 2d 3e  count_p = head->
2a20: 63 6f 75 6e 74 65 72 20 2b 20 31 3b 0a 09 7d 20  counter + 1;..} 
2a30: 65 6c 73 65 20 7b 0a 09 09 2a 63 68 69 6c 64 72  else {...*childr
2a40: 65 6e 5f 63 6f 75 6e 74 5f 70 20 3d 20 30 3b 0a  en_count_p = 0;.
2a50: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 68 65 61 64  .}...return(head
2a60: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
2a70: 20 61 70 70 66 73 5f 73 71 6c 69 74 65 33 5f 71   appfs_sqlite3_q
2a80: 75 65 72 79 5f 63 62 28 76 6f 69 64 20 2a 5f 63  uery_cb(void *_c
2a90: 62 5f 68 61 6e 64 6c 65 2c 20 69 6e 74 20 63 6f  b_handle, int co
2aa0: 6c 75 6d 6e 73 2c 20 63 68 61 72 20 2a 2a 76 61  lumns, char **va
2ab0: 6c 75 65 73 2c 20 63 68 61 72 20 2a 2a 6e 61 6d  lues, char **nam
2ac0: 65 73 29 20 7b 0a 09 73 74 72 75 63 74 20 61 70  es) {..struct ap
2ad0: 70 66 73 5f 73 71 6c 69 74 65 33 5f 71 75 65 72  pfs_sqlite3_quer
2ae0: 79 5f 63 62 5f 68 61 6e 64 6c 65 20 2a 63 62 5f  y_cb_handle *cb_
2af0: 68 61 6e 64 6c 65 3b 0a 09 73 74 72 75 63 74 20  handle;..struct 
2b00: 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a  appfs_children *
2b10: 6f 62 6a 3b 0a 0a 09 63 62 5f 68 61 6e 64 6c 65  obj;...cb_handle
2b20: 20 3d 20 5f 63 62 5f 68 61 6e 64 6c 65 3b 0a 0a   = _cb_handle;..
2b30: 09 6f 62 6a 20 3d 20 28 76 6f 69 64 20 2a 29 20  .obj = (void *) 
2b40: 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  ckalloc(sizeof(*
2b50: 6f 62 6a 29 29 3b 0a 0a 09 73 77 69 74 63 68 20  obj));...switch 
2b60: 28 63 62 5f 68 61 6e 64 6c 65 2d 3e 61 72 67 63  (cb_handle->argc
2b70: 29 20 7b 0a 09 09 63 61 73 65 20 31 3a 0a 09 09  ) {...case 1:...
2b80: 09 73 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 6e  .snprintf(obj->n
2b90: 61 6d 65 2c 20 73 69 7a 65 6f 66 28 6f 62 6a 2d  ame, sizeof(obj-
2ba0: 3e 6e 61 6d 65 29 2c 20 63 62 5f 68 61 6e 64 6c  >name), cb_handl
2bb0: 65 2d 3e 66 6d 74 2c 20 76 61 6c 75 65 73 5b 30  e->fmt, values[0
2bc0: 5d 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ]);....break;...
2bd0: 63 61 73 65 20 32 3a 0a 09 09 09 73 6e 70 72 69  case 2:....snpri
2be0: 6e 74 66 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 73  ntf(obj->name, s
2bf0: 69 7a 65 6f 66 28 6f 62 6a 2d 3e 6e 61 6d 65 29  izeof(obj->name)
2c00: 2c 20 63 62 5f 68 61 6e 64 6c 65 2d 3e 66 6d 74  , cb_handle->fmt
2c10: 2c 20 76 61 6c 75 65 73 5b 30 5d 2c 20 76 61 6c  , values[0], val
2c20: 75 65 73 5b 31 5d 29 3b 0a 09 09 09 62 72 65 61  ues[1]);....brea
2c30: 6b 3b 0a 09 09 63 61 73 65 20 33 3a 0a 09 09 09  k;...case 3:....
2c40: 73 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 6e 61  snprintf(obj->na
2c50: 6d 65 2c 20 73 69 7a 65 6f 66 28 6f 62 6a 2d 3e  me, sizeof(obj->
2c60: 6e 61 6d 65 29 2c 20 63 62 5f 68 61 6e 64 6c 65  name), cb_handle
2c70: 2d 3e 66 6d 74 2c 20 76 61 6c 75 65 73 5b 30 5d  ->fmt, values[0]
2c80: 2c 20 76 61 6c 75 65 73 5b 31 5d 2c 20 76 61 6c  , values[1], val
2c90: 75 65 73 5b 32 5d 29 3b 0a 09 09 09 62 72 65 61  ues[2]);....brea
2ca0: 6b 3b 0a 09 09 63 61 73 65 20 34 3a 0a 09 09 09  k;...case 4:....
2cb0: 73 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 6e 61  snprintf(obj->na
2cc0: 6d 65 2c 20 73 69 7a 65 6f 66 28 6f 62 6a 2d 3e  me, sizeof(obj->
2cd0: 6e 61 6d 65 29 2c 20 63 62 5f 68 61 6e 64 6c 65  name), cb_handle
2ce0: 2d 3e 66 6d 74 2c 20 76 61 6c 75 65 73 5b 30 5d  ->fmt, values[0]
2cf0: 2c 20 76 61 6c 75 65 73 5b 31 5d 2c 20 76 61 6c  , values[1], val
2d00: 75 65 73 5b 32 5d 2c 20 76 61 6c 75 65 73 5b 33  ues[2], values[3
2d10: 5d 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  ]);....break;..}
2d20: 0a 0a 09 69 66 20 28 63 62 5f 68 61 6e 64 6c 65  ...if (cb_handle
2d30: 2d 3e 68 65 61 64 20 3d 3d 20 4e 55 4c 4c 29 20  ->head == NULL) 
2d40: 7b 0a 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74 65 72  {...obj->counter
2d50: 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 0;..} else {.
2d60: 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74 65 72 20 3d  ..obj->counter =
2d70: 20 63 62 5f 68 61 6e 64 6c 65 2d 3e 68 65 61 64   cb_handle->head
2d80: 2d 3e 63 6f 75 6e 74 65 72 20 2b 20 31 3b 0a 09  ->counter + 1;..
2d90: 7d 0a 0a 09 6f 62 6a 2d 3e 5f 6e 65 78 74 20 3d  }...obj->_next =
2da0: 20 63 62 5f 68 61 6e 64 6c 65 2d 3e 68 65 61 64   cb_handle->head
2db0: 3b 0a 09 63 62 5f 68 61 6e 64 6c 65 2d 3e 68 65  ;..cb_handle->he
2dc0: 61 64 20 3d 20 6f 62 6a 3b 0a 0a 09 72 65 74 75  ad = obj;...retu
2dd0: 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn(0);.}..static
2de0: 20 73 74 72 75 63 74 20 61 70 70 66 73 5f 63 68   struct appfs_ch
2df0: 69 6c 64 72 65 6e 20 2a 61 70 70 66 73 5f 73 71  ildren *appfs_sq
2e00: 6c 69 74 65 33 5f 71 75 65 72 79 28 63 68 61 72  lite3_query(char
2e10: 20 2a 73 71 6c 2c 20 69 6e 74 20 61 72 67 63 2c   *sql, int argc,
2e20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6d 74   const char *fmt
2e30: 2c 20 69 6e 74 20 2a 72 65 73 75 6c 74 73 5f 63  , int *results_c
2e40: 6f 75 6e 74 5f 70 29 20 7b 0a 09 73 74 72 75 63  ount_p) {..struc
2e50: 74 20 61 70 70 66 73 5f 73 71 6c 69 74 65 33 5f  t appfs_sqlite3_
2e60: 71 75 65 72 79 5f 63 62 5f 68 61 6e 64 6c 65 20  query_cb_handle 
2e70: 63 62 5f 68 61 6e 64 6c 65 3b 0a 09 69 6e 74 20  cb_handle;..int 
2e80: 73 71 6c 69 74 65 5f 72 65 74 3b 0a 0a 09 69 66  sqlite_ret;...if
2e90: 20 28 72 65 73 75 6c 74 73 5f 63 6f 75 6e 74 5f   (results_count_
2ea0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  p == NULL) {...r
2eb0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
2ec0: 0a 09 69 66 20 28 73 71 6c 20 3d 3d 20 4e 55 4c  ..if (sql == NUL
2ed0: 4c 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42  L) {...APPFS_DEB
2ee0: 55 47 28 22 43 61 6c 6c 20 74 6f 20 73 71 6c 69  UG("Call to sqli
2ef0: 74 65 33 5f 6d 70 72 69 6e 74 66 20 70 72 6f 62  te3_mprintf prob
2f00: 61 62 6c 79 20 66 61 69 6c 65 64 2e 22 29 3b 0a  ably failed.");.
2f10: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
2f20: 0a 09 7d 0a 0a 09 69 66 20 28 66 6d 74 20 3d 3d  ..}...if (fmt ==
2f30: 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 6d 74 20 3d   NULL) {...fmt =
2f40: 20 22 25 73 22 3b 0a 09 7d 0a 0a 09 63 62 5f 68   "%s";..}...cb_h
2f50: 61 6e 64 6c 65 2e 68 65 61 64 20 3d 20 4e 55 4c  andle.head = NUL
2f60: 4c 3b 0a 09 63 62 5f 68 61 6e 64 6c 65 2e 61 72  L;..cb_handle.ar
2f70: 67 63 20 3d 20 61 72 67 63 3b 0a 09 63 62 5f 68  gc = argc;..cb_h
2f80: 61 6e 64 6c 65 2e 66 6d 74 20 20 3d 20 66 6d 74  andle.fmt  = fmt
2f90: 3b 0a 0a 09 41 50 50 46 53 5f 44 45 42 55 47 28  ;...APPFS_DEBUG(
2fa0: 22 53 51 4c 3a 20 25 73 22 2c 20 73 71 6c 29 3b  "SQL: %s", sql);
2fb0: 0a 09 73 71 6c 69 74 65 5f 72 65 74 20 3d 20 73  ..sqlite_ret = s
2fc0: 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62  qlite3_exec(glob
2fd0: 61 6c 54 68 72 65 61 64 2e 64 62 2c 20 73 71 6c  alThread.db, sql
2fe0: 2c 20 61 70 70 66 73 5f 73 71 6c 69 74 65 33 5f  , appfs_sqlite3_
2ff0: 71 75 65 72 79 5f 63 62 2c 20 26 63 62 5f 68 61  query_cb, &cb_ha
3000: 6e 64 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09 73 71  ndle, NULL);..sq
3010: 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 29 3b  lite3_free(sql);
3020: 0a 0a 09 69 66 20 28 73 71 6c 69 74 65 5f 72 65  ...if (sqlite_re
3030: 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20  t != SQLITE_OK) 
3040: 7b 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47 28  {...APPFS_DEBUG(
3050: 22 43 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33  "Call to sqlite3
3060: 5f 65 78 65 63 20 66 61 69 6c 65 64 2e 22 29 3b  _exec failed.");
3070: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
3080: 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 62 5f 68 61  ;..}...if (cb_ha
3090: 6e 64 6c 65 2e 68 65 61 64 20 21 3d 20 4e 55 4c  ndle.head != NUL
30a0: 4c 29 20 7b 0a 09 09 2a 72 65 73 75 6c 74 73 5f  L) {...*results_
30b0: 63 6f 75 6e 74 5f 70 20 3d 20 63 62 5f 68 61 6e  count_p = cb_han
30c0: 64 6c 65 2e 68 65 61 64 2d 3e 63 6f 75 6e 74 65  dle.head->counte
30d0: 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09 72 65 74 75  r + 1;..}...retu
30e0: 72 6e 28 63 62 5f 68 61 6e 64 6c 65 2e 68 65 61  rn(cb_handle.hea
30f0: 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  d);.}..static in
3100: 74 20 61 70 70 66 73 5f 6c 6f 6f 6b 75 70 5f 70  t appfs_lookup_p
3110: 61 63 6b 61 67 65 5f 68 61 73 68 5f 63 62 28 76  ackage_hash_cb(v
3120: 6f 69 64 20 2a 5f 72 65 74 76 61 6c 2c 20 69 6e  oid *_retval, in
3130: 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 68 61 72 20  t columns, char 
3140: 2a 2a 76 61 6c 75 65 73 2c 20 63 68 61 72 20 2a  **values, char *
3150: 2a 6e 61 6d 65 73 29 20 7b 0a 09 63 68 61 72 20  *names) {..char 
3160: 2a 2a 72 65 74 76 61 6c 20 3d 20 5f 72 65 74 76  **retval = _retv
3170: 61 6c 3b 0a 0a 09 2a 72 65 74 76 61 6c 20 3d 20  al;...*retval = 
3180: 73 74 72 64 75 70 28 76 61 6c 75 65 73 5b 30 5d  strdup(values[0]
3190: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
31a0: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
31b0: 61 70 70 66 73 5f 6c 6f 6f 6b 75 70 5f 70 61 63  appfs_lookup_pac
31c0: 6b 61 67 65 5f 68 61 73 68 28 63 6f 6e 73 74 20  kage_hash(const 
31d0: 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20  char *hostname, 
31e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 63 6b  const char *pack
31f0: 61 67 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  age, const char 
3200: 2a 6f 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *os, const char 
3210: 2a 63 70 75 41 72 63 68 2c 20 63 6f 6e 73 74 20  *cpuArch, const 
3220: 63 68 61 72 20 2a 76 65 72 73 69 6f 6e 29 20 7b  char *version) {
3230: 0a 09 63 68 61 72 20 2a 73 71 6c 3b 0a 09 63 68  ..char *sql;..ch
3240: 61 72 20 2a 72 65 74 76 61 6c 20 3d 20 4e 55 4c  ar *retval = NUL
3250: 4c 3b 0a 09 69 6e 74 20 73 71 6c 69 74 65 5f 72  L;..int sqlite_r
3260: 65 74 3b 0a 0a 09 61 70 70 66 73 5f 75 70 64 61  et;...appfs_upda
3270: 74 65 5f 69 6e 64 65 78 28 68 6f 73 74 6e 61 6d  te_index(hostnam
3280: 65 29 3b 0a 0a 09 73 71 6c 20 3d 20 73 71 6c 69  e);...sql = sqli
3290: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
32a0: 45 43 54 20 73 68 61 31 20 46 52 4f 4d 20 70 61  ECT sha1 FROM pa
32b0: 63 6b 61 67 65 73 20 57 48 45 52 45 20 68 6f 73  ckages WHERE hos
32c0: 74 6e 61 6d 65 20 3d 20 25 51 20 41 4e 44 20 70  tname = %Q AND p
32d0: 61 63 6b 61 67 65 20 3d 20 25 51 20 41 4e 44 20  ackage = %Q AND 
32e0: 6f 73 20 3d 20 25 51 20 41 4e 44 20 63 70 75 41  os = %Q AND cpuA
32f0: 72 63 68 20 3d 20 25 51 20 41 4e 44 20 76 65 72  rch = %Q AND ver
3300: 73 69 6f 6e 20 3d 20 25 51 3b 22 2c 0a 09 09 68  sion = %Q;",...h
3310: 6f 73 74 6e 61 6d 65 2c 0a 09 09 70 61 63 6b 61  ostname,...packa
3320: 67 65 2c 0a 09 09 6f 73 2c 0a 09 09 63 70 75 41  ge,...os,...cpuA
3330: 72 63 68 2c 0a 09 09 76 65 72 73 69 6f 6e 0a 09  rch,...version..
3340: 29 3b 0a 09 69 66 20 28 73 71 6c 20 3d 3d 20 4e  );..if (sql == N
3350: 55 4c 4c 29 20 7b 0a 09 09 41 50 50 46 53 5f 44  ULL) {...APPFS_D
3360: 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20 73 71  EBUG("Call to sq
3370: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 66 61  lite3_mprintf fa
3380: 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
3390: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 41  rn(NULL);..}...A
33a0: 50 50 46 53 5f 44 45 42 55 47 28 22 53 51 4c 3a  PPFS_DEBUG("SQL:
33b0: 20 25 73 22 2c 20 73 71 6c 29 3b 0a 09 73 71 6c   %s", sql);..sql
33c0: 69 74 65 5f 72 65 74 20 3d 20 73 71 6c 69 74 65  ite_ret = sqlite
33d0: 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c 54 68 72  3_exec(globalThr
33e0: 65 61 64 2e 64 62 2c 20 73 71 6c 2c 20 61 70 70  ead.db, sql, app
33f0: 66 73 5f 6c 6f 6f 6b 75 70 5f 70 61 63 6b 61 67  fs_lookup_packag
3400: 65 5f 68 61 73 68 5f 63 62 2c 20 26 72 65 74 76  e_hash_cb, &retv
3410: 61 6c 2c 20 4e 55 4c 4c 29 3b 0a 09 73 71 6c 69  al, NULL);..sqli
3420: 74 65 33 5f 66 72 65 65 28 73 71 6c 29 3b 0a 0a  te3_free(sql);..
3430: 09 69 66 20 28 73 71 6c 69 74 65 5f 72 65 74 20  .if (sqlite_ret 
3440: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  != SQLITE_OK) {.
3450: 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 43  ..APPFS_DEBUG("C
3460: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
3470: 78 65 63 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  xec failed.");..
3480: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
3490: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
34a0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  al);.}..static i
34b0: 6e 74 20 61 70 70 66 73 5f 67 65 74 66 69 6c 65  nt appfs_getfile
34c0: 69 6e 66 6f 5f 63 62 28 76 6f 69 64 20 2a 5f 70  info_cb(void *_p
34d0: 61 74 68 69 6e 66 6f 2c 20 69 6e 74 20 63 6f 6c  athinfo, int col
34e0: 75 6d 6e 73 2c 20 63 68 61 72 20 2a 2a 76 61 6c  umns, char **val
34f0: 75 65 73 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65  ues, char **name
3500: 73 29 20 7b 0a 09 73 74 72 75 63 74 20 61 70 70  s) {..struct app
3510: 66 73 5f 70 61 74 68 69 6e 66 6f 20 2a 70 61 74  fs_pathinfo *pat
3520: 68 69 6e 66 6f 20 3d 20 5f 70 61 74 68 69 6e 66  hinfo = _pathinf
3530: 6f 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  o;..const char *
3540: 74 79 70 65 2c 20 2a 74 69 6d 65 2c 20 2a 73 6f  type, *time, *so
3550: 75 72 63 65 2c 20 2a 73 69 7a 65 2c 20 2a 70 65  urce, *size, *pe
3560: 72 6d 73 2c 20 2a 73 68 61 31 2c 20 2a 72 6f 77  rms, *sha1, *row
3570: 69 64 3b 0a 0a 09 74 79 70 65 20 3d 20 76 61 6c  id;...type = val
3580: 75 65 73 5b 30 5d 3b 0a 09 74 69 6d 65 20 3d 20  ues[0];..time = 
3590: 76 61 6c 75 65 73 5b 31 5d 3b 0a 09 73 6f 75 72  values[1];..sour
35a0: 63 65 20 3d 20 76 61 6c 75 65 73 5b 32 5d 3b 0a  ce = values[2];.
35b0: 09 73 69 7a 65 20 3d 20 76 61 6c 75 65 73 5b 33  .size = values[3
35c0: 5d 3b 0a 09 70 65 72 6d 73 20 3d 20 76 61 6c 75  ];..perms = valu
35d0: 65 73 5b 34 5d 3b 0a 09 73 68 61 31 20 3d 20 76  es[4];..sha1 = v
35e0: 61 6c 75 65 73 5b 35 5d 3b 0a 09 72 6f 77 69 64  alues[5];..rowid
35f0: 20 3d 20 76 61 6c 75 65 73 5b 36 5d 3b 0a 0a 09   = values[6];...
3600: 70 61 74 68 69 6e 66 6f 2d 3e 74 69 6d 65 20 3d  pathinfo->time =
3610: 20 73 74 72 74 6f 75 6c 6c 28 74 69 6d 65 2c 20   strtoull(time, 
3620: 4e 55 4c 4c 2c 20 31 30 29 3b 0a 0a 09 2f 2a 20  NULL, 10);.../* 
3630: 50 61 63 6b 61 67 65 20 66 69 6c 65 20 69 6e 6f  Package file ino
3640: 64 65 73 20 73 74 61 72 74 20 61 74 20 32 5e 33  des start at 2^3
3650: 32 2c 20 66 61 6b 65 20 69 6e 6f 64 65 73 20 61  2, fake inodes a
3660: 72 65 20 62 65 66 6f 72 65 20 74 68 65 6e 20 2a  re before then *
3670: 2f 0a 09 70 61 74 68 69 6e 66 6f 2d 3e 69 6e 6f  /..pathinfo->ino
3680: 64 65 20 3d 20 73 74 72 74 6f 75 6c 6c 28 72 6f  de = strtoull(ro
3690: 77 69 64 2c 20 4e 55 4c 4c 2c 20 31 30 29 20 2b  wid, NULL, 10) +
36a0: 20 34 32 39 34 39 36 37 32 39 36 55 4c 4c 3b 0a   4294967296ULL;.
36b0: 0a 09 69 66 20 28 73 74 72 63 6d 70 28 74 79 70  ..if (strcmp(typ
36c0: 65 2c 20 22 66 69 6c 65 22 29 20 3d 3d 20 30 29  e, "file") == 0)
36d0: 20 7b 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74   {...pathinfo->t
36e0: 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54 48  ype = APPFS_PATH
36f0: 54 59 50 45 5f 46 49 4c 45 3b 0a 0a 09 09 69 66  TYPE_FILE;....if
3700: 20 28 21 73 69 7a 65 29 20 7b 0a 09 09 09 73 69   (!size) {....si
3710: 7a 65 20 3d 20 22 30 22 3b 0a 09 09 7d 0a 0a 09  ze = "0";...}...
3720: 09 69 66 20 28 21 70 65 72 6d 73 29 20 7b 0a 09  .if (!perms) {..
3730: 09 09 70 65 72 6d 73 20 3d 20 22 22 3b 0a 09 09  ..perms = "";...
3740: 7d 0a 0a 09 09 69 66 20 28 21 73 68 61 31 29 20  }....if (!sha1) 
3750: 7b 0a 09 09 09 73 68 61 31 20 3d 20 22 22 3b 0a  {....sha1 = "";.
3760: 09 09 7d 0a 0a 09 09 70 61 74 68 69 6e 66 6f 2d  ..}....pathinfo-
3770: 3e 74 79 70 65 69 6e 66 6f 2e 66 69 6c 65 2e 73  >typeinfo.file.s
3780: 69 7a 65 20 3d 20 73 74 72 74 6f 75 6c 6c 28 73  ize = strtoull(s
3790: 69 7a 65 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a  ize, NULL, 10);.
37a0: 09 09 73 6e 70 72 69 6e 74 66 28 70 61 74 68 69  ..snprintf(pathi
37b0: 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 66 69  nfo->typeinfo.fi
37c0: 6c 65 2e 73 68 61 31 2c 20 73 69 7a 65 6f 66 28  le.sha1, sizeof(
37d0: 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e  pathinfo->typein
37e0: 66 6f 2e 66 69 6c 65 2e 73 68 61 31 29 2c 20 22  fo.file.sha1), "
37f0: 25 73 22 2c 20 73 68 61 31 29 3b 0a 0a 09 09 69  %s", sha1);....i
3800: 66 20 28 73 74 72 63 6d 70 28 70 65 72 6d 73 2c  f (strcmp(perms,
3810: 20 22 78 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09   "x") == 0) {...
3820: 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69  .pathinfo->typei
3830: 6e 66 6f 2e 66 69 6c 65 2e 65 78 65 63 75 74 61  nfo.file.executa
3840: 62 6c 65 20 3d 20 31 3b 0a 09 09 7d 20 65 6c 73  ble = 1;...} els
3850: 65 20 7b 0a 09 09 09 70 61 74 68 69 6e 66 6f 2d  e {....pathinfo-
3860: 3e 74 79 70 65 69 6e 66 6f 2e 66 69 6c 65 2e 65  >typeinfo.file.e
3870: 78 65 63 75 74 61 62 6c 65 20 3d 20 30 3b 0a 09  xecutable = 0;..
3880: 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b  .}....return(0);
3890: 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72 63 6d 70  ..}...if (strcmp
38a0: 28 74 79 70 65 2c 20 22 64 69 72 65 63 74 6f 72  (type, "director
38b0: 79 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 70 61  y") == 0) {...pa
38c0: 74 68 69 6e 66 6f 2d 3e 74 79 70 65 20 3d 20 41  thinfo->type = A
38d0: 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f 44 49  PPFS_PATHTYPE_DI
38e0: 52 45 43 54 4f 52 59 3b 0a 09 09 70 61 74 68 69  RECTORY;...pathi
38f0: 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 64 69  nfo->typeinfo.di
3900: 72 2e 63 68 69 6c 64 63 6f 75 6e 74 20 3d 20 30  r.childcount = 0
3910: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a  ;....return(0);.
3920: 09 7d 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28  .}...if (strcmp(
3930: 74 79 70 65 2c 20 22 73 79 6d 6c 69 6e 6b 22 29  type, "symlink")
3940: 20 3d 3d 20 30 29 20 7b 0a 09 09 70 61 74 68 69   == 0) {...pathi
3950: 6e 66 6f 2d 3e 74 79 70 65 20 3d 20 41 50 50 46  nfo->type = APPF
3960: 53 5f 50 41 54 48 54 59 50 45 5f 53 59 4d 4c 49  S_PATHTYPE_SYMLI
3970: 4e 4b 3b 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e  NK;...pathinfo->
3980: 74 79 70 65 69 6e 66 6f 2e 64 69 72 2e 63 68 69  typeinfo.dir.chi
3990: 6c 64 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  ldcount = 0;....
39a0: 69 66 20 28 21 73 6f 75 72 63 65 29 20 7b 0a 09  if (!source) {..
39b0: 09 09 73 6f 75 72 63 65 20 3d 20 22 2e 42 41 44  ..source = ".BAD
39c0: 4c 49 4e 4b 22 3b 0a 09 09 7d 0a 0a 09 09 70 61  LINK";...}....pa
39d0: 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f  thinfo->typeinfo
39e0: 2e 73 79 6d 6c 69 6e 6b 2e 73 69 7a 65 20 3d 20  .symlink.size = 
39f0: 73 74 72 6c 65 6e 28 73 6f 75 72 63 65 29 3b 0a  strlen(source);.
3a00: 09 09 73 6e 70 72 69 6e 74 66 28 70 61 74 68 69  ..snprintf(pathi
3a10: 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 73 79  nfo->typeinfo.sy
3a20: 6d 6c 69 6e 6b 2e 73 6f 75 72 63 65 2c 20 73 69  mlink.source, si
3a30: 7a 65 6f 66 28 70 61 74 68 69 6e 66 6f 2d 3e 74  zeof(pathinfo->t
3a40: 79 70 65 69 6e 66 6f 2e 73 79 6d 6c 69 6e 6b 2e  ypeinfo.symlink.
3a50: 73 6f 75 72 63 65 29 2c 20 22 25 73 22 2c 20 73  source), "%s", s
3a60: 6f 75 72 63 65 29 3b 0a 0a 09 09 72 65 74 75 72  ource);....retur
3a70: 6e 28 30 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  n(0);..}...retur
3a80: 6e 28 30 29 3b 0a 0a 09 2f 2a 20 55 6e 74 69 6c  n(0);.../* Until
3a90: 20 74 68 69 73 20 69 73 20 75 73 65 64 2c 20 70   this is used, p
3aa0: 72 65 76 65 6e 74 20 74 68 65 20 63 6f 6d 70 69  revent the compi
3ab0: 6c 65 72 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ler from complai
3ac0: 6e 69 6e 67 20 2a 2f 0a 09 73 6f 75 72 63 65 20  ning */..source 
3ad0: 3d 20 73 6f 75 72 63 65 3b 0a 7d 0a 0a 73 74 61  = source;.}..sta
3ae0: 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f 67 65  tic int appfs_ge
3af0: 74 66 69 6c 65 69 6e 66 6f 28 63 6f 6e 73 74 20  tfileinfo(const 
3b00: 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20  char *hostname, 
3b10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 63 6b  const char *pack
3b20: 61 67 65 5f 68 61 73 68 2c 20 63 6f 6e 73 74 20  age_hash, const 
3b30: 63 68 61 72 20 2a 5f 70 61 74 68 2c 20 73 74 72  char *_path, str
3b40: 75 63 74 20 61 70 70 66 73 5f 70 61 74 68 69 6e  uct appfs_pathin
3b50: 66 6f 20 2a 70 61 74 68 69 6e 66 6f 29 20 7b 0a  fo *pathinfo) {.
3b60: 09 63 68 61 72 20 2a 64 69 72 65 63 74 6f 72 79  .char *directory
3b70: 2c 20 2a 66 69 6c 65 2c 20 2a 70 61 74 68 3b 0a  , *file, *path;.
3b80: 09 63 68 61 72 20 2a 73 71 6c 3b 0a 09 69 6e 74  .char *sql;..int
3b90: 20 73 71 6c 69 74 65 5f 72 65 74 3b 0a 0a 09 69   sqlite_ret;...i
3ba0: 66 20 28 70 61 74 68 69 6e 66 6f 20 3d 3d 20 4e  f (pathinfo == N
3bb0: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
3bc0: 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 61 70 70 66  -EIO);..}...appf
3bd0: 73 5f 75 70 64 61 74 65 5f 69 6e 64 65 78 28 68  s_update_index(h
3be0: 6f 73 74 6e 61 6d 65 29 3b 0a 09 61 70 70 66 73  ostname);..appfs
3bf0: 5f 75 70 64 61 74 65 5f 6d 61 6e 69 66 65 73 74  _update_manifest
3c00: 28 68 6f 73 74 6e 61 6d 65 2c 20 70 61 63 6b 61  (hostname, packa
3c10: 67 65 5f 68 61 73 68 29 3b 0a 0a 09 70 61 74 68  ge_hash);...path
3c20: 20 3d 20 73 74 72 64 75 70 28 5f 70 61 74 68 29   = strdup(_path)
3c30: 3b 0a 09 64 69 72 65 63 74 6f 72 79 20 3d 20 70  ;..directory = p
3c40: 61 74 68 3b 0a 09 66 69 6c 65 20 3d 20 73 74 72  ath;..file = str
3c50: 72 63 68 72 28 70 61 74 68 2c 20 27 2f 27 29 3b  rchr(path, '/');
3c60: 0a 09 69 66 20 28 66 69 6c 65 20 3d 3d 20 4e 55  ..if (file == NU
3c70: 4c 4c 29 20 7b 0a 09 09 66 69 6c 65 20 3d 20 70  LL) {...file = p
3c80: 61 74 68 3b 0a 09 09 64 69 72 65 63 74 6f 72 79  ath;...directory
3c90: 20 3d 20 22 22 3b 0a 09 7d 20 65 6c 73 65 20 7b   = "";..} else {
3ca0: 0a 09 09 2a 66 69 6c 65 20 3d 20 27 5c 30 27 3b  ...*file = '\0';
3cb0: 0a 09 09 66 69 6c 65 2b 2b 3b 0a 09 7d 0a 0a 09  ...file++;..}...
3cc0: 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  sql = sqlite3_mp
3cd0: 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 74 79  rintf("SELECT ty
3ce0: 70 65 2c 20 74 69 6d 65 2c 20 73 6f 75 72 63 65  pe, time, source
3cf0: 2c 20 73 69 7a 65 2c 20 70 65 72 6d 73 2c 20 66  , size, perms, f
3d00: 69 6c 65 5f 73 68 61 31 2c 20 72 6f 77 69 64 20  ile_sha1, rowid 
3d10: 46 52 4f 4d 20 66 69 6c 65 73 20 57 48 45 52 45  FROM files WHERE
3d20: 20 70 61 63 6b 61 67 65 5f 73 68 61 31 20 3d 20   package_sha1 = 
3d30: 25 51 20 41 4e 44 20 66 69 6c 65 5f 64 69 72 65  %Q AND file_dire
3d40: 63 74 6f 72 79 20 3d 20 25 51 20 41 4e 44 20 66  ctory = %Q AND f
3d50: 69 6c 65 5f 6e 61 6d 65 20 3d 20 25 51 3b 22 2c  ile_name = %Q;",
3d60: 20 70 61 63 6b 61 67 65 5f 68 61 73 68 2c 20 64   package_hash, d
3d70: 69 72 65 63 74 6f 72 79 2c 20 66 69 6c 65 29 3b  irectory, file);
3d80: 0a 09 69 66 20 28 73 71 6c 20 3d 3d 20 4e 55 4c  ..if (sql == NUL
3d90: 4c 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42  L) {...APPFS_DEB
3da0: 55 47 28 22 43 61 6c 6c 20 74 6f 20 73 71 6c 69  UG("Call to sqli
3db0: 74 65 33 5f 6d 70 72 69 6e 74 66 20 66 61 69 6c  te3_mprintf fail
3dc0: 65 64 2e 22 29 3b 0a 0a 09 09 66 72 65 65 28 70  ed.");....free(p
3dd0: 61 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ath);....return(
3de0: 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 66 72 65 65  -EIO);..}...free
3df0: 28 70 61 74 68 29 3b 0a 0a 09 70 61 74 68 69 6e  (path);...pathin
3e00: 66 6f 2d 3e 74 79 70 65 20 3d 20 41 50 50 46 53  fo->type = APPFS
3e10: 5f 50 41 54 48 54 59 50 45 5f 49 4e 56 41 4c 49  _PATHTYPE_INVALI
3e20: 44 3b 0a 0a 09 41 50 50 46 53 5f 44 45 42 55 47  D;...APPFS_DEBUG
3e30: 28 22 53 51 4c 3a 20 25 73 22 2c 20 73 71 6c 29  ("SQL: %s", sql)
3e40: 3b 0a 09 73 71 6c 69 74 65 5f 72 65 74 20 3d 20  ;..sqlite_ret = 
3e50: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f  sqlite3_exec(glo
3e60: 62 61 6c 54 68 72 65 61 64 2e 64 62 2c 20 73 71  balThread.db, sq
3e70: 6c 2c 20 61 70 70 66 73 5f 67 65 74 66 69 6c 65  l, appfs_getfile
3e80: 69 6e 66 6f 5f 63 62 2c 20 70 61 74 68 69 6e 66  info_cb, pathinf
3e90: 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 73 71 6c 69 74  o, NULL);..sqlit
3ea0: 65 33 5f 66 72 65 65 28 73 71 6c 29 3b 0a 0a 09  e3_free(sql);...
3eb0: 69 66 20 28 73 71 6c 69 74 65 5f 72 65 74 20 21  if (sqlite_ret !
3ec0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 09  = SQLITE_OK) {..
3ed0: 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 43 61  .APPFS_DEBUG("Ca
3ee0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
3ef0: 65 63 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ec failed.");...
3f00: 09 72 65 74 75 72 6e 28 2d 45 49 4f 29 3b 0a 09  .return(-EIO);..
3f10: 7d 0a 0a 09 69 66 20 28 70 61 74 68 69 6e 66 6f  }...if (pathinfo
3f20: 2d 3e 74 79 70 65 20 3d 3d 20 41 50 50 46 53 5f  ->type == APPFS_
3f30: 50 41 54 48 54 59 50 45 5f 49 4e 56 41 4c 49 44  PATHTYPE_INVALID
3f40: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 4e  ) {...return(-EN
3f50: 4f 45 4e 54 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  OENT);..}...retu
3f60: 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn(0);.}..static
3f70: 20 69 6e 74 20 61 70 70 66 73 5f 67 65 74 5f 70   int appfs_get_p
3f80: 61 74 68 5f 69 6e 66 6f 5f 73 71 6c 28 63 68 61  ath_info_sql(cha
3f90: 72 20 2a 73 71 6c 2c 20 69 6e 74 20 61 72 67 63  r *sql, int argc
3fa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6d  , const char *fm
3fb0: 74 2c 20 73 74 72 75 63 74 20 61 70 70 66 73 5f  t, struct appfs_
3fc0: 70 61 74 68 69 6e 66 6f 20 2a 70 61 74 68 69 6e  pathinfo *pathin
3fd0: 66 6f 2c 20 73 74 72 75 63 74 20 61 70 70 66 73  fo, struct appfs
3fe0: 5f 63 68 69 6c 64 72 65 6e 20 2a 2a 63 68 69 6c  _children **chil
3ff0: 64 72 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20  dren) {..struct 
4000: 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a  appfs_children *
4010: 6e 6f 64 65 2c 20 2a 64 69 72 5f 63 68 69 6c 64  node, *dir_child
4020: 72 65 6e 2c 20 2a 64 69 72 5f 63 68 69 6c 64 3b  ren, *dir_child;
4030: 0a 09 69 6e 74 20 64 69 72 5f 63 68 69 6c 64 72  ..int dir_childr
4040: 65 6e 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  en_count = 0;...
4050: 64 69 72 5f 63 68 69 6c 64 72 65 6e 20 3d 20 61  dir_children = a
4060: 70 70 66 73 5f 73 71 6c 69 74 65 33 5f 71 75 65  ppfs_sqlite3_que
4070: 72 79 28 73 71 6c 2c 20 61 72 67 63 2c 20 66 6d  ry(sql, argc, fm
4080: 74 2c 20 26 64 69 72 5f 63 68 69 6c 64 72 65 6e  t, &dir_children
4090: 5f 63 6f 75 6e 74 29 3b 0a 0a 09 69 66 20 28 64  _count);...if (d
40a0: 69 72 5f 63 68 69 6c 64 72 65 6e 20 3d 3d 20 4e  ir_children == N
40b0: 55 4c 4c 20 7c 7c 20 64 69 72 5f 63 68 69 6c 64  ULL || dir_child
40c0: 72 65 6e 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20  ren_count == 0) 
40d0: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45  {...return(-ENOE
40e0: 4e 54 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 71  NT);..}.../* Req
40f0: 75 65 73 74 20 66 6f 72 20 61 20 73 69 6e 67 6c  uest for a singl
4100: 65 20 68 6f 73 74 6e 61 6d 65 20 2a 2f 0a 09 70  e hostname */..p
4110: 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 20 3d 20  athinfo->type = 
4120: 41 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f 44  APPFS_PATHTYPE_D
4130: 49 52 45 43 54 4f 52 59 3b 0a 09 70 61 74 68 69  IRECTORY;..pathi
4140: 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 64 69  nfo->typeinfo.di
4150: 72 2e 63 68 69 6c 64 63 6f 75 6e 74 20 3d 20 64  r.childcount = d
4160: 69 72 5f 63 68 69 6c 64 72 65 6e 5f 63 6f 75 6e  ir_children_coun
4170: 74 3b 0a 09 70 61 74 68 69 6e 66 6f 2d 3e 74 69  t;..pathinfo->ti
4180: 6d 65 20 3d 20 67 6c 6f 62 61 6c 54 68 72 65 61  me = globalThrea
4190: 64 2e 62 6f 6f 74 74 69 6d 65 3b 0a 0a 09 69 66  d.boottime;...if
41a0: 20 28 63 68 69 6c 64 72 65 6e 29 20 7b 0a 09 09   (children) {...
41b0: 66 6f 72 20 28 64 69 72 5f 63 68 69 6c 64 20 3d  for (dir_child =
41c0: 20 64 69 72 5f 63 68 69 6c 64 72 65 6e 3b 20 64   dir_children; d
41d0: 69 72 5f 63 68 69 6c 64 3b 20 64 69 72 5f 63 68  ir_child; dir_ch
41e0: 69 6c 64 20 3d 20 64 69 72 5f 63 68 69 6c 64 2d  ild = dir_child-
41f0: 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 6e 6f 64  >_next) {....nod
4200: 65 20 3d 20 28 76 6f 69 64 20 2a 29 20 63 6b 61  e = (void *) cka
4210: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6e 6f 64  lloc(sizeof(*nod
4220: 65 29 29 3b 0a 09 09 09 6e 6f 64 65 2d 3e 5f 6e  e));....node->_n
4230: 65 78 74 20 3d 20 2a 63 68 69 6c 64 72 65 6e 3b  ext = *children;
4240: 0a 09 09 09 73 74 72 63 70 79 28 6e 6f 64 65 2d  ....strcpy(node-
4250: 3e 6e 61 6d 65 2c 20 64 69 72 5f 63 68 69 6c 64  >name, dir_child
4260: 2d 3e 6e 61 6d 65 29 3b 0a 09 09 09 2a 63 68 69  ->name);....*chi
4270: 6c 64 72 65 6e 20 3d 20 6e 6f 64 65 3b 0a 09 09  ldren = node;...
4280: 7d 0a 09 7d 0a 0a 09 61 70 70 66 73 5f 66 72 65  }..}...appfs_fre
4290: 65 5f 6c 69 73 74 5f 63 68 69 6c 64 72 65 6e 28  e_list_children(
42a0: 64 69 72 5f 63 68 69 6c 64 72 65 6e 29 3b 0a 0a  dir_children);..
42b0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73  .return(0);.}..s
42c0: 74 61 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f  tatic int appfs_
42d0: 61 64 64 5f 70 61 74 68 5f 63 68 69 6c 64 28 63  add_path_child(c
42e0: 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c  onst char *name,
42f0: 20 73 74 72 75 63 74 20 61 70 70 66 73 5f 70 61   struct appfs_pa
4300: 74 68 69 6e 66 6f 20 2a 70 61 74 68 69 6e 66 6f  thinfo *pathinfo
4310: 2c 20 73 74 72 75 63 74 20 61 70 70 66 73 5f 63  , struct appfs_c
4320: 68 69 6c 64 72 65 6e 20 2a 2a 63 68 69 6c 64 72  hildren **childr
4330: 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20 61 70  en) {..struct ap
4340: 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a 6e 65  pfs_children *ne
4350: 77 5f 63 68 69 6c 64 3b 0a 0a 09 70 61 74 68 69  w_child;...pathi
4360: 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 64 69  nfo->typeinfo.di
4370: 72 2e 63 68 69 6c 64 63 6f 75 6e 74 2b 2b 3b 0a  r.childcount++;.
4380: 0a 09 69 66 20 28 63 68 69 6c 64 72 65 6e 29 20  ..if (children) 
4390: 7b 0a 09 09 6e 65 77 5f 63 68 69 6c 64 20 3d 20  {...new_child = 
43a0: 28 76 6f 69 64 20 2a 29 20 63 6b 61 6c 6c 6f 63  (void *) ckalloc
43b0: 28 73 69 7a 65 6f 66 28 2a 6e 65 77 5f 63 68 69  (sizeof(*new_chi
43c0: 6c 64 29 29 3b 0a 09 09 6e 65 77 5f 63 68 69 6c  ld));...new_chil
43d0: 64 2d 3e 5f 6e 65 78 74 20 3d 20 2a 63 68 69 6c  d->_next = *chil
43e0: 64 72 65 6e 3b 0a 0a 09 09 73 6e 70 72 69 6e 74  dren;....snprint
43f0: 66 28 6e 65 77 5f 63 68 69 6c 64 2d 3e 6e 61 6d  f(new_child->nam
4400: 65 2c 20 73 69 7a 65 6f 66 28 6e 65 77 5f 63 68  e, sizeof(new_ch
4410: 69 6c 64 2d 3e 6e 61 6d 65 29 2c 20 22 25 73 22  ild->name), "%s"
4420: 2c 20 6e 61 6d 65 29 3b 0a 0a 09 09 2a 63 68 69  , name);....*chi
4430: 6c 64 72 65 6e 20 3d 20 6e 65 77 5f 63 68 69 6c  ldren = new_chil
4440: 64 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30  d;..}...return(0
4450: 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  );.}../* Generat
4460: 65 20 61 6e 20 69 6e 6f 64 65 20 66 6f 72 20 61  e an inode for a
4470: 20 67 69 76 65 6e 20 70 61 74 68 20 2a 2f 0a 73   given path */.s
4480: 74 61 74 69 63 20 6c 6f 6e 67 20 6c 6f 6e 67 20  tatic long long 
4490: 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f 69  appfs_get_path_i
44a0: 6e 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  node(const char 
44b0: 2a 70 61 74 68 29 20 7b 0a 09 6c 6f 6e 67 20 6c  *path) {..long l
44c0: 6f 6e 67 20 72 65 74 76 61 6c 3b 0a 09 63 6f 6e  ong retval;..con
44d0: 73 74 20 63 68 61 72 20 2a 70 3b 0a 0a 09 72 65  st char *p;...re
44e0: 74 76 61 6c 20 3d 20 31 30 3b 0a 0a 09 66 6f 72  tval = 10;...for
44f0: 20 28 70 20 3d 20 70 61 74 68 3b 20 2a 70 3b 20   (p = path; *p; 
4500: 70 2b 2b 29 20 7b 0a 09 09 72 65 74 76 61 6c 20  p++) {...retval 
4510: 25 3d 20 34 32 39 30 39 36 30 32 39 30 55 4c 4c  %= 4290960290ULL
4520: 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20 2a 70  ;...retval += *p
4530: 3b 0a 09 09 72 65 74 76 61 6c 20 3c 3c 3d 20 37  ;...retval <<= 7
4540: 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 2b 3d  ;..}...retval +=
4550: 20 31 30 3b 0a 09 72 65 74 76 61 6c 20 25 3d 20   10;..retval %= 
4560: 34 32 39 34 39 36 37 32 39 36 55 4c 4c 3b 0a 0a  4294967296ULL;..
4570: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
4580: 0a 7d 0a 0a 2f 2a 20 47 65 74 20 69 6e 66 6f 72  .}../* Get infor
4590: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 70  mation about a p
45a0: 61 74 68 2c 20 61 6e 64 20 6f 70 74 69 6f 6e 61  ath, and optiona
45b0: 6c 6c 79 20 6c 69 73 74 20 63 68 69 6c 64 72 65  lly list childre
45c0: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
45d0: 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f 69  appfs_get_path_i
45e0: 6e 66 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  nfo(const char *
45f0: 5f 70 61 74 68 2c 20 73 74 72 75 63 74 20 61 70  _path, struct ap
4600: 70 66 73 5f 70 61 74 68 69 6e 66 6f 20 2a 70 61  pfs_pathinfo *pa
4610: 74 68 69 6e 66 6f 2c 20 73 74 72 75 63 74 20 61  thinfo, struct a
4620: 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a 2a  ppfs_children **
4630: 63 68 69 6c 64 72 65 6e 29 20 7b 0a 09 73 74 72  children) {..str
4640: 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72  uct appfs_childr
4650: 65 6e 20 2a 64 69 72 5f 63 68 69 6c 64 72 65 6e  en *dir_children
4660: 3b 0a 09 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d  ;..char *hostnam
4670: 65 2c 20 2a 70 61 63 6b 61 67 65 6e 61 6d 65 2c  e, *packagename,
4680: 20 2a 6f 73 5f 63 70 75 41 72 63 68 2c 20 2a 6f   *os_cpuArch, *o
4690: 73 2c 20 2a 63 70 75 41 72 63 68 2c 20 2a 76 65  s, *cpuArch, *ve
46a0: 72 73 69 6f 6e 3b 0a 09 63 68 61 72 20 2a 70 61  rsion;..char *pa
46b0: 74 68 2c 20 2a 70 61 74 68 5f 73 3b 0a 09 63 68  th, *path_s;..ch
46c0: 61 72 20 2a 70 61 63 6b 61 67 65 5f 68 61 73 68  ar *package_hash
46d0: 3b 0a 09 63 68 61 72 20 2a 73 71 6c 3b 0a 09 69  ;..char *sql;..i
46e0: 6e 74 20 66 69 6c 65 73 5f 63 6f 75 6e 74 3b 0a  nt files_count;.
46f0: 09 69 6e 74 20 66 69 6c 65 69 6e 66 6f 5f 72 65  .int fileinfo_re
4700: 74 2c 20 72 65 74 76 61 6c 3b 0a 0a 09 2f 2a 20  t, retval;.../* 
4710: 49 6e 69 74 69 61 6c 69 7a 65 20 72 65 74 75 72  Initialize retur
4720: 6e 20 2a 2f 0a 09 69 66 20 28 63 68 69 6c 64 72  n */..if (childr
4730: 65 6e 29 20 7b 0a 09 09 2a 63 68 69 6c 64 72 65  en) {...*childre
4740: 6e 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f  n = NULL;..}.../
4750: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
4760: 69 73 20 69 73 20 61 20 76 61 6c 69 64 20 72 65  is is a valid re
4770: 71 75 65 73 74 20 2a 2f 0a 09 69 66 20 28 5f 70  quest */..if (_p
4780: 61 74 68 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ath == NULL) {..
4790: 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29  .return(-ENOENT)
47a0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 5f 70 61 74 68  ;..}...if (_path
47b0: 5b 30 5d 20 21 3d 20 27 2f 27 29 20 7b 0a 09 09  [0] != '/') {...
47c0: 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b  return(-ENOENT);
47d0: 0a 09 7d 0a 0a 09 2f 2a 20 4e 6f 74 65 20 74 68  ..}.../* Note th
47e0: 61 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  at this is not a
47f0: 20 22 72 65 61 6c 22 20 64 69 72 65 63 74 6f 72   "real" director
4800: 79 20 66 72 6f 6d 20 61 20 70 61 63 6b 61 67 65  y from a package
4810: 20 2a 2f 0a 09 70 61 74 68 69 6e 66 6f 2d 3e 70   */..pathinfo->p
4820: 61 63 6b 61 67 65 64 20 3d 20 30 3b 0a 0a 09 69  ackaged = 0;...i
4830: 66 20 28 5f 70 61 74 68 5b 31 5d 20 3d 3d 20 27  f (_path[1] == '
4840: 5c 30 27 29 20 7b 0a 09 09 2f 2a 20 52 65 71 75  \0') {.../* Requ
4850: 65 73 74 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  est for the root
4860: 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 09 09   directory */...
4870: 70 61 74 68 69 6e 66 6f 2d 3e 68 6f 73 74 6e 61  pathinfo->hostna
4880: 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09  me[0] = '\0';...
4890: 70 61 74 68 69 6e 66 6f 2d 3e 69 6e 6f 64 65 20  pathinfo->inode 
48a0: 3d 20 31 3b 0a 0a 09 09 73 71 6c 20 3d 20 73 71  = 1;....sql = sq
48b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
48c0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 68  ELECT DISTINCT h
48d0: 6f 73 74 6e 61 6d 65 20 46 52 4f 4d 20 70 61 63  ostname FROM pac
48e0: 6b 61 67 65 73 3b 22 29 3b 0a 0a 09 09 72 65 74  kages;");....ret
48f0: 76 61 6c 20 3d 20 61 70 70 66 73 5f 67 65 74 5f  val = appfs_get_
4900: 70 61 74 68 5f 69 6e 66 6f 5f 73 71 6c 28 73 71  path_info_sql(sq
4910: 6c 2c 20 31 2c 20 4e 55 4c 4c 2c 20 70 61 74 68  l, 1, NULL, path
4920: 69 6e 66 6f 2c 20 63 68 69 6c 64 72 65 6e 29 3b  info, children);
4930: 0a 0a 09 09 2f 2a 20 54 68 65 20 72 6f 6f 74 20  ..../* The root 
4940: 64 69 72 65 63 74 6f 72 79 20 61 6c 77 61 79 73  directory always
4950: 20 65 78 69 73 74 73 2c 20 65 76 65 6e 20 69 66   exists, even if
4960: 20 69 74 20 68 61 73 20 6e 6f 20 73 75 62 6f 72   it has no subor
4970: 64 69 6e 61 74 65 73 20 2a 2f 0a 09 09 69 66 20  dinates */...if 
4980: 28 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  (retval != 0) {.
4990: 09 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70  ...pathinfo->typ
49a0: 65 20 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59  e = APPFS_PATHTY
49b0: 50 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09 09  PE_DIRECTORY;...
49c0: 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69  .pathinfo->typei
49d0: 6e 66 6f 2e 64 69 72 2e 63 68 69 6c 64 63 6f 75  nfo.dir.childcou
49e0: 6e 74 20 3d 20 30 3b 0a 09 09 09 70 61 74 68 69  nt = 0;....pathi
49f0: 6e 66 6f 2d 3e 74 69 6d 65 20 3d 20 67 6c 6f 62  nfo->time = glob
4a00: 61 6c 54 68 72 65 61 64 2e 62 6f 6f 74 74 69 6d  alThread.boottim
4a10: 65 3b 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20  e;.....retval = 
4a20: 30 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  0;...}....return
4a30: 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 70  (retval);..}...p
4a40: 61 74 68 20 3d 20 73 74 72 64 75 70 28 5f 70 61  ath = strdup(_pa
4a50: 74 68 29 3b 0a 09 70 61 74 68 5f 73 20 3d 20 70  th);..path_s = p
4a60: 61 74 68 3b 0a 0a 09 70 61 74 68 69 6e 66 6f 2d  ath;...pathinfo-
4a70: 3e 69 6e 6f 64 65 20 3d 20 61 70 70 66 73 5f 67  >inode = appfs_g
4a80: 65 74 5f 70 61 74 68 5f 69 6e 6f 64 65 28 70 61  et_path_inode(pa
4a90: 74 68 29 3b 0a 0a 09 68 6f 73 74 6e 61 6d 65 20  th);...hostname 
4aa0: 3d 20 70 61 74 68 20 2b 20 31 3b 0a 09 70 61 63  = path + 1;..pac
4ab0: 6b 61 67 65 6e 61 6d 65 20 3d 20 73 74 72 63 68  kagename = strch
4ac0: 72 28 68 6f 73 74 6e 61 6d 65 2c 20 27 2f 27 29  r(hostname, '/')
4ad0: 3b 0a 0a 09 69 66 20 28 70 61 63 6b 61 67 65 6e  ;...if (packagen
4ae0: 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ame != NULL) {..
4af0: 09 2a 70 61 63 6b 61 67 65 6e 61 6d 65 20 3d 20  .*packagename = 
4b00: 27 5c 30 27 3b 0a 09 09 70 61 63 6b 61 67 65 6e  '\0';...packagen
4b10: 61 6d 65 2b 2b 3b 0a 09 7d 0a 0a 09 73 6e 70 72  ame++;..}...snpr
4b20: 69 6e 74 66 28 70 61 74 68 69 6e 66 6f 2d 3e 68  intf(pathinfo->h
4b30: 6f 73 74 6e 61 6d 65 2c 20 73 69 7a 65 6f 66 28  ostname, sizeof(
4b40: 70 61 74 68 69 6e 66 6f 2d 3e 68 6f 73 74 6e 61  pathinfo->hostna
4b50: 6d 65 29 2c 20 22 25 73 22 2c 20 68 6f 73 74 6e  me), "%s", hostn
4b60: 61 6d 65 29 3b 0a 0a 09 69 66 20 28 70 61 63 6b  ame);...if (pack
4b70: 61 67 65 6e 61 6d 65 20 3d 3d 20 4e 55 4c 4c 29  agename == NULL)
4b80: 20 7b 0a 09 09 61 70 70 66 73 5f 75 70 64 61 74   {...appfs_updat
4b90: 65 5f 69 6e 64 65 78 28 68 6f 73 74 6e 61 6d 65  e_index(hostname
4ba0: 29 3b 0a 0a 09 09 73 71 6c 20 3d 20 73 71 6c 69  );....sql = sqli
4bb0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
4bc0: 45 43 54 20 44 49 53 54 49 4e 43 54 20 70 61 63  ECT DISTINCT pac
4bd0: 6b 61 67 65 20 46 52 4f 4d 20 70 61 63 6b 61 67  kage FROM packag
4be0: 65 73 20 57 48 45 52 45 20 68 6f 73 74 6e 61 6d  es WHERE hostnam
4bf0: 65 20 3d 20 25 51 3b 22 2c 20 68 6f 73 74 6e 61  e = %Q;", hostna
4c00: 6d 65 29 3b 0a 0a 09 09 66 72 65 65 28 70 61 74  me);....free(pat
4c10: 68 5f 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  h_s);....return(
4c20: 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f 69  appfs_get_path_i
4c30: 6e 66 6f 5f 73 71 6c 28 73 71 6c 2c 20 31 2c 20  nfo_sql(sql, 1, 
4c40: 4e 55 4c 4c 2c 20 70 61 74 68 69 6e 66 6f 2c 20  NULL, pathinfo, 
4c50: 63 68 69 6c 64 72 65 6e 29 29 3b 0a 09 7d 0a 0a  children));..}..
4c60: 09 6f 73 5f 63 70 75 41 72 63 68 20 3d 20 73 74  .os_cpuArch = st
4c70: 72 63 68 72 28 70 61 63 6b 61 67 65 6e 61 6d 65  rchr(packagename
4c80: 2c 20 27 2f 27 29 3b 0a 0a 09 69 66 20 28 6f 73  , '/');...if (os
4c90: 5f 63 70 75 41 72 63 68 20 21 3d 20 4e 55 4c 4c  _cpuArch != NULL
4ca0: 29 20 7b 0a 09 09 2a 6f 73 5f 63 70 75 41 72 63  ) {...*os_cpuArc
4cb0: 68 20 3d 20 27 5c 30 27 3b 0a 09 09 6f 73 5f 63  h = '\0';...os_c
4cc0: 70 75 41 72 63 68 2b 2b 3b 0a 09 7d 0a 0a 09 69  puArch++;..}...i
4cd0: 66 20 28 6f 73 5f 63 70 75 41 72 63 68 20 3d 3d  f (os_cpuArch ==
4ce0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 70 70 66 73   NULL) {...appfs
4cf0: 5f 75 70 64 61 74 65 5f 69 6e 64 65 78 28 68 6f  _update_index(ho
4d00: 73 74 6e 61 6d 65 29 3b 0a 0a 09 09 73 71 6c 20  stname);....sql 
4d10: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
4d20: 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e  f("SELECT DISTIN
4d30: 43 54 20 6f 73 2c 20 63 70 75 41 72 63 68 20 46  CT os, cpuArch F
4d40: 52 4f 4d 20 70 61 63 6b 61 67 65 73 20 57 48 45  ROM packages WHE
4d50: 52 45 20 68 6f 73 74 6e 61 6d 65 20 3d 20 25 51  RE hostname = %Q
4d60: 20 41 4e 44 20 70 61 63 6b 61 67 65 20 3d 20 25   AND package = %
4d70: 51 3b 22 2c 20 68 6f 73 74 6e 61 6d 65 2c 20 70  Q;", hostname, p
4d80: 61 63 6b 61 67 65 6e 61 6d 65 29 3b 0a 0a 09 09  ackagename);....
4d90: 66 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09  free(path_s);...
4da0: 09 72 65 74 76 61 6c 20 3d 20 61 70 70 66 73 5f  .retval = appfs_
4db0: 67 65 74 5f 70 61 74 68 5f 69 6e 66 6f 5f 73 71  get_path_info_sq
4dc0: 6c 28 73 71 6c 2c 20 32 2c 20 22 25 73 2d 25 73  l(sql, 2, "%s-%s
4dd0: 22 2c 20 70 61 74 68 69 6e 66 6f 2c 20 63 68 69  ", pathinfo, chi
4de0: 6c 64 72 65 6e 29 3b 0a 0a 09 09 69 66 20 28 72  ldren);....if (r
4df0: 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
4e00: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
4e10: 0a 09 09 7d 0a 0a 09 09 61 70 70 66 73 5f 61 64  ...}....appfs_ad
4e20: 64 5f 70 61 74 68 5f 63 68 69 6c 64 28 22 70 6c  d_path_child("pl
4e30: 61 74 66 6f 72 6d 22 2c 20 70 61 74 68 69 6e 66  atform", pathinf
4e40: 6f 2c 20 63 68 69 6c 64 72 65 6e 29 3b 0a 0a 09  o, children);...
4e50: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
4e60: 0a 09 7d 0a 0a 09 76 65 72 73 69 6f 6e 20 3d 20  ..}...version = 
4e70: 73 74 72 63 68 72 28 6f 73 5f 63 70 75 41 72 63  strchr(os_cpuArc
4e80: 68 2c 20 27 2f 27 29 3b 0a 0a 09 69 66 20 28 76  h, '/');...if (v
4e90: 65 72 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20  ersion != NULL) 
4ea0: 7b 0a 09 09 2a 76 65 72 73 69 6f 6e 20 3d 20 27  {...*version = '
4eb0: 5c 30 27 3b 0a 09 09 76 65 72 73 69 6f 6e 2b 2b  \0';...version++
4ec0: 3b 0a 09 7d 0a 0a 09 6f 73 20 3d 20 6f 73 5f 63  ;..}...os = os_c
4ed0: 70 75 41 72 63 68 3b 0a 09 63 70 75 41 72 63 68  puArch;..cpuArch
4ee0: 20 3d 20 73 74 72 63 68 72 28 6f 73 5f 63 70 75   = strchr(os_cpu
4ef0: 41 72 63 68 2c 20 27 2d 27 29 3b 0a 09 69 66 20  Arch, '-');..if 
4f00: 28 63 70 75 41 72 63 68 29 20 7b 0a 09 09 2a 63  (cpuArch) {...*c
4f10: 70 75 41 72 63 68 20 3d 20 27 5c 30 27 3b 0a 09  puArch = '\0';..
4f20: 09 63 70 75 41 72 63 68 2b 2b 3b 0a 09 7d 20 65  .cpuArch++;..} e
4f30: 6c 73 65 20 7b 0a 09 09 63 70 75 41 72 63 68 20  lse {...cpuArch 
4f40: 3d 20 22 22 3b 0a 09 7d 0a 0a 09 69 66 20 28 76  = "";..}...if (v
4f50: 65 72 73 69 6f 6e 20 3d 3d 20 4e 55 4c 4c 29 20  ersion == NULL) 
4f60: 7b 0a 09 09 69 66 20 28 73 74 72 63 6d 70 28 6f  {...if (strcmp(o
4f70: 73 2c 20 22 70 6c 61 74 66 6f 72 6d 22 29 20 3d  s, "platform") =
4f80: 3d 20 30 20 26 26 20 73 74 72 63 6d 70 28 63 70  = 0 && strcmp(cp
4f90: 75 41 72 63 68 2c 20 22 22 29 20 3d 3d 20 30 29  uArch, "") == 0)
4fa0: 20 7b 0a 09 09 09 70 61 74 68 69 6e 66 6f 2d 3e   {....pathinfo->
4fb0: 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54  type = APPFS_PAT
4fc0: 48 54 59 50 45 5f 53 59 4d 4c 49 4e 4b 3b 0a 09  HTYPE_SYMLINK;..
4fd0: 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 69 6d 65  ..pathinfo->time
4fe0: 20 3d 20 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e   = globalThread.
4ff0: 62 6f 6f 74 74 69 6d 65 3b 0a 09 09 09 70 61 74  boottime;....pat
5000: 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e  hinfo->typeinfo.
5010: 64 69 72 2e 63 68 69 6c 64 63 6f 75 6e 74 20 3d  dir.childcount =
5020: 20 30 3b 0a 09 09 09 70 61 74 68 69 6e 66 6f 2d   0;....pathinfo-
5030: 3e 74 79 70 65 69 6e 66 6f 2e 73 79 6d 6c 69 6e  >typeinfo.symlin
5040: 6b 2e 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28  k.size = strlen(
5050: 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 70 6c 61  globalThread.pla
5060: 74 66 6f 72 6d 29 3b 0a 0a 09 09 09 73 6e 70 72  tform);.....snpr
5070: 69 6e 74 66 28 70 61 74 68 69 6e 66 6f 2d 3e 74  intf(pathinfo->t
5080: 79 70 65 69 6e 66 6f 2e 73 79 6d 6c 69 6e 6b 2e  ypeinfo.symlink.
5090: 73 6f 75 72 63 65 2c 20 73 69 7a 65 6f 66 28 70  source, sizeof(p
50a0: 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66  athinfo->typeinf
50b0: 6f 2e 73 79 6d 6c 69 6e 6b 2e 73 6f 75 72 63 65  o.symlink.source
50c0: 29 2c 20 22 25 73 22 2c 20 67 6c 6f 62 61 6c 54  ), "%s", globalT
50d0: 68 72 65 61 64 2e 70 6c 61 74 66 6f 72 6d 29 3b  hread.platform);
50e0: 0a 0a 09 09 09 66 72 65 65 28 70 61 74 68 5f 73  .....free(path_s
50f0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 30 29  );.....return(0)
5100: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 52 65 71 75  ;...}..../* Requ
5110: 65 73 74 20 66 6f 72 20 76 65 72 73 69 6f 6e 20  est for version 
5120: 6c 69 73 74 20 66 6f 72 20 61 20 70 61 63 6b 61  list for a packa
5130: 67 65 20 6f 6e 20 61 6e 20 4f 53 2f 43 50 55 20  ge on an OS/CPU 
5140: 2a 2f 0a 09 09 61 70 70 66 73 5f 75 70 64 61 74  */...appfs_updat
5150: 65 5f 69 6e 64 65 78 28 68 6f 73 74 6e 61 6d 65  e_index(hostname
5160: 29 3b 0a 0a 09 09 73 71 6c 20 3d 20 73 71 6c 69  );....sql = sqli
5170: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
5180: 45 43 54 20 44 49 53 54 49 4e 43 54 20 76 65 72  ECT DISTINCT ver
5190: 73 69 6f 6e 20 46 52 4f 4d 20 70 61 63 6b 61 67  sion FROM packag
51a0: 65 73 20 57 48 45 52 45 20 68 6f 73 74 6e 61 6d  es WHERE hostnam
51b0: 65 20 3d 20 25 51 20 41 4e 44 20 70 61 63 6b 61  e = %Q AND packa
51c0: 67 65 20 3d 20 25 51 20 41 4e 44 20 6f 73 20 3d  ge = %Q AND os =
51d0: 20 25 51 20 61 6e 64 20 63 70 75 41 72 63 68 20   %Q and cpuArch 
51e0: 3d 20 25 51 3b 22 2c 20 68 6f 73 74 6e 61 6d 65  = %Q;", hostname
51f0: 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65 2c 20 6f  , packagename, o
5200: 73 2c 20 63 70 75 41 72 63 68 29 3b 0a 0a 09 09  s, cpuArch);....
5210: 66 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09  free(path_s);...
5220: 09 72 65 74 75 72 6e 28 61 70 70 66 73 5f 67 65  .return(appfs_ge
5230: 74 5f 70 61 74 68 5f 69 6e 66 6f 5f 73 71 6c 28  t_path_info_sql(
5240: 73 71 6c 2c 20 31 2c 20 4e 55 4c 4c 2c 20 70 61  sql, 1, NULL, pa
5250: 74 68 69 6e 66 6f 2c 20 63 68 69 6c 64 72 65 6e  thinfo, children
5260: 29 29 3b 0a 09 7d 0a 0a 09 70 61 74 68 20 3d 20  ));..}...path = 
5270: 73 74 72 63 68 72 28 76 65 72 73 69 6f 6e 2c 20  strchr(version, 
5280: 27 2f 27 29 3b 0a 09 69 66 20 28 70 61 74 68 20  '/');..if (path 
5290: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 61 74  == NULL) {...pat
52a0: 68 20 3d 20 22 22 3b 0a 09 7d 20 65 6c 73 65 20  h = "";..} else 
52b0: 7b 0a 09 09 2a 70 61 74 68 20 3d 20 27 5c 30 27  {...*path = '\0'
52c0: 3b 0a 09 09 70 61 74 68 2b 2b 3b 0a 09 7d 0a 0a  ;...path++;..}..
52d0: 09 2f 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20  ./* Request for 
52e0: 61 20 66 69 6c 65 20 69 6e 20 61 20 73 70 65 63  a file in a spec
52f0: 69 66 69 63 20 70 61 63 6b 61 67 65 20 2a 2f 0a  ific package */.
5300: 09 70 61 74 68 69 6e 66 6f 2d 3e 70 61 63 6b 61  .pathinfo->packa
5310: 67 65 64 20 3d 20 31 3b 0a 09 41 50 50 46 53 5f  ged = 1;..APPFS_
5320: 44 45 42 55 47 28 22 52 65 71 75 65 73 74 69 6e  DEBUG("Requestin
5330: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
5340: 72 20 68 6f 73 74 6e 61 6d 65 20 3d 20 25 73 2c  r hostname = %s,
5350: 20 70 61 63 6b 61 67 65 20 3d 20 25 73 2c 20 6f   package = %s, o
5360: 73 20 3d 20 25 73 2c 20 63 70 75 41 72 63 68 20  s = %s, cpuArch 
5370: 3d 20 25 73 2c 20 76 65 72 73 69 6f 6e 20 3d 20  = %s, version = 
5380: 25 73 2c 20 70 61 74 68 20 3d 20 25 73 22 2c 20  %s, path = %s", 
5390: 0a 09 09 68 6f 73 74 6e 61 6d 65 2c 20 70 61 63  ...hostname, pac
53a0: 6b 61 67 65 6e 61 6d 65 2c 20 6f 73 2c 20 63 70  kagename, os, cp
53b0: 75 41 72 63 68 2c 20 76 65 72 73 69 6f 6e 2c 20  uArch, version, 
53c0: 70 61 74 68 0a 09 29 3b 0a 0a 09 70 61 63 6b 61  path..);...packa
53d0: 67 65 5f 68 61 73 68 20 3d 20 61 70 70 66 73 5f  ge_hash = appfs_
53e0: 6c 6f 6f 6b 75 70 5f 70 61 63 6b 61 67 65 5f 68  lookup_package_h
53f0: 61 73 68 28 68 6f 73 74 6e 61 6d 65 2c 20 70 61  ash(hostname, pa
5400: 63 6b 61 67 65 6e 61 6d 65 2c 20 6f 73 2c 20 63  ckagename, os, c
5410: 70 75 41 72 63 68 2c 20 76 65 72 73 69 6f 6e 29  puArch, version)
5420: 3b 0a 09 69 66 20 28 70 61 63 6b 61 67 65 5f 68  ;..if (package_h
5430: 61 73 68 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ash == NULL) {..
5440: 09 66 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a  .free(path_s);..
5450: 09 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54  ..return(-ENOENT
5460: 29 3b 0a 09 7d 0a 0a 09 41 50 50 46 53 5f 44 45  );..}...APPFS_DE
5470: 42 55 47 28 22 20 20 2e 2e 2e 20 77 68 69 63 68  BUG("  ... which
5480: 20 68 61 73 68 20 61 20 68 61 73 68 20 6f 66 20   hash a hash of 
5490: 25 73 22 2c 20 70 61 63 6b 61 67 65 5f 68 61 73  %s", package_has
54a0: 68 29 3b 0a 0a 09 61 70 70 66 73 5f 75 70 64 61  h);...appfs_upda
54b0: 74 65 5f 6d 61 6e 69 66 65 73 74 28 68 6f 73 74  te_manifest(host
54c0: 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65 5f 68 61  name, package_ha
54d0: 73 68 29 3b 0a 0a 09 69 66 20 28 73 74 72 63 6d  sh);...if (strcm
54e0: 70 28 70 61 74 68 2c 20 22 22 29 20 3d 3d 20 30  p(path, "") == 0
54f0: 29 20 7b 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e  ) {...pathinfo->
5500: 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54  type = APPFS_PAT
5510: 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b  HTYPE_DIRECTORY;
5520: 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 69 6d  ...pathinfo->tim
5530: 65 20 3d 20 67 6c 6f 62 61 6c 54 68 72 65 61 64  e = globalThread
5540: 2e 62 6f 6f 74 74 69 6d 65 3b 0a 09 7d 20 65 6c  .boottime;..} el
5550: 73 65 20 7b 0a 09 09 66 69 6c 65 69 6e 66 6f 5f  se {...fileinfo_
5560: 72 65 74 20 3d 20 61 70 70 66 73 5f 67 65 74 66  ret = appfs_getf
5570: 69 6c 65 69 6e 66 6f 28 68 6f 73 74 6e 61 6d 65  ileinfo(hostname
5580: 2c 20 70 61 63 6b 61 67 65 5f 68 61 73 68 2c 20  , package_hash, 
5590: 70 61 74 68 2c 20 70 61 74 68 69 6e 66 6f 29 3b  path, pathinfo);
55a0: 0a 09 09 69 66 20 28 66 69 6c 65 69 6e 66 6f 5f  ...if (fileinfo_
55b0: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 66  ret != 0) {....f
55c0: 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09 09  ree(path_s);....
55d0: 09 72 65 74 75 72 6e 28 66 69 6c 65 69 6e 66 6f  .return(fileinfo
55e0: 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  _ret);...}..}...
55f0: 69 66 20 28 70 61 74 68 69 6e 66 6f 2d 3e 74 79  if (pathinfo->ty
5600: 70 65 20 3d 3d 20 41 50 50 46 53 5f 50 41 54 48  pe == APPFS_PATH
5610: 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 29 20  TYPE_DIRECTORY) 
5620: 7b 0a 09 09 64 69 72 5f 63 68 69 6c 64 72 65 6e  {...dir_children
5630: 20 3d 20 61 70 70 66 73 5f 67 65 74 63 68 69 6c   = appfs_getchil
5640: 64 72 65 6e 28 68 6f 73 74 6e 61 6d 65 2c 20 70  dren(hostname, p
5650: 61 63 6b 61 67 65 5f 68 61 73 68 2c 20 70 61 74  ackage_hash, pat
5660: 68 2c 20 26 66 69 6c 65 73 5f 63 6f 75 6e 74 29  h, &files_count)
5670: 3b 0a 0a 09 09 69 66 20 28 64 69 72 5f 63 68 69  ;....if (dir_chi
5680: 6c 64 72 65 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b  ldren != NULL) {
5690: 0a 09 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79  ....pathinfo->ty
56a0: 70 65 69 6e 66 6f 2e 64 69 72 2e 63 68 69 6c 64  peinfo.dir.child
56b0: 63 6f 75 6e 74 20 3d 20 66 69 6c 65 73 5f 63 6f  count = files_co
56c0: 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  unt;...}....if (
56d0: 63 68 69 6c 64 72 65 6e 29 20 7b 0a 09 09 09 2a  children) {....*
56e0: 63 68 69 6c 64 72 65 6e 20 3d 20 64 69 72 5f 63  children = dir_c
56f0: 68 69 6c 64 72 65 6e 3b 0a 09 09 7d 20 65 6c 73  hildren;...} els
5700: 65 20 7b 0a 09 09 09 61 70 70 66 73 5f 66 72 65  e {....appfs_fre
5710: 65 5f 6c 69 73 74 5f 63 68 69 6c 64 72 65 6e 28  e_list_children(
5720: 64 69 72 5f 63 68 69 6c 64 72 65 6e 29 3b 0a 09  dir_children);..
5730: 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 70 61 74  .}..}...free(pat
5740: 68 5f 73 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  h_s);...return(0
5750: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
5760: 20 61 70 70 66 73 5f 66 75 73 65 5f 72 65 61 64   appfs_fuse_read
5770: 6c 69 6e 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  link(const char 
5780: 2a 70 61 74 68 2c 20 63 68 61 72 20 2a 62 75 66  *path, char *buf
5790: 2c 20 73 69 7a 65 5f 74 20 73 69 7a 65 29 20 7b  , size_t size) {
57a0: 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 70  ..struct appfs_p
57b0: 61 74 68 69 6e 66 6f 20 70 61 74 68 69 6e 66 6f  athinfo pathinfo
57c0: 3b 0a 09 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a  ;..int res = 0;.
57d0: 0a 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 45  ..APPFS_DEBUG("E
57e0: 6e 74 65 72 20 28 70 61 74 68 20 3d 20 25 73 2c  nter (path = %s,
57f0: 20 2e 2e 2e 29 22 2c 20 70 61 74 68 29 3b 0a 0a   ...)", path);..
5800: 09 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 20 3d  .pathinfo.type =
5810: 20 41 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f   APPFS_PATHTYPE_
5820: 49 4e 56 41 4c 49 44 3b 0a 0a 09 72 65 73 20 3d  INVALID;...res =
5830: 20 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f   appfs_get_path_
5840: 69 6e 66 6f 28 70 61 74 68 2c 20 26 70 61 74 68  info(path, &path
5850: 69 6e 66 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  info, NULL);..if
5860: 20 28 72 65 73 20 21 3d 20 30 29 20 7b 0a 09 09   (res != 0) {...
5870: 72 65 74 75 72 6e 28 72 65 73 29 3b 0a 09 7d 0a  return(res);..}.
5880: 0a 09 69 66 20 28 70 61 74 68 69 6e 66 6f 2e 74  ..if (pathinfo.t
5890: 79 70 65 20 21 3d 20 41 50 50 46 53 5f 50 41 54  ype != APPFS_PAT
58a0: 48 54 59 50 45 5f 53 59 4d 4c 49 4e 4b 29 20 7b  HTYPE_SYMLINK) {
58b0: 0a 09 09 72 65 74 75 72 6e 28 2d 45 49 4e 56 41  ...return(-EINVA
58c0: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74  L);..}...if ((st
58d0: 72 6c 65 6e 28 70 61 74 68 69 6e 66 6f 2e 74 79  rlen(pathinfo.ty
58e0: 70 65 69 6e 66 6f 2e 73 79 6d 6c 69 6e 6b 2e 73  peinfo.symlink.s
58f0: 6f 75 72 63 65 29 20 2b 20 31 29 20 3e 20 73 69  ource) + 1) > si
5900: 7a 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d  ze) {...return(-
5910: 45 4e 41 4d 45 54 4f 4f 4c 4f 4e 47 29 3b 0a 09  ENAMETOOLONG);..
5920: 7d 0a 0a 09 6d 65 6d 63 70 79 28 62 75 66 2c 20  }...memcpy(buf, 
5930: 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 69 6e 66  pathinfo.typeinf
5940: 6f 2e 73 79 6d 6c 69 6e 6b 2e 73 6f 75 72 63 65  o.symlink.source
5950: 2c 20 73 74 72 6c 65 6e 28 70 61 74 68 69 6e 66  , strlen(pathinf
5960: 6f 2e 74 79 70 65 69 6e 66 6f 2e 73 79 6d 6c 69  o.typeinfo.symli
5970: 6e 6b 2e 73 6f 75 72 63 65 29 20 2b 20 31 29 3b  nk.source) + 1);
5980: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
5990: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
59a0: 73 5f 66 75 73 65 5f 67 65 74 61 74 74 72 28 63  s_fuse_getattr(c
59b0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
59c0: 20 73 74 72 75 63 74 20 73 74 61 74 20 2a 73 74   struct stat *st
59d0: 62 75 66 29 20 7b 0a 09 73 74 72 75 63 74 20 61  buf) {..struct a
59e0: 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20 70 61  ppfs_pathinfo pa
59f0: 74 68 69 6e 66 6f 3b 0a 09 69 6e 74 20 72 65 73  thinfo;..int res
5a00: 20 3d 20 30 3b 0a 0a 09 41 50 50 46 53 5f 44 45   = 0;...APPFS_DE
5a10: 42 55 47 28 22 45 6e 74 65 72 20 28 70 61 74 68  BUG("Enter (path
5a20: 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c 20 70 61   = %s, ...)", pa
5a30: 74 68 29 3b 0a 0a 09 70 61 74 68 69 6e 66 6f 2e  th);...pathinfo.
5a40: 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54  type = APPFS_PAT
5a50: 48 54 59 50 45 5f 49 4e 56 41 4c 49 44 3b 0a 0a  HTYPE_INVALID;..
5a60: 09 72 65 73 20 3d 20 61 70 70 66 73 5f 67 65 74  .res = appfs_get
5a70: 5f 70 61 74 68 5f 69 6e 66 6f 28 70 61 74 68 2c  _path_info(path,
5a80: 20 26 70 61 74 68 69 6e 66 6f 2c 20 4e 55 4c 4c   &pathinfo, NULL
5a90: 29 3b 0a 09 69 66 20 28 72 65 73 20 21 3d 20 30  );..if (res != 0
5aa0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 72 65 73  ) {...return(res
5ab0: 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 73  );..}...memset(s
5ac0: 74 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  tbuf, 0, sizeof(
5ad0: 73 74 72 75 63 74 20 73 74 61 74 29 29 3b 0a 0a  struct stat));..
5ae0: 09 73 74 62 75 66 2d 3e 73 74 5f 6d 74 69 6d 65  .stbuf->st_mtime
5af0: 20 3d 20 70 61 74 68 69 6e 66 6f 2e 74 69 6d 65   = pathinfo.time
5b00: 3b 0a 09 73 74 62 75 66 2d 3e 73 74 5f 63 74 69  ;..stbuf->st_cti
5b10: 6d 65 20 3d 20 70 61 74 68 69 6e 66 6f 2e 74 69  me = pathinfo.ti
5b20: 6d 65 3b 0a 09 73 74 62 75 66 2d 3e 73 74 5f 61  me;..stbuf->st_a
5b30: 74 69 6d 65 20 3d 20 70 61 74 68 69 6e 66 6f 2e  time = pathinfo.
5b40: 74 69 6d 65 3b 0a 09 73 74 62 75 66 2d 3e 73 74  time;..stbuf->st
5b50: 5f 69 6e 6f 20 20 20 3d 20 70 61 74 68 69 6e 66  _ino   = pathinf
5b60: 6f 2e 69 6e 6f 64 65 3b 0a 09 73 74 62 75 66 2d  o.inode;..stbuf-
5b70: 3e 73 74 5f 6d 6f 64 65 20 20 3d 20 30 3b 0a 0a  >st_mode  = 0;..
5b80: 09 73 77 69 74 63 68 20 28 70 61 74 68 69 6e 66  .switch (pathinf
5b90: 6f 2e 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65  o.type) {...case
5ba0: 20 41 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f   APPFS_PATHTYPE_
5bb0: 44 49 52 45 43 54 4f 52 59 3a 0a 09 09 09 73 74  DIRECTORY:....st
5bc0: 62 75 66 2d 3e 73 74 5f 6d 6f 64 65 20 3d 20 53  buf->st_mode = S
5bd0: 5f 49 46 44 49 52 20 7c 20 30 35 35 35 3b 0a 09  _IFDIR | 0555;..
5be0: 09 09 73 74 62 75 66 2d 3e 73 74 5f 6e 6c 69 6e  ..stbuf->st_nlin
5bf0: 6b 20 3d 20 32 20 2b 20 70 61 74 68 69 6e 66 6f  k = 2 + pathinfo
5c00: 2e 74 79 70 65 69 6e 66 6f 2e 64 69 72 2e 63 68  .typeinfo.dir.ch
5c10: 69 6c 64 63 6f 75 6e 74 3b 0a 09 09 09 62 72 65  ildcount;....bre
5c20: 61 6b 3b 0a 09 09 63 61 73 65 20 41 50 50 46 53  ak;...case APPFS
5c30: 5f 50 41 54 48 54 59 50 45 5f 46 49 4c 45 3a 0a  _PATHTYPE_FILE:.
5c40: 09 09 09 69 66 20 28 70 61 74 68 69 6e 66 6f 2e  ...if (pathinfo.
5c50: 74 79 70 65 69 6e 66 6f 2e 66 69 6c 65 2e 65 78  typeinfo.file.ex
5c60: 65 63 75 74 61 62 6c 65 29 20 7b 0a 09 09 09 09  ecutable) {.....
5c70: 73 74 62 75 66 2d 3e 73 74 5f 6d 6f 64 65 20 3d  stbuf->st_mode =
5c80: 20 53 5f 49 46 52 45 47 20 7c 20 30 35 35 35 3b   S_IFREG | 0555;
5c90: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
5ca0: 09 73 74 62 75 66 2d 3e 73 74 5f 6d 6f 64 65 20  .stbuf->st_mode 
5cb0: 3d 20 53 5f 49 46 52 45 47 20 7c 20 30 34 34 34  = S_IFREG | 0444
5cc0: 3b 0a 09 09 09 7d 0a 0a 09 09 09 73 74 62 75 66  ;....}.....stbuf
5cd0: 2d 3e 73 74 5f 6e 6c 69 6e 6b 20 3d 20 31 3b 0a  ->st_nlink = 1;.
5ce0: 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 73 69 7a  ...stbuf->st_siz
5cf0: 65 20 3d 20 70 61 74 68 69 6e 66 6f 2e 74 79 70  e = pathinfo.typ
5d00: 65 69 6e 66 6f 2e 66 69 6c 65 2e 73 69 7a 65 3b  einfo.file.size;
5d10: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
5d20: 65 20 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  e APPFS_PATHTYPE
5d30: 5f 53 59 4d 4c 49 4e 4b 3a 0a 09 09 09 73 74 62  _SYMLINK:....stb
5d40: 75 66 2d 3e 73 74 5f 6d 6f 64 65 20 3d 20 53 5f  uf->st_mode = S_
5d50: 49 46 4c 4e 4b 20 7c 20 30 35 35 35 3b 0a 09 09  IFLNK | 0555;...
5d60: 09 73 74 62 75 66 2d 3e 73 74 5f 6e 6c 69 6e 6b  .stbuf->st_nlink
5d70: 20 3d 20 31 3b 0a 09 09 09 73 74 62 75 66 2d 3e   = 1;....stbuf->
5d80: 73 74 5f 73 69 7a 65 20 3d 20 70 61 74 68 69 6e  st_size = pathin
5d90: 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 73 79 6d 6c  fo.typeinfo.syml
5da0: 69 6e 6b 2e 73 69 7a 65 3b 0a 09 09 09 62 72 65  ink.size;....bre
5db0: 61 6b 3b 0a 09 09 63 61 73 65 20 41 50 50 46 53  ak;...case APPFS
5dc0: 5f 50 41 54 48 54 59 50 45 5f 49 4e 56 41 4c 49  _PATHTYPE_INVALI
5dd0: 44 3a 0a 09 09 09 72 65 73 20 3d 20 2d 45 49 4f  D:....res = -EIO
5de0: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  ;.....break;..}.
5df0: 0a 09 69 66 20 28 70 61 74 68 69 6e 66 6f 2e 70  ..if (pathinfo.p
5e00: 61 63 6b 61 67 65 64 29 20 7b 0a 09 09 69 66 20  ackaged) {...if 
5e10: 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 6f 70  (globalThread.op
5e20: 74 69 6f 6e 73 2e 77 72 69 74 61 62 6c 65 29 20  tions.writable) 
5e30: 7b 0a 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 6d  {....stbuf->st_m
5e40: 6f 64 65 20 7c 3d 20 30 32 32 32 3b 0a 09 09 7d  ode |= 0222;...}
5e50: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 72 65 73  ..}...return res
5e60: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
5e70: 61 70 70 66 73 5f 66 75 73 65 5f 72 65 61 64 64  appfs_fuse_readd
5e80: 69 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  ir(const char *p
5e90: 61 74 68 2c 20 76 6f 69 64 20 2a 62 75 66 2c 20  ath, void *buf, 
5ea0: 66 75 73 65 5f 66 69 6c 6c 5f 64 69 72 5f 74 20  fuse_fill_dir_t 
5eb0: 66 69 6c 6c 65 72 2c 20 6f 66 66 5f 74 20 6f 66  filler, off_t of
5ec0: 66 73 65 74 2c 20 73 74 72 75 63 74 20 66 75 73  fset, struct fus
5ed0: 65 5f 66 69 6c 65 5f 69 6e 66 6f 20 2a 66 69 29  e_file_info *fi)
5ee0: 20 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73   {..struct appfs
5ef0: 5f 70 61 74 68 69 6e 66 6f 20 70 61 74 68 69 6e  _pathinfo pathin
5f00: 66 6f 3b 0a 09 73 74 72 75 63 74 20 61 70 70 66  fo;..struct appf
5f10: 73 5f 63 68 69 6c 64 72 65 6e 20 2a 63 68 69 6c  s_children *chil
5f20: 64 72 65 6e 2c 20 2a 63 68 69 6c 64 3b 0a 09 69  dren, *child;..i
5f30: 6e 74 20 72 65 74 76 61 6c 3b 0a 0a 09 41 50 50  nt retval;...APP
5f40: 46 53 5f 44 45 42 55 47 28 22 45 6e 74 65 72 20  FS_DEBUG("Enter 
5f50: 28 70 61 74 68 20 3d 20 25 73 2c 20 2e 2e 2e 29  (path = %s, ...)
5f60: 22 2c 20 70 61 74 68 29 3b 0a 0a 09 72 65 74 76  ", path);...retv
5f70: 61 6c 20 3d 20 61 70 70 66 73 5f 67 65 74 5f 70  al = appfs_get_p
5f80: 61 74 68 5f 69 6e 66 6f 28 70 61 74 68 2c 20 26  ath_info(path, &
5f90: 70 61 74 68 69 6e 66 6f 2c 20 26 63 68 69 6c 64  pathinfo, &child
5fa0: 72 65 6e 29 3b 0a 09 69 66 20 28 72 65 74 76 61  ren);..if (retva
5fb0: 6c 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  l != 0) {...retu
5fc0: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  rn(retval);..}..
5fd0: 09 66 69 6c 6c 65 72 28 62 75 66 2c 20 22 2e 22  .filler(buf, "."
5fe0: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 66 69 6c  , NULL, 0);..fil
5ff0: 6c 65 72 28 62 75 66 2c 20 22 2e 2e 22 2c 20 4e  ler(buf, "..", N
6000: 55 4c 4c 2c 20 30 29 3b 0a 0a 09 66 6f 72 20 28  ULL, 0);...for (
6010: 63 68 69 6c 64 20 3d 20 63 68 69 6c 64 72 65 6e  child = children
6020: 3b 20 63 68 69 6c 64 3b 20 63 68 69 6c 64 20 3d  ; child; child =
6030: 20 63 68 69 6c 64 2d 3e 5f 6e 65 78 74 29 20 7b   child->_next) {
6040: 0a 09 09 66 69 6c 6c 65 72 28 62 75 66 2c 20 63  ...filler(buf, c
6050: 68 69 6c 64 2d 3e 6e 61 6d 65 2c 20 4e 55 4c 4c  hild->name, NULL
6060: 2c 20 30 29 3b 0a 09 7d 0a 0a 09 61 70 70 66 73  , 0);..}...appfs
6070: 5f 66 72 65 65 5f 6c 69 73 74 5f 63 68 69 6c 64  _free_list_child
6080: 72 65 6e 28 63 68 69 6c 64 72 65 6e 29 3b 0a 0a  ren(children);..
6090: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73  .return(0);.}..s
60a0: 74 61 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f  tatic int appfs_
60b0: 66 75 73 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  fuse_open(const 
60c0: 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74 72 75  char *path, stru
60d0: 63 74 20 66 75 73 65 5f 66 69 6c 65 5f 69 6e 66  ct fuse_file_inf
60e0: 6f 20 2a 66 69 29 20 7b 0a 09 73 74 72 75 63 74  o *fi) {..struct
60f0: 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20   appfs_pathinfo 
6100: 70 61 74 68 69 6e 66 6f 3b 0a 09 63 6f 6e 73 74  pathinfo;..const
6110: 20 63 68 61 72 20 2a 72 65 61 6c 5f 70 61 74 68   char *real_path
6120: 3b 0a 09 69 6e 74 20 66 68 3b 0a 09 69 6e 74 20  ;..int fh;..int 
6130: 67 70 69 5f 72 65 74 3b 0a 0a 09 41 50 50 46 53  gpi_ret;...APPFS
6140: 5f 44 45 42 55 47 28 22 45 6e 74 65 72 20 28 70  _DEBUG("Enter (p
6150: 61 74 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c  ath = %s, ...)",
6160: 20 70 61 74 68 29 3b 0a 0a 09 69 66 20 28 28 66   path);...if ((f
6170: 69 2d 3e 66 6c 61 67 73 20 26 20 33 29 20 21 3d  i->flags & 3) !=
6180: 20 4f 5f 52 44 4f 4e 4c 59 29 20 7b 0a 20 20 20   O_RDONLY) {.   
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
61a0: 75 72 6e 28 2d 45 41 43 43 45 53 29 3b 0a 09 7d  urn(-EACCES);..}
61b0: 0a 0a 09 67 70 69 5f 72 65 74 20 3d 20 61 70 70  ...gpi_ret = app
61c0: 66 73 5f 67 65 74 5f 70 61 74 68 5f 69 6e 66 6f  fs_get_path_info
61d0: 28 70 61 74 68 2c 20 26 70 61 74 68 69 6e 66 6f  (path, &pathinfo
61e0: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 67 70  , NULL);..if (gp
61f0: 69 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  i_ret != 0) {...
6200: 72 65 74 75 72 6e 28 67 70 69 5f 72 65 74 29 3b  return(gpi_ret);
6210: 0a 09 7d 0a 0a 09 69 66 20 28 70 61 74 68 69 6e  ..}...if (pathin
6220: 66 6f 2e 74 79 70 65 20 3d 3d 20 41 50 50 46 53  fo.type == APPFS
6230: 5f 50 41 54 48 54 59 50 45 5f 44 49 52 45 43 54  _PATHTYPE_DIRECT
6240: 4f 52 59 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ORY) {...return(
6250: 2d 45 49 53 44 49 52 29 3b 0a 09 7d 0a 0a 09 72  -EISDIR);..}...r
6260: 65 61 6c 5f 70 61 74 68 20 3d 20 61 70 70 66 73  eal_path = appfs
6270: 5f 67 65 74 66 69 6c 65 28 70 61 74 68 69 6e 66  _getfile(pathinf
6280: 6f 2e 68 6f 73 74 6e 61 6d 65 2c 20 70 61 74 68  o.hostname, path
6290: 69 6e 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 66 69  info.typeinfo.fi
62a0: 6c 65 2e 73 68 61 31 29 3b 0a 09 69 66 20 28 72  le.sha1);..if (r
62b0: 65 61 6c 5f 70 61 74 68 20 3d 3d 20 4e 55 4c 4c  eal_path == NULL
62c0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 49  ) {...return(-EI
62d0: 4f 29 3b 0a 09 7d 0a 0a 09 66 68 20 3d 20 6f 70  O);..}...fh = op
62e0: 65 6e 28 72 65 61 6c 5f 70 61 74 68 2c 20 4f 5f  en(real_path, O_
62f0: 52 44 4f 4e 4c 59 29 3b 0a 09 66 72 65 65 28 28  RDONLY);..free((
6300: 76 6f 69 64 20 2a 29 20 72 65 61 6c 5f 70 61 74  void *) real_pat
6310: 68 29 3b 0a 09 69 66 20 28 66 68 20 3c 20 30 29  h);..if (fh < 0)
6320: 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 49 4f   {...return(-EIO
6330: 29 3b 0a 09 7d 0a 0a 09 66 69 2d 3e 66 68 20 3d  );..}...fi->fh =
6340: 20 66 68 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29   fh;...return(0)
6350: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
6360: 61 70 70 66 73 5f 66 75 73 65 5f 63 6c 6f 73 65  appfs_fuse_close
6370: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74  (const char *pat
6380: 68 2c 20 73 74 72 75 63 74 20 66 75 73 65 5f 66  h, struct fuse_f
6390: 69 6c 65 5f 69 6e 66 6f 20 2a 66 69 29 20 7b 0a  ile_info *fi) {.
63a0: 09 69 6e 74 20 63 6c 6f 73 65 5f 72 65 74 3b 0a  .int close_ret;.
63b0: 0a 09 63 6c 6f 73 65 5f 72 65 74 20 3d 20 63 6c  ..close_ret = cl
63c0: 6f 73 65 28 66 69 2d 3e 66 68 29 3b 0a 09 69 66  ose(fi->fh);..if
63d0: 20 28 63 6c 6f 73 65 5f 72 65 74 20 21 3d 20 30   (close_ret != 0
63e0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 49  ) {...return(-EI
63f0: 4f 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  O);..}...return(
6400: 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  0);.}..static in
6410: 74 20 61 70 70 66 73 5f 66 75 73 65 5f 72 65 61  t appfs_fuse_rea
6420: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  d(const char *pa
6430: 74 68 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 73  th, char *buf, s
6440: 69 7a 65 5f 74 20 73 69 7a 65 2c 20 6f 66 66 5f  ize_t size, off_
6450: 74 20 6f 66 66 73 65 74 2c 20 73 74 72 75 63 74  t offset, struct
6460: 20 66 75 73 65 5f 66 69 6c 65 5f 69 6e 66 6f 20   fuse_file_info 
6470: 2a 66 69 29 20 7b 0a 09 6f 66 66 5f 74 20 6c 73  *fi) {..off_t ls
6480: 65 65 6b 5f 72 65 74 3b 0a 09 73 73 69 7a 65 5f  eek_ret;..ssize_
6490: 74 20 72 65 61 64 5f 72 65 74 3b 0a 0a 09 41 50  t read_ret;...AP
64a0: 50 46 53 5f 44 45 42 55 47 28 22 45 6e 74 65 72  PFS_DEBUG("Enter
64b0: 20 28 70 61 74 68 20 3d 20 25 73 2c 20 2e 2e 2e   (path = %s, ...
64c0: 29 22 2c 20 70 61 74 68 29 3b 0a 0a 09 6c 73 65  )", path);...lse
64d0: 65 6b 5f 72 65 74 20 3d 20 6c 73 65 65 6b 28 66  ek_ret = lseek(f
64e0: 69 2d 3e 66 68 2c 20 6f 66 66 73 65 74 2c 20 53  i->fh, offset, S
64f0: 45 45 4b 5f 53 45 54 29 3b 0a 09 69 66 20 28 6c  EEK_SET);..if (l
6500: 73 65 65 6b 5f 72 65 74 20 21 3d 20 6f 66 66 73  seek_ret != offs
6510: 65 74 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d  et) {...return(-
6520: 45 49 4f 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f  EIO);..}...read_
6530: 72 65 74 20 3d 20 72 65 61 64 28 66 69 2d 3e 66  ret = read(fi->f
6540: 68 2c 20 62 75 66 2c 20 73 69 7a 65 29 3b 0a 0a  h, buf, size);..
6550: 09 72 65 74 75 72 6e 28 72 65 61 64 5f 72 65 74  .return(read_ret
6560: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72  );.}..static str
6570: 75 63 74 20 66 75 73 65 5f 6f 70 65 72 61 74 69  uct fuse_operati
6580: 6f 6e 73 20 61 70 70 66 73 5f 6f 70 65 72 20 3d  ons appfs_oper =
6590: 20 7b 0a 09 2e 67 65 74 61 74 74 72 20 20 20 3d   {...getattr   =
65a0: 20 61 70 70 66 73 5f 66 75 73 65 5f 67 65 74 61   appfs_fuse_geta
65b0: 74 74 72 2c 0a 09 2e 72 65 61 64 64 69 72 20 20  ttr,...readdir  
65c0: 20 3d 20 61 70 70 66 73 5f 66 75 73 65 5f 72 65   = appfs_fuse_re
65d0: 61 64 64 69 72 2c 0a 09 2e 72 65 61 64 6c 69 6e  addir,...readlin
65e0: 6b 20 20 3d 20 61 70 70 66 73 5f 66 75 73 65 5f  k  = appfs_fuse_
65f0: 72 65 61 64 6c 69 6e 6b 2c 0a 09 2e 6f 70 65 6e  readlink,...open
6600: 20 20 20 20 20 20 3d 20 61 70 70 66 73 5f 66 75        = appfs_fu
6610: 73 65 5f 6f 70 65 6e 2c 0a 09 2e 72 65 6c 65 61  se_open,...relea
6620: 73 65 20 20 20 3d 20 61 70 70 66 73 5f 66 75 73  se   = appfs_fus
6630: 65 5f 63 6c 6f 73 65 2c 0a 09 2e 72 65 61 64 20  e_close,...read 
6640: 20 20 20 20 20 3d 20 61 70 70 66 73 5f 66 75 73       = appfs_fus
6650: 65 5f 72 65 61 64 0a 7d 3b 0a 0a 69 6e 74 20 6d  e_read.};..int m
6660: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
6670: 61 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09 63 6f  ar **argv) {..co
6680: 6e 73 74 20 63 68 61 72 20 2a 63 61 63 68 65 64  nst char *cached
6690: 69 72 20 3d 20 41 50 50 46 53 5f 43 41 43 48 45  ir = APPFS_CACHE
66a0: 44 49 52 3b 0a 09 63 68 61 72 20 64 62 66 69 6c  DIR;..char dbfil
66b0: 65 6e 61 6d 65 5b 31 30 32 34 5d 3b 0a 09 69 6e  ename[1024];..in
66c0: 74 20 70 74 68 72 65 61 64 5f 72 65 74 2c 20 73  t pthread_ret, s
66d0: 6e 70 72 69 6e 74 66 5f 72 65 74 2c 20 73 71 6c  nprintf_ret, sql
66e0: 69 74 65 5f 72 65 74 3b 0a 0a 09 67 6c 6f 62 61  ite_ret;...globa
66f0: 6c 54 68 72 65 61 64 2e 63 61 63 68 65 64 69 72  lThread.cachedir
6700: 20 3d 20 63 61 63 68 65 64 69 72 3b 0a 09 67 6c   = cachedir;..gl
6710: 6f 62 61 6c 54 68 72 65 61 64 2e 62 6f 6f 74 74  obalThread.boott
6720: 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29  ime = time(NULL)
6730: 3b 0a 09 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e  ;..globalThread.
6740: 70 6c 61 74 66 6f 72 6d 20 3d 20 22 6c 69 6e 75  platform = "linu
6750: 78 2d 78 38 36 5f 36 34 22 3b 0a 09 67 6c 6f 62  x-x86_64";..glob
6760: 61 6c 54 68 72 65 61 64 2e 6f 70 74 69 6f 6e 73  alThread.options
6770: 2e 77 72 69 74 61 62 6c 65 20 3d 20 31 3b 0a 0a  .writable = 1;..
6780: 09 54 63 6c 5f 53 74 61 74 69 63 50 61 63 6b 61  .Tcl_StaticPacka
6790: 67 65 28 4e 55 4c 4c 2c 20 22 73 68 61 31 22 2c  ge(NULL, "sha1",
67a0: 20 53 68 61 31 5f 49 6e 69 74 2c 20 4e 55 4c 4c   Sha1_Init, NULL
67b0: 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 72 65 74  );...pthread_ret
67c0: 20 3d 20 70 74 68 72 65 61 64 5f 6b 65 79 5f 63   = pthread_key_c
67d0: 72 65 61 74 65 28 26 69 6e 74 65 72 70 4b 65 79  reate(&interpKey
67e0: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 70 74  , NULL);..if (pt
67f0: 68 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20  hread_ret != 0) 
6800: 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65  {...fprintf(stde
6810: 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 63  rr, "Unable to c
6820: 72 65 61 74 65 20 54 53 44 20 6b 65 79 20 66 6f  reate TSD key fo
6830: 72 20 54 63 6c 2e 20 20 41 62 6f 72 74 69 6e 67  r Tcl.  Aborting
6840: 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  .\n");....return
6850: 28 31 29 3b 0a 09 7d 0a 0a 09 73 6e 70 72 69 6e  (1);..}...snprin
6860: 74 66 5f 72 65 74 20 3d 20 73 6e 70 72 69 6e 74  tf_ret = snprint
6870: 66 28 64 62 66 69 6c 65 6e 61 6d 65 2c 20 73 69  f(dbfilename, si
6880: 7a 65 6f 66 28 64 62 66 69 6c 65 6e 61 6d 65 29  zeof(dbfilename)
6890: 2c 20 22 25 73 2f 25 73 22 2c 20 63 61 63 68 65  , "%s/%s", cache
68a0: 64 69 72 2c 20 22 63 61 63 68 65 2e 64 62 22 29  dir, "cache.db")
68b0: 3b 0a 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f  ;..if (snprintf_
68c0: 72 65 74 20 3e 3d 20 73 69 7a 65 6f 66 28 64 62  ret >= sizeof(db
68d0: 66 69 6c 65 6e 61 6d 65 29 29 20 7b 0a 09 09 66  filename)) {...f
68e0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
68f0: 55 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 64 61  Unable to set da
6900: 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 2e  tabase filename.
6910: 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b    Aborting.\n");
6920: 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
6930: 7d 0a 0a 09 73 71 6c 69 74 65 5f 72 65 74 20 3d  }...sqlite_ret =
6940: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 64 62   sqlite3_open(db
6950: 66 69 6c 65 6e 61 6d 65 2c 20 26 67 6c 6f 62 61  filename, &globa
6960: 6c 54 68 72 65 61 64 2e 64 62 29 3b 0a 09 69 66  lThread.db);..if
6970: 20 28 73 71 6c 69 74 65 5f 72 65 74 20 21 3d 20   (sqlite_ret != 
6980: 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 09 09 66  SQLITE_OK) {...f
6990: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
69a0: 55 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  Unable to open d
69b0: 61 74 61 62 61 73 65 3a 20 25 73 5c 6e 22 2c 20  atabase: %s\n", 
69c0: 64 62 66 69 6c 65 6e 61 6d 65 29 3b 0a 0a 09 09  dbfilename);....
69d0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
69e0: 72 65 74 75 72 6e 28 66 75 73 65 5f 6d 61 69 6e  return(fuse_main
69f0: 28 61 72 67 63 2c 20 61 72 67 76 2c 20 26 61 70  (argc, argv, &ap
6a00: 70 66 73 5f 6f 70 65 72 2c 20 4e 55 4c 4c 29 29  pfs_oper, NULL))
6a10: 3b 0a 7d 0a 20 0a                                ;.}. .