Hex Artifact Content

Artifact 7ee6ccc5a207c0447b8415b8818f886eeaf4a62f:


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 74 63 6c 2e 68 3e 0a 0a 23 69 66 6e 64  e <tcl.h>..#ifnd
0110: 65 66 20 41 50 50 46 53 5f 43 41 43 48 45 44 49  ef APPFS_CACHEDI
0120: 52 0a 23 64 65 66 69 6e 65 20 41 50 50 46 53 5f  R.#define APPFS_
0130: 43 41 43 48 45 44 49 52 20 22 2f 76 61 72 2f 63  CACHEDIR "/var/c
0140: 61 63 68 65 2f 61 70 70 66 73 22 0a 23 65 6e 64  ache/appfs".#end
0150: 69 66 0a 0a 23 64 65 66 69 6e 65 20 41 50 50 46  if..#define APPF
0160: 53 5f 44 45 42 55 47 28 78 2e 2e 2e 29 20 7b 20  S_DEBUG(x...) { 
0170: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
0180: 22 5b 64 65 62 75 67 5d 20 25 73 3a 25 69 3a 25  "[debug] %s:%i:%
0190: 73 3a 20 22 2c 20 5f 5f 46 49 4c 45 5f 5f 2c 20  s: ", __FILE__, 
01a0: 5f 5f 4c 49 4e 45 5f 5f 2c 20 5f 5f 66 75 6e 63  __LINE__, __func
01b0: 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64  __); fprintf(std
01c0: 65 72 72 2c 20 78 29 3b 20 66 70 72 69 6e 74 66  err, x); fprintf
01d0: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 20  (stderr, "\n"); 
01e0: 7d 0a 0a 73 74 61 74 69 63 20 70 74 68 72 65 61  }..static pthrea
01f0: 64 5f 6b 65 79 5f 74 20 69 6e 74 65 72 70 4b 65  d_key_t interpKe
0200: 79 3b 0a 0a 73 74 72 75 63 74 20 61 70 70 66 73  y;..struct appfs
0210: 5f 74 68 72 65 61 64 5f 64 61 74 61 20 7b 0a 09  _thread_data {..
0220: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 09 63 6f  sqlite3 *db;..co
0230: 6e 73 74 20 63 68 61 72 20 2a 63 61 63 68 65 64  nst char *cached
0240: 69 72 3b 0a 09 74 69 6d 65 5f 74 20 62 6f 6f 74  ir;..time_t boot
0250: 74 69 6d 65 3b 0a 09 63 6f 6e 73 74 20 63 68 61  time;..const cha
0260: 72 20 2a 70 6c 61 74 66 6f 72 6d 3b 0a 7d 3b 0a  r *platform;.};.
0270: 0a 73 74 72 75 63 74 20 61 70 70 66 73 5f 74 68  .struct appfs_th
0280: 72 65 61 64 5f 64 61 74 61 20 67 6c 6f 62 61 6c  read_data global
0290: 54 68 72 65 61 64 3b 0a 0a 74 79 70 65 64 65 66  Thread;..typedef
02a0: 20 65 6e 75 6d 20 7b 0a 09 41 50 50 46 53 5f 50   enum {..APPFS_P
02b0: 41 54 48 54 59 50 45 5f 49 4e 56 41 4c 49 44 2c  ATHTYPE_INVALID,
02c0: 0a 09 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  ..APPFS_PATHTYPE
02d0: 5f 46 49 4c 45 2c 0a 09 41 50 50 46 53 5f 50 41  _FILE,..APPFS_PA
02e0: 54 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59  THTYPE_DIRECTORY
02f0: 2c 0a 09 41 50 50 46 53 5f 50 41 54 48 54 59 50  ,..APPFS_PATHTYP
0300: 45 5f 53 59 4d 4c 49 4e 4b 0a 7d 20 61 70 70 66  E_SYMLINK.} appf
0310: 73 5f 70 61 74 68 74 79 70 65 5f 74 3b 0a 0a 73  s_pathtype_t;..s
0320: 74 72 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c  truct appfs_chil
0330: 64 72 65 6e 20 7b 0a 09 73 74 72 75 63 74 20 61  dren {..struct a
0340: 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a 5f  ppfs_children *_
0350: 6e 65 78 74 3b 0a 09 69 6e 74 20 63 6f 75 6e 74  next;..int count
0360: 65 72 3b 0a 0a 09 63 68 61 72 20 6e 61 6d 65 5b  er;...char name[
0370: 32 35 36 5d 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  256];.};..struct
0380: 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20   appfs_pathinfo 
0390: 7b 0a 09 61 70 70 66 73 5f 70 61 74 68 74 79 70  {..appfs_pathtyp
03a0: 65 5f 74 20 74 79 70 65 3b 0a 09 74 69 6d 65 5f  e_t type;..time_
03b0: 74 20 74 69 6d 65 3b 0a 09 63 68 61 72 20 68 6f  t time;..char ho
03c0: 73 74 6e 61 6d 65 5b 32 35 36 5d 3b 0a 09 75 6e  stname[256];..un
03d0: 69 6f 6e 20 7b 0a 09 09 73 74 72 75 63 74 20 7b  ion {...struct {
03e0: 0a 09 09 09 69 6e 74 20 63 68 69 6c 64 63 6f 75  ....int childcou
03f0: 6e 74 3b 0a 09 09 7d 20 64 69 72 3b 0a 09 09 73  nt;...} dir;...s
0400: 74 72 75 63 74 20 7b 0a 09 09 09 69 6e 74 20 65  truct {....int e
0410: 78 65 63 75 74 61 62 6c 65 3b 0a 09 09 09 6f 66  xecutable;....of
0420: 66 5f 74 20 73 69 7a 65 3b 0a 09 09 09 63 68 61  f_t size;....cha
0430: 72 20 73 68 61 31 5b 34 31 5d 3b 0a 09 09 7d 20  r sha1[41];...} 
0440: 66 69 6c 65 3b 0a 09 09 73 74 72 75 63 74 20 7b  file;...struct {
0450: 0a 09 09 09 6f 66 66 5f 74 20 73 69 7a 65 3b 0a  ....off_t size;.
0460: 09 09 09 63 68 61 72 20 73 6f 75 72 63 65 5b 32  ...char source[2
0470: 35 36 5d 3b 0a 09 09 7d 20 73 79 6d 6c 69 6e 6b  56];...} symlink
0480: 3b 0a 09 7d 20 74 79 70 65 69 6e 66 6f 3b 0a 7d  ;..} typeinfo;.}
0490: 3b 0a 0a 73 74 72 75 63 74 20 61 70 70 66 73 5f  ;..struct appfs_
04a0: 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 63 62  sqlite3_query_cb
04b0: 5f 68 61 6e 64 6c 65 20 7b 0a 09 73 74 72 75 63  _handle {..struc
04c0: 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e  t appfs_children
04d0: 20 2a 68 65 61 64 3b 0a 09 69 6e 74 20 61 72 67   *head;..int arg
04e0: 63 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  c;..const char *
04f0: 66 6d 74 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  fmt;.};..static 
0500: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 61 70 70 66  Tcl_Interp *appf
0510: 73 5f 63 72 65 61 74 65 5f 54 63 6c 49 6e 74 65  s_create_TclInte
0520: 72 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  rp(const char *c
0530: 61 63 68 65 64 69 72 29 20 7b 0a 09 54 63 6c 5f  achedir) {..Tcl_
0540: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
0550: 09 69 6e 74 20 74 63 6c 5f 72 65 74 3b 0a 0a 09  .int tcl_ret;...
0560: 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65  interp = Tcl_Cre
0570: 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 09 69 66  ateInterp();..if
0580: 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c   (interp == NULL
0590: 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74  ) {...fprintf(st
05a0: 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f  derr, "Unable to
05b0: 20 63 72 65 61 74 65 20 54 63 6c 20 49 6e 74 65   create Tcl Inte
05c0: 72 70 72 65 74 65 72 2e 20 20 41 62 6f 72 74 69  rpreter.  Aborti
05d0: 6e 67 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75  ng.\n");....retu
05e0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74  rn(NULL);..}...t
05f0: 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 49 6e 69  cl_ret = Tcl_Ini
0600: 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28  t(interp);..if (
0610: 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f  tcl_ret != TCL_O
0620: 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73  K) {...fprintf(s
0630: 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74  tderr, "Unable t
0640: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c  o initialize Tcl
0650: 2e 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29  .  Aborting.\n")
0660: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
0670: 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20  );..}...tcl_ret 
0680: 3d 20 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72  = Tcl_Eval(inter
0690: 70 2c 20 22 22 0a 23 69 6e 63 6c 75 64 65 20 22  p, "".#include "
06a0: 61 70 70 66 73 64 2e 74 63 6c 2e 68 22 0a 09 22  appfsd.tcl.h".."
06b0: 22 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74  ");..if (tcl_ret
06c0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
06d0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
06e0: 22 55 6e 61 62 6c 65 20 74 6f 20 69 6e 69 74 69  "Unable to initi
06f0: 61 6c 69 7a 65 20 54 63 6c 20 41 70 70 46 53 20  alize Tcl AppFS 
0700: 73 63 72 69 70 74 2e 20 20 41 62 6f 72 74 69 6e  script.  Abortin
0710: 67 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  g.\n");...fprint
0720: 66 28 73 74 64 65 72 72 2c 20 22 54 63 6c 20 45  f(stderr, "Tcl E
0730: 72 72 6f 72 20 69 73 3a 20 25 73 5c 6e 22 2c 20  rror is: %s\n", 
0740: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
0750: 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09  ult(interp));...
0760: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
0770: 7d 0a 0a 09 69 66 20 28 54 63 6c 5f 53 65 74 56  }...if (Tcl_SetV
0780: 61 72 28 69 6e 74 65 72 70 2c 20 22 3a 3a 61 70  ar(interp, "::ap
0790: 70 66 73 3a 3a 63 61 63 68 65 64 69 72 22 2c 20  pfs::cachedir", 
07a0: 63 61 63 68 65 64 69 72 2c 20 54 43 4c 5f 47 4c  cachedir, TCL_GL
07b0: 4f 42 41 4c 5f 4f 4e 4c 59 29 20 3d 3d 20 4e 55  OBAL_ONLY) == NU
07c0: 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  LL) {...fprintf(
07d0: 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20  stderr, "Unable 
07e0: 74 6f 20 73 65 74 20 63 61 63 68 65 20 64 69 72  to set cache dir
07f0: 65 63 74 6f 72 79 2e 20 20 54 68 69 73 20 73 68  ectory.  This sh
0800: 6f 75 6c 64 20 6e 65 76 65 72 20 66 61 69 6c 2e  ould never fail.
0810: 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  \n");....return(
0820: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f  NULL);..}...tcl_
0830: 72 65 74 20 3d 20 54 63 6c 5f 45 76 61 6c 28 69  ret = Tcl_Eval(i
0840: 6e 74 65 72 70 2c 20 22 3a 3a 61 70 70 66 73 3a  nterp, "::appfs:
0850: 3a 69 6e 69 74 22 29 3b 0a 09 69 66 20 28 74 63  :init");..if (tc
0860: 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29  l_ret != TCL_OK)
0870: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64   {...fprintf(std
0880: 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20  err, "Unable to 
0890: 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 41  initialize Tcl A
08a0: 70 70 46 53 20 73 63 72 69 70 74 20 28 3a 3a 61  ppFS script (::a
08b0: 70 70 66 73 3a 3a 69 6e 69 74 29 2e 20 20 41 62  ppfs::init).  Ab
08c0: 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 09 09 66  orting.\n");...f
08d0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
08e0: 54 63 6c 20 45 72 72 6f 72 20 69 73 3a 20 25 73  Tcl Error is: %s
08f0: 5c 6e 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  \n", Tcl_GetStri
0900: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
0910: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
0920: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  L);..}...return(
0930: 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 73 74 61 74  interp);.}..stat
0940: 69 63 20 69 6e 74 20 61 70 70 66 73 5f 54 63 6c  ic int appfs_Tcl
0950: 5f 45 76 61 6c 28 54 63 6c 5f 49 6e 74 65 72 70  _Eval(Tcl_Interp
0960: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
0970: 6a 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  jc, const char *
0980: 63 6d 64 2c 20 2e 2e 2e 29 20 7b 0a 09 54 63 6c  cmd, ...) {..Tcl
0990: 5f 4f 62 6a 20 2a 2a 6f 62 6a 76 3b 0a 09 63 6f  _Obj **objv;..co
09a0: 6e 73 74 20 63 68 61 72 20 2a 61 72 67 3b 0a 09  nst char *arg;..
09b0: 76 61 5f 6c 69 73 74 20 61 72 67 70 3b 0a 09 69  va_list argp;..i
09c0: 6e 74 20 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  nt retval;..int 
09d0: 69 3b 0a 0a 09 6f 62 6a 76 20 3d 20 28 76 6f 69  i;...objv = (voi
09e0: 64 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a  d *) ckalloc(siz
09f0: 65 6f 66 28 2a 6f 62 6a 76 29 20 2a 20 6f 62 6a  eof(*objv) * obj
0a00: 63 29 3b 0a 09 6f 62 6a 76 5b 30 5d 20 3d 20 54  c);..objv[0] = T
0a10: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
0a20: 63 6d 64 2c 20 2d 31 29 3b 0a 09 54 63 6c 5f 49  cmd, -1);..Tcl_I
0a30: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ncrRefCount(objv
0a40: 5b 30 5d 29 3b 0a 0a 09 76 61 5f 73 74 61 72 74  [0]);...va_start
0a50: 28 61 72 67 70 2c 20 63 6d 64 29 3b 0a 09 66 6f  (argp, cmd);..fo
0a60: 72 20 28 69 20 3d 20 31 3b 20 69 20 3c 20 6f 62  r (i = 1; i < ob
0a70: 6a 63 3b 20 69 2b 2b 29 20 7b 0a 09 09 61 72 67  jc; i++) {...arg
0a80: 20 3d 20 76 61 5f 61 72 67 28 61 72 67 70 2c 20   = va_arg(argp, 
0a90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 09  const char *);..
0aa0: 09 6f 62 6a 76 5b 69 5d 20 3d 20 54 63 6c 5f 4e  .objv[i] = Tcl_N
0ab0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 61 72 67 2c  ewStringObj(arg,
0ac0: 20 2d 31 29 3b 0a 09 09 54 63 6c 5f 49 6e 63 72   -1);...Tcl_Incr
0ad0: 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 69 5d  RefCount(objv[i]
0ae0: 29 3b 0a 09 7d 0a 09 76 61 5f 65 6e 64 28 61 72  );..}..va_end(ar
0af0: 67 70 29 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  gp);...retval = 
0b00: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 69 6e 74  Tcl_EvalObjv(int
0b10: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c  erp, objc, objv,
0b20: 20 30 29 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20   0);...for (i = 
0b30: 30 3b 20 69 20 3c 20 6f 62 6a 63 3b 20 69 2b 2b  0; i < objc; i++
0b40: 29 20 7b 0a 09 09 54 63 6c 5f 44 65 63 72 52 65  ) {...Tcl_DecrRe
0b50: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 69 5d 29 3b  fCount(objv[i]);
0b60: 0a 09 7d 0a 0a 09 63 6b 66 72 65 65 28 28 76 6f  ..}...ckfree((vo
0b70: 69 64 20 2a 29 20 6f 62 6a 76 29 3b 0a 0a 09 69  id *) objv);...i
0b80: 66 20 28 72 65 74 76 61 6c 20 21 3d 20 54 43 4c  f (retval != TCL
0b90: 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46 53 5f 44  _OK) {...APPFS_D
0ba0: 45 42 55 47 28 22 54 63 6c 20 63 6f 6d 6d 61 6e  EBUG("Tcl comman
0bb0: 64 20 66 61 69 6c 65 64 2c 20 3a 3a 65 72 72 6f  d failed, ::erro
0bc0: 72 49 6e 66 6f 20 63 6f 6e 74 61 69 6e 73 3a 20  rInfo contains: 
0bd0: 25 73 5c 6e 22 2c 20 54 63 6c 5f 47 65 74 56 61  %s\n", Tcl_GetVa
0be0: 72 28 69 6e 74 65 72 70 2c 20 22 3a 3a 65 72 72  r(interp, "::err
0bf0: 6f 72 49 6e 66 6f 22 2c 20 30 29 29 3b 0a 09 7d  orInfo", 0));..}
0c00: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
0c10: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
0c20: 64 20 61 70 70 66 73 5f 75 70 64 61 74 65 5f 69  d appfs_update_i
0c30: 6e 64 65 78 28 63 6f 6e 73 74 20 63 68 61 72 20  ndex(const char 
0c40: 2a 68 6f 73 74 6e 61 6d 65 29 20 7b 0a 09 54 63  *hostname) {..Tc
0c50: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0c60: 3b 0a 09 69 6e 74 20 74 63 6c 5f 72 65 74 3b 0a  ;..int tcl_ret;.
0c70: 0a 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 45  ..APPFS_DEBUG("E
0c80: 6e 74 65 72 3a 20 68 6f 73 74 6e 61 6d 65 20 3d  nter: hostname =
0c90: 20 25 73 22 2c 20 68 6f 73 74 6e 61 6d 65 29 3b   %s", hostname);
0ca0: 0a 0a 09 69 6e 74 65 72 70 20 3d 20 70 74 68 72  ...interp = pthr
0cb0: 65 61 64 5f 67 65 74 73 70 65 63 69 66 69 63 28  ead_getspecific(
0cc0: 69 6e 74 65 72 70 4b 65 79 29 3b 0a 09 69 66 20  interpKey);..if 
0cd0: 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 29  (interp == NULL)
0ce0: 20 7b 0a 09 09 69 6e 74 65 72 70 20 3d 20 61 70   {...interp = ap
0cf0: 70 66 73 5f 63 72 65 61 74 65 5f 54 63 6c 49 6e  pfs_create_TclIn
0d00: 74 65 72 70 28 67 6c 6f 62 61 6c 54 68 72 65 61  terp(globalThrea
0d10: 64 2e 63 61 63 68 65 64 69 72 29 3b 0a 0a 09 09  d.cachedir);....
0d20: 70 74 68 72 65 61 64 5f 73 65 74 73 70 65 63 69  pthread_setspeci
0d30: 66 69 63 28 69 6e 74 65 72 70 4b 65 79 2c 20 69  fic(interpKey, i
0d40: 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 74 63 6c  nterp);..}...tcl
0d50: 5f 72 65 74 20 3d 20 61 70 70 66 73 5f 54 63 6c  _ret = appfs_Tcl
0d60: 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 32 2c  _Eval(interp, 2,
0d70: 20 22 3a 3a 61 70 70 66 73 3a 3a 67 65 74 69 6e   "::appfs::getin
0d80: 64 65 78 22 2c 20 68 6f 73 74 6e 61 6d 65 29 3b  dex", hostname);
0d90: 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d  ..if (tcl_ret !=
0da0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 41 50 50   TCL_OK) {...APP
0db0: 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74  FS_DEBUG("Call t
0dc0: 6f 20 3a 3a 61 70 70 66 73 3a 3a 67 65 74 69 6e  o ::appfs::getin
0dd0: 64 65 78 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  dex failed: %s",
0de0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
0df0: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a  sult(interp));..
0e00: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 72  ..return;..}...r
0e10: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
0e20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 70 70   const char *app
0e30: 66 73 5f 67 65 74 66 69 6c 65 28 63 6f 6e 73 74  fs_getfile(const
0e40: 20 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c   char *hostname,
0e50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 68 61   const char *sha
0e60: 31 29 20 7b 0a 09 54 63 6c 5f 49 6e 74 65 72 70  1) {..Tcl_Interp
0e70: 20 2a 69 6e 74 65 72 70 3b 0a 09 63 68 61 72 20   *interp;..char 
0e80: 2a 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 63  *retval;..int tc
0e90: 6c 5f 72 65 74 3b 0a 0a 09 69 6e 74 65 72 70 20  l_ret;...interp 
0ea0: 3d 20 70 74 68 72 65 61 64 5f 67 65 74 73 70 65  = pthread_getspe
0eb0: 63 69 66 69 63 28 69 6e 74 65 72 70 4b 65 79 29  cific(interpKey)
0ec0: 3b 0a 09 69 66 20 28 69 6e 74 65 72 70 20 3d 3d  ;..if (interp ==
0ed0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 74 65 72   NULL) {...inter
0ee0: 70 20 3d 20 61 70 70 66 73 5f 63 72 65 61 74 65  p = appfs_create
0ef0: 5f 54 63 6c 49 6e 74 65 72 70 28 67 6c 6f 62 61  _TclInterp(globa
0f00: 6c 54 68 72 65 61 64 2e 63 61 63 68 65 64 69 72  lThread.cachedir
0f10: 29 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 73 65  );....pthread_se
0f20: 74 73 70 65 63 69 66 69 63 28 69 6e 74 65 72 70  tspecific(interp
0f30: 4b 65 79 2c 20 69 6e 74 65 72 70 29 3b 0a 09 7d  Key, interp);..}
0f40: 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20 61 70 70  ...tcl_ret = app
0f50: 66 73 5f 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65  fs_Tcl_Eval(inte
0f60: 72 70 2c 20 33 2c 20 22 3a 3a 61 70 70 66 73 3a  rp, 3, "::appfs:
0f70: 3a 64 6f 77 6e 6c 6f 61 64 22 2c 20 68 6f 73 74  :download", host
0f80: 6e 61 6d 65 2c 20 73 68 61 31 29 3b 0a 09 69 66  name, sha1);..if
0f90: 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c   (tcl_ret != TCL
0fa0: 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46 53 5f 44  _OK) {...APPFS_D
0fb0: 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20 3a 3a  EBUG("Call to ::
0fc0: 61 70 70 66 73 3a 3a 64 6f 77 6e 6c 6f 61 64 20  appfs::download 
0fd0: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 54 63 6c  failed: %s", Tcl
0fe0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
0ff0: 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09 72 65  (interp));....re
1000: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
1010: 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75 70  .retval = strdup
1020: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
1030: 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a  sult(interp));..
1040: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1050: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1060: 61 70 70 66 73 5f 75 70 64 61 74 65 5f 6d 61 6e  appfs_update_man
1070: 69 66 65 73 74 28 63 6f 6e 73 74 20 63 68 61 72  ifest(const char
1080: 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 63 6f 6e 73   *hostname, cons
1090: 74 20 63 68 61 72 20 2a 73 68 61 31 29 20 7b 0a  t char *sha1) {.
10a0: 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  .Tcl_Interp *int
10b0: 65 72 70 3b 0a 09 69 6e 74 20 74 63 6c 5f 72 65  erp;..int tcl_re
10c0: 74 3b 0a 0a 09 69 6e 74 65 72 70 20 3d 20 70 74  t;...interp = pt
10d0: 68 72 65 61 64 5f 67 65 74 73 70 65 63 69 66 69  hread_getspecifi
10e0: 63 28 69 6e 74 65 72 70 4b 65 79 29 3b 0a 09 69  c(interpKey);..i
10f0: 66 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c  f (interp == NUL
1100: 4c 29 20 7b 0a 09 09 69 6e 74 65 72 70 20 3d 20  L) {...interp = 
1110: 61 70 70 66 73 5f 63 72 65 61 74 65 5f 54 63 6c  appfs_create_Tcl
1120: 49 6e 74 65 72 70 28 67 6c 6f 62 61 6c 54 68 72  Interp(globalThr
1130: 65 61 64 2e 63 61 63 68 65 64 69 72 29 3b 0a 0a  ead.cachedir);..
1140: 09 09 70 74 68 72 65 61 64 5f 73 65 74 73 70 65  ..pthread_setspe
1150: 63 69 66 69 63 28 69 6e 74 65 72 70 4b 65 79 2c  cific(interpKey,
1160: 20 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 74   interp);..}...t
1170: 63 6c 5f 72 65 74 20 3d 20 61 70 70 66 73 5f 54  cl_ret = appfs_T
1180: 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  cl_Eval(interp, 
1190: 33 2c 20 22 3a 3a 61 70 70 66 73 3a 3a 67 65 74  3, "::appfs::get
11a0: 70 6b 67 6d 61 6e 69 66 65 73 74 22 2c 20 68 6f  pkgmanifest", ho
11b0: 73 74 6e 61 6d 65 2c 20 73 68 61 31 29 3b 0a 09  stname, sha1);..
11c0: 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54  if (tcl_ret != T
11d0: 43 4c 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46 53  CL_OK) {...APPFS
11e0: 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20  _DEBUG("Call to 
11f0: 3a 3a 61 70 70 66 73 3a 3a 67 65 74 70 6b 67 6d  ::appfs::getpkgm
1200: 61 6e 69 66 65 73 74 20 66 61 69 6c 65 64 3a 20  anifest failed: 
1210: 25 73 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  %s", Tcl_GetStri
1220: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
1230: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  );....return;..}
1240: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 23 64  ...return;.}..#d
1250: 65 66 69 6e 65 20 61 70 70 66 73 5f 66 72 65 65  efine appfs_free
1260: 5f 6c 69 73 74 5f 74 79 70 65 28 69 64 2c 20 74  _list_type(id, t
1270: 79 70 65 29 20 73 74 61 74 69 63 20 76 6f 69 64  ype) static void
1280: 20 61 70 70 66 73 5f 66 72 65 65 5f 6c 69 73 74   appfs_free_list
1290: 5f 20 23 23 20 69 64 28 74 79 70 65 20 2a 68 65  _ ## id(type *he
12a0: 61 64 29 20 7b 20 5c 0a 09 74 79 70 65 20 2a 6f  ad) { \..type *o
12b0: 62 6a 2c 20 2a 6e 65 78 74 3b 20 5c 0a 09 66 6f  bj, *next; \..fo
12c0: 72 20 28 6f 62 6a 20 3d 20 68 65 61 64 3b 20 6f  r (obj = head; o
12d0: 62 6a 3b 20 6f 62 6a 20 3d 20 6e 65 78 74 29 20  bj; obj = next) 
12e0: 7b 20 5c 0a 09 09 6e 65 78 74 20 3d 20 6f 62 6a  { \...next = obj
12f0: 2d 3e 5f 6e 65 78 74 3b 20 5c 0a 09 09 63 6b 66  ->_next; \...ckf
1300: 72 65 65 28 28 76 6f 69 64 20 2a 29 20 6f 62 6a  ree((void *) obj
1310: 29 3b 20 5c 0a 09 7d 20 5c 0a 7d 0a 0a 61 70 70  ); \..} \.}..app
1320: 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f 74 79 70  fs_free_list_typ
1330: 65 28 63 68 69 6c 64 72 65 6e 2c 20 73 74 72 75  e(children, stru
1340: 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65  ct appfs_childre
1350: 6e 29 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  n)..static int a
1360: 70 70 66 73 5f 67 65 74 63 68 69 6c 64 72 65 6e  ppfs_getchildren
1370: 5f 63 62 28 76 6f 69 64 20 2a 5f 68 65 61 64 2c  _cb(void *_head,
1380: 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 68   int columns, ch
1390: 61 72 20 2a 2a 76 61 6c 75 65 73 2c 20 63 68 61  ar **values, cha
13a0: 72 20 2a 2a 6e 61 6d 65 73 29 20 7b 0a 09 73 74  r **names) {..st
13b0: 72 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64  ruct appfs_child
13c0: 72 65 6e 20 2a 2a 68 65 61 64 5f 70 2c 20 2a 6f  ren **head_p, *o
13d0: 62 6a 3b 0a 0a 09 68 65 61 64 5f 70 20 3d 20 5f  bj;...head_p = _
13e0: 68 65 61 64 3b 0a 0a 09 6f 62 6a 20 3d 20 28 76  head;...obj = (v
13f0: 6f 69 64 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73  oid *) ckalloc(s
1400: 69 7a 65 6f 66 28 2a 6f 62 6a 29 29 3b 0a 0a 09  izeof(*obj));...
1410: 73 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 6e 61  snprintf(obj->na
1420: 6d 65 2c 20 73 69 7a 65 6f 66 28 6f 62 6a 2d 3e  me, sizeof(obj->
1430: 6e 61 6d 65 29 2c 20 22 25 73 22 2c 20 76 61 6c  name), "%s", val
1440: 75 65 73 5b 30 5d 29 3b 0a 0a 09 69 66 20 28 2a  ues[0]);...if (*
1450: 68 65 61 64 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  head_p == NULL) 
1460: 7b 0a 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74 65 72  {...obj->counter
1470: 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 0;..} else {.
1480: 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74 65 72 20 3d  ..obj->counter =
1490: 20 28 2a 68 65 61 64 5f 70 29 2d 3e 63 6f 75 6e   (*head_p)->coun
14a0: 74 65 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09 6f 62  ter + 1;..}...ob
14b0: 6a 2d 3e 5f 6e 65 78 74 20 3d 20 2a 68 65 61 64  j->_next = *head
14c0: 5f 70 3b 0a 09 2a 68 65 61 64 5f 70 20 3d 20 6f  _p;..*head_p = o
14d0: 62 6a 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  bj;...return(0);
14e0: 0a 09 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72  ...}..static str
14f0: 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72  uct appfs_childr
1500: 65 6e 20 2a 61 70 70 66 73 5f 67 65 74 63 68 69  en *appfs_getchi
1510: 6c 64 72 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  ldren(const char
1520: 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 63 6f 6e 73   *hostname, cons
1530: 74 20 63 68 61 72 20 2a 70 61 63 6b 61 67 65 5f  t char *package_
1540: 68 61 73 68 2c 20 63 6f 6e 73 74 20 63 68 61 72  hash, const char
1550: 20 2a 70 61 74 68 2c 20 69 6e 74 20 2a 63 68 69   *path, int *chi
1560: 6c 64 72 65 6e 5f 63 6f 75 6e 74 5f 70 29 20 7b  ldren_count_p) {
1570: 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 63  ..struct appfs_c
1580: 68 69 6c 64 72 65 6e 20 2a 68 65 61 64 20 3d 20  hildren *head = 
1590: 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 73 71 6c  NULL;..char *sql
15a0: 3b 0a 09 69 6e 74 20 73 71 6c 69 74 65 5f 72 65  ;..int sqlite_re
15b0: 74 3b 0a 0a 09 69 66 20 28 63 68 69 6c 64 72 65  t;...if (childre
15c0: 6e 5f 63 6f 75 6e 74 5f 70 20 3d 3d 20 4e 55 4c  n_count_p == NUL
15d0: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55  L) {...return(NU
15e0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 61 70 70 66 73 5f  LL);..}...appfs_
15f0: 75 70 64 61 74 65 5f 69 6e 64 65 78 28 68 6f 73  update_index(hos
1600: 74 6e 61 6d 65 29 3b 0a 09 61 70 70 66 73 5f 75  tname);..appfs_u
1610: 70 64 61 74 65 5f 6d 61 6e 69 66 65 73 74 28 68  pdate_manifest(h
1620: 6f 73 74 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65  ostname, package
1630: 5f 68 61 73 68 29 3b 0a 0a 09 73 71 6c 20 3d 20  _hash);...sql = 
1640: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1650: 22 53 45 4c 45 43 54 20 66 69 6c 65 5f 6e 61 6d  "SELECT file_nam
1660: 65 20 46 52 4f 4d 20 66 69 6c 65 73 20 57 48 45  e FROM files WHE
1670: 52 45 20 70 61 63 6b 61 67 65 5f 73 68 61 31 20  RE package_sha1 
1680: 3d 20 25 51 20 41 4e 44 20 66 69 6c 65 5f 64 69  = %Q AND file_di
1690: 72 65 63 74 6f 72 79 20 3d 20 25 51 3b 22 2c 20  rectory = %Q;", 
16a0: 70 61 63 6b 61 67 65 5f 68 61 73 68 2c 20 70 61  package_hash, pa
16b0: 74 68 29 3b 0a 09 69 66 20 28 73 71 6c 20 3d 3d  th);..if (sql ==
16c0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 41 50 50 46 53   NULL) {...APPFS
16d0: 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20  _DEBUG("Call to 
16e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
16f0: 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1700: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
1710: 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 53 51  .APPFS_DEBUG("SQ
1720: 4c 3a 20 25 73 22 2c 20 73 71 6c 29 3b 0a 09 73  L: %s", sql);..s
1730: 71 6c 69 74 65 5f 72 65 74 20 3d 20 73 71 6c 69  qlite_ret = sqli
1740: 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c 54  te3_exec(globalT
1750: 68 72 65 61 64 2e 64 62 2c 20 73 71 6c 2c 20 61  hread.db, sql, a
1760: 70 70 66 73 5f 67 65 74 63 68 69 6c 64 72 65 6e  ppfs_getchildren
1770: 5f 63 62 2c 20 26 68 65 61 64 2c 20 4e 55 4c 4c  _cb, &head, NULL
1780: 29 3b 0a 09 73 71 6c 69 74 65 33 5f 66 72 65 65  );..sqlite3_free
1790: 28 73 71 6c 29 3b 0a 0a 09 69 66 20 28 73 71 6c  (sql);...if (sql
17a0: 69 74 65 5f 72 65 74 20 21 3d 20 53 51 4c 49 54  ite_ret != SQLIT
17b0: 45 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46 53 5f  E_OK) {...APPFS_
17c0: 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20 73  DEBUG("Call to s
17d0: 71 6c 69 74 65 33 5f 65 78 65 63 20 66 61 69 6c  qlite3_exec fail
17e0: 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
17f0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
1800: 28 68 65 61 64 20 21 3d 20 4e 55 4c 4c 29 20 7b  (head != NULL) {
1810: 0a 09 09 2a 63 68 69 6c 64 72 65 6e 5f 63 6f 75  ...*children_cou
1820: 6e 74 5f 70 20 3d 20 68 65 61 64 2d 3e 63 6f 75  nt_p = head->cou
1830: 6e 74 65 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09 72  nter + 1;..}...r
1840: 65 74 75 72 6e 28 68 65 61 64 29 3b 0a 7d 0a 0a  eturn(head);.}..
1850: 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66 73  static int appfs
1860: 5f 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 63  _sqlite3_query_c
1870: 62 28 76 6f 69 64 20 2a 5f 63 62 5f 68 61 6e 64  b(void *_cb_hand
1880: 6c 65 2c 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 2c  le, int columns,
1890: 20 63 68 61 72 20 2a 2a 76 61 6c 75 65 73 2c 20   char **values, 
18a0: 63 68 61 72 20 2a 2a 6e 61 6d 65 73 29 20 7b 0a  char **names) {.
18b0: 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 73 71  .struct appfs_sq
18c0: 6c 69 74 65 33 5f 71 75 65 72 79 5f 63 62 5f 68  lite3_query_cb_h
18d0: 61 6e 64 6c 65 20 2a 63 62 5f 68 61 6e 64 6c 65  andle *cb_handle
18e0: 3b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f  ;..struct appfs_
18f0: 63 68 69 6c 64 72 65 6e 20 2a 6f 62 6a 3b 0a 0a  children *obj;..
1900: 09 63 62 5f 68 61 6e 64 6c 65 20 3d 20 5f 63 62  .cb_handle = _cb
1910: 5f 68 61 6e 64 6c 65 3b 0a 0a 09 6f 62 6a 20 3d  _handle;...obj =
1920: 20 28 76 6f 69 64 20 2a 29 20 63 6b 61 6c 6c 6f   (void *) ckallo
1930: 63 28 73 69 7a 65 6f 66 28 2a 6f 62 6a 29 29 3b  c(sizeof(*obj));
1940: 0a 0a 09 73 77 69 74 63 68 20 28 63 62 5f 68 61  ...switch (cb_ha
1950: 6e 64 6c 65 2d 3e 61 72 67 63 29 20 7b 0a 09 09  ndle->argc) {...
1960: 63 61 73 65 20 31 3a 0a 09 09 09 73 6e 70 72 69  case 1:....snpri
1970: 6e 74 66 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 73  ntf(obj->name, s
1980: 69 7a 65 6f 66 28 6f 62 6a 2d 3e 6e 61 6d 65 29  izeof(obj->name)
1990: 2c 20 63 62 5f 68 61 6e 64 6c 65 2d 3e 66 6d 74  , cb_handle->fmt
19a0: 2c 20 76 61 6c 75 65 73 5b 30 5d 29 3b 0a 09 09  , values[0]);...
19b0: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 32  .break;...case 2
19c0: 3a 0a 09 09 09 73 6e 70 72 69 6e 74 66 28 6f 62  :....snprintf(ob
19d0: 6a 2d 3e 6e 61 6d 65 2c 20 73 69 7a 65 6f 66 28  j->name, sizeof(
19e0: 6f 62 6a 2d 3e 6e 61 6d 65 29 2c 20 63 62 5f 68  obj->name), cb_h
19f0: 61 6e 64 6c 65 2d 3e 66 6d 74 2c 20 76 61 6c 75  andle->fmt, valu
1a00: 65 73 5b 30 5d 2c 20 76 61 6c 75 65 73 5b 31 5d  es[0], values[1]
1a10: 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  );....break;...c
1a20: 61 73 65 20 33 3a 0a 09 09 09 73 6e 70 72 69 6e  ase 3:....snprin
1a30: 74 66 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 73 69  tf(obj->name, si
1a40: 7a 65 6f 66 28 6f 62 6a 2d 3e 6e 61 6d 65 29 2c  zeof(obj->name),
1a50: 20 63 62 5f 68 61 6e 64 6c 65 2d 3e 66 6d 74 2c   cb_handle->fmt,
1a60: 20 76 61 6c 75 65 73 5b 30 5d 2c 20 76 61 6c 75   values[0], valu
1a70: 65 73 5b 31 5d 2c 20 76 61 6c 75 65 73 5b 32 5d  es[1], values[2]
1a80: 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  );....break;...c
1a90: 61 73 65 20 34 3a 0a 09 09 09 73 6e 70 72 69 6e  ase 4:....snprin
1aa0: 74 66 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 73 69  tf(obj->name, si
1ab0: 7a 65 6f 66 28 6f 62 6a 2d 3e 6e 61 6d 65 29 2c  zeof(obj->name),
1ac0: 20 63 62 5f 68 61 6e 64 6c 65 2d 3e 66 6d 74 2c   cb_handle->fmt,
1ad0: 20 76 61 6c 75 65 73 5b 30 5d 2c 20 76 61 6c 75   values[0], valu
1ae0: 65 73 5b 31 5d 2c 20 76 61 6c 75 65 73 5b 32 5d  es[1], values[2]
1af0: 2c 20 76 61 6c 75 65 73 5b 33 5d 29 3b 0a 09 09  , values[3]);...
1b00: 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20  .break;..}...if 
1b10: 28 63 62 5f 68 61 6e 64 6c 65 2d 3e 68 65 61 64  (cb_handle->head
1b20: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6f 62   == NULL) {...ob
1b30: 6a 2d 3e 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  j->counter = 0;.
1b40: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6f 62 6a 2d  .} else {...obj-
1b50: 3e 63 6f 75 6e 74 65 72 20 3d 20 63 62 5f 68 61  >counter = cb_ha
1b60: 6e 64 6c 65 2d 3e 68 65 61 64 2d 3e 63 6f 75 6e  ndle->head->coun
1b70: 74 65 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09 6f 62  ter + 1;..}...ob
1b80: 6a 2d 3e 5f 6e 65 78 74 20 3d 20 63 62 5f 68 61  j->_next = cb_ha
1b90: 6e 64 6c 65 2d 3e 68 65 61 64 3b 0a 09 63 62 5f  ndle->head;..cb_
1ba0: 68 61 6e 64 6c 65 2d 3e 68 65 61 64 20 3d 20 6f  handle->head = o
1bb0: 62 6a 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  bj;...return(0);
1bc0: 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  .}..static struc
1bd0: 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e  t appfs_children
1be0: 20 2a 61 70 70 66 73 5f 73 71 6c 69 74 65 33 5f   *appfs_sqlite3_
1bf0: 71 75 65 72 79 28 63 68 61 72 20 2a 73 71 6c 2c  query(char *sql,
1c00: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
1c10: 20 63 68 61 72 20 2a 66 6d 74 2c 20 69 6e 74 20   char *fmt, int 
1c20: 2a 72 65 73 75 6c 74 73 5f 63 6f 75 6e 74 5f 70  *results_count_p
1c30: 29 20 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66  ) {..struct appf
1c40: 73 5f 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  s_sqlite3_query_
1c50: 63 62 5f 68 61 6e 64 6c 65 20 63 62 5f 68 61 6e  cb_handle cb_han
1c60: 64 6c 65 3b 0a 09 69 6e 74 20 73 71 6c 69 74 65  dle;..int sqlite
1c70: 5f 72 65 74 3b 0a 0a 09 69 66 20 28 72 65 73 75  _ret;...if (resu
1c80: 6c 74 73 5f 63 6f 75 6e 74 5f 70 20 3d 3d 20 4e  lts_count_p == N
1c90: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
1ca0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
1cb0: 73 71 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  sql == NULL) {..
1cc0: 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 43 61  .APPFS_DEBUG("Ca
1cd0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d 70  ll to sqlite3_mp
1ce0: 72 69 6e 74 66 20 70 72 6f 62 61 62 6c 79 20 66  rintf probably f
1cf0: 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1d00: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
1d10: 69 66 20 28 66 6d 74 20 3d 3d 20 4e 55 4c 4c 29  if (fmt == NULL)
1d20: 20 7b 0a 09 09 66 6d 74 20 3d 20 22 25 73 22 3b   {...fmt = "%s";
1d30: 0a 09 7d 0a 0a 09 63 62 5f 68 61 6e 64 6c 65 2e  ..}...cb_handle.
1d40: 68 65 61 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63 62  head = NULL;..cb
1d50: 5f 68 61 6e 64 6c 65 2e 61 72 67 63 20 3d 20 61  _handle.argc = a
1d60: 72 67 63 3b 0a 09 63 62 5f 68 61 6e 64 6c 65 2e  rgc;..cb_handle.
1d70: 66 6d 74 20 20 3d 20 66 6d 74 3b 0a 0a 09 41 50  fmt  = fmt;...AP
1d80: 50 46 53 5f 44 45 42 55 47 28 22 53 51 4c 3a 20  PFS_DEBUG("SQL: 
1d90: 25 73 22 2c 20 73 71 6c 29 3b 0a 09 73 71 6c 69  %s", sql);..sqli
1da0: 74 65 5f 72 65 74 20 3d 20 73 71 6c 69 74 65 33  te_ret = sqlite3
1db0: 5f 65 78 65 63 28 67 6c 6f 62 61 6c 54 68 72 65  _exec(globalThre
1dc0: 61 64 2e 64 62 2c 20 73 71 6c 2c 20 61 70 70 66  ad.db, sql, appf
1dd0: 73 5f 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  s_sqlite3_query_
1de0: 63 62 2c 20 26 63 62 5f 68 61 6e 64 6c 65 2c 20  cb, &cb_handle, 
1df0: 4e 55 4c 4c 29 3b 0a 09 73 71 6c 69 74 65 33 5f  NULL);..sqlite3_
1e00: 66 72 65 65 28 73 71 6c 29 3b 0a 0a 09 69 66 20  free(sql);...if 
1e10: 28 73 71 6c 69 74 65 5f 72 65 74 20 21 3d 20 53  (sqlite_ret != S
1e20: 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 09 09 41 50  QLITE_OK) {...AP
1e30: 50 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20  PFS_DEBUG("Call 
1e40: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20  to sqlite3_exec 
1e50: 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1e60: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
1e70: 09 69 66 20 28 63 62 5f 68 61 6e 64 6c 65 2e 68  .if (cb_handle.h
1e80: 65 61 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ead != NULL) {..
1e90: 09 2a 72 65 73 75 6c 74 73 5f 63 6f 75 6e 74 5f  .*results_count_
1ea0: 70 20 3d 20 63 62 5f 68 61 6e 64 6c 65 2e 68 65  p = cb_handle.he
1eb0: 61 64 2d 3e 63 6f 75 6e 74 65 72 20 2b 20 31 3b  ad->counter + 1;
1ec0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 63 62 5f  ..}...return(cb_
1ed0: 68 61 6e 64 6c 65 2e 68 65 61 64 29 3b 0a 7d 0a  handle.head);.}.
1ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
1ef0: 73 5f 6c 6f 6f 6b 75 70 5f 70 61 63 6b 61 67 65  s_lookup_package
1f00: 5f 68 61 73 68 5f 63 62 28 76 6f 69 64 20 2a 5f  _hash_cb(void *_
1f10: 72 65 74 76 61 6c 2c 20 69 6e 74 20 63 6f 6c 75  retval, int colu
1f20: 6d 6e 73 2c 20 63 68 61 72 20 2a 2a 76 61 6c 75  mns, char **valu
1f30: 65 73 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 73  es, char **names
1f40: 29 20 7b 0a 09 63 68 61 72 20 2a 2a 72 65 74 76  ) {..char **retv
1f50: 61 6c 20 3d 20 5f 72 65 74 76 61 6c 3b 0a 0a 09  al = _retval;...
1f60: 2a 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75 70  *retval = strdup
1f70: 28 76 61 6c 75 65 73 5b 30 5d 29 3b 0a 0a 09 72  (values[0]);...r
1f80: 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61  eturn(0);.}..sta
1f90: 74 69 63 20 63 68 61 72 20 2a 61 70 70 66 73 5f  tic char *appfs_
1fa0: 6c 6f 6f 6b 75 70 5f 70 61 63 6b 61 67 65 5f 68  lookup_package_h
1fb0: 61 73 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ash(const char *
1fc0: 68 6f 73 74 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  hostname, const 
1fd0: 63 68 61 72 20 2a 70 61 63 6b 61 67 65 2c 20 63  char *package, c
1fe0: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 73 2c 20 63  onst char *os, c
1ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 70 75 41 72  onst char *cpuAr
2000: 63 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ch, const char *
2010: 76 65 72 73 69 6f 6e 29 20 7b 0a 09 63 68 61 72  version) {..char
2020: 20 2a 73 71 6c 3b 0a 09 63 68 61 72 20 2a 72 65   *sql;..char *re
2030: 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e  tval = NULL;..in
2040: 74 20 73 71 6c 69 74 65 5f 72 65 74 3b 0a 0a 09  t sqlite_ret;...
2050: 61 70 70 66 73 5f 75 70 64 61 74 65 5f 69 6e 64  appfs_update_ind
2060: 65 78 28 68 6f 73 74 6e 61 6d 65 29 3b 0a 0a 09  ex(hostname);...
2070: 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  sql = sqlite3_mp
2080: 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 73 68  rintf("SELECT sh
2090: 61 31 20 46 52 4f 4d 20 70 61 63 6b 61 67 65 73  a1 FROM packages
20a0: 20 57 48 45 52 45 20 68 6f 73 74 6e 61 6d 65 20   WHERE hostname 
20b0: 3d 20 25 51 20 41 4e 44 20 70 61 63 6b 61 67 65  = %Q AND package
20c0: 20 3d 20 25 51 20 41 4e 44 20 6f 73 20 3d 20 25   = %Q AND os = %
20d0: 51 20 41 4e 44 20 63 70 75 41 72 63 68 20 3d 20  Q AND cpuArch = 
20e0: 25 51 20 41 4e 44 20 76 65 72 73 69 6f 6e 20 3d  %Q AND version =
20f0: 20 25 51 3b 22 2c 0a 09 09 68 6f 73 74 6e 61 6d   %Q;",...hostnam
2100: 65 2c 0a 09 09 70 61 63 6b 61 67 65 2c 0a 09 09  e,...package,...
2110: 6f 73 2c 0a 09 09 63 70 75 41 72 63 68 2c 0a 09  os,...cpuArch,..
2120: 09 76 65 72 73 69 6f 6e 0a 09 29 3b 0a 09 69 66  .version..);..if
2130: 20 28 73 71 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (sql == NULL) {
2140: 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22  ...APPFS_DEBUG("
2150: 43 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  Call to sqlite3_
2160: 6d 70 72 69 6e 74 66 20 66 61 69 6c 65 64 2e 22  mprintf failed."
2170: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
2180: 4c 29 3b 0a 09 7d 0a 0a 09 41 50 50 46 53 5f 44  L);..}...APPFS_D
2190: 45 42 55 47 28 22 53 51 4c 3a 20 25 73 22 2c 20  EBUG("SQL: %s", 
21a0: 73 71 6c 29 3b 0a 09 73 71 6c 69 74 65 5f 72 65  sql);..sqlite_re
21b0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  t = sqlite3_exec
21c0: 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 64 62  (globalThread.db
21d0: 2c 20 73 71 6c 2c 20 61 70 70 66 73 5f 6c 6f 6f  , sql, appfs_loo
21e0: 6b 75 70 5f 70 61 63 6b 61 67 65 5f 68 61 73 68  kup_package_hash
21f0: 5f 63 62 2c 20 26 72 65 74 76 61 6c 2c 20 4e 55  _cb, &retval, NU
2200: 4c 4c 29 3b 0a 09 73 71 6c 69 74 65 33 5f 66 72  LL);..sqlite3_fr
2210: 65 65 28 73 71 6c 29 3b 0a 0a 09 69 66 20 28 73  ee(sql);...if (s
2220: 71 6c 69 74 65 5f 72 65 74 20 21 3d 20 53 51 4c  qlite_ret != SQL
2230: 49 54 45 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46  ITE_OK) {...APPF
2240: 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f  S_DEBUG("Call to
2250: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 66 61   sqlite3_exec fa
2260: 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2270: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72  rn(NULL);..}...r
2280: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
2290: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70  ..static int app
22a0: 66 73 5f 67 65 74 66 69 6c 65 69 6e 66 6f 5f 63  fs_getfileinfo_c
22b0: 62 28 76 6f 69 64 20 2a 5f 70 61 74 68 69 6e 66  b(void *_pathinf
22c0: 6f 2c 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 2c 20  o, int columns, 
22d0: 63 68 61 72 20 2a 2a 76 61 6c 75 65 73 2c 20 63  char **values, c
22e0: 68 61 72 20 2a 2a 6e 61 6d 65 73 29 20 7b 0a 09  har **names) {..
22f0: 73 74 72 75 63 74 20 61 70 70 66 73 5f 70 61 74  struct appfs_pat
2300: 68 69 6e 66 6f 20 2a 70 61 74 68 69 6e 66 6f 20  hinfo *pathinfo 
2310: 3d 20 5f 70 61 74 68 69 6e 66 6f 3b 0a 09 63 6f  = _pathinfo;..co
2320: 6e 73 74 20 63 68 61 72 20 2a 74 79 70 65 2c 20  nst char *type, 
2330: 2a 74 69 6d 65 2c 20 2a 73 6f 75 72 63 65 2c 20  *time, *source, 
2340: 2a 73 69 7a 65 2c 20 2a 70 65 72 6d 73 2c 20 2a  *size, *perms, *
2350: 73 68 61 31 3b 0a 0a 09 74 79 70 65 20 3d 20 76  sha1;...type = v
2360: 61 6c 75 65 73 5b 30 5d 3b 0a 09 74 69 6d 65 20  alues[0];..time 
2370: 3d 20 76 61 6c 75 65 73 5b 31 5d 3b 0a 09 73 6f  = values[1];..so
2380: 75 72 63 65 20 3d 20 76 61 6c 75 65 73 5b 32 5d  urce = values[2]
2390: 3b 0a 09 73 69 7a 65 20 3d 20 76 61 6c 75 65 73  ;..size = values
23a0: 5b 33 5d 3b 0a 09 70 65 72 6d 73 20 3d 20 76 61  [3];..perms = va
23b0: 6c 75 65 73 5b 34 5d 3b 0a 09 73 68 61 31 20 3d  lues[4];..sha1 =
23c0: 20 76 61 6c 75 65 73 5b 35 5d 3b 0a 0a 09 70 61   values[5];...pa
23d0: 74 68 69 6e 66 6f 2d 3e 74 69 6d 65 20 3d 20 73  thinfo->time = s
23e0: 74 72 74 6f 75 6c 6c 28 74 69 6d 65 2c 20 4e 55  trtoull(time, NU
23f0: 4c 4c 2c 20 31 30 29 3b 0a 0a 09 69 66 20 28 73  LL, 10);...if (s
2400: 74 72 63 6d 70 28 74 79 70 65 2c 20 22 66 69 6c  trcmp(type, "fil
2410: 65 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 70 61  e") == 0) {...pa
2420: 74 68 69 6e 66 6f 2d 3e 74 79 70 65 20 3d 20 41  thinfo->type = A
2430: 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f 46 49  PPFS_PATHTYPE_FI
2440: 4c 45 3b 0a 0a 09 09 69 66 20 28 21 73 69 7a 65  LE;....if (!size
2450: 29 20 7b 0a 09 09 09 73 69 7a 65 20 3d 20 22 30  ) {....size = "0
2460: 22 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 21 70  ";...}....if (!p
2470: 65 72 6d 73 29 20 7b 0a 09 09 09 70 65 72 6d 73  erms) {....perms
2480: 20 3d 20 22 22 3b 0a 09 09 7d 0a 0a 09 09 69 66   = "";...}....if
2490: 20 28 21 73 68 61 31 29 20 7b 0a 09 09 09 73 68   (!sha1) {....sh
24a0: 61 31 20 3d 20 22 22 3b 0a 09 09 7d 0a 0a 09 09  a1 = "";...}....
24b0: 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e  pathinfo->typein
24c0: 66 6f 2e 66 69 6c 65 2e 73 69 7a 65 20 3d 20 73  fo.file.size = s
24d0: 74 72 74 6f 75 6c 6c 28 73 69 7a 65 2c 20 4e 55  trtoull(size, NU
24e0: 4c 4c 2c 20 31 30 29 3b 0a 09 09 73 6e 70 72 69  LL, 10);...snpri
24f0: 6e 74 66 28 70 61 74 68 69 6e 66 6f 2d 3e 74 79  ntf(pathinfo->ty
2500: 70 65 69 6e 66 6f 2e 66 69 6c 65 2e 73 68 61 31  peinfo.file.sha1
2510: 2c 20 73 69 7a 65 6f 66 28 70 61 74 68 69 6e 66  , sizeof(pathinf
2520: 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 66 69 6c 65  o->typeinfo.file
2530: 2e 73 68 61 31 29 2c 20 22 25 73 22 2c 20 73 68  .sha1), "%s", sh
2540: 61 31 29 3b 0a 0a 09 09 69 66 20 28 73 74 72 63  a1);....if (strc
2550: 6d 70 28 70 65 72 6d 73 2c 20 22 78 22 29 20 3d  mp(perms, "x") =
2560: 3d 20 30 29 20 7b 0a 09 09 09 70 61 74 68 69 6e  = 0) {....pathin
2570: 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 66 69 6c  fo->typeinfo.fil
2580: 65 2e 65 78 65 63 75 74 61 62 6c 65 20 3d 20 31  e.executable = 1
2590: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
25a0: 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e  pathinfo->typein
25b0: 66 6f 2e 66 69 6c 65 2e 65 78 65 63 75 74 61 62  fo.file.executab
25c0: 6c 65 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 72  le = 0;...}....r
25d0: 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 69  eturn(0);..}...i
25e0: 66 20 28 73 74 72 63 6d 70 28 74 79 70 65 2c 20  f (strcmp(type, 
25f0: 22 64 69 72 65 63 74 6f 72 79 22 29 20 3d 3d 20  "directory") == 
2600: 30 29 20 7b 0a 09 09 70 61 74 68 69 6e 66 6f 2d  0) {...pathinfo-
2610: 3e 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41  >type = APPFS_PA
2620: 54 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59  THTYPE_DIRECTORY
2630: 3b 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79  ;...pathinfo->ty
2640: 70 65 69 6e 66 6f 2e 64 69 72 2e 63 68 69 6c 64  peinfo.dir.child
2650: 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 72 65  count = 0;....re
2660: 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 69 66  turn(0);..}...if
2670: 20 28 73 74 72 63 6d 70 28 74 79 70 65 2c 20 22   (strcmp(type, "
2680: 73 79 6d 6c 69 6e 6b 22 29 20 3d 3d 20 30 29 20  symlink") == 0) 
2690: 7b 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79  {...pathinfo->ty
26a0: 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54 48 54  pe = APPFS_PATHT
26b0: 59 50 45 5f 53 59 4d 4c 49 4e 4b 3b 0a 09 09 70  YPE_SYMLINK;...p
26c0: 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66  athinfo->typeinf
26d0: 6f 2e 64 69 72 2e 63 68 69 6c 64 63 6f 75 6e 74  o.dir.childcount
26e0: 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28 21 73 6f   = 0;....if (!so
26f0: 75 72 63 65 29 20 7b 0a 09 09 09 73 6f 75 72 63  urce) {....sourc
2700: 65 20 3d 20 22 2e 42 41 44 4c 49 4e 4b 22 3b 0a  e = ".BADLINK";.
2710: 09 09 7d 0a 0a 09 09 70 61 74 68 69 6e 66 6f 2d  ..}....pathinfo-
2720: 3e 74 79 70 65 69 6e 66 6f 2e 73 79 6d 6c 69 6e  >typeinfo.symlin
2730: 6b 2e 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28  k.size = strlen(
2740: 73 6f 75 72 63 65 29 3b 0a 09 09 73 6e 70 72 69  source);...snpri
2750: 6e 74 66 28 70 61 74 68 69 6e 66 6f 2d 3e 74 79  ntf(pathinfo->ty
2760: 70 65 69 6e 66 6f 2e 73 79 6d 6c 69 6e 6b 2e 73  peinfo.symlink.s
2770: 6f 75 72 63 65 2c 20 73 69 7a 65 6f 66 28 70 61  ource, sizeof(pa
2780: 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f  thinfo->typeinfo
2790: 2e 73 79 6d 6c 69 6e 6b 2e 73 6f 75 72 63 65 29  .symlink.source)
27a0: 2c 20 22 25 73 22 2c 20 73 6f 75 72 63 65 29 3b  , "%s", source);
27b0: 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  ....return(0);..
27c0: 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 0a  }...return(0);..
27d0: 09 2f 2a 20 55 6e 74 69 6c 20 74 68 69 73 20 69  ./* Until this i
27e0: 73 20 75 73 65 64 2c 20 70 72 65 76 65 6e 74 20  s used, prevent 
27f0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 72 6f  the compiler fro
2800: 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 20 2a 2f  m complaining */
2810: 0a 09 73 6f 75 72 63 65 20 3d 20 73 6f 75 72 63  ..source = sourc
2820: 65 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  e;.}..static int
2830: 20 61 70 70 66 73 5f 67 65 74 66 69 6c 65 69 6e   appfs_getfilein
2840: 66 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 68  fo(const char *h
2850: 6f 73 74 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ostname, const c
2860: 68 61 72 20 2a 70 61 63 6b 61 67 65 5f 68 61 73  har *package_has
2870: 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f  h, const char *_
2880: 70 61 74 68 2c 20 73 74 72 75 63 74 20 61 70 70  path, struct app
2890: 66 73 5f 70 61 74 68 69 6e 66 6f 20 2a 70 61 74  fs_pathinfo *pat
28a0: 68 69 6e 66 6f 29 20 7b 0a 09 63 68 61 72 20 2a  hinfo) {..char *
28b0: 64 69 72 65 63 74 6f 72 79 2c 20 2a 66 69 6c 65  directory, *file
28c0: 2c 20 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a  , *path;..char *
28d0: 73 71 6c 3b 0a 09 69 6e 74 20 73 71 6c 69 74 65  sql;..int sqlite
28e0: 5f 72 65 74 3b 0a 0a 09 69 66 20 28 70 61 74 68  _ret;...if (path
28f0: 69 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  info == NULL) {.
2900: 09 09 72 65 74 75 72 6e 28 2d 45 49 4f 29 3b 0a  ..return(-EIO);.
2910: 09 7d 0a 0a 09 61 70 70 66 73 5f 75 70 64 61 74  .}...appfs_updat
2920: 65 5f 69 6e 64 65 78 28 68 6f 73 74 6e 61 6d 65  e_index(hostname
2930: 29 3b 0a 09 61 70 70 66 73 5f 75 70 64 61 74 65  );..appfs_update
2940: 5f 6d 61 6e 69 66 65 73 74 28 68 6f 73 74 6e 61  _manifest(hostna
2950: 6d 65 2c 20 70 61 63 6b 61 67 65 5f 68 61 73 68  me, package_hash
2960: 29 3b 0a 0a 09 70 61 74 68 20 3d 20 73 74 72 64  );...path = strd
2970: 75 70 28 5f 70 61 74 68 29 3b 0a 09 64 69 72 65  up(_path);..dire
2980: 63 74 6f 72 79 20 3d 20 70 61 74 68 3b 0a 09 66  ctory = path;..f
2990: 69 6c 65 20 3d 20 73 74 72 72 63 68 72 28 70 61  ile = strrchr(pa
29a0: 74 68 2c 20 27 2f 27 29 3b 0a 09 69 66 20 28 66  th, '/');..if (f
29b0: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
29c0: 09 66 69 6c 65 20 3d 20 70 61 74 68 3b 0a 09 09  .file = path;...
29d0: 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22 3b 0a  directory = "";.
29e0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2a 66 69 6c  .} else {...*fil
29f0: 65 20 3d 20 27 5c 30 27 3b 0a 09 09 66 69 6c 65  e = '\0';...file
2a00: 2b 2b 3b 0a 09 7d 0a 0a 09 73 71 6c 20 3d 20 73  ++;..}...sql = s
2a10: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2a20: 53 45 4c 45 43 54 20 74 79 70 65 2c 20 74 69 6d  SELECT type, tim
2a30: 65 2c 20 73 6f 75 72 63 65 2c 20 73 69 7a 65 2c  e, source, size,
2a40: 20 70 65 72 6d 73 2c 20 66 69 6c 65 5f 73 68 61   perms, file_sha
2a50: 31 20 46 52 4f 4d 20 66 69 6c 65 73 20 57 48 45  1 FROM files WHE
2a60: 52 45 20 70 61 63 6b 61 67 65 5f 73 68 61 31 20  RE package_sha1 
2a70: 3d 20 25 51 20 41 4e 44 20 66 69 6c 65 5f 64 69  = %Q AND file_di
2a80: 72 65 63 74 6f 72 79 20 3d 20 25 51 20 41 4e 44  rectory = %Q AND
2a90: 20 66 69 6c 65 5f 6e 61 6d 65 20 3d 20 25 51 3b   file_name = %Q;
2aa0: 22 2c 20 70 61 63 6b 61 67 65 5f 68 61 73 68 2c  ", package_hash,
2ab0: 20 64 69 72 65 63 74 6f 72 79 2c 20 66 69 6c 65   directory, file
2ac0: 29 3b 0a 09 69 66 20 28 73 71 6c 20 3d 3d 20 4e  );..if (sql == N
2ad0: 55 4c 4c 29 20 7b 0a 09 09 41 50 50 46 53 5f 44  ULL) {...APPFS_D
2ae0: 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20 73 71  EBUG("Call to sq
2af0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 66 61  lite3_mprintf fa
2b00: 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 66 72 65 65  iled.");....free
2b10: 28 70 61 74 68 29 3b 0a 0a 09 09 72 65 74 75 72  (path);....retur
2b20: 6e 28 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 66 72  n(-EIO);..}...fr
2b30: 65 65 28 70 61 74 68 29 3b 0a 0a 09 70 61 74 68  ee(path);...path
2b40: 69 6e 66 6f 2d 3e 74 79 70 65 20 3d 20 41 50 50  info->type = APP
2b50: 46 53 5f 50 41 54 48 54 59 50 45 5f 49 4e 56 41  FS_PATHTYPE_INVA
2b60: 4c 49 44 3b 0a 0a 09 41 50 50 46 53 5f 44 45 42  LID;...APPFS_DEB
2b70: 55 47 28 22 53 51 4c 3a 20 25 73 22 2c 20 73 71  UG("SQL: %s", sq
2b80: 6c 29 3b 0a 09 73 71 6c 69 74 65 5f 72 65 74 20  l);..sqlite_ret 
2b90: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67  = sqlite3_exec(g
2ba0: 6c 6f 62 61 6c 54 68 72 65 61 64 2e 64 62 2c 20  lobalThread.db, 
2bb0: 73 71 6c 2c 20 61 70 70 66 73 5f 67 65 74 66 69  sql, appfs_getfi
2bc0: 6c 65 69 6e 66 6f 5f 63 62 2c 20 70 61 74 68 69  leinfo_cb, pathi
2bd0: 6e 66 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 73 71 6c  nfo, NULL);..sql
2be0: 69 74 65 33 5f 66 72 65 65 28 73 71 6c 29 3b 0a  ite3_free(sql);.
2bf0: 0a 09 69 66 20 28 73 71 6c 69 74 65 5f 72 65 74  ..if (sqlite_ret
2c00: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b   != SQLITE_OK) {
2c10: 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22  ...APPFS_DEBUG("
2c20: 43 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  Call to sqlite3_
2c30: 65 78 65 63 20 66 61 69 6c 65 64 2e 22 29 3b 0a  exec failed.");.
2c40: 0a 09 09 72 65 74 75 72 6e 28 2d 45 49 4f 29 3b  ...return(-EIO);
2c50: 0a 09 7d 0a 0a 09 69 66 20 28 70 61 74 68 69 6e  ..}...if (pathin
2c60: 66 6f 2d 3e 74 79 70 65 20 3d 3d 20 41 50 50 46  fo->type == APPF
2c70: 53 5f 50 41 54 48 54 59 50 45 5f 49 4e 56 41 4c  S_PATHTYPE_INVAL
2c80: 49 44 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d  ID) {...return(-
2c90: 45 4e 4f 45 4e 54 29 3b 0a 09 7d 0a 0a 09 72 65  ENOENT);..}...re
2ca0: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74  turn(0);.}..stat
2cb0: 69 63 20 69 6e 74 20 61 70 70 66 73 5f 67 65 74  ic int appfs_get
2cc0: 5f 70 61 74 68 5f 69 6e 66 6f 5f 73 71 6c 28 63  _path_info_sql(c
2cd0: 68 61 72 20 2a 73 71 6c 2c 20 69 6e 74 20 61 72  har *sql, int ar
2ce0: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
2cf0: 66 6d 74 2c 20 73 74 72 75 63 74 20 61 70 70 66  fmt, struct appf
2d00: 73 5f 70 61 74 68 69 6e 66 6f 20 2a 70 61 74 68  s_pathinfo *path
2d10: 69 6e 66 6f 2c 20 73 74 72 75 63 74 20 61 70 70  info, struct app
2d20: 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a 2a 63 68  fs_children **ch
2d30: 69 6c 64 72 65 6e 29 20 7b 0a 09 73 74 72 75 63  ildren) {..struc
2d40: 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e  t appfs_children
2d50: 20 2a 6e 6f 64 65 2c 20 2a 64 69 72 5f 63 68 69   *node, *dir_chi
2d60: 6c 64 72 65 6e 2c 20 2a 64 69 72 5f 63 68 69 6c  ldren, *dir_chil
2d70: 64 3b 0a 09 69 6e 74 20 64 69 72 5f 63 68 69 6c  d;..int dir_chil
2d80: 64 72 65 6e 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  dren_count = 0;.
2d90: 0a 09 64 69 72 5f 63 68 69 6c 64 72 65 6e 20 3d  ..dir_children =
2da0: 20 61 70 70 66 73 5f 73 71 6c 69 74 65 33 5f 71   appfs_sqlite3_q
2db0: 75 65 72 79 28 73 71 6c 2c 20 61 72 67 63 2c 20  uery(sql, argc, 
2dc0: 66 6d 74 2c 20 26 64 69 72 5f 63 68 69 6c 64 72  fmt, &dir_childr
2dd0: 65 6e 5f 63 6f 75 6e 74 29 3b 0a 0a 09 69 66 20  en_count);...if 
2de0: 28 64 69 72 5f 63 68 69 6c 64 72 65 6e 20 3d 3d  (dir_children ==
2df0: 20 4e 55 4c 4c 20 7c 7c 20 64 69 72 5f 63 68 69   NULL || dir_chi
2e00: 6c 64 72 65 6e 5f 63 6f 75 6e 74 20 3d 3d 20 30  ldren_count == 0
2e10: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 4e  ) {...return(-EN
2e20: 4f 45 4e 54 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52  OENT);..}.../* R
2e30: 65 71 75 65 73 74 20 66 6f 72 20 61 20 73 69 6e  equest for a sin
2e40: 67 6c 65 20 68 6f 73 74 6e 61 6d 65 20 2a 2f 0a  gle hostname */.
2e50: 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 20  .pathinfo->type 
2e60: 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  = APPFS_PATHTYPE
2e70: 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09 70 61 74  _DIRECTORY;..pat
2e80: 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e  hinfo->typeinfo.
2e90: 64 69 72 2e 63 68 69 6c 64 63 6f 75 6e 74 20 3d  dir.childcount =
2ea0: 20 64 69 72 5f 63 68 69 6c 64 72 65 6e 5f 63 6f   dir_children_co
2eb0: 75 6e 74 3b 0a 09 70 61 74 68 69 6e 66 6f 2d 3e  unt;..pathinfo->
2ec0: 74 69 6d 65 20 3d 20 67 6c 6f 62 61 6c 54 68 72  time = globalThr
2ed0: 65 61 64 2e 62 6f 6f 74 74 69 6d 65 3b 0a 0a 09  ead.boottime;...
2ee0: 69 66 20 28 63 68 69 6c 64 72 65 6e 29 20 7b 0a  if (children) {.
2ef0: 09 09 66 6f 72 20 28 64 69 72 5f 63 68 69 6c 64  ..for (dir_child
2f00: 20 3d 20 64 69 72 5f 63 68 69 6c 64 72 65 6e 3b   = dir_children;
2f10: 20 64 69 72 5f 63 68 69 6c 64 3b 20 64 69 72 5f   dir_child; dir_
2f20: 63 68 69 6c 64 20 3d 20 64 69 72 5f 63 68 69 6c  child = dir_chil
2f30: 64 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 6e  d->_next) {....n
2f40: 6f 64 65 20 3d 20 28 76 6f 69 64 20 2a 29 20 63  ode = (void *) c
2f50: 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6e  kalloc(sizeof(*n
2f60: 6f 64 65 29 29 3b 0a 09 09 09 6e 6f 64 65 2d 3e  ode));....node->
2f70: 5f 6e 65 78 74 20 3d 20 2a 63 68 69 6c 64 72 65  _next = *childre
2f80: 6e 3b 0a 09 09 09 73 74 72 63 70 79 28 6e 6f 64  n;....strcpy(nod
2f90: 65 2d 3e 6e 61 6d 65 2c 20 64 69 72 5f 63 68 69  e->name, dir_chi
2fa0: 6c 64 2d 3e 6e 61 6d 65 29 3b 0a 09 09 09 2a 63  ld->name);....*c
2fb0: 68 69 6c 64 72 65 6e 20 3d 20 6e 6f 64 65 3b 0a  hildren = node;.
2fc0: 09 09 7d 0a 09 7d 0a 0a 09 61 70 70 66 73 5f 66  ..}..}...appfs_f
2fd0: 72 65 65 5f 6c 69 73 74 5f 63 68 69 6c 64 72 65  ree_list_childre
2fe0: 6e 28 64 69 72 5f 63 68 69 6c 64 72 65 6e 29 3b  n(dir_children);
2ff0: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
3000: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
3010: 73 5f 61 64 64 5f 70 61 74 68 5f 63 68 69 6c 64  s_add_path_child
3020: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d  (const char *nam
3030: 65 2c 20 73 74 72 75 63 74 20 61 70 70 66 73 5f  e, struct appfs_
3040: 70 61 74 68 69 6e 66 6f 20 2a 70 61 74 68 69 6e  pathinfo *pathin
3050: 66 6f 2c 20 73 74 72 75 63 74 20 61 70 70 66 73  fo, struct appfs
3060: 5f 63 68 69 6c 64 72 65 6e 20 2a 2a 63 68 69 6c  _children **chil
3070: 64 72 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20  dren) {..struct 
3080: 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a  appfs_children *
3090: 6e 65 77 5f 63 68 69 6c 64 3b 0a 0a 09 70 61 74  new_child;...pat
30a0: 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e  hinfo->typeinfo.
30b0: 64 69 72 2e 63 68 69 6c 64 63 6f 75 6e 74 2b 2b  dir.childcount++
30c0: 3b 0a 0a 09 69 66 20 28 63 68 69 6c 64 72 65 6e  ;...if (children
30d0: 29 20 7b 0a 09 09 6e 65 77 5f 63 68 69 6c 64 20  ) {...new_child 
30e0: 3d 20 28 76 6f 69 64 20 2a 29 20 63 6b 61 6c 6c  = (void *) ckall
30f0: 6f 63 28 73 69 7a 65 6f 66 28 2a 6e 65 77 5f 63  oc(sizeof(*new_c
3100: 68 69 6c 64 29 29 3b 0a 09 09 6e 65 77 5f 63 68  hild));...new_ch
3110: 69 6c 64 2d 3e 5f 6e 65 78 74 20 3d 20 2a 63 68  ild->_next = *ch
3120: 69 6c 64 72 65 6e 3b 0a 0a 09 09 73 6e 70 72 69  ildren;....snpri
3130: 6e 74 66 28 6e 65 77 5f 63 68 69 6c 64 2d 3e 6e  ntf(new_child->n
3140: 61 6d 65 2c 20 73 69 7a 65 6f 66 28 6e 65 77 5f  ame, sizeof(new_
3150: 63 68 69 6c 64 2d 3e 6e 61 6d 65 29 2c 20 22 25  child->name), "%
3160: 73 22 2c 20 6e 61 6d 65 29 3b 0a 0a 09 09 2a 63  s", name);....*c
3170: 68 69 6c 64 72 65 6e 20 3d 20 6e 65 77 5f 63 68  hildren = new_ch
3180: 69 6c 64 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ild;..}...return
3190: 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 74 20 69  (0);.}../* Get i
31a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
31b0: 20 61 20 70 61 74 68 2c 20 61 6e 64 20 6f 70 74   a path, and opt
31c0: 69 6f 6e 61 6c 6c 79 20 6c 69 73 74 20 63 68 69  ionally list chi
31d0: 6c 64 72 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ldren */.static 
31e0: 69 6e 74 20 61 70 70 66 73 5f 67 65 74 5f 70 61  int appfs_get_pa
31f0: 74 68 5f 69 6e 66 6f 28 63 6f 6e 73 74 20 63 68  th_info(const ch
3200: 61 72 20 2a 5f 70 61 74 68 2c 20 73 74 72 75 63  ar *_path, struc
3210: 74 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f  t appfs_pathinfo
3220: 20 2a 70 61 74 68 69 6e 66 6f 2c 20 73 74 72 75   *pathinfo, stru
3230: 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65  ct appfs_childre
3240: 6e 20 2a 2a 63 68 69 6c 64 72 65 6e 29 20 7b 0a  n **children) {.
3250: 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 63 68  .struct appfs_ch
3260: 69 6c 64 72 65 6e 20 2a 64 69 72 5f 63 68 69 6c  ildren *dir_chil
3270: 64 72 65 6e 3b 0a 09 63 68 61 72 20 2a 68 6f 73  dren;..char *hos
3280: 74 6e 61 6d 65 2c 20 2a 70 61 63 6b 61 67 65 6e  tname, *packagen
3290: 61 6d 65 2c 20 2a 6f 73 5f 63 70 75 41 72 63 68  ame, *os_cpuArch
32a0: 2c 20 2a 6f 73 2c 20 2a 63 70 75 41 72 63 68 2c  , *os, *cpuArch,
32b0: 20 2a 76 65 72 73 69 6f 6e 3b 0a 09 63 68 61 72   *version;..char
32c0: 20 2a 70 61 74 68 2c 20 2a 70 61 74 68 5f 73 3b   *path, *path_s;
32d0: 0a 09 63 68 61 72 20 2a 70 61 63 6b 61 67 65 5f  ..char *package_
32e0: 68 61 73 68 3b 0a 09 63 68 61 72 20 2a 73 71 6c  hash;..char *sql
32f0: 3b 0a 09 69 6e 74 20 66 69 6c 65 73 5f 63 6f 75  ;..int files_cou
3300: 6e 74 3b 0a 09 69 6e 74 20 66 69 6c 65 69 6e 66  nt;..int fileinf
3310: 6f 5f 72 65 74 2c 20 72 65 74 76 61 6c 3b 0a 0a  o_ret, retval;..
3320: 09 69 66 20 28 63 68 69 6c 64 72 65 6e 29 20 7b  .if (children) {
3330: 0a 09 09 2a 63 68 69 6c 64 72 65 6e 20 3d 20 4e  ...*children = N
3340: 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 5f 70  ULL;..}...if (_p
3350: 61 74 68 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ath == NULL) {..
3360: 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29  .return(-ENOENT)
3370: 3b 0a 09 7d 0a 0a 09 69 66 20 28 5f 70 61 74 68  ;..}...if (_path
3380: 5b 30 5d 20 21 3d 20 27 2f 27 29 20 7b 0a 09 09  [0] != '/') {...
3390: 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b  return(-ENOENT);
33a0: 0a 09 7d 0a 0a 09 69 66 20 28 5f 70 61 74 68 5b  ..}...if (_path[
33b0: 31 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09  1] == '\0') {...
33c0: 2f 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 74  /* Request for t
33d0: 68 65 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72  he root director
33e0: 79 20 2a 2f 0a 09 09 70 61 74 68 69 6e 66 6f 2d  y */...pathinfo-
33f0: 3e 68 6f 73 74 6e 61 6d 65 5b 30 5d 20 3d 20 27  >hostname[0] = '
3400: 5c 30 27 3b 0a 0a 09 09 73 71 6c 20 3d 20 73 71  \0';....sql = sq
3410: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
3420: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 68  ELECT DISTINCT h
3430: 6f 73 74 6e 61 6d 65 20 46 52 4f 4d 20 70 61 63  ostname FROM pac
3440: 6b 61 67 65 73 3b 22 29 3b 0a 0a 09 09 72 65 74  kages;");....ret
3450: 76 61 6c 20 3d 20 61 70 70 66 73 5f 67 65 74 5f  val = appfs_get_
3460: 70 61 74 68 5f 69 6e 66 6f 5f 73 71 6c 28 73 71  path_info_sql(sq
3470: 6c 2c 20 31 2c 20 4e 55 4c 4c 2c 20 70 61 74 68  l, 1, NULL, path
3480: 69 6e 66 6f 2c 20 63 68 69 6c 64 72 65 6e 29 3b  info, children);
3490: 0a 0a 09 09 2f 2a 20 54 68 65 20 72 6f 6f 74 20  ..../* The root 
34a0: 64 69 72 65 63 74 6f 72 79 20 61 6c 77 61 79 73  directory always
34b0: 20 65 78 69 73 74 73 2c 20 65 76 65 6e 20 69 66   exists, even if
34c0: 20 69 74 20 68 61 73 20 6e 6f 20 73 75 62 6f 72   it has no subor
34d0: 64 69 6e 61 74 65 73 20 2a 2f 0a 09 09 69 66 20  dinates */...if 
34e0: 28 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  (retval != 0) {.
34f0: 09 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70  ...pathinfo->typ
3500: 65 20 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59  e = APPFS_PATHTY
3510: 50 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09 09  PE_DIRECTORY;...
3520: 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69  .pathinfo->typei
3530: 6e 66 6f 2e 64 69 72 2e 63 68 69 6c 64 63 6f 75  nfo.dir.childcou
3540: 6e 74 20 3d 20 30 3b 0a 09 09 09 70 61 74 68 69  nt = 0;....pathi
3550: 6e 66 6f 2d 3e 74 69 6d 65 20 3d 20 67 6c 6f 62  nfo->time = glob
3560: 61 6c 54 68 72 65 61 64 2e 62 6f 6f 74 74 69 6d  alThread.boottim
3570: 65 3b 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20  e;.....retval = 
3580: 30 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  0;...}....return
3590: 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 70  (retval);..}...p
35a0: 61 74 68 20 3d 20 73 74 72 64 75 70 28 5f 70 61  ath = strdup(_pa
35b0: 74 68 29 3b 0a 09 70 61 74 68 5f 73 20 3d 20 70  th);..path_s = p
35c0: 61 74 68 3b 0a 0a 09 68 6f 73 74 6e 61 6d 65 20  ath;...hostname 
35d0: 3d 20 70 61 74 68 20 2b 20 31 3b 0a 09 70 61 63  = path + 1;..pac
35e0: 6b 61 67 65 6e 61 6d 65 20 3d 20 73 74 72 63 68  kagename = strch
35f0: 72 28 68 6f 73 74 6e 61 6d 65 2c 20 27 2f 27 29  r(hostname, '/')
3600: 3b 0a 0a 09 69 66 20 28 70 61 63 6b 61 67 65 6e  ;...if (packagen
3610: 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ame != NULL) {..
3620: 09 2a 70 61 63 6b 61 67 65 6e 61 6d 65 20 3d 20  .*packagename = 
3630: 27 5c 30 27 3b 0a 09 09 70 61 63 6b 61 67 65 6e  '\0';...packagen
3640: 61 6d 65 2b 2b 3b 0a 09 7d 0a 0a 09 73 6e 70 72  ame++;..}...snpr
3650: 69 6e 74 66 28 70 61 74 68 69 6e 66 6f 2d 3e 68  intf(pathinfo->h
3660: 6f 73 74 6e 61 6d 65 2c 20 73 69 7a 65 6f 66 28  ostname, sizeof(
3670: 70 61 74 68 69 6e 66 6f 2d 3e 68 6f 73 74 6e 61  pathinfo->hostna
3680: 6d 65 29 2c 20 22 25 73 22 2c 20 68 6f 73 74 6e  me), "%s", hostn
3690: 61 6d 65 29 3b 0a 0a 09 69 66 20 28 70 61 63 6b  ame);...if (pack
36a0: 61 67 65 6e 61 6d 65 20 3d 3d 20 4e 55 4c 4c 29  agename == NULL)
36b0: 20 7b 0a 09 09 61 70 70 66 73 5f 75 70 64 61 74   {...appfs_updat
36c0: 65 5f 69 6e 64 65 78 28 68 6f 73 74 6e 61 6d 65  e_index(hostname
36d0: 29 3b 0a 0a 09 09 73 71 6c 20 3d 20 73 71 6c 69  );....sql = sqli
36e0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
36f0: 45 43 54 20 44 49 53 54 49 4e 43 54 20 70 61 63  ECT DISTINCT pac
3700: 6b 61 67 65 20 46 52 4f 4d 20 70 61 63 6b 61 67  kage FROM packag
3710: 65 73 20 57 48 45 52 45 20 68 6f 73 74 6e 61 6d  es WHERE hostnam
3720: 65 20 3d 20 25 51 3b 22 2c 20 68 6f 73 74 6e 61  e = %Q;", hostna
3730: 6d 65 29 3b 0a 0a 09 09 66 72 65 65 28 70 61 74  me);....free(pat
3740: 68 5f 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  h_s);....return(
3750: 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f 69  appfs_get_path_i
3760: 6e 66 6f 5f 73 71 6c 28 73 71 6c 2c 20 31 2c 20  nfo_sql(sql, 1, 
3770: 4e 55 4c 4c 2c 20 70 61 74 68 69 6e 66 6f 2c 20  NULL, pathinfo, 
3780: 63 68 69 6c 64 72 65 6e 29 29 3b 0a 09 7d 0a 0a  children));..}..
3790: 09 6f 73 5f 63 70 75 41 72 63 68 20 3d 20 73 74  .os_cpuArch = st
37a0: 72 63 68 72 28 70 61 63 6b 61 67 65 6e 61 6d 65  rchr(packagename
37b0: 2c 20 27 2f 27 29 3b 0a 0a 09 69 66 20 28 6f 73  , '/');...if (os
37c0: 5f 63 70 75 41 72 63 68 20 21 3d 20 4e 55 4c 4c  _cpuArch != NULL
37d0: 29 20 7b 0a 09 09 2a 6f 73 5f 63 70 75 41 72 63  ) {...*os_cpuArc
37e0: 68 20 3d 20 27 5c 30 27 3b 0a 09 09 6f 73 5f 63  h = '\0';...os_c
37f0: 70 75 41 72 63 68 2b 2b 3b 0a 09 7d 0a 0a 09 69  puArch++;..}...i
3800: 66 20 28 6f 73 5f 63 70 75 41 72 63 68 20 3d 3d  f (os_cpuArch ==
3810: 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 70 70 66 73   NULL) {...appfs
3820: 5f 75 70 64 61 74 65 5f 69 6e 64 65 78 28 68 6f  _update_index(ho
3830: 73 74 6e 61 6d 65 29 3b 0a 0a 09 09 73 71 6c 20  stname);....sql 
3840: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3850: 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e  f("SELECT DISTIN
3860: 43 54 20 6f 73 2c 20 63 70 75 41 72 63 68 20 46  CT os, cpuArch F
3870: 52 4f 4d 20 70 61 63 6b 61 67 65 73 20 57 48 45  ROM packages WHE
3880: 52 45 20 68 6f 73 74 6e 61 6d 65 20 3d 20 25 51  RE hostname = %Q
3890: 20 41 4e 44 20 70 61 63 6b 61 67 65 20 3d 20 25   AND package = %
38a0: 51 3b 22 2c 20 68 6f 73 74 6e 61 6d 65 2c 20 70  Q;", hostname, p
38b0: 61 63 6b 61 67 65 6e 61 6d 65 29 3b 0a 0a 09 09  ackagename);....
38c0: 66 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09  free(path_s);...
38d0: 09 72 65 74 76 61 6c 20 3d 20 61 70 70 66 73 5f  .retval = appfs_
38e0: 67 65 74 5f 70 61 74 68 5f 69 6e 66 6f 5f 73 71  get_path_info_sq
38f0: 6c 28 73 71 6c 2c 20 32 2c 20 22 25 73 2d 25 73  l(sql, 2, "%s-%s
3900: 22 2c 20 70 61 74 68 69 6e 66 6f 2c 20 63 68 69  ", pathinfo, chi
3910: 6c 64 72 65 6e 29 3b 0a 0a 09 09 69 66 20 28 72  ldren);....if (r
3920: 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
3930: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
3940: 0a 09 09 7d 0a 0a 09 09 61 70 70 66 73 5f 61 64  ...}....appfs_ad
3950: 64 5f 70 61 74 68 5f 63 68 69 6c 64 28 22 70 6c  d_path_child("pl
3960: 61 74 66 6f 72 6d 22 2c 20 70 61 74 68 69 6e 66  atform", pathinf
3970: 6f 2c 20 63 68 69 6c 64 72 65 6e 29 3b 0a 0a 09  o, children);...
3980: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
3990: 0a 09 7d 0a 0a 09 76 65 72 73 69 6f 6e 20 3d 20  ..}...version = 
39a0: 73 74 72 63 68 72 28 6f 73 5f 63 70 75 41 72 63  strchr(os_cpuArc
39b0: 68 2c 20 27 2f 27 29 3b 0a 0a 09 69 66 20 28 76  h, '/');...if (v
39c0: 65 72 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20  ersion != NULL) 
39d0: 7b 0a 09 09 2a 76 65 72 73 69 6f 6e 20 3d 20 27  {...*version = '
39e0: 5c 30 27 3b 0a 09 09 76 65 72 73 69 6f 6e 2b 2b  \0';...version++
39f0: 3b 0a 09 7d 0a 0a 09 6f 73 20 3d 20 6f 73 5f 63  ;..}...os = os_c
3a00: 70 75 41 72 63 68 3b 0a 09 63 70 75 41 72 63 68  puArch;..cpuArch
3a10: 20 3d 20 73 74 72 63 68 72 28 6f 73 5f 63 70 75   = strchr(os_cpu
3a20: 41 72 63 68 2c 20 27 2d 27 29 3b 0a 09 69 66 20  Arch, '-');..if 
3a30: 28 63 70 75 41 72 63 68 29 20 7b 0a 09 09 2a 63  (cpuArch) {...*c
3a40: 70 75 41 72 63 68 20 3d 20 27 5c 30 27 3b 0a 09  puArch = '\0';..
3a50: 09 63 70 75 41 72 63 68 2b 2b 3b 0a 09 7d 20 65  .cpuArch++;..} e
3a60: 6c 73 65 20 7b 0a 09 09 63 70 75 41 72 63 68 20  lse {...cpuArch 
3a70: 3d 20 22 22 3b 0a 09 7d 0a 0a 09 69 66 20 28 76  = "";..}...if (v
3a80: 65 72 73 69 6f 6e 20 3d 3d 20 4e 55 4c 4c 29 20  ersion == NULL) 
3a90: 7b 0a 09 09 69 66 20 28 73 74 72 63 6d 70 28 6f  {...if (strcmp(o
3aa0: 73 2c 20 22 70 6c 61 74 66 6f 72 6d 22 29 20 3d  s, "platform") =
3ab0: 3d 20 30 20 26 26 20 73 74 72 63 6d 70 28 63 70  = 0 && strcmp(cp
3ac0: 75 41 72 63 68 2c 20 22 22 29 20 3d 3d 20 30 29  uArch, "") == 0)
3ad0: 20 7b 0a 09 09 09 70 61 74 68 69 6e 66 6f 2d 3e   {....pathinfo->
3ae0: 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54  type = APPFS_PAT
3af0: 48 54 59 50 45 5f 53 59 4d 4c 49 4e 4b 3b 0a 09  HTYPE_SYMLINK;..
3b00: 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 69 6d 65  ..pathinfo->time
3b10: 20 3d 20 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e   = globalThread.
3b20: 62 6f 6f 74 74 69 6d 65 3b 0a 09 09 09 70 61 74  boottime;....pat
3b30: 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e  hinfo->typeinfo.
3b40: 64 69 72 2e 63 68 69 6c 64 63 6f 75 6e 74 20 3d  dir.childcount =
3b50: 20 30 3b 0a 09 09 09 70 61 74 68 69 6e 66 6f 2d   0;....pathinfo-
3b60: 3e 74 79 70 65 69 6e 66 6f 2e 73 79 6d 6c 69 6e  >typeinfo.symlin
3b70: 6b 2e 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28  k.size = strlen(
3b80: 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 70 6c 61  globalThread.pla
3b90: 74 66 6f 72 6d 29 3b 0a 0a 09 09 09 73 6e 70 72  tform);.....snpr
3ba0: 69 6e 74 66 28 70 61 74 68 69 6e 66 6f 2d 3e 74  intf(pathinfo->t
3bb0: 79 70 65 69 6e 66 6f 2e 73 79 6d 6c 69 6e 6b 2e  ypeinfo.symlink.
3bc0: 73 6f 75 72 63 65 2c 20 73 69 7a 65 6f 66 28 70  source, sizeof(p
3bd0: 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66  athinfo->typeinf
3be0: 6f 2e 73 79 6d 6c 69 6e 6b 2e 73 6f 75 72 63 65  o.symlink.source
3bf0: 29 2c 20 22 25 73 22 2c 20 67 6c 6f 62 61 6c 54  ), "%s", globalT
3c00: 68 72 65 61 64 2e 70 6c 61 74 66 6f 72 6d 29 3b  hread.platform);
3c10: 0a 0a 09 09 09 66 72 65 65 28 70 61 74 68 5f 73  .....free(path_s
3c20: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 30 29  );.....return(0)
3c30: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 52 65 71 75  ;...}..../* Requ
3c40: 65 73 74 20 66 6f 72 20 76 65 72 73 69 6f 6e 20  est for version 
3c50: 6c 69 73 74 20 66 6f 72 20 61 20 70 61 63 6b 61  list for a packa
3c60: 67 65 20 6f 6e 20 61 6e 20 4f 53 2f 43 50 55 20  ge on an OS/CPU 
3c70: 2a 2f 0a 09 09 61 70 70 66 73 5f 75 70 64 61 74  */...appfs_updat
3c80: 65 5f 69 6e 64 65 78 28 68 6f 73 74 6e 61 6d 65  e_index(hostname
3c90: 29 3b 0a 0a 09 09 73 71 6c 20 3d 20 73 71 6c 69  );....sql = sqli
3ca0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
3cb0: 45 43 54 20 44 49 53 54 49 4e 43 54 20 76 65 72  ECT DISTINCT ver
3cc0: 73 69 6f 6e 20 46 52 4f 4d 20 70 61 63 6b 61 67  sion FROM packag
3cd0: 65 73 20 57 48 45 52 45 20 68 6f 73 74 6e 61 6d  es WHERE hostnam
3ce0: 65 20 3d 20 25 51 20 41 4e 44 20 70 61 63 6b 61  e = %Q AND packa
3cf0: 67 65 20 3d 20 25 51 20 41 4e 44 20 6f 73 20 3d  ge = %Q AND os =
3d00: 20 25 51 20 61 6e 64 20 63 70 75 41 72 63 68 20   %Q and cpuArch 
3d10: 3d 20 25 51 3b 22 2c 20 68 6f 73 74 6e 61 6d 65  = %Q;", hostname
3d20: 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65 2c 20 6f  , packagename, o
3d30: 73 2c 20 63 70 75 41 72 63 68 29 3b 0a 0a 09 09  s, cpuArch);....
3d40: 66 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09  free(path_s);...
3d50: 09 72 65 74 75 72 6e 28 61 70 70 66 73 5f 67 65  .return(appfs_ge
3d60: 74 5f 70 61 74 68 5f 69 6e 66 6f 5f 73 71 6c 28  t_path_info_sql(
3d70: 73 71 6c 2c 20 31 2c 20 4e 55 4c 4c 2c 20 70 61  sql, 1, NULL, pa
3d80: 74 68 69 6e 66 6f 2c 20 63 68 69 6c 64 72 65 6e  thinfo, children
3d90: 29 29 3b 0a 09 7d 0a 0a 09 70 61 74 68 20 3d 20  ));..}...path = 
3da0: 73 74 72 63 68 72 28 76 65 72 73 69 6f 6e 2c 20  strchr(version, 
3db0: 27 2f 27 29 3b 0a 09 69 66 20 28 70 61 74 68 20  '/');..if (path 
3dc0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 61 74  == NULL) {...pat
3dd0: 68 20 3d 20 22 22 3b 0a 09 7d 20 65 6c 73 65 20  h = "";..} else 
3de0: 7b 0a 09 09 2a 70 61 74 68 20 3d 20 27 5c 30 27  {...*path = '\0'
3df0: 3b 0a 09 09 70 61 74 68 2b 2b 3b 0a 09 7d 0a 0a  ;...path++;..}..
3e00: 09 2f 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20  ./* Request for 
3e10: 61 20 66 69 6c 65 20 69 6e 20 61 20 73 70 65 63  a file in a spec
3e20: 69 66 69 63 20 70 61 63 6b 61 67 65 20 2a 2f 0a  ific package */.
3e30: 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 52 65  .APPFS_DEBUG("Re
3e40: 71 75 65 73 74 69 6e 67 20 69 6e 66 6f 72 6d 61  questing informa
3e50: 74 69 6f 6e 20 66 6f 72 20 68 6f 73 74 6e 61 6d  tion for hostnam
3e60: 65 20 3d 20 25 73 2c 20 70 61 63 6b 61 67 65 20  e = %s, package 
3e70: 3d 20 25 73 2c 20 6f 73 20 3d 20 25 73 2c 20 63  = %s, os = %s, c
3e80: 70 75 41 72 63 68 20 3d 20 25 73 2c 20 76 65 72  puArch = %s, ver
3e90: 73 69 6f 6e 20 3d 20 25 73 2c 20 70 61 74 68 20  sion = %s, path 
3ea0: 3d 20 25 73 22 2c 20 0a 09 09 68 6f 73 74 6e 61  = %s", ...hostna
3eb0: 6d 65 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65 2c  me, packagename,
3ec0: 20 6f 73 2c 20 63 70 75 41 72 63 68 2c 20 76 65   os, cpuArch, ve
3ed0: 72 73 69 6f 6e 2c 20 70 61 74 68 0a 09 29 3b 0a  rsion, path..);.
3ee0: 0a 09 70 61 63 6b 61 67 65 5f 68 61 73 68 20 3d  ..package_hash =
3ef0: 20 61 70 70 66 73 5f 6c 6f 6f 6b 75 70 5f 70 61   appfs_lookup_pa
3f00: 63 6b 61 67 65 5f 68 61 73 68 28 68 6f 73 74 6e  ckage_hash(hostn
3f10: 61 6d 65 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65  ame, packagename
3f20: 2c 20 6f 73 2c 20 63 70 75 41 72 63 68 2c 20 76  , os, cpuArch, v
3f30: 65 72 73 69 6f 6e 29 3b 0a 09 69 66 20 28 70 61  ersion);..if (pa
3f40: 63 6b 61 67 65 5f 68 61 73 68 20 3d 3d 20 4e 55  ckage_hash == NU
3f50: 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28 70 61 74  LL) {...free(pat
3f60: 68 5f 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  h_s);....return(
3f70: 2d 45 4e 4f 45 4e 54 29 3b 0a 09 7d 0a 0a 09 41  -ENOENT);..}...A
3f80: 50 50 46 53 5f 44 45 42 55 47 28 22 20 20 2e 2e  PPFS_DEBUG("  ..
3f90: 2e 20 77 68 69 63 68 20 68 61 73 68 20 61 20 68  . which hash a h
3fa0: 61 73 68 20 6f 66 20 25 73 22 2c 20 70 61 63 6b  ash of %s", pack
3fb0: 61 67 65 5f 68 61 73 68 29 3b 0a 0a 09 61 70 70  age_hash);...app
3fc0: 66 73 5f 75 70 64 61 74 65 5f 6d 61 6e 69 66 65  fs_update_manife
3fd0: 73 74 28 68 6f 73 74 6e 61 6d 65 2c 20 70 61 63  st(hostname, pac
3fe0: 6b 61 67 65 5f 68 61 73 68 29 3b 0a 0a 09 69 66  kage_hash);...if
3ff0: 20 28 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   (strcmp(path, "
4000: 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 70 61 74  ") == 0) {...pat
4010: 68 69 6e 66 6f 2d 3e 74 79 70 65 20 3d 20 41 50  hinfo->type = AP
4020: 50 46 53 5f 50 41 54 48 54 59 50 45 5f 44 49 52  PFS_PATHTYPE_DIR
4030: 45 43 54 4f 52 59 3b 0a 09 09 70 61 74 68 69 6e  ECTORY;...pathin
4040: 66 6f 2d 3e 74 69 6d 65 20 3d 20 67 6c 6f 62 61  fo->time = globa
4050: 6c 54 68 72 65 61 64 2e 62 6f 6f 74 74 69 6d 65  lThread.boottime
4060: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 69  ;..} else {...fi
4070: 6c 65 69 6e 66 6f 5f 72 65 74 20 3d 20 61 70 70  leinfo_ret = app
4080: 66 73 5f 67 65 74 66 69 6c 65 69 6e 66 6f 28 68  fs_getfileinfo(h
4090: 6f 73 74 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65  ostname, package
40a0: 5f 68 61 73 68 2c 20 70 61 74 68 2c 20 70 61 74  _hash, path, pat
40b0: 68 69 6e 66 6f 29 3b 0a 09 09 69 66 20 28 66 69  hinfo);...if (fi
40c0: 6c 65 69 6e 66 6f 5f 72 65 74 20 21 3d 20 30 29  leinfo_ret != 0)
40d0: 20 7b 0a 09 09 09 66 72 65 65 28 70 61 74 68 5f   {....free(path_
40e0: 73 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 66  s);.....return(f
40f0: 69 6c 65 69 6e 66 6f 5f 72 65 74 29 3b 0a 09 09  ileinfo_ret);...
4100: 7d 0a 09 7d 0a 0a 09 69 66 20 28 70 61 74 68 69  }..}...if (pathi
4110: 6e 66 6f 2d 3e 74 79 70 65 20 3d 3d 20 41 50 50  nfo->type == APP
4120: 46 53 5f 50 41 54 48 54 59 50 45 5f 44 49 52 45  FS_PATHTYPE_DIRE
4130: 43 54 4f 52 59 29 20 7b 0a 09 09 64 69 72 5f 63  CTORY) {...dir_c
4140: 68 69 6c 64 72 65 6e 20 3d 20 61 70 70 66 73 5f  hildren = appfs_
4150: 67 65 74 63 68 69 6c 64 72 65 6e 28 68 6f 73 74  getchildren(host
4160: 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65 5f 68 61  name, package_ha
4170: 73 68 2c 20 70 61 74 68 2c 20 26 66 69 6c 65 73  sh, path, &files
4180: 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28  _count);....if (
4190: 64 69 72 5f 63 68 69 6c 64 72 65 6e 20 21 3d 20  dir_children != 
41a0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 70 61 74 68 69  NULL) {....pathi
41b0: 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 64 69  nfo->typeinfo.di
41c0: 72 2e 63 68 69 6c 64 63 6f 75 6e 74 20 3d 20 66  r.childcount = f
41d0: 69 6c 65 73 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a  iles_count;...}.
41e0: 0a 09 09 69 66 20 28 63 68 69 6c 64 72 65 6e 29  ...if (children)
41f0: 20 7b 0a 09 09 09 2a 63 68 69 6c 64 72 65 6e 20   {....*children 
4200: 3d 20 64 69 72 5f 63 68 69 6c 64 72 65 6e 3b 0a  = dir_children;.
4210: 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 70 61  ..}..}...free(pa
4220: 74 68 5f 73 29 3b 0a 0a 09 72 65 74 75 72 6e 28  th_s);...return(
4230: 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  0);.}..static in
4240: 74 20 61 70 70 66 73 5f 66 75 73 65 5f 72 65 61  t appfs_fuse_rea
4250: 64 6c 69 6e 6b 28 63 6f 6e 73 74 20 63 68 61 72  dlink(const char
4260: 20 2a 70 61 74 68 2c 20 63 68 61 72 20 2a 62 75   *path, char *bu
4270: 66 2c 20 73 69 7a 65 5f 74 20 73 69 7a 65 29 20  f, size_t size) 
4280: 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f  {..struct appfs_
4290: 70 61 74 68 69 6e 66 6f 20 70 61 74 68 69 6e 66  pathinfo pathinf
42a0: 6f 3b 0a 09 69 6e 74 20 72 65 73 20 3d 20 30 3b  o;..int res = 0;
42b0: 0a 0a 09 41 50 50 46 53 5f 44 45 42 55 47 28 22  ...APPFS_DEBUG("
42c0: 45 6e 74 65 72 20 28 70 61 74 68 20 3d 20 25 73  Enter (path = %s
42d0: 2c 20 2e 2e 2e 29 22 2c 20 70 61 74 68 29 3b 0a  , ...)", path);.
42e0: 0a 09 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 20  ..pathinfo.type 
42f0: 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  = APPFS_PATHTYPE
4300: 5f 49 4e 56 41 4c 49 44 3b 0a 0a 09 72 65 73 20  _INVALID;...res 
4310: 3d 20 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68  = appfs_get_path
4320: 5f 69 6e 66 6f 28 70 61 74 68 2c 20 26 70 61 74  _info(path, &pat
4330: 68 69 6e 66 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 69  hinfo, NULL);..i
4340: 66 20 28 72 65 73 20 21 3d 20 30 29 20 7b 0a 09  f (res != 0) {..
4350: 09 72 65 74 75 72 6e 28 72 65 73 29 3b 0a 09 7d  .return(res);..}
4360: 0a 0a 09 69 66 20 28 70 61 74 68 69 6e 66 6f 2e  ...if (pathinfo.
4370: 74 79 70 65 20 21 3d 20 41 50 50 46 53 5f 50 41  type != APPFS_PA
4380: 54 48 54 59 50 45 5f 53 59 4d 4c 49 4e 4b 29 20  THTYPE_SYMLINK) 
4390: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 49 4e 56  {...return(-EINV
43a0: 41 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 28 73  AL);..}...if ((s
43b0: 74 72 6c 65 6e 28 70 61 74 68 69 6e 66 6f 2e 74  trlen(pathinfo.t
43c0: 79 70 65 69 6e 66 6f 2e 73 79 6d 6c 69 6e 6b 2e  ypeinfo.symlink.
43d0: 73 6f 75 72 63 65 29 20 2b 20 31 29 20 3e 20 73  source) + 1) > s
43e0: 69 7a 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ize) {...return(
43f0: 2d 45 4e 41 4d 45 54 4f 4f 4c 4f 4e 47 29 3b 0a  -ENAMETOOLONG);.
4400: 09 7d 0a 0a 09 6d 65 6d 63 70 79 28 62 75 66 2c  .}...memcpy(buf,
4410: 20 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 69 6e   pathinfo.typein
4420: 66 6f 2e 73 79 6d 6c 69 6e 6b 2e 73 6f 75 72 63  fo.symlink.sourc
4430: 65 2c 20 73 74 72 6c 65 6e 28 70 61 74 68 69 6e  e, strlen(pathin
4440: 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 73 79 6d 6c  fo.typeinfo.syml
4450: 69 6e 6b 2e 73 6f 75 72 63 65 29 20 2b 20 31 29  ink.source) + 1)
4460: 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
4470: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70  ..static int app
4480: 66 73 5f 66 75 73 65 5f 67 65 74 61 74 74 72 28  fs_fuse_getattr(
4490: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
44a0: 2c 20 73 74 72 75 63 74 20 73 74 61 74 20 2a 73  , struct stat *s
44b0: 74 62 75 66 29 20 7b 0a 09 73 74 72 75 63 74 20  tbuf) {..struct 
44c0: 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20 70  appfs_pathinfo p
44d0: 61 74 68 69 6e 66 6f 3b 0a 09 69 6e 74 20 72 65  athinfo;..int re
44e0: 73 20 3d 20 30 3b 0a 0a 09 41 50 50 46 53 5f 44  s = 0;...APPFS_D
44f0: 45 42 55 47 28 22 45 6e 74 65 72 20 28 70 61 74  EBUG("Enter (pat
4500: 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c 20 70  h = %s, ...)", p
4510: 61 74 68 29 3b 0a 0a 09 70 61 74 68 69 6e 66 6f  ath);...pathinfo
4520: 2e 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41  .type = APPFS_PA
4530: 54 48 54 59 50 45 5f 49 4e 56 41 4c 49 44 3b 0a  THTYPE_INVALID;.
4540: 0a 09 72 65 73 20 3d 20 61 70 70 66 73 5f 67 65  ..res = appfs_ge
4550: 74 5f 70 61 74 68 5f 69 6e 66 6f 28 70 61 74 68  t_path_info(path
4560: 2c 20 26 70 61 74 68 69 6e 66 6f 2c 20 4e 55 4c  , &pathinfo, NUL
4570: 4c 29 3b 0a 09 69 66 20 28 72 65 73 20 21 3d 20  L);..if (res != 
4580: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 72 65  0) {...return(re
4590: 73 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  s);..}...memset(
45a0: 73 74 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66  stbuf, 0, sizeof
45b0: 28 73 74 72 75 63 74 20 73 74 61 74 29 29 3b 0a  (struct stat));.
45c0: 0a 09 73 74 62 75 66 2d 3e 73 74 5f 6d 74 69 6d  ..stbuf->st_mtim
45d0: 65 20 3d 20 70 61 74 68 69 6e 66 6f 2e 74 69 6d  e = pathinfo.tim
45e0: 65 3b 0a 09 73 74 62 75 66 2d 3e 73 74 5f 63 74  e;..stbuf->st_ct
45f0: 69 6d 65 20 3d 20 70 61 74 68 69 6e 66 6f 2e 74  ime = pathinfo.t
4600: 69 6d 65 3b 0a 09 73 74 62 75 66 2d 3e 73 74 5f  ime;..stbuf->st_
4610: 61 74 69 6d 65 20 3d 20 70 61 74 68 69 6e 66 6f  atime = pathinfo
4620: 2e 74 69 6d 65 3b 0a 0a 09 73 77 69 74 63 68 20  .time;...switch 
4630: 28 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 29 20  (pathinfo.type) 
4640: 7b 0a 09 09 63 61 73 65 20 41 50 50 46 53 5f 50  {...case APPFS_P
4650: 41 54 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52  ATHTYPE_DIRECTOR
4660: 59 3a 0a 09 09 09 73 74 62 75 66 2d 3e 73 74 5f  Y:....stbuf->st_
4670: 6d 6f 64 65 20 3d 20 53 5f 49 46 44 49 52 20 7c  mode = S_IFDIR |
4680: 20 30 35 35 35 3b 0a 09 09 09 73 74 62 75 66 2d   0555;....stbuf-
4690: 3e 73 74 5f 6e 6c 69 6e 6b 20 3d 20 32 20 2b 20  >st_nlink = 2 + 
46a0: 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 69 6e 66  pathinfo.typeinf
46b0: 6f 2e 64 69 72 2e 63 68 69 6c 64 63 6f 75 6e 74  o.dir.childcount
46c0: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
46d0: 73 65 20 41 50 50 46 53 5f 50 41 54 48 54 59 50  se APPFS_PATHTYP
46e0: 45 5f 46 49 4c 45 3a 0a 09 09 09 69 66 20 28 70  E_FILE:....if (p
46f0: 61 74 68 69 6e 66 6f 2e 74 79 70 65 69 6e 66 6f  athinfo.typeinfo
4700: 2e 66 69 6c 65 2e 65 78 65 63 75 74 61 62 6c 65  .file.executable
4710: 29 20 7b 0a 09 09 09 09 73 74 62 75 66 2d 3e 73  ) {.....stbuf->s
4720: 74 5f 6d 6f 64 65 20 3d 20 53 5f 49 46 52 45 47  t_mode = S_IFREG
4730: 20 7c 20 30 35 35 35 3b 0a 09 09 09 7d 20 65 6c   | 0555;....} el
4740: 73 65 20 7b 0a 09 09 09 09 73 74 62 75 66 2d 3e  se {.....stbuf->
4750: 73 74 5f 6d 6f 64 65 20 3d 20 53 5f 49 46 52 45  st_mode = S_IFRE
4760: 47 20 7c 20 30 34 34 34 3b 0a 09 09 09 7d 0a 0a  G | 0444;....}..
4770: 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 6e 6c 69  ...stbuf->st_nli
4780: 6e 6b 20 3d 20 31 3b 0a 09 09 09 73 74 62 75 66  nk = 1;....stbuf
4790: 2d 3e 73 74 5f 73 69 7a 65 20 3d 20 70 61 74 68  ->st_size = path
47a0: 69 6e 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 66 69  info.typeinfo.fi
47b0: 6c 65 2e 73 69 7a 65 3b 0a 09 09 09 62 72 65 61  le.size;....brea
47c0: 6b 3b 0a 09 09 63 61 73 65 20 41 50 50 46 53 5f  k;...case APPFS_
47d0: 50 41 54 48 54 59 50 45 5f 53 59 4d 4c 49 4e 4b  PATHTYPE_SYMLINK
47e0: 3a 0a 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 6d  :....stbuf->st_m
47f0: 6f 64 65 20 3d 20 53 5f 49 46 4c 4e 4b 20 7c 20  ode = S_IFLNK | 
4800: 30 35 35 35 3b 0a 09 09 09 73 74 62 75 66 2d 3e  0555;....stbuf->
4810: 73 74 5f 6e 6c 69 6e 6b 20 3d 20 31 3b 0a 09 09  st_nlink = 1;...
4820: 09 73 74 62 75 66 2d 3e 73 74 5f 73 69 7a 65 20  .stbuf->st_size 
4830: 3d 20 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 69  = pathinfo.typei
4840: 6e 66 6f 2e 73 79 6d 6c 69 6e 6b 2e 73 69 7a 65  nfo.symlink.size
4850: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
4860: 73 65 20 41 50 50 46 53 5f 50 41 54 48 54 59 50  se APPFS_PATHTYP
4870: 45 5f 49 4e 56 41 4c 49 44 3a 0a 09 09 09 72 65  E_INVALID:....re
4880: 73 20 3d 20 2d 45 49 4f 3b 0a 0a 09 09 09 62 72  s = -EIO;.....br
4890: 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  eak;..}...return
48a0: 20 72 65 73 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   res;.}..static 
48b0: 69 6e 74 20 61 70 70 66 73 5f 66 75 73 65 5f 72  int appfs_fuse_r
48c0: 65 61 64 64 69 72 28 63 6f 6e 73 74 20 63 68 61  eaddir(const cha
48d0: 72 20 2a 70 61 74 68 2c 20 76 6f 69 64 20 2a 62  r *path, void *b
48e0: 75 66 2c 20 66 75 73 65 5f 66 69 6c 6c 5f 64 69  uf, fuse_fill_di
48f0: 72 5f 74 20 66 69 6c 6c 65 72 2c 20 6f 66 66 5f  r_t filler, off_
4900: 74 20 6f 66 66 73 65 74 2c 20 73 74 72 75 63 74  t offset, struct
4910: 20 66 75 73 65 5f 66 69 6c 65 5f 69 6e 66 6f 20   fuse_file_info 
4920: 2a 66 69 29 20 7b 0a 09 73 74 72 75 63 74 20 61  *fi) {..struct a
4930: 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20 70 61  ppfs_pathinfo pa
4940: 74 68 69 6e 66 6f 3b 0a 09 73 74 72 75 63 74 20  thinfo;..struct 
4950: 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a  appfs_children *
4960: 63 68 69 6c 64 72 65 6e 2c 20 2a 63 68 69 6c 64  children, *child
4970: 3b 0a 09 69 6e 74 20 72 65 74 76 61 6c 3b 0a 0a  ;..int retval;..
4980: 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 45 6e  .APPFS_DEBUG("En
4990: 74 65 72 20 28 70 61 74 68 20 3d 20 25 73 2c 20  ter (path = %s, 
49a0: 2e 2e 2e 29 22 2c 20 70 61 74 68 29 3b 0a 0a 09  ...)", path);...
49b0: 72 65 74 76 61 6c 20 3d 20 61 70 70 66 73 5f 67  retval = appfs_g
49c0: 65 74 5f 70 61 74 68 5f 69 6e 66 6f 28 70 61 74  et_path_info(pat
49d0: 68 2c 20 26 70 61 74 68 69 6e 66 6f 2c 20 26 63  h, &pathinfo, &c
49e0: 68 69 6c 64 72 65 6e 29 3b 0a 09 69 66 20 28 72  hildren);..if (r
49f0: 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
4a00: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
4a10: 09 7d 0a 0a 09 66 69 6c 6c 65 72 28 62 75 66 2c  .}...filler(buf,
4a20: 20 22 2e 22 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a   ".", NULL, 0);.
4a30: 09 66 69 6c 6c 65 72 28 62 75 66 2c 20 22 2e 2e  .filler(buf, "..
4a40: 22 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 66  ", NULL, 0);...f
4a50: 6f 72 20 28 63 68 69 6c 64 20 3d 20 63 68 69 6c  or (child = chil
4a60: 64 72 65 6e 3b 20 63 68 69 6c 64 3b 20 63 68 69  dren; child; chi
4a70: 6c 64 20 3d 20 63 68 69 6c 64 2d 3e 5f 6e 65 78  ld = child->_nex
4a80: 74 29 20 7b 0a 09 09 66 69 6c 6c 65 72 28 62 75  t) {...filler(bu
4a90: 66 2c 20 63 68 69 6c 64 2d 3e 6e 61 6d 65 2c 20  f, child->name, 
4aa0: 4e 55 4c 4c 2c 20 30 29 3b 0a 09 7d 0a 0a 09 61  NULL, 0);..}...a
4ab0: 70 70 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f 63  ppfs_free_list_c
4ac0: 68 69 6c 64 72 65 6e 28 63 68 69 6c 64 72 65 6e  hildren(children
4ad0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
4ae0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  }..static int ap
4af0: 70 66 73 5f 66 75 73 65 5f 6f 70 65 6e 28 63 6f  pfs_fuse_open(co
4b00: 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
4b10: 73 74 72 75 63 74 20 66 75 73 65 5f 66 69 6c 65  struct fuse_file
4b20: 5f 69 6e 66 6f 20 2a 66 69 29 20 7b 0a 09 73 74  _info *fi) {..st
4b30: 72 75 63 74 20 61 70 70 66 73 5f 70 61 74 68 69  ruct appfs_pathi
4b40: 6e 66 6f 20 70 61 74 68 69 6e 66 6f 3b 0a 09 63  nfo pathinfo;..c
4b50: 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 61 6c 5f  onst char *real_
4b60: 70 61 74 68 3b 0a 09 69 6e 74 20 66 68 3b 0a 09  path;..int fh;..
4b70: 69 6e 74 20 67 70 69 5f 72 65 74 3b 0a 0a 09 41  int gpi_ret;...A
4b80: 50 50 46 53 5f 44 45 42 55 47 28 22 45 6e 74 65  PPFS_DEBUG("Ente
4b90: 72 20 28 70 61 74 68 20 3d 20 25 73 2c 20 2e 2e  r (path = %s, ..
4ba0: 2e 29 22 2c 20 70 61 74 68 29 3b 0a 0a 09 69 66  .)", path);...if
4bb0: 20 28 28 66 69 2d 3e 66 6c 61 67 73 20 26 20 33   ((fi->flags & 3
4bc0: 29 20 21 3d 20 4f 5f 52 44 4f 4e 4c 59 29 20 7b  ) != O_RDONLY) {
4bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4be0: 20 72 65 74 75 72 6e 28 2d 45 41 43 43 45 53 29   return(-EACCES)
4bf0: 3b 0a 09 7d 0a 0a 09 67 70 69 5f 72 65 74 20 3d  ;..}...gpi_ret =
4c00: 20 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f   appfs_get_path_
4c10: 69 6e 66 6f 28 70 61 74 68 2c 20 26 70 61 74 68  info(path, &path
4c20: 69 6e 66 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  info, NULL);..if
4c30: 20 28 67 70 69 5f 72 65 74 20 21 3d 20 30 29 20   (gpi_ret != 0) 
4c40: 7b 0a 09 09 72 65 74 75 72 6e 28 67 70 69 5f 72  {...return(gpi_r
4c50: 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 61  et);..}...if (pa
4c60: 74 68 69 6e 66 6f 2e 74 79 70 65 20 3d 3d 20 41  thinfo.type == A
4c70: 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f 44 49  PPFS_PATHTYPE_DI
4c80: 52 45 43 54 4f 52 59 29 20 7b 0a 09 09 72 65 74  RECTORY) {...ret
4c90: 75 72 6e 28 2d 45 49 53 44 49 52 29 3b 0a 09 7d  urn(-EISDIR);..}
4ca0: 0a 0a 09 72 65 61 6c 5f 70 61 74 68 20 3d 20 61  ...real_path = a
4cb0: 70 70 66 73 5f 67 65 74 66 69 6c 65 28 70 61 74  ppfs_getfile(pat
4cc0: 68 69 6e 66 6f 2e 68 6f 73 74 6e 61 6d 65 2c 20  hinfo.hostname, 
4cd0: 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 69 6e 66  pathinfo.typeinf
4ce0: 6f 2e 66 69 6c 65 2e 73 68 61 31 29 3b 0a 09 69  o.file.sha1);..i
4cf0: 66 20 28 72 65 61 6c 5f 70 61 74 68 20 3d 3d 20  f (real_path == 
4d00: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
4d10: 28 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 66 68 20  (-EIO);..}...fh 
4d20: 3d 20 6f 70 65 6e 28 72 65 61 6c 5f 70 61 74 68  = open(real_path
4d30: 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 66 72  , O_RDONLY);..fr
4d40: 65 65 28 28 76 6f 69 64 20 2a 29 20 72 65 61 6c  ee((void *) real
4d50: 5f 70 61 74 68 29 3b 0a 09 69 66 20 28 66 68 20  _path);..if (fh 
4d60: 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
4d70: 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 66 69 2d 3e  -EIO);..}...fi->
4d80: 66 68 20 3d 20 66 68 3b 0a 0a 09 72 65 74 75 72  fh = fh;...retur
4d90: 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(0);.}..static 
4da0: 69 6e 74 20 61 70 70 66 73 5f 66 75 73 65 5f 63  int appfs_fuse_c
4db0: 6c 6f 73 65 28 63 6f 6e 73 74 20 63 68 61 72 20  lose(const char 
4dc0: 2a 70 61 74 68 2c 20 73 74 72 75 63 74 20 66 75  *path, struct fu
4dd0: 73 65 5f 66 69 6c 65 5f 69 6e 66 6f 20 2a 66 69  se_file_info *fi
4de0: 29 20 7b 0a 09 69 6e 74 20 63 6c 6f 73 65 5f 72  ) {..int close_r
4df0: 65 74 3b 0a 0a 09 63 6c 6f 73 65 5f 72 65 74 20  et;...close_ret 
4e00: 3d 20 63 6c 6f 73 65 28 66 69 2d 3e 66 68 29 3b  = close(fi->fh);
4e10: 0a 09 69 66 20 28 63 6c 6f 73 65 5f 72 65 74 20  ..if (close_ret 
4e20: 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e  != 0) {...return
4e30: 28 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 72 65 74  (-EIO);..}...ret
4e40: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69  urn(0);.}..stati
4e50: 63 20 69 6e 74 20 61 70 70 66 73 5f 66 75 73 65  c int appfs_fuse
4e60: 5f 72 65 61 64 28 63 6f 6e 73 74 20 63 68 61 72  _read(const char
4e70: 20 2a 70 61 74 68 2c 20 63 68 61 72 20 2a 62 75   *path, char *bu
4e80: 66 2c 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  f, size_t size, 
4e90: 6f 66 66 5f 74 20 6f 66 66 73 65 74 2c 20 73 74  off_t offset, st
4ea0: 72 75 63 74 20 66 75 73 65 5f 66 69 6c 65 5f 69  ruct fuse_file_i
4eb0: 6e 66 6f 20 2a 66 69 29 20 7b 0a 09 6f 66 66 5f  nfo *fi) {..off_
4ec0: 74 20 6c 73 65 65 6b 5f 72 65 74 3b 0a 09 73 73  t lseek_ret;..ss
4ed0: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
4ee0: 0a 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 45  ..APPFS_DEBUG("E
4ef0: 6e 74 65 72 20 28 70 61 74 68 20 3d 20 25 73 2c  nter (path = %s,
4f00: 20 2e 2e 2e 29 22 2c 20 70 61 74 68 29 3b 0a 0a   ...)", path);..
4f10: 09 6c 73 65 65 6b 5f 72 65 74 20 3d 20 6c 73 65  .lseek_ret = lse
4f20: 65 6b 28 66 69 2d 3e 66 68 2c 20 6f 66 66 73 65  ek(fi->fh, offse
4f30: 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 09 69  t, SEEK_SET);..i
4f40: 66 20 28 6c 73 65 65 6b 5f 72 65 74 20 21 3d 20  f (lseek_ret != 
4f50: 6f 66 66 73 65 74 29 20 7b 0a 09 09 72 65 74 75  offset) {...retu
4f60: 72 6e 28 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 72  rn(-EIO);..}...r
4f70: 65 61 64 5f 72 65 74 20 3d 20 72 65 61 64 28 66  ead_ret = read(f
4f80: 69 2d 3e 66 68 2c 20 62 75 66 2c 20 73 69 7a 65  i->fh, buf, size
4f90: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 61 64  );...return(read
4fa0: 5f 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  _ret);.}..static
4fb0: 20 73 74 72 75 63 74 20 66 75 73 65 5f 6f 70 65   struct fuse_ope
4fc0: 72 61 74 69 6f 6e 73 20 61 70 70 66 73 5f 6f 70  rations appfs_op
4fd0: 65 72 20 3d 20 7b 0a 09 2e 67 65 74 61 74 74 72  er = {...getattr
4fe0: 20 20 20 3d 20 61 70 70 66 73 5f 66 75 73 65 5f     = appfs_fuse_
4ff0: 67 65 74 61 74 74 72 2c 0a 09 2e 72 65 61 64 64  getattr,...readd
5000: 69 72 20 20 20 3d 20 61 70 70 66 73 5f 66 75 73  ir   = appfs_fus
5010: 65 5f 72 65 61 64 64 69 72 2c 0a 09 2e 72 65 61  e_readdir,...rea
5020: 64 6c 69 6e 6b 20 20 3d 20 61 70 70 66 73 5f 66  dlink  = appfs_f
5030: 75 73 65 5f 72 65 61 64 6c 69 6e 6b 2c 0a 09 2e  use_readlink,...
5040: 6f 70 65 6e 20 20 20 20 20 20 3d 20 61 70 70 66  open      = appf
5050: 73 5f 66 75 73 65 5f 6f 70 65 6e 2c 0a 09 2e 72  s_fuse_open,...r
5060: 65 6c 65 61 73 65 20 20 20 3d 20 61 70 70 66 73  elease   = appfs
5070: 5f 66 75 73 65 5f 63 6c 6f 73 65 2c 0a 09 2e 72  _fuse_close,...r
5080: 65 61 64 20 20 20 20 20 20 3d 20 61 70 70 66 73  ead      = appfs
5090: 5f 66 75 73 65 5f 72 65 61 64 0a 7d 3b 0a 0a 69  _fuse_read.};..i
50a0: 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
50b0: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 20 7b  , char **argv) {
50c0: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 61  ..const char *ca
50d0: 63 68 65 64 69 72 20 3d 20 41 50 50 46 53 5f 43  chedir = APPFS_C
50e0: 41 43 48 45 44 49 52 3b 0a 09 63 68 61 72 20 64  ACHEDIR;..char d
50f0: 62 66 69 6c 65 6e 61 6d 65 5b 31 30 32 34 5d 3b  bfilename[1024];
5100: 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
5110: 74 2c 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 2c  t, snprintf_ret,
5120: 20 73 71 6c 69 74 65 5f 72 65 74 3b 0a 0a 09 67   sqlite_ret;...g
5130: 6c 6f 62 61 6c 54 68 72 65 61 64 2e 63 61 63 68  lobalThread.cach
5140: 65 64 69 72 20 3d 20 63 61 63 68 65 64 69 72 3b  edir = cachedir;
5150: 0a 09 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 62  ..globalThread.b
5160: 6f 6f 74 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e  oottime = time(N
5170: 55 4c 4c 29 3b 0a 09 67 6c 6f 62 61 6c 54 68 72  ULL);..globalThr
5180: 65 61 64 2e 70 6c 61 74 66 6f 72 6d 20 3d 20 22  ead.platform = "
5190: 6c 69 6e 75 78 2d 78 38 36 5f 36 34 22 3b 0a 0a  linux-x86_64";..
51a0: 09 70 74 68 72 65 61 64 5f 72 65 74 20 3d 20 70  .pthread_ret = p
51b0: 74 68 72 65 61 64 5f 6b 65 79 5f 63 72 65 61 74  thread_key_creat
51c0: 65 28 26 69 6e 74 65 72 70 4b 65 79 2c 20 4e 55  e(&interpKey, NU
51d0: 4c 4c 29 3b 0a 09 69 66 20 28 70 74 68 72 65 61  LL);..if (pthrea
51e0: 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  d_ret != 0) {...
51f0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
5200: 22 55 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74  "Unable to creat
5210: 65 20 54 53 44 20 6b 65 79 20 66 6f 72 20 54 63  e TSD key for Tc
5220: 6c 2e 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22  l.  Aborting.\n"
5230: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
5240: 0a 09 7d 0a 0a 09 73 6e 70 72 69 6e 74 66 5f 72  ..}...snprintf_r
5250: 65 74 20 3d 20 73 6e 70 72 69 6e 74 66 28 64 62  et = snprintf(db
5260: 66 69 6c 65 6e 61 6d 65 2c 20 73 69 7a 65 6f 66  filename, sizeof
5270: 28 64 62 66 69 6c 65 6e 61 6d 65 29 2c 20 22 25  (dbfilename), "%
5280: 73 2f 25 73 22 2c 20 63 61 63 68 65 64 69 72 2c  s/%s", cachedir,
5290: 20 22 63 61 63 68 65 2e 64 62 22 29 3b 0a 09 69   "cache.db");..i
52a0: 66 20 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20  f (snprintf_ret 
52b0: 3e 3d 20 73 69 7a 65 6f 66 28 64 62 66 69 6c 65  >= sizeof(dbfile
52c0: 6e 61 6d 65 29 29 20 7b 0a 09 09 66 70 72 69 6e  name)) {...fprin
52d0: 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62  tf(stderr, "Unab
52e0: 6c 65 20 74 6f 20 73 65 74 20 64 61 74 61 62 61  le to set databa
52f0: 73 65 20 66 69 6c 65 6e 61 6d 65 2e 20 20 41 62  se filename.  Ab
5300: 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 0a 09 09  orting.\n");....
5310: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
5320: 73 71 6c 69 74 65 5f 72 65 74 20 3d 20 73 71 6c  sqlite_ret = sql
5330: 69 74 65 33 5f 6f 70 65 6e 28 64 62 66 69 6c 65  ite3_open(dbfile
5340: 6e 61 6d 65 2c 20 26 67 6c 6f 62 61 6c 54 68 72  name, &globalThr
5350: 65 61 64 2e 64 62 29 3b 0a 09 69 66 20 28 73 71  ead.db);..if (sq
5360: 6c 69 74 65 5f 72 65 74 20 21 3d 20 53 51 4c 49  lite_ret != SQLI
5370: 54 45 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e  TE_OK) {...fprin
5380: 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62  tf(stderr, "Unab
5390: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
53a0: 61 73 65 3a 20 25 73 5c 6e 22 2c 20 64 62 66 69  ase: %s\n", dbfi
53b0: 6c 65 6e 61 6d 65 29 3b 0a 0a 09 09 72 65 74 75  lename);....retu
53c0: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  rn(1);..}...retu
53d0: 72 6e 28 66 75 73 65 5f 6d 61 69 6e 28 61 72 67  rn(fuse_main(arg
53e0: 63 2c 20 61 72 67 76 2c 20 26 61 70 70 66 73 5f  c, argv, &appfs_
53f0: 6f 70 65 72 2c 20 4e 55 4c 4c 29 29 3b 0a 7d 0a  oper, NULL));.}.
5400: 20 0a                                             .