Hex Artifact Content

Artifact fb14cea9355cc86bd304d04f19f34c38b68548a4:


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 71 6c 69 74 65 33 2e 68  clude <sqlite3.h
0030: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0040: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
0050: 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75  stdarg.h>.#inclu
0060: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0070: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
0080: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0090: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
00a0: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
00b0: 3c 66 75 73 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  <fuse.h>.#includ
00c0: 65 20 3c 74 63 6c 2e 68 3e 0a 0a 23 64 65 66 69  e <tcl.h>..#defi
00d0: 6e 65 20 41 50 50 46 53 5f 43 41 43 48 45 44 49  ne APPFS_CACHEDI
00e0: 52 20 22 2f 74 6d 70 2f 61 70 70 66 73 2d 63 61  R "/tmp/appfs-ca
00f0: 63 68 65 22 0a 0a 23 64 65 66 69 6e 65 20 41 50  che"..#define AP
0100: 50 46 53 5f 44 45 42 55 47 28 78 2e 2e 2e 29 20  PFS_DEBUG(x...) 
0110: 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  { fprintf(stderr
0120: 2c 20 22 5b 64 65 62 75 67 5d 20 25 73 3a 25 69  , "[debug] %s:%i
0130: 3a 25 73 3a 20 22 2c 20 5f 5f 46 49 4c 45 5f 5f  :%s: ", __FILE__
0140: 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 5f 5f 66 75  , __LINE__, __fu
0150: 6e 63 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28 73  nc__); fprintf(s
0160: 74 64 65 72 72 2c 20 78 29 3b 20 66 70 72 69 6e  tderr, x); fprin
0170: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29  tf(stderr, "\n")
0180: 3b 20 7d 0a 0a 73 74 72 75 63 74 20 61 70 70 66  ; }..struct appf
0190: 73 5f 74 68 72 65 61 64 5f 64 61 74 61 20 7b 0a  s_thread_data {.
01a0: 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  .Tcl_Interp *int
01b0: 65 72 70 3b 0a 09 73 71 6c 69 74 65 33 20 2a 64  erp;..sqlite3 *d
01c0: 62 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 61 70  b;.};..struct ap
01d0: 70 66 73 5f 74 68 72 65 61 64 5f 64 61 74 61 20  pfs_thread_data 
01e0: 67 6c 6f 62 61 6c 54 68 72 65 61 64 3b 0a 0a 74  globalThread;..t
01f0: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 41  ypedef enum {..A
0200: 50 50 46 53 5f 4f 53 5f 55 4e 4b 4e 4f 57 4e 2c  PPFS_OS_UNKNOWN,
0210: 0a 09 41 50 50 46 53 5f 4f 53 5f 41 4c 4c 2c 0a  ..APPFS_OS_ALL,.
0220: 09 41 50 50 46 53 5f 4f 53 5f 4c 49 4e 55 58 2c  .APPFS_OS_LINUX,
0230: 0a 09 41 50 50 46 53 5f 4f 53 5f 4d 41 43 4f 53  ..APPFS_OS_MACOS
0240: 58 2c 0a 09 41 50 50 46 53 5f 4f 53 5f 46 52 45  X,..APPFS_OS_FRE
0250: 45 42 53 44 2c 0a 09 41 50 50 46 53 5f 4f 53 5f  EBSD,..APPFS_OS_
0260: 4f 50 45 4e 42 53 44 2c 0a 09 41 50 50 46 53 5f  OPENBSD,..APPFS_
0270: 4f 53 5f 53 4f 4c 41 52 49 53 0a 7d 20 61 70 70  OS_SOLARIS.} app
0280: 66 73 5f 6f 73 5f 74 3b 0a 0a 74 79 70 65 64 65  fs_os_t;..typede
0290: 66 20 65 6e 75 6d 20 7b 0a 09 41 50 50 46 53 5f  f enum {..APPFS_
02a0: 43 50 55 5f 55 4e 4b 4e 4f 57 4e 2c 0a 09 41 50  CPU_UNKNOWN,..AP
02b0: 50 46 53 5f 43 50 55 5f 41 4c 4c 2c 0a 09 41 50  PFS_CPU_ALL,..AP
02c0: 50 46 53 5f 43 50 55 5f 41 4d 44 36 34 2c 0a 09  PFS_CPU_AMD64,..
02d0: 41 50 50 46 53 5f 43 50 55 5f 49 33 38 36 2c 0a  APPFS_CPU_I386,.
02e0: 09 41 50 50 46 53 5f 43 50 55 5f 41 52 4d 0a 7d  .APPFS_CPU_ARM.}
02f0: 20 61 70 70 66 73 5f 63 70 75 41 72 63 68 5f 74   appfs_cpuArch_t
0300: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
0310: 7b 0a 09 41 50 50 46 53 5f 50 41 54 48 54 59 50  {..APPFS_PATHTYP
0320: 45 5f 49 4e 56 41 4c 49 44 2c 0a 09 41 50 50 46  E_INVALID,..APPF
0330: 53 5f 50 41 54 48 54 59 50 45 5f 46 49 4c 45 2c  S_PATHTYPE_FILE,
0340: 0a 09 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  ..APPFS_PATHTYPE
0350: 5f 44 49 52 45 43 54 4f 52 59 2c 0a 09 41 50 50  _DIRECTORY,..APP
0360: 46 53 5f 50 41 54 48 54 59 50 45 5f 53 59 4d 4c  FS_PATHTYPE_SYML
0370: 49 4e 4b 0a 7d 20 61 70 70 66 73 5f 70 61 74 68  INK.} appfs_path
0380: 74 79 70 65 5f 74 3b 0a 0a 73 74 72 75 63 74 20  type_t;..struct 
0390: 61 70 70 66 73 5f 70 61 63 6b 61 67 65 20 7b 0a  appfs_package {.
03a0: 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 70 61  .struct appfs_pa
03b0: 63 6b 61 67 65 20 2a 5f 6e 65 78 74 3b 0a 09 69  ckage *_next;..i
03c0: 6e 74 20 63 6f 75 6e 74 65 72 3b 0a 0a 09 63 68  nt counter;...ch
03d0: 61 72 20 6e 61 6d 65 5b 32 35 36 5d 3b 0a 09 63  ar name[256];..c
03e0: 68 61 72 20 76 65 72 73 69 6f 6e 5b 36 34 5d 3b  har version[64];
03f0: 0a 09 63 68 61 72 20 73 68 61 31 5b 34 31 5d 3b  ..char sha1[41];
0400: 0a 09 61 70 70 66 73 5f 6f 73 5f 74 20 6f 73 3b  ..appfs_os_t os;
0410: 0a 09 61 70 70 66 73 5f 63 70 75 41 72 63 68 5f  ..appfs_cpuArch_
0420: 74 20 63 70 75 41 72 63 68 3b 0a 09 69 6e 74 20  t cpuArch;..int 
0430: 69 73 4c 61 74 65 73 74 3b 0a 7d 3b 0a 0a 73 74  isLatest;.};..st
0440: 72 75 63 74 20 61 70 70 66 73 5f 73 69 74 65 20  ruct appfs_site 
0450: 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f  {..struct appfs_
0460: 73 69 74 65 20 2a 5f 6e 65 78 74 3b 0a 09 69 6e  site *_next;..in
0470: 74 20 63 6f 75 6e 74 65 72 3b 0a 0a 09 63 68 61  t counter;...cha
0480: 72 20 6e 61 6d 65 5b 32 35 36 5d 3b 0a 7d 3b 0a  r name[256];.};.
0490: 0a 73 74 72 75 63 74 20 61 70 70 66 73 5f 63 68  .struct appfs_ch
04a0: 69 6c 64 72 65 6e 20 7b 0a 09 73 74 72 75 63 74  ildren {..struct
04b0: 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20   appfs_children 
04c0: 2a 5f 6e 65 78 74 3b 0a 09 69 6e 74 20 63 6f 75  *_next;..int cou
04d0: 6e 74 65 72 3b 0a 0a 09 63 68 61 72 20 6e 61 6d  nter;...char nam
04e0: 65 5b 32 35 36 5d 3b 0a 7d 3b 0a 0a 73 74 72 75  e[256];.};..stru
04f0: 63 74 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66  ct appfs_pathinf
0500: 6f 20 7b 0a 09 61 70 70 66 73 5f 70 61 74 68 74  o {..appfs_patht
0510: 79 70 65 5f 74 20 74 79 70 65 3b 0a 09 74 69 6d  ype_t type;..tim
0520: 65 5f 74 20 74 69 6d 65 3b 0a 09 75 6e 69 6f 6e  e_t time;..union
0530: 20 7b 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09   {...struct {...
0540: 09 69 6e 74 20 63 68 69 6c 64 63 6f 75 6e 74 3b  .int childcount;
0550: 0a 09 09 7d 20 64 69 72 3b 0a 09 09 73 74 72 75  ...} dir;...stru
0560: 63 74 20 7b 0a 09 09 09 69 6e 74 20 65 78 65 63  ct {....int exec
0570: 75 74 61 62 6c 65 3b 0a 09 09 09 6f 66 66 5f 74  utable;....off_t
0580: 20 73 69 7a 65 3b 0a 09 09 7d 20 66 69 6c 65 3b   size;...} file;
0590: 0a 09 7d 20 74 79 70 65 69 6e 66 6f 3b 0a 7d 3b  ..} typeinfo;.};
05a0: 0a 0a 73 74 61 74 69 63 20 61 70 70 66 73 5f 6f  ..static appfs_o
05b0: 73 5f 74 20 61 70 70 66 73 5f 63 6f 6e 76 65 72  s_t appfs_conver
05c0: 74 5f 6f 73 5f 66 72 6f 6d 53 74 72 69 6e 67 28  t_os_fromString(
05d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 73 29 20  const char *os) 
05e0: 7b 0a 09 69 66 20 28 73 74 72 63 61 73 65 63 6d  {..if (strcasecm
05f0: 70 28 6f 73 2c 20 22 4c 69 6e 75 78 22 29 20 3d  p(os, "Linux") =
0600: 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  = 0) {...return(
0610: 41 50 50 46 53 5f 4f 53 5f 4c 49 4e 55 58 29 3b  APPFS_OS_LINUX);
0620: 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72 63 61 73  ..}...if (strcas
0630: 65 63 6d 70 28 6f 73 2c 20 22 44 61 72 77 69 6e  ecmp(os, "Darwin
0640: 22 29 20 3d 3d 20 30 20 7c 7c 20 73 74 72 63 61  ") == 0 || strca
0650: 73 65 63 6d 70 28 6f 73 2c 20 22 4d 61 63 20 4f  secmp(os, "Mac O
0660: 53 22 29 20 3d 3d 20 30 20 7c 7c 20 73 74 72 63  S") == 0 || strc
0670: 61 73 65 63 6d 70 28 6f 73 2c 20 22 4d 61 63 20  asecmp(os, "Mac 
0680: 4f 53 20 58 22 29 20 3d 3d 20 30 29 20 7b 0a 09  OS X") == 0) {..
0690: 09 72 65 74 75 72 6e 28 41 50 50 46 53 5f 4f 53  .return(APPFS_OS
06a0: 5f 4d 41 43 4f 53 58 29 3b 0a 09 7d 0a 0a 09 69  _MACOSX);..}...i
06b0: 66 20 28 73 74 72 63 61 73 65 63 6d 70 28 6f 73  f (strcasecmp(os
06c0: 2c 20 22 6e 6f 61 72 63 68 22 29 20 3d 3d 20 30  , "noarch") == 0
06d0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 41 50 50  ) {...return(APP
06e0: 46 53 5f 4f 53 5f 41 4c 4c 29 3b 0a 09 7d 0a 0a  FS_OS_ALL);..}..
06f0: 09 72 65 74 75 72 6e 28 41 50 50 46 53 5f 4f 53  .return(APPFS_OS
0700: 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a 7d 0a 0a 73 74  _UNKNOWN);.}..st
0710: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0720: 2a 61 70 70 66 73 5f 63 6f 6e 76 65 72 74 5f 6f  *appfs_convert_o
0730: 73 5f 74 6f 53 74 72 69 6e 67 28 61 70 70 66 73  s_toString(appfs
0740: 5f 6f 73 5f 74 20 6f 73 29 20 7b 0a 09 73 77 69  _os_t os) {..swi
0750: 74 63 68 20 28 6f 73 29 20 7b 0a 09 09 63 61 73  tch (os) {...cas
0760: 65 20 41 50 50 46 53 5f 4f 53 5f 41 4c 4c 3a 0a  e APPFS_OS_ALL:.
0770: 09 09 09 72 65 74 75 72 6e 28 22 6e 6f 61 72 63  ...return("noarc
0780: 68 22 29 3b 0a 09 09 63 61 73 65 20 41 50 50 46  h");...case APPF
0790: 53 5f 4f 53 5f 4c 49 4e 55 58 3a 0a 09 09 09 72  S_OS_LINUX:....r
07a0: 65 74 75 72 6e 28 22 6c 69 6e 75 78 22 29 3b 0a  eturn("linux");.
07b0: 09 09 63 61 73 65 20 41 50 50 46 53 5f 4f 53 5f  ..case APPFS_OS_
07c0: 4d 41 43 4f 53 58 3a 0a 09 09 09 72 65 74 75 72  MACOSX:....retur
07d0: 6e 28 22 6d 61 63 6f 73 78 22 29 3b 0a 09 09 63  n("macosx");...c
07e0: 61 73 65 20 41 50 50 46 53 5f 4f 53 5f 46 52 45  ase APPFS_OS_FRE
07f0: 45 42 53 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  EBSD:....return(
0800: 22 66 72 65 65 62 73 64 22 29 3b 0a 09 09 63 61  "freebsd");...ca
0810: 73 65 20 41 50 50 46 53 5f 4f 53 5f 4f 50 45 4e  se APPFS_OS_OPEN
0820: 42 53 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BSD:....return("
0830: 6f 70 65 6e 62 73 64 22 29 3b 0a 09 09 63 61 73  openbsd");...cas
0840: 65 20 41 50 50 46 53 5f 4f 53 5f 53 4f 4c 41 52  e APPFS_OS_SOLAR
0850: 49 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 66  IS:....return("f
0860: 72 65 65 62 73 64 22 29 3b 0a 09 09 63 61 73 65  reebsd");...case
0870: 20 41 50 50 46 53 5f 43 50 55 5f 55 4e 4b 4e 4f   APPFS_CPU_UNKNO
0880: 57 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 75  WN:....return("u
0890: 6e 6b 6e 6f 77 6e 22 29 3b 0a 09 7d 0a 0a 09 72  nknown");..}...r
08a0: 65 74 75 72 6e 28 22 75 6e 6b 6e 6f 77 6e 22 29  eturn("unknown")
08b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 61 70 70 66  ;.}..static appf
08c0: 73 5f 63 70 75 41 72 63 68 5f 74 20 61 70 70 66  s_cpuArch_t appf
08d0: 73 5f 63 6f 6e 76 65 72 74 5f 63 70 75 41 72 63  s_convert_cpuArc
08e0: 68 5f 66 72 6f 6d 53 74 72 69 6e 67 28 63 6f 6e  h_fromString(con
08f0: 73 74 20 63 68 61 72 20 2a 63 70 75 29 20 7b 0a  st char *cpu) {.
0900: 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 28  .if (strcasecmp(
0910: 63 70 75 2c 20 22 61 6d 64 36 34 22 29 20 3d 3d  cpu, "amd64") ==
0920: 20 30 20 7c 7c 20 73 74 72 63 61 73 65 63 6d 70   0 || strcasecmp
0930: 28 63 70 75 2c 20 22 78 38 36 5f 36 34 22 29 20  (cpu, "x86_64") 
0940: 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e  == 0) {...return
0950: 28 41 50 50 46 53 5f 43 50 55 5f 41 4d 44 36 34  (APPFS_CPU_AMD64
0960: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72 63  );..}...if (strc
0970: 61 73 65 63 6d 70 28 63 70 75 2c 20 22 69 33 38  asecmp(cpu, "i38
0980: 36 22 29 20 3d 3d 20 30 20 7c 7c 20 5c 0a 09 20  6") == 0 || \.. 
0990: 20 20 20 73 74 72 63 61 73 65 63 6d 70 28 63 70     strcasecmp(cp
09a0: 75 2c 20 22 69 34 38 36 22 29 20 3d 3d 20 30 20  u, "i486") == 0 
09b0: 7c 7c 20 5c 0a 09 20 20 20 20 73 74 72 63 61 73  || \..    strcas
09c0: 65 63 6d 70 28 63 70 75 2c 20 22 69 35 38 36 22  ecmp(cpu, "i586"
09d0: 29 20 3d 3d 20 30 20 7c 7c 20 5c 0a 09 20 20 20  ) == 0 || \..   
09e0: 20 73 74 72 63 61 73 65 63 6d 70 28 63 70 75 2c   strcasecmp(cpu,
09f0: 20 22 69 36 38 36 22 29 20 3d 3d 20 30 20 7c 7c   "i686") == 0 ||
0a00: 20 5c 0a 09 20 20 20 20 73 74 72 63 61 73 65 63   \..    strcasec
0a10: 6d 70 28 63 70 75 2c 20 22 69 78 38 36 22 29 20  mp(cpu, "ix86") 
0a20: 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e  == 0) {...return
0a30: 28 41 50 50 46 53 5f 43 50 55 5f 49 33 38 36 29  (APPFS_CPU_I386)
0a40: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72 63 61  ;..}...if (strca
0a50: 73 65 63 6d 70 28 63 70 75 2c 20 22 61 72 6d 22  secmp(cpu, "arm"
0a60: 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  ) == 0) {...retu
0a70: 72 6e 28 41 50 50 46 53 5f 43 50 55 5f 41 52 4d  rn(APPFS_CPU_ARM
0a80: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72 63  );..}...if (strc
0a90: 61 73 65 63 6d 70 28 63 70 75 2c 20 22 6e 6f 61  asecmp(cpu, "noa
0aa0: 72 63 68 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09  rch") == 0) {...
0ab0: 72 65 74 75 72 6e 28 41 50 50 46 53 5f 43 50 55  return(APPFS_CPU
0ac0: 5f 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  _ALL);..}...retu
0ad0: 72 6e 28 41 50 50 46 53 5f 43 50 55 5f 55 4e 4b  rn(APPFS_CPU_UNK
0ae0: 4e 4f 57 4e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  NOWN);.}..static
0af0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 70 70   const char *app
0b00: 66 73 5f 63 6f 6e 76 65 72 74 5f 63 70 75 41 72  fs_convert_cpuAr
0b10: 63 68 5f 74 6f 53 74 72 69 6e 67 28 61 70 70 66  ch_toString(appf
0b20: 73 5f 63 70 75 41 72 63 68 5f 74 20 63 70 75 29  s_cpuArch_t cpu)
0b30: 20 7b 0a 09 73 77 69 74 63 68 20 28 63 70 75 29   {..switch (cpu)
0b40: 20 7b 0a 09 09 63 61 73 65 20 41 50 50 46 53 5f   {...case APPFS_
0b50: 43 50 55 5f 41 4c 4c 3a 0a 09 09 09 72 65 74 75  CPU_ALL:....retu
0b60: 72 6e 28 22 6e 6f 61 72 63 68 22 29 3b 0a 09 09  rn("noarch");...
0b70: 63 61 73 65 20 41 50 50 46 53 5f 43 50 55 5f 41  case APPFS_CPU_A
0b80: 4d 44 36 34 3a 0a 09 09 09 72 65 74 75 72 6e 28  MD64:....return(
0b90: 22 61 6d 64 36 34 22 29 3b 0a 09 09 63 61 73 65  "amd64");...case
0ba0: 20 41 50 50 46 53 5f 43 50 55 5f 49 33 38 36 3a   APPFS_CPU_I386:
0bb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 69 78 38 36  ....return("ix86
0bc0: 22 29 3b 0a 09 09 63 61 73 65 20 41 50 50 46 53  ");...case APPFS
0bd0: 5f 43 50 55 5f 41 52 4d 3a 0a 09 09 09 72 65 74  _CPU_ARM:....ret
0be0: 75 72 6e 28 22 61 72 6d 22 29 3b 0a 09 09 63 61  urn("arm");...ca
0bf0: 73 65 20 41 50 50 46 53 5f 43 50 55 5f 55 4e 4b  se APPFS_CPU_UNK
0c00: 4e 4f 57 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  NOWN:....return(
0c10: 22 75 6e 6b 6e 6f 77 6e 22 29 3b 0a 09 7d 0a 0a  "unknown");..}..
0c20: 09 72 65 74 75 72 6e 28 22 75 6e 6b 6e 6f 77 6e  .return("unknown
0c30: 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ");.}..static in
0c40: 74 20 61 70 70 66 73 5f 54 63 6c 5f 45 76 61 6c  t appfs_Tcl_Eval
0c50: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
0c60: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 63  erp, int objc, c
0c70: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6d 64 2c 20  onst char *cmd, 
0c80: 2e 2e 2e 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20  ...) {..Tcl_Obj 
0c90: 2a 2a 6f 62 6a 76 3b 0a 09 63 6f 6e 73 74 20 63  **objv;..const c
0ca0: 68 61 72 20 2a 61 72 67 3b 0a 09 76 61 5f 6c 69  har *arg;..va_li
0cb0: 73 74 20 61 72 67 70 3b 0a 09 69 6e 74 20 72 65  st argp;..int re
0cc0: 74 76 61 6c 3b 0a 09 69 6e 74 20 69 3b 0a 0a 09  tval;..int i;...
0cd0: 6f 62 6a 76 20 3d 20 28 76 6f 69 64 20 2a 29 20  objv = (void *) 
0ce0: 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  ckalloc(sizeof(*
0cf0: 6f 62 6a 76 29 20 2a 20 6f 62 6a 63 29 3b 0a 09  objv) * objc);..
0d00: 6f 62 6a 76 5b 30 5d 20 3d 20 54 63 6c 5f 4e 65  objv[0] = Tcl_Ne
0d10: 77 53 74 72 69 6e 67 4f 62 6a 28 63 6d 64 2c 20  wStringObj(cmd, 
0d20: 2d 31 29 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65  -1);..Tcl_IncrRe
0d30: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 30 5d 29 3b  fCount(objv[0]);
0d40: 0a 0a 09 76 61 5f 73 74 61 72 74 28 61 72 67 70  ...va_start(argp
0d50: 2c 20 63 6d 64 29 3b 0a 09 66 6f 72 20 28 69 20  , cmd);..for (i 
0d60: 3d 20 31 3b 20 69 20 3c 20 6f 62 6a 63 3b 20 69  = 1; i < objc; i
0d70: 2b 2b 29 20 7b 0a 09 09 61 72 67 20 3d 20 76 61  ++) {...arg = va
0d80: 5f 61 72 67 28 61 72 67 70 2c 20 63 6f 6e 73 74  _arg(argp, const
0d90: 20 63 68 61 72 20 2a 29 3b 0a 09 09 6f 62 6a 76   char *);...objv
0da0: 5b 69 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  [i] = Tcl_NewStr
0db0: 69 6e 67 4f 62 6a 28 61 72 67 2c 20 2d 31 29 3b  ingObj(arg, -1);
0dc0: 0a 09 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  ...Tcl_IncrRefCo
0dd0: 75 6e 74 28 6f 62 6a 76 5b 69 5d 29 3b 0a 09 7d  unt(objv[i]);..}
0de0: 0a 09 76 61 5f 65 6e 64 28 61 72 67 70 29 3b 0a  ..va_end(argp);.
0df0: 0a 09 72 65 74 76 61 6c 20 3d 20 54 63 6c 5f 45  ..retval = Tcl_E
0e00: 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20  valObjv(interp, 
0e10: 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 30 29 3b 0a  objc, objv, 0);.
0e20: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
0e30: 3c 20 6f 62 6a 63 3b 20 69 2b 2b 29 20 7b 0a 09  < objc; i++) {..
0e40: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
0e50: 74 28 6f 62 6a 76 5b 69 5d 29 3b 0a 09 7d 0a 0a  t(objv[i]);..}..
0e60: 09 63 6b 66 72 65 65 28 28 76 6f 69 64 20 2a 29  .ckfree((void *)
0e70: 20 6f 62 6a 76 29 3b 0a 0a 09 72 65 74 75 72 6e   objv);...return
0e80: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
0e90: 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f 75 70  tic int appfs_up
0ea0: 64 61 74 65 5f 69 6e 64 65 78 28 63 6f 6e 73 74  date_index(const
0eb0: 20 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 29   char *hostname)
0ec0: 20 7b 0a 09 69 6e 74 20 74 63 6c 5f 72 65 74 3b   {..int tcl_ret;
0ed0: 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20 61 70 70  ...tcl_ret = app
0ee0: 66 73 5f 54 63 6c 5f 45 76 61 6c 28 67 6c 6f 62  fs_Tcl_Eval(glob
0ef0: 61 6c 54 68 72 65 61 64 2e 69 6e 74 65 72 70 2c  alThread.interp,
0f00: 20 32 2c 20 22 3a 3a 61 70 70 66 73 3a 3a 67 65   2, "::appfs::ge
0f10: 74 69 6e 64 65 78 22 2c 20 68 6f 73 74 6e 61 6d  tindex", hostnam
0f20: 65 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74  e);..if (tcl_ret
0f30: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
0f40: 41 50 50 46 53 5f 44 45 42 55 47 28 22 43 61 6c  APPFS_DEBUG("Cal
0f50: 6c 20 74 6f 20 3a 3a 61 70 70 66 73 3a 3a 67 65  l to ::appfs::ge
0f60: 74 69 6e 64 65 78 20 66 61 69 6c 65 64 3a 20 25  tindex failed: %
0f70: 73 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s", Tcl_GetStrin
0f80: 67 52 65 73 75 6c 74 28 67 6c 6f 62 61 6c 54 68  gResult(globalTh
0f90: 72 65 61 64 2e 69 6e 74 65 72 70 29 29 3b 0a 0a  read.interp));..
0fa0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
0fb0: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
0fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
0fd0: 73 5f 67 65 74 66 69 6c 65 28 63 6f 6e 73 74 20  s_getfile(const 
0fe0: 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20  char *hostname, 
0ff0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 68 61 31  const char *sha1
1000: 29 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  ) {..return(0);.
1010: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  }..static int ap
1020: 70 66 73 5f 75 70 64 61 74 65 5f 6d 61 6e 69 66  pfs_update_manif
1030: 65 73 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  est(const char *
1040: 68 6f 73 74 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  hostname, const 
1050: 63 68 61 72 20 2a 73 68 61 31 29 20 7b 0a 09 69  char *sha1) {..i
1060: 6e 74 20 74 63 6c 5f 72 65 74 3b 0a 0a 09 74 63  nt tcl_ret;...tc
1070: 6c 5f 72 65 74 20 3d 20 61 70 70 66 73 5f 54 63  l_ret = appfs_Tc
1080: 6c 5f 45 76 61 6c 28 67 6c 6f 62 61 6c 54 68 72  l_Eval(globalThr
1090: 65 61 64 2e 69 6e 74 65 72 70 2c 20 33 2c 20 22  ead.interp, 3, "
10a0: 3a 3a 61 70 70 66 73 3a 3a 67 65 74 70 6b 67 6d  ::appfs::getpkgm
10b0: 61 6e 69 66 65 73 74 22 2c 20 68 6f 73 74 6e 61  anifest", hostna
10c0: 6d 65 2c 20 73 68 61 31 29 3b 0a 09 69 66 20 28  me, sha1);..if (
10d0: 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f  tcl_ret != TCL_O
10e0: 4b 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42  K) {...APPFS_DEB
10f0: 55 47 28 22 43 61 6c 6c 20 74 6f 20 3a 3a 61 70  UG("Call to ::ap
1100: 70 66 73 3a 3a 67 65 74 70 6b 67 6d 61 6e 69 66  pfs::getpkgmanif
1110: 65 73 74 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  est failed: %s",
1120: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
1130: 73 75 6c 74 28 67 6c 6f 62 61 6c 54 68 72 65 61  sult(globalThrea
1140: 64 2e 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09 72  d.interp));....r
1150: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
1160: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 0a 23  return(0);.}...#
1170: 64 65 66 69 6e 65 20 61 70 70 66 73 5f 66 72 65  define appfs_fre
1180: 65 5f 6c 69 73 74 5f 74 79 70 65 28 69 64 2c 20  e_list_type(id, 
1190: 74 79 70 65 29 20 73 74 61 74 69 63 20 76 6f 69  type) static voi
11a0: 64 20 61 70 70 66 73 5f 66 72 65 65 5f 6c 69 73  d appfs_free_lis
11b0: 74 5f 20 23 23 20 69 64 28 74 79 70 65 20 2a 68  t_ ## id(type *h
11c0: 65 61 64 29 20 7b 20 5c 0a 09 74 79 70 65 20 2a  ead) { \..type *
11d0: 6f 62 6a 2c 20 2a 6e 65 78 74 3b 20 5c 0a 09 66  obj, *next; \..f
11e0: 6f 72 20 28 6f 62 6a 20 3d 20 68 65 61 64 3b 20  or (obj = head; 
11f0: 6f 62 6a 3b 20 6f 62 6a 20 3d 20 6e 65 78 74 29  obj; obj = next)
1200: 20 7b 20 5c 0a 09 09 6e 65 78 74 20 3d 20 6f 62   { \...next = ob
1210: 6a 2d 3e 5f 6e 65 78 74 3b 20 5c 0a 09 09 63 6b  j->_next; \...ck
1220: 66 72 65 65 28 28 76 6f 69 64 20 2a 29 20 6f 62  free((void *) ob
1230: 6a 29 3b 20 5c 0a 09 7d 20 5c 0a 7d 0a 0a 61 70  j); \..} \.}..ap
1240: 70 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f 74 79  pfs_free_list_ty
1250: 70 65 28 73 69 74 65 2c 20 73 74 72 75 63 74 20  pe(site, struct 
1260: 61 70 70 66 73 5f 73 69 74 65 29 0a 61 70 70 66  appfs_site).appf
1270: 73 5f 66 72 65 65 5f 6c 69 73 74 5f 74 79 70 65  s_free_list_type
1280: 28 70 61 63 6b 61 67 65 2c 20 73 74 72 75 63 74  (package, struct
1290: 20 61 70 70 66 73 5f 70 61 63 6b 61 67 65 29 0a   appfs_package).
12a0: 61 70 70 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f  appfs_free_list_
12b0: 74 79 70 65 28 63 68 69 6c 64 72 65 6e 2c 20 73  type(children, s
12c0: 74 72 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c  truct appfs_chil
12d0: 64 72 65 6e 29 0a 0a 73 74 61 74 69 63 20 69 6e  dren)..static in
12e0: 74 20 61 70 70 66 73 5f 67 65 74 73 69 74 65 73  t appfs_getsites
12f0: 5f 63 62 28 76 6f 69 64 20 2a 5f 68 65 61 64 2c  _cb(void *_head,
1300: 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 68   int columns, ch
1310: 61 72 20 2a 2a 76 61 6c 75 65 73 2c 20 63 68 61  ar **values, cha
1320: 72 20 2a 2a 6e 61 6d 65 73 29 20 7b 0a 09 73 74  r **names) {..st
1330: 72 75 63 74 20 61 70 70 66 73 5f 73 69 74 65 20  ruct appfs_site 
1340: 2a 2a 68 65 61 64 5f 70 2c 20 2a 6f 62 6a 3b 0a  **head_p, *obj;.
1350: 0a 09 68 65 61 64 5f 70 20 3d 20 5f 68 65 61 64  ..head_p = _head
1360: 3b 0a 0a 09 6f 62 6a 20 3d 20 28 76 6f 69 64 20  ;...obj = (void 
1370: 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f  *) ckalloc(sizeo
1380: 66 28 2a 6f 62 6a 29 29 3b 0a 09 73 6e 70 72 69  f(*obj));..snpri
1390: 6e 74 66 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 73  ntf(obj->name, s
13a0: 69 7a 65 6f 66 28 6f 62 6a 2d 3e 6e 61 6d 65 29  izeof(obj->name)
13b0: 2c 20 22 25 73 22 2c 20 76 61 6c 75 65 73 5b 30  , "%s", values[0
13c0: 5d 29 3b 0a 0a 09 69 66 20 28 2a 68 65 61 64 5f  ]);...if (*head_
13d0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6f  p == NULL) {...o
13e0: 62 6a 2d 3e 63 6f 75 6e 74 65 72 20 3d 20 30 3b  bj->counter = 0;
13f0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6f 62 6a  ..} else {...obj
1400: 2d 3e 63 6f 75 6e 74 65 72 20 3d 20 28 2a 68 65  ->counter = (*he
1410: 61 64 5f 70 29 2d 3e 63 6f 75 6e 74 65 72 20 2b  ad_p)->counter +
1420: 20 31 3b 0a 09 7d 0a 0a 09 6f 62 6a 2d 3e 5f 6e   1;..}...obj->_n
1430: 65 78 74 20 3d 20 2a 68 65 61 64 5f 70 3b 0a 09  ext = *head_p;..
1440: 2a 68 65 61 64 5f 70 20 3d 20 6f 62 6a 3b 0a 0a  *head_p = obj;..
1450: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73  .return(0);.}..s
1460: 74 61 74 69 63 20 73 74 72 75 63 74 20 61 70 70  tatic struct app
1470: 66 73 5f 73 69 74 65 20 2a 61 70 70 66 73 5f 67  fs_site *appfs_g
1480: 65 74 73 69 74 65 73 28 69 6e 74 20 2a 73 69 74  etsites(int *sit
1490: 65 5f 63 6f 75 6e 74 5f 70 29 20 7b 0a 09 73 74  e_count_p) {..st
14a0: 72 75 63 74 20 61 70 70 66 73 5f 73 69 74 65 20  ruct appfs_site 
14b0: 2a 68 65 61 64 20 3d 20 4e 55 4c 4c 3b 0a 09 69  *head = NULL;..i
14c0: 6e 74 20 73 71 6c 69 74 65 5f 72 65 74 3b 0a 0a  nt sqlite_ret;..
14d0: 09 69 66 20 28 73 69 74 65 5f 63 6f 75 6e 74 5f  .if (site_count_
14e0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  p == NULL) {...r
14f0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
1500: 0a 09 73 71 6c 69 74 65 5f 72 65 74 20 3d 20 73  ..sqlite_ret = s
1510: 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62  qlite3_exec(glob
1520: 61 6c 54 68 72 65 61 64 2e 64 62 2c 20 22 53 45  alThread.db, "SE
1530: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 68 6f  LECT DISTINCT ho
1540: 73 74 6e 61 6d 65 20 46 52 4f 4d 20 70 61 63 6b  stname FROM pack
1550: 61 67 65 73 3b 22 2c 20 61 70 70 66 73 5f 67 65  ages;", appfs_ge
1560: 74 73 69 74 65 73 5f 63 62 2c 20 26 68 65 61 64  tsites_cb, &head
1570: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 71  , NULL);..if (sq
1580: 6c 69 74 65 5f 72 65 74 20 21 3d 20 53 51 4c 49  lite_ret != SQLI
1590: 54 45 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46 53  TE_OK) {...APPFS
15a0: 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20  _DEBUG("Call to 
15b0: 73 71 6c 69 74 65 33 5f 65 78 65 63 20 66 61 69  sqlite3_exec fai
15c0: 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
15d0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
15e0: 20 28 68 65 61 64 20 21 3d 20 4e 55 4c 4c 29 20   (head != NULL) 
15f0: 7b 0a 09 09 2a 73 69 74 65 5f 63 6f 75 6e 74 5f  {...*site_count_
1600: 70 20 3d 20 68 65 61 64 2d 3e 63 6f 75 6e 74 65  p = head->counte
1610: 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09 72 65 74 75  r + 1;..}...retu
1620: 72 6e 28 68 65 61 64 29 3b 0a 7d 0a 0a 73 74 61  rn(head);.}..sta
1630: 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f 67 65  tic int appfs_ge
1640: 74 69 6e 64 65 78 5f 63 62 28 76 6f 69 64 20 2a  tindex_cb(void *
1650: 5f 68 65 61 64 2c 20 69 6e 74 20 63 6f 6c 75 6d  _head, int colum
1660: 6e 73 2c 20 63 68 61 72 20 2a 2a 76 61 6c 75 65  ns, char **value
1670: 73 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 73 29  s, char **names)
1680: 20 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73   {..struct appfs
1690: 5f 70 61 63 6b 61 67 65 20 2a 2a 68 65 61 64 5f  _package **head_
16a0: 70 2c 20 2a 6f 62 6a 3b 0a 0a 09 68 65 61 64 5f  p, *obj;...head_
16b0: 70 20 3d 20 5f 68 65 61 64 3b 0a 0a 09 6f 62 6a  p = _head;...obj
16c0: 20 3d 20 28 76 6f 69 64 20 2a 29 20 63 6b 61 6c   = (void *) ckal
16d0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6f 62 6a 29  loc(sizeof(*obj)
16e0: 29 3b 0a 0a 09 73 6e 70 72 69 6e 74 66 28 6f 62  );...snprintf(ob
16f0: 6a 2d 3e 6e 61 6d 65 2c 20 73 69 7a 65 6f 66 28  j->name, sizeof(
1700: 6f 62 6a 2d 3e 6e 61 6d 65 29 2c 20 22 25 73 22  obj->name), "%s"
1710: 2c 20 76 61 6c 75 65 73 5b 30 5d 29 3b 0a 09 73  , values[0]);..s
1720: 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 76 65 72  nprintf(obj->ver
1730: 73 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6f 62 6a  sion, sizeof(obj
1740: 2d 3e 76 65 72 73 69 6f 6e 29 2c 20 22 25 73 22  ->version), "%s"
1750: 2c 20 76 61 6c 75 65 73 5b 31 5d 29 3b 0a 09 73  , values[1]);..s
1760: 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 73 68 61  nprintf(obj->sha
1770: 31 2c 20 73 69 7a 65 6f 66 28 6f 62 6a 2d 3e 73  1, sizeof(obj->s
1780: 68 61 31 29 2c 20 22 25 73 22 2c 20 76 61 6c 75  ha1), "%s", valu
1790: 65 73 5b 32 5d 29 3b 0a 09 6f 62 6a 2d 3e 6f 73  es[2]);..obj->os
17a0: 20 3d 20 61 70 70 66 73 5f 63 6f 6e 76 65 72 74   = appfs_convert
17b0: 5f 6f 73 5f 66 72 6f 6d 53 74 72 69 6e 67 28 76  _os_fromString(v
17c0: 61 6c 75 65 73 5b 33 5d 29 3b 0a 09 6f 62 6a 2d  alues[3]);..obj-
17d0: 3e 63 70 75 41 72 63 68 20 3d 20 61 70 70 66 73  >cpuArch = appfs
17e0: 5f 63 6f 6e 76 65 72 74 5f 63 70 75 41 72 63 68  _convert_cpuArch
17f0: 5f 66 72 6f 6d 53 74 72 69 6e 67 28 76 61 6c 75  _fromString(valu
1800: 65 73 5b 34 5d 29 3b 0a 09 69 66 20 28 76 61 6c  es[4]);..if (val
1810: 75 65 73 5b 35 5d 5b 30 5d 20 3d 3d 20 27 31 27  ues[5][0] == '1'
1820: 29 20 7b 0a 09 09 6f 62 6a 2d 3e 69 73 4c 61 74  ) {...obj->isLat
1830: 65 73 74 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65  est = 1;..} else
1840: 20 7b 0a 09 09 6f 62 6a 2d 3e 69 73 4c 61 74 65   {...obj->isLate
1850: 73 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  st = 0;..}...if 
1860: 28 2a 68 65 61 64 5f 70 20 3d 3d 20 4e 55 4c 4c  (*head_p == NULL
1870: 29 20 7b 0a 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74  ) {...obj->count
1880: 65 72 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  er = 0;..} else 
1890: 7b 0a 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74 65 72  {...obj->counter
18a0: 20 3d 20 28 2a 68 65 61 64 5f 70 29 2d 3e 63 6f   = (*head_p)->co
18b0: 75 6e 74 65 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09  unter + 1;..}...
18c0: 6f 62 6a 2d 3e 5f 6e 65 78 74 20 3d 20 2a 68 65  obj->_next = *he
18d0: 61 64 5f 70 3b 0a 09 2a 68 65 61 64 5f 70 20 3d  ad_p;..*head_p =
18e0: 20 6f 62 6a 3b 0a 0a 09 72 65 74 75 72 6e 28 30   obj;...return(0
18f0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72  );.}..static str
1900: 75 63 74 20 61 70 70 66 73 5f 70 61 63 6b 61 67  uct appfs_packag
1910: 65 20 2a 61 70 70 66 73 5f 67 65 74 69 6e 64 65  e *appfs_getinde
1920: 78 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f  x(const char *ho
1930: 73 74 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 61 63  stname, int *pac
1940: 6b 61 67 65 5f 63 6f 75 6e 74 5f 70 29 20 7b 0a  kage_count_p) {.
1950: 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 70 61  .struct appfs_pa
1960: 63 6b 61 67 65 20 2a 68 65 61 64 20 3d 20 4e 55  ckage *head = NU
1970: 4c 4c 3b 0a 09 63 68 61 72 20 2a 73 71 6c 3b 0a  LL;..char *sql;.
1980: 09 69 6e 74 20 69 6e 64 65 78 5f 72 65 74 2c 20  .int index_ret, 
1990: 73 71 6c 69 74 65 5f 72 65 74 3b 0a 0a 09 69 66  sqlite_ret;...if
19a0: 20 28 70 61 63 6b 61 67 65 5f 63 6f 75 6e 74 5f   (package_count_
19b0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  p == NULL) {...r
19c0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
19d0: 0a 09 69 6e 64 65 78 5f 72 65 74 20 3d 20 61 70  ..index_ret = ap
19e0: 70 66 73 5f 75 70 64 61 74 65 5f 69 6e 64 65 78  pfs_update_index
19f0: 28 68 6f 73 74 6e 61 6d 65 29 3b 0a 09 69 66 20  (hostname);..if 
1a00: 28 69 6e 64 65 78 5f 72 65 74 20 21 3d 20 30 29  (index_ret != 0)
1a10: 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c   {...return(NULL
1a20: 29 3b 0a 09 7d 0a 0a 09 73 71 6c 20 3d 20 73 71  );..}...sql = sq
1a30: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1a40: 45 4c 45 43 54 20 70 61 63 6b 61 67 65 2c 20 76  ELECT package, v
1a50: 65 72 73 69 6f 6e 2c 20 73 68 61 31 2c 20 6f 73  ersion, sha1, os
1a60: 2c 20 63 70 75 41 72 63 68 2c 20 69 73 4c 61 74  , cpuArch, isLat
1a70: 65 73 74 20 46 52 4f 4d 20 70 61 63 6b 61 67 65  est FROM package
1a80: 73 20 57 48 45 52 45 20 68 6f 73 74 6e 61 6d 65  s WHERE hostname
1a90: 20 3d 20 25 51 3b 22 2c 20 68 6f 73 74 6e 61 6d   = %Q;", hostnam
1aa0: 65 29 3b 0a 09 69 66 20 28 73 71 6c 20 3d 3d 20  e);..if (sql == 
1ab0: 4e 55 4c 4c 29 20 7b 0a 09 09 41 50 50 46 53 5f  NULL) {...APPFS_
1ac0: 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20 73  DEBUG("Call to s
1ad0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 66  qlite3_mprintf f
1ae0: 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1af0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
1b00: 73 71 6c 69 74 65 5f 72 65 74 20 3d 20 73 71 6c  sqlite_ret = sql
1b10: 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c  ite3_exec(global
1b20: 54 68 72 65 61 64 2e 64 62 2c 20 73 71 6c 2c 20  Thread.db, sql, 
1b30: 61 70 70 66 73 5f 67 65 74 69 6e 64 65 78 5f 63  appfs_getindex_c
1b40: 62 2c 20 26 68 65 61 64 2c 20 4e 55 4c 4c 29 3b  b, &head, NULL);
1b50: 0a 09 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73  ..sqlite3_free(s
1b60: 71 6c 29 3b 0a 0a 09 69 66 20 28 73 71 6c 69 74  ql);...if (sqlit
1b70: 65 5f 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f  e_ret != SQLITE_
1b80: 4f 4b 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45  OK) {...APPFS_DE
1b90: 42 55 47 28 22 43 61 6c 6c 20 74 6f 20 73 71 6c  BUG("Call to sql
1ba0: 69 74 65 33 5f 65 78 65 63 20 66 61 69 6c 65 64  ite3_exec failed
1bb0: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  .");....return(N
1bc0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ULL);..}...if (h
1bd0: 65 61 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ead != NULL) {..
1be0: 09 2a 70 61 63 6b 61 67 65 5f 63 6f 75 6e 74 5f  .*package_count_
1bf0: 70 20 3d 20 68 65 61 64 2d 3e 63 6f 75 6e 74 65  p = head->counte
1c00: 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09 72 65 74 75  r + 1;..}...retu
1c10: 72 6e 28 68 65 61 64 29 3b 0a 7d 0a 0a 73 74 61  rn(head);.}..sta
1c20: 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f 67 65  tic int appfs_ge
1c30: 74 63 68 69 6c 64 72 65 6e 5f 63 62 28 76 6f 69  tchildren_cb(voi
1c40: 64 20 2a 5f 68 65 61 64 2c 20 69 6e 74 20 63 6f  d *_head, int co
1c50: 6c 75 6d 6e 73 2c 20 63 68 61 72 20 2a 2a 76 61  lumns, char **va
1c60: 6c 75 65 73 2c 20 63 68 61 72 20 2a 2a 6e 61 6d  lues, char **nam
1c70: 65 73 29 20 7b 0a 09 73 74 72 75 63 74 20 61 70  es) {..struct ap
1c80: 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a 2a 68  pfs_children **h
1c90: 65 61 64 5f 70 2c 20 2a 6f 62 6a 3b 0a 0a 09 68  ead_p, *obj;...h
1ca0: 65 61 64 5f 70 20 3d 20 5f 68 65 61 64 3b 0a 0a  ead_p = _head;..
1cb0: 09 6f 62 6a 20 3d 20 28 76 6f 69 64 20 2a 29 20  .obj = (void *) 
1cc0: 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  ckalloc(sizeof(*
1cd0: 6f 62 6a 29 29 3b 0a 0a 09 73 6e 70 72 69 6e 74  obj));...snprint
1ce0: 66 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 73 69 7a  f(obj->name, siz
1cf0: 65 6f 66 28 6f 62 6a 2d 3e 6e 61 6d 65 29 2c 20  eof(obj->name), 
1d00: 22 25 73 22 2c 20 76 61 6c 75 65 73 5b 30 5d 29  "%s", values[0])
1d10: 3b 0a 0a 09 69 66 20 28 2a 68 65 61 64 5f 70 20  ;...if (*head_p 
1d20: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6f 62 6a  == NULL) {...obj
1d30: 2d 3e 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 09  ->counter = 0;..
1d40: 7d 20 65 6c 73 65 20 7b 0a 09 09 6f 62 6a 2d 3e  } else {...obj->
1d50: 63 6f 75 6e 74 65 72 20 3d 20 28 2a 68 65 61 64  counter = (*head
1d60: 5f 70 29 2d 3e 63 6f 75 6e 74 65 72 20 2b 20 31  _p)->counter + 1
1d70: 3b 0a 09 7d 0a 0a 09 6f 62 6a 2d 3e 5f 6e 65 78  ;..}...obj->_nex
1d80: 74 20 3d 20 2a 68 65 61 64 5f 70 3b 0a 09 2a 68  t = *head_p;..*h
1d90: 65 61 64 5f 70 20 3d 20 6f 62 6a 3b 0a 0a 09 72  ead_p = obj;...r
1da0: 65 74 75 72 6e 28 30 29 3b 0a 09 0a 7d 0a 0a 73  eturn(0);...}..s
1db0: 74 61 74 69 63 20 73 74 72 75 63 74 20 61 70 70  tatic struct app
1dc0: 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a 61 70 70  fs_children *app
1dd0: 66 73 5f 67 65 74 63 68 69 6c 64 72 65 6e 28 63  fs_getchildren(c
1de0: 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f 73 74 6e  onst char *hostn
1df0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1e00: 2a 70 61 63 6b 61 67 65 5f 68 61 73 68 2c 20 63  *package_hash, c
1e10: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
1e20: 20 69 6e 74 20 2a 63 68 69 6c 64 72 65 6e 5f 63   int *children_c
1e30: 6f 75 6e 74 5f 70 29 20 7b 0a 09 73 74 72 75 63  ount_p) {..struc
1e40: 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e  t appfs_children
1e50: 20 2a 68 65 61 64 20 3d 20 4e 55 4c 4c 3b 0a 09   *head = NULL;..
1e60: 63 68 61 72 20 2a 73 71 6c 3b 0a 09 69 6e 74 20  char *sql;..int 
1e70: 69 6e 64 65 78 5f 72 65 74 2c 20 73 71 6c 69 74  index_ret, sqlit
1e80: 65 5f 72 65 74 2c 20 6d 61 6e 69 66 65 73 74 5f  e_ret, manifest_
1e90: 72 65 74 3b 0a 0a 09 69 66 20 28 63 68 69 6c 64  ret;...if (child
1ea0: 72 65 6e 5f 63 6f 75 6e 74 5f 70 20 3d 3d 20 4e  ren_count_p == N
1eb0: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
1ec0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 6e 64 65  NULL);..}...inde
1ed0: 78 5f 72 65 74 20 3d 20 61 70 70 66 73 5f 75 70  x_ret = appfs_up
1ee0: 64 61 74 65 5f 69 6e 64 65 78 28 68 6f 73 74 6e  date_index(hostn
1ef0: 61 6d 65 29 3b 0a 09 69 66 20 28 69 6e 64 65 78  ame);..if (index
1f00: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72  _ret != 0) {...r
1f10: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
1f20: 0a 09 6d 61 6e 69 66 65 73 74 5f 72 65 74 20 3d  ..manifest_ret =
1f30: 20 61 70 70 66 73 5f 75 70 64 61 74 65 5f 6d 61   appfs_update_ma
1f40: 6e 69 66 65 73 74 28 68 6f 73 74 6e 61 6d 65 2c  nifest(hostname,
1f50: 20 70 61 63 6b 61 67 65 5f 68 61 73 68 29 3b 0a   package_hash);.
1f60: 09 69 66 20 28 6d 61 6e 69 66 65 73 74 5f 72 65  .if (manifest_re
1f70: 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  t != 0) {...retu
1f80: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 73  rn(NULL);..}...s
1f90: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1fa0: 69 6e 74 66 28 22 53 45 4c 45 43 54 20 66 69 6c  intf("SELECT fil
1fb0: 65 5f 6e 61 6d 65 20 46 52 4f 4d 20 66 69 6c 65  e_name FROM file
1fc0: 73 20 57 48 45 52 45 20 70 61 63 6b 61 67 65 5f  s WHERE package_
1fd0: 73 68 61 31 20 3d 20 25 51 20 41 4e 44 20 66 69  sha1 = %Q AND fi
1fe0: 6c 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 25  le_directory = %
1ff0: 51 3b 22 2c 20 70 61 63 6b 61 67 65 5f 68 61 73  Q;", package_has
2000: 68 2c 20 70 61 74 68 29 3b 0a 09 69 66 20 28 73  h, path);..if (s
2010: 71 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ql == NULL) {...
2020: 41 50 50 46 53 5f 44 45 42 55 47 28 22 43 61 6c  APPFS_DEBUG("Cal
2030: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d 70 72  l to sqlite3_mpr
2040: 69 6e 74 66 20 66 61 69 6c 65 64 2e 22 29 3b 0a  intf failed.");.
2050: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
2060: 0a 09 7d 0a 0a 09 41 50 50 46 53 5f 44 45 42 55  ..}...APPFS_DEBU
2070: 47 28 22 53 51 4c 3a 20 25 73 22 2c 20 73 71 6c  G("SQL: %s", sql
2080: 29 3b 0a 09 73 71 6c 69 74 65 5f 72 65 74 20 3d  );..sqlite_ret =
2090: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c   sqlite3_exec(gl
20a0: 6f 62 61 6c 54 68 72 65 61 64 2e 64 62 2c 20 73  obalThread.db, s
20b0: 71 6c 2c 20 61 70 70 66 73 5f 67 65 74 63 68 69  ql, appfs_getchi
20c0: 6c 64 72 65 6e 5f 63 62 2c 20 26 68 65 61 64 2c  ldren_cb, &head,
20d0: 20 4e 55 4c 4c 29 3b 0a 09 73 71 6c 69 74 65 33   NULL);..sqlite3
20e0: 5f 66 72 65 65 28 73 71 6c 29 3b 0a 0a 09 69 66  _free(sql);...if
20f0: 20 28 73 71 6c 69 74 65 5f 72 65 74 20 21 3d 20   (sqlite_ret != 
2100: 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 09 09 41  SQLITE_OK) {...A
2110: 50 50 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c  PPFS_DEBUG("Call
2120: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
2130: 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2140: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
2150: 0a 09 69 66 20 28 68 65 61 64 20 21 3d 20 4e 55  ..if (head != NU
2160: 4c 4c 29 20 7b 0a 09 09 2a 63 68 69 6c 64 72 65  LL) {...*childre
2170: 6e 5f 63 6f 75 6e 74 5f 70 20 3d 20 68 65 61 64  n_count_p = head
2180: 2d 3e 63 6f 75 6e 74 65 72 20 2b 20 31 3b 0a 09  ->counter + 1;..
2190: 7d 0a 0a 09 72 65 74 75 72 6e 28 68 65 61 64 29  }...return(head)
21a0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
21b0: 61 70 70 66 73 5f 6c 6f 6f 6b 75 70 5f 70 61 63  appfs_lookup_pac
21c0: 6b 61 67 65 5f 68 61 73 68 5f 63 62 28 76 6f 69  kage_hash_cb(voi
21d0: 64 20 2a 5f 72 65 74 76 61 6c 2c 20 69 6e 74 20  d *_retval, int 
21e0: 63 6f 6c 75 6d 6e 73 2c 20 63 68 61 72 20 2a 2a  columns, char **
21f0: 76 61 6c 75 65 73 2c 20 63 68 61 72 20 2a 2a 6e  values, char **n
2200: 61 6d 65 73 29 20 7b 0a 09 63 68 61 72 20 2a 2a  ames) {..char **
2210: 72 65 74 76 61 6c 20 3d 20 5f 72 65 74 76 61 6c  retval = _retval
2220: 3b 0a 0a 09 2a 72 65 74 76 61 6c 20 3d 20 73 74  ;...*retval = st
2230: 72 64 75 70 28 76 61 6c 75 65 73 5b 30 5d 29 3b  rdup(values[0]);
2240: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
2250: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 70  .static char *ap
2260: 70 66 73 5f 6c 6f 6f 6b 75 70 5f 70 61 63 6b 61  pfs_lookup_packa
2270: 67 65 5f 68 61 73 68 28 63 6f 6e 73 74 20 63 68  ge_hash(const ch
2280: 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 63 6f  ar *hostname, co
2290: 6e 73 74 20 63 68 61 72 20 2a 70 61 63 6b 61 67  nst char *packag
22a0: 65 2c 20 61 70 70 66 73 5f 6f 73 5f 74 20 6f 73  e, appfs_os_t os
22b0: 2c 20 61 70 70 66 73 5f 63 70 75 41 72 63 68 5f  , appfs_cpuArch_
22c0: 74 20 63 70 75 41 72 63 68 2c 20 63 6f 6e 73 74  t cpuArch, const
22d0: 20 63 68 61 72 20 2a 76 65 72 73 69 6f 6e 29 20   char *version) 
22e0: 7b 0a 09 63 68 61 72 20 2a 73 71 6c 3b 0a 09 63  {..char *sql;..c
22f0: 68 61 72 20 2a 72 65 74 76 61 6c 20 3d 20 4e 55  har *retval = NU
2300: 4c 4c 3b 0a 09 69 6e 74 20 69 6e 64 65 78 5f 72  LL;..int index_r
2310: 65 74 2c 20 73 71 6c 69 74 65 5f 72 65 74 3b 0a  et, sqlite_ret;.
2320: 0a 09 69 6e 64 65 78 5f 72 65 74 20 3d 20 61 70  ..index_ret = ap
2330: 70 66 73 5f 75 70 64 61 74 65 5f 69 6e 64 65 78  pfs_update_index
2340: 28 68 6f 73 74 6e 61 6d 65 29 3b 0a 09 69 66 20  (hostname);..if 
2350: 28 69 6e 64 65 78 5f 72 65 74 20 21 3d 20 30 29  (index_ret != 0)
2360: 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c   {...return(NULL
2370: 29 3b 0a 09 7d 0a 0a 09 73 71 6c 20 3d 20 73 71  );..}...sql = sq
2380: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
2390: 45 4c 45 43 54 20 73 68 61 31 20 46 52 4f 4d 20  ELECT sha1 FROM 
23a0: 70 61 63 6b 61 67 65 73 20 57 48 45 52 45 20 68  packages WHERE h
23b0: 6f 73 74 6e 61 6d 65 20 3d 20 25 51 20 41 4e 44  ostname = %Q AND
23c0: 20 70 61 63 6b 61 67 65 20 3d 20 25 51 20 41 4e   package = %Q AN
23d0: 44 20 6f 73 20 3d 20 25 51 20 41 4e 44 20 63 70  D os = %Q AND cp
23e0: 75 41 72 63 68 20 3d 20 25 51 20 41 4e 44 20 76  uArch = %Q AND v
23f0: 65 72 73 69 6f 6e 20 3d 20 25 51 3b 22 2c 0a 09  ersion = %Q;",..
2400: 09 68 6f 73 74 6e 61 6d 65 2c 0a 09 09 70 61 63  .hostname,...pac
2410: 6b 61 67 65 2c 0a 09 09 61 70 70 66 73 5f 63 6f  kage,...appfs_co
2420: 6e 76 65 72 74 5f 6f 73 5f 74 6f 53 74 72 69 6e  nvert_os_toStrin
2430: 67 28 6f 73 29 2c 0a 09 09 61 70 70 66 73 5f 63  g(os),...appfs_c
2440: 6f 6e 76 65 72 74 5f 63 70 75 41 72 63 68 5f 74  onvert_cpuArch_t
2450: 6f 53 74 72 69 6e 67 28 63 70 75 41 72 63 68 29  oString(cpuArch)
2460: 2c 0a 09 09 76 65 72 73 69 6f 6e 0a 09 29 3b 0a  ,...version..);.
2470: 09 69 66 20 28 73 71 6c 20 3d 3d 20 4e 55 4c 4c  .if (sql == NULL
2480: 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42 55  ) {...APPFS_DEBU
2490: 47 28 22 43 61 6c 6c 20 74 6f 20 73 71 6c 69 74  G("Call to sqlit
24a0: 65 33 5f 6d 70 72 69 6e 74 66 20 66 61 69 6c 65  e3_mprintf faile
24b0: 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24c0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 41 50 50 46  NULL);..}...APPF
24d0: 53 5f 44 45 42 55 47 28 22 53 51 4c 3a 20 25 73  S_DEBUG("SQL: %s
24e0: 22 2c 20 73 71 6c 29 3b 0a 09 73 71 6c 69 74 65  ", sql);..sqlite
24f0: 5f 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65  _ret = sqlite3_e
2500: 78 65 63 28 67 6c 6f 62 61 6c 54 68 72 65 61 64  xec(globalThread
2510: 2e 64 62 2c 20 73 71 6c 2c 20 61 70 70 66 73 5f  .db, sql, appfs_
2520: 6c 6f 6f 6b 75 70 5f 70 61 63 6b 61 67 65 5f 68  lookup_package_h
2530: 61 73 68 5f 63 62 2c 20 26 72 65 74 76 61 6c 2c  ash_cb, &retval,
2540: 20 4e 55 4c 4c 29 3b 0a 09 73 71 6c 69 74 65 33   NULL);..sqlite3
2550: 5f 66 72 65 65 28 73 71 6c 29 3b 0a 0a 09 69 66  _free(sql);...if
2560: 20 28 73 71 6c 69 74 65 5f 72 65 74 20 21 3d 20   (sqlite_ret != 
2570: 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 09 09 41  SQLITE_OK) {...A
2580: 50 50 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c  PPFS_DEBUG("Call
2590: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
25a0: 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
25b0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
25c0: 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
25d0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
25e0: 61 70 70 66 73 5f 67 65 74 66 69 6c 65 69 6e 66  appfs_getfileinf
25f0: 6f 5f 63 62 28 76 6f 69 64 20 2a 5f 70 61 74 68  o_cb(void *_path
2600: 69 6e 66 6f 2c 20 69 6e 74 20 63 6f 6c 75 6d 6e  info, int column
2610: 73 2c 20 63 68 61 72 20 2a 2a 76 61 6c 75 65 73  s, char **values
2620: 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 73 29 20  , char **names) 
2630: 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f  {..struct appfs_
2640: 70 61 74 68 69 6e 66 6f 20 2a 70 61 74 68 69 6e  pathinfo *pathin
2650: 66 6f 20 3d 20 5f 70 61 74 68 69 6e 66 6f 3b 0a  fo = _pathinfo;.
2660: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 79 70  .const char *typ
2670: 65 2c 20 2a 74 69 6d 65 2c 20 2a 73 6f 75 72 63  e, *time, *sourc
2680: 65 2c 20 2a 73 69 7a 65 3b 0a 0a 09 74 79 70 65  e, *size;...type
2690: 20 3d 20 76 61 6c 75 65 73 5b 30 5d 3b 0a 09 74   = values[0];..t
26a0: 69 6d 65 20 3d 20 76 61 6c 75 65 73 5b 31 5d 3b  ime = values[1];
26b0: 0a 09 73 6f 75 72 63 65 20 3d 20 76 61 6c 75 65  ..source = value
26c0: 73 5b 32 5d 3b 0a 09 73 69 7a 65 20 3d 20 76 61  s[2];..size = va
26d0: 6c 75 65 73 5b 33 5d 3b 0a 0a 09 70 61 74 68 69  lues[3];...pathi
26e0: 6e 66 6f 2d 3e 74 69 6d 65 20 3d 20 73 74 72 74  nfo->time = strt
26f0: 6f 75 6c 6c 28 74 69 6d 65 2c 20 4e 55 4c 4c 2c  oull(time, NULL,
2700: 20 31 30 29 3b 0a 0a 09 69 66 20 28 73 74 72 63   10);...if (strc
2710: 6d 70 28 74 79 70 65 2c 20 22 66 69 6c 65 22 29  mp(type, "file")
2720: 20 3d 3d 20 30 29 20 7b 0a 09 09 70 61 74 68 69   == 0) {...pathi
2730: 6e 66 6f 2d 3e 74 79 70 65 20 3d 20 41 50 50 46  nfo->type = APPF
2740: 53 5f 50 41 54 48 54 59 50 45 5f 46 49 4c 45 3b  S_PATHTYPE_FILE;
2750: 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70  ...pathinfo->typ
2760: 65 69 6e 66 6f 2e 66 69 6c 65 2e 65 78 65 63 75  einfo.file.execu
2770: 74 61 62 6c 65 20 3d 20 30 3b 0a 09 09 70 61 74  table = 0;...pat
2780: 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e  hinfo->typeinfo.
2790: 66 69 6c 65 2e 73 69 7a 65 20 3d 20 73 74 72 74  file.size = strt
27a0: 6f 75 6c 6c 28 73 69 7a 65 2c 20 4e 55 4c 4c 2c  oull(size, NULL,
27b0: 20 31 30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28   10);....return(
27c0: 30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72  0);..}...if (str
27d0: 63 6d 70 28 74 79 70 65 2c 20 22 64 69 72 65 63  cmp(type, "direc
27e0: 74 6f 72 79 22 29 20 3d 3d 20 30 29 20 7b 0a 09  tory") == 0) {..
27f0: 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 20  .pathinfo->type 
2800: 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  = APPFS_PATHTYPE
2810: 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09 09 70 61  _DIRECTORY;...pa
2820: 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f  thinfo->typeinfo
2830: 2e 64 69 72 2e 63 68 69 6c 64 63 6f 75 6e 74 20  .dir.childcount 
2840: 3d 20 30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 30  = 0;....return(0
2850: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30  );..}...return(0
2860: 29 3b 0a 0a 09 2f 2a 20 55 6e 74 69 6c 20 74 68  );.../* Until th
2870: 69 73 20 69 73 20 75 73 65 64 2c 20 70 72 65 76  is is used, prev
2880: 65 6e 74 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ent the compiler
2890: 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e   from complainin
28a0: 67 20 2a 2f 0a 09 73 6f 75 72 63 65 20 3d 20 73  g */..source = s
28b0: 6f 75 72 63 65 3b 0a 7d 0a 0a 73 74 61 74 69 63  ource;.}..static
28c0: 20 69 6e 74 20 61 70 70 66 73 5f 67 65 74 66 69   int appfs_getfi
28d0: 6c 65 69 6e 66 6f 28 63 6f 6e 73 74 20 63 68 61  leinfo(const cha
28e0: 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 63 6f 6e  r *hostname, con
28f0: 73 74 20 63 68 61 72 20 2a 70 61 63 6b 61 67 65  st char *package
2900: 5f 68 61 73 68 2c 20 63 6f 6e 73 74 20 63 68 61  _hash, const cha
2910: 72 20 2a 5f 70 61 74 68 2c 20 73 74 72 75 63 74  r *_path, struct
2920: 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20   appfs_pathinfo 
2930: 2a 70 61 74 68 69 6e 66 6f 29 20 7b 0a 09 63 68  *pathinfo) {..ch
2940: 61 72 20 2a 64 69 72 65 63 74 6f 72 79 2c 20 2a  ar *directory, *
2950: 66 69 6c 65 2c 20 2a 70 61 74 68 3b 0a 09 63 68  file, *path;..ch
2960: 61 72 20 2a 73 71 6c 3b 0a 09 69 6e 74 20 69 6e  ar *sql;..int in
2970: 64 65 78 5f 72 65 74 2c 20 73 71 6c 69 74 65 5f  dex_ret, sqlite_
2980: 72 65 74 2c 20 6d 61 6e 69 66 65 73 74 5f 72 65  ret, manifest_re
2990: 74 3b 0a 0a 09 69 66 20 28 70 61 74 68 69 6e 66  t;...if (pathinf
29a0: 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  o == NULL) {...r
29b0: 65 74 75 72 6e 28 2d 45 49 4f 29 3b 0a 09 7d 0a  eturn(-EIO);..}.
29c0: 0a 09 69 6e 64 65 78 5f 72 65 74 20 3d 20 61 70  ..index_ret = ap
29d0: 70 66 73 5f 75 70 64 61 74 65 5f 69 6e 64 65 78  pfs_update_index
29e0: 28 68 6f 73 74 6e 61 6d 65 29 3b 0a 09 69 66 20  (hostname);..if 
29f0: 28 69 6e 64 65 78 5f 72 65 74 20 21 3d 20 30 29  (index_ret != 0)
2a00: 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 49 4f   {...return(-EIO
2a10: 29 3b 0a 09 7d 0a 0a 09 6d 61 6e 69 66 65 73 74  );..}...manifest
2a20: 5f 72 65 74 20 3d 20 61 70 70 66 73 5f 75 70 64  _ret = appfs_upd
2a30: 61 74 65 5f 6d 61 6e 69 66 65 73 74 28 68 6f 73  ate_manifest(hos
2a40: 74 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65 5f 68  tname, package_h
2a50: 61 73 68 29 3b 0a 09 69 66 20 28 6d 61 6e 69 66  ash);..if (manif
2a60: 65 73 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  est_ret != 0) {.
2a70: 09 09 72 65 74 75 72 6e 28 2d 45 49 4f 29 3b 0a  ..return(-EIO);.
2a80: 09 7d 0a 0a 09 70 61 74 68 20 3d 20 73 74 72 64  .}...path = strd
2a90: 75 70 28 5f 70 61 74 68 29 3b 0a 09 64 69 72 65  up(_path);..dire
2aa0: 63 74 6f 72 79 20 3d 20 70 61 74 68 3b 0a 09 66  ctory = path;..f
2ab0: 69 6c 65 20 3d 20 73 74 72 72 63 68 72 28 70 61  ile = strrchr(pa
2ac0: 74 68 2c 20 27 2f 27 29 3b 0a 09 69 66 20 28 66  th, '/');..if (f
2ad0: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
2ae0: 09 66 69 6c 65 20 3d 20 70 61 74 68 3b 0a 09 09  .file = path;...
2af0: 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22 3b 0a  directory = "";.
2b00: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2a 66 69 6c  .} else {...*fil
2b10: 65 20 3d 20 27 5c 30 27 3b 0a 09 09 66 69 6c 65  e = '\0';...file
2b20: 2b 2b 3b 0a 09 7d 0a 0a 09 73 71 6c 20 3d 20 73  ++;..}...sql = s
2b30: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2b40: 53 45 4c 45 43 54 20 74 79 70 65 2c 20 74 69 6d  SELECT type, tim
2b50: 65 2c 20 73 6f 75 72 63 65 2c 20 73 69 7a 65 20  e, source, size 
2b60: 46 52 4f 4d 20 66 69 6c 65 73 20 57 48 45 52 45  FROM files WHERE
2b70: 20 70 61 63 6b 61 67 65 5f 73 68 61 31 20 3d 20   package_sha1 = 
2b80: 25 51 20 41 4e 44 20 66 69 6c 65 5f 64 69 72 65  %Q AND file_dire
2b90: 63 74 6f 72 79 20 3d 20 25 51 20 41 4e 44 20 66  ctory = %Q AND f
2ba0: 69 6c 65 5f 6e 61 6d 65 20 3d 20 25 51 3b 22 2c  ile_name = %Q;",
2bb0: 20 70 61 63 6b 61 67 65 5f 68 61 73 68 2c 20 64   package_hash, d
2bc0: 69 72 65 63 74 6f 72 79 2c 20 66 69 6c 65 29 3b  irectory, file);
2bd0: 0a 09 69 66 20 28 73 71 6c 20 3d 3d 20 4e 55 4c  ..if (sql == NUL
2be0: 4c 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42  L) {...APPFS_DEB
2bf0: 55 47 28 22 43 61 6c 6c 20 74 6f 20 73 71 6c 69  UG("Call to sqli
2c00: 74 65 33 5f 6d 70 72 69 6e 74 66 20 66 61 69 6c  te3_mprintf fail
2c10: 65 64 2e 22 29 3b 0a 0a 09 09 66 72 65 65 28 70  ed.");....free(p
2c20: 61 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ath);....return(
2c30: 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 66 72 65 65  -EIO);..}...free
2c40: 28 70 61 74 68 29 3b 0a 0a 09 70 61 74 68 69 6e  (path);...pathin
2c50: 66 6f 2d 3e 74 79 70 65 20 3d 20 41 50 50 46 53  fo->type = APPFS
2c60: 5f 50 41 54 48 54 59 50 45 5f 49 4e 56 41 4c 49  _PATHTYPE_INVALI
2c70: 44 3b 0a 0a 09 41 50 50 46 53 5f 44 45 42 55 47  D;...APPFS_DEBUG
2c80: 28 22 53 51 4c 3a 20 25 73 22 2c 20 73 71 6c 29  ("SQL: %s", sql)
2c90: 3b 0a 09 73 71 6c 69 74 65 5f 72 65 74 20 3d 20  ;..sqlite_ret = 
2ca0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f  sqlite3_exec(glo
2cb0: 62 61 6c 54 68 72 65 61 64 2e 64 62 2c 20 73 71  balThread.db, sq
2cc0: 6c 2c 20 61 70 70 66 73 5f 67 65 74 66 69 6c 65  l, appfs_getfile
2cd0: 69 6e 66 6f 5f 63 62 2c 20 70 61 74 68 69 6e 66  info_cb, pathinf
2ce0: 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 73 71 6c 69 74  o, NULL);..sqlit
2cf0: 65 33 5f 66 72 65 65 28 73 71 6c 29 3b 0a 0a 09  e3_free(sql);...
2d00: 69 66 20 28 73 71 6c 69 74 65 5f 72 65 74 20 21  if (sqlite_ret !
2d10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 09  = SQLITE_OK) {..
2d20: 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 43 61  .APPFS_DEBUG("Ca
2d30: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
2d40: 65 63 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ec failed.");...
2d50: 09 72 65 74 75 72 6e 28 2d 45 49 4f 29 3b 0a 09  .return(-EIO);..
2d60: 7d 0a 0a 09 69 66 20 28 70 61 74 68 69 6e 66 6f  }...if (pathinfo
2d70: 2d 3e 74 79 70 65 20 3d 3d 20 41 50 50 46 53 5f  ->type == APPFS_
2d80: 50 41 54 48 54 59 50 45 5f 49 4e 56 41 4c 49 44  PATHTYPE_INVALID
2d90: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 4e  ) {...return(-EN
2da0: 4f 45 4e 54 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  OENT);..}...retu
2db0: 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 74  rn(0);.}../* Get
2dc0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
2dd0: 75 74 20 61 20 70 61 74 68 2c 20 61 6e 64 20 6f  ut a path, and o
2de0: 70 74 69 6f 6e 61 6c 6c 79 20 6c 69 73 74 20 63  ptionally list c
2df0: 68 69 6c 64 72 65 6e 20 2a 2f 0a 73 74 61 74 69  hildren */.stati
2e00: 63 20 69 6e 74 20 61 70 70 66 73 5f 67 65 74 5f  c int appfs_get_
2e10: 70 61 74 68 5f 69 6e 66 6f 28 63 6f 6e 73 74 20  path_info(const 
2e20: 63 68 61 72 20 2a 5f 70 61 74 68 2c 20 73 74 72  char *_path, str
2e30: 75 63 74 20 61 70 70 66 73 5f 70 61 74 68 69 6e  uct appfs_pathin
2e40: 66 6f 20 2a 70 61 74 68 69 6e 66 6f 2c 20 73 74  fo *pathinfo, st
2e50: 72 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64  ruct appfs_child
2e60: 72 65 6e 20 2a 2a 63 68 69 6c 64 72 65 6e 29 20  ren **children) 
2e70: 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f  {..struct appfs_
2e80: 73 69 74 65 20 2a 73 69 74 65 73 2c 20 2a 73 69  site *sites, *si
2e90: 74 65 3b 0a 09 73 74 72 75 63 74 20 61 70 70 66  te;..struct appf
2ea0: 73 5f 63 68 69 6c 64 72 65 6e 20 2a 6e 6f 64 65  s_children *node
2eb0: 2c 20 2a 64 69 72 5f 63 68 69 6c 64 72 65 6e 3b  , *dir_children;
2ec0: 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 70  ..struct appfs_p
2ed0: 61 63 6b 61 67 65 20 2a 70 61 63 6b 61 67 65 73  ackage *packages
2ee0: 2c 20 2a 70 61 63 6b 61 67 65 3b 0a 09 61 70 70  , *package;..app
2ef0: 66 73 5f 6f 73 5f 74 20 6f 73 5f 76 61 6c 3b 0a  fs_os_t os_val;.
2f00: 09 61 70 70 66 73 5f 63 70 75 41 72 63 68 5f 74  .appfs_cpuArch_t
2f10: 20 63 70 75 41 72 63 68 5f 76 61 6c 3b 0a 09 63   cpuArch_val;..c
2f20: 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 2a  har *hostname, *
2f30: 70 61 63 6b 61 67 65 6e 61 6d 65 2c 20 2a 6f 73  packagename, *os
2f40: 5f 63 70 75 41 72 63 68 2c 20 2a 6f 73 2c 20 2a  _cpuArch, *os, *
2f50: 63 70 75 41 72 63 68 2c 20 2a 76 65 72 73 69 6f  cpuArch, *versio
2f60: 6e 3b 0a 09 63 68 61 72 20 2a 70 61 74 68 2c 20  n;..char *path, 
2f70: 2a 70 61 74 68 5f 73 3b 0a 09 63 68 61 72 20 2a  *path_s;..char *
2f80: 70 61 63 6b 61 67 65 5f 68 61 73 68 3b 0a 09 69  package_hash;..i
2f90: 6e 74 20 73 69 74 65 73 5f 63 6f 75 6e 74 2c 20  nt sites_count, 
2fa0: 70 61 63 6b 61 67 65 73 5f 63 6f 75 6e 74 2c 20  packages_count, 
2fb0: 6f 73 5f 63 70 75 41 72 63 68 5f 63 6f 75 6e 74  os_cpuArch_count
2fc0: 2c 20 76 65 72 73 69 6f 6e 5f 63 6f 75 6e 74 2c  , version_count,
2fd0: 20 66 69 6c 65 73 5f 63 6f 75 6e 74 3b 0a 09 69   files_count;..i
2fe0: 6e 74 20 66 69 6c 65 69 6e 66 6f 5f 72 65 74 3b  nt fileinfo_ret;
2ff0: 0a 0a 09 69 66 20 28 63 68 69 6c 64 72 65 6e 29  ...if (children)
3000: 20 7b 0a 09 09 2a 63 68 69 6c 64 72 65 6e 20 3d   {...*children =
3010: 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28   NULL;..}...if (
3020: 5f 70 61 74 68 20 3d 3d 20 4e 55 4c 4c 29 20 7b  _path == NULL) {
3030: 0a 09 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e  ...return(-ENOEN
3040: 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 5f 70 61  T);..}...if (_pa
3050: 74 68 5b 30 5d 20 21 3d 20 27 2f 27 29 20 7b 0a  th[0] != '/') {.
3060: 09 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54  ..return(-ENOENT
3070: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 5f 70 61 74  );..}...if (_pat
3080: 68 5b 31 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a  h[1] == '\0') {.
3090: 09 09 2f 2a 20 52 65 71 75 65 73 74 20 66 6f 72  ../* Request for
30a0: 20 74 68 65 20 72 6f 6f 74 20 64 69 72 65 63 74   the root direct
30b0: 6f 72 79 20 2a 2f 0a 09 09 73 69 74 65 73 20 3d  ory */...sites =
30c0: 20 61 70 70 66 73 5f 67 65 74 73 69 74 65 73 28   appfs_getsites(
30d0: 26 73 69 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  &sites_count);..
30e0: 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65  ..pathinfo->type
30f0: 20 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59 50   = APPFS_PATHTYP
3100: 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09 09 70  E_DIRECTORY;...p
3110: 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66  athinfo->typeinf
3120: 6f 2e 64 69 72 2e 63 68 69 6c 64 63 6f 75 6e 74  o.dir.childcount
3130: 20 3d 20 73 69 74 65 73 5f 63 6f 75 6e 74 3b 0a   = sites_count;.
3140: 0a 09 09 69 66 20 28 63 68 69 6c 64 72 65 6e 29  ...if (children)
3150: 20 7b 0a 09 09 09 66 6f 72 20 28 73 69 74 65 20   {....for (site 
3160: 3d 20 73 69 74 65 73 3b 20 73 69 74 65 3b 20 73  = sites; site; s
3170: 69 74 65 20 3d 20 73 69 74 65 2d 3e 5f 6e 65 78  ite = site->_nex
3180: 74 29 20 7b 0a 09 09 09 09 6e 6f 64 65 20 3d 20  t) {.....node = 
3190: 28 76 6f 69 64 20 2a 29 20 63 6b 61 6c 6c 6f 63  (void *) ckalloc
31a0: 28 73 69 7a 65 6f 66 28 2a 6e 6f 64 65 29 29 3b  (sizeof(*node));
31b0: 0a 09 09 09 09 6e 6f 64 65 2d 3e 5f 6e 65 78 74  .....node->_next
31c0: 20 3d 20 2a 63 68 69 6c 64 72 65 6e 3b 0a 09 09   = *children;...
31d0: 09 09 73 74 72 63 70 79 28 6e 6f 64 65 2d 3e 6e  ..strcpy(node->n
31e0: 61 6d 65 2c 20 73 69 74 65 2d 3e 6e 61 6d 65 29  ame, site->name)
31f0: 3b 0a 09 09 09 09 2a 63 68 69 6c 64 72 65 6e 20  ;.....*children 
3200: 3d 20 6e 6f 64 65 3b 0a 09 09 09 7d 0a 09 09 7d  = node;....}...}
3210: 0a 0a 09 09 61 70 70 66 73 5f 66 72 65 65 5f 6c  ....appfs_free_l
3220: 69 73 74 5f 73 69 74 65 28 73 69 74 65 73 29 3b  ist_site(sites);
3230: 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  ....return(0);..
3240: 7d 0a 0a 09 70 61 74 68 20 3d 20 73 74 72 64 75  }...path = strdu
3250: 70 28 5f 70 61 74 68 29 3b 0a 09 70 61 74 68 5f  p(_path);..path_
3260: 73 20 3d 20 70 61 74 68 3b 0a 0a 09 68 6f 73 74  s = path;...host
3270: 6e 61 6d 65 20 3d 20 70 61 74 68 20 2b 20 31 3b  name = path + 1;
3280: 0a 09 70 61 63 6b 61 67 65 6e 61 6d 65 20 3d 20  ..packagename = 
3290: 73 74 72 63 68 72 28 68 6f 73 74 6e 61 6d 65 2c  strchr(hostname,
32a0: 20 27 2f 27 29 3b 0a 0a 09 69 66 20 28 70 61 63   '/');...if (pac
32b0: 6b 61 67 65 6e 61 6d 65 20 21 3d 20 4e 55 4c 4c  kagename != NULL
32c0: 29 20 7b 0a 09 09 2a 70 61 63 6b 61 67 65 6e 61  ) {...*packagena
32d0: 6d 65 20 3d 20 27 5c 30 27 3b 0a 09 09 70 61 63  me = '\0';...pac
32e0: 6b 61 67 65 6e 61 6d 65 2b 2b 3b 0a 09 7d 0a 0a  kagename++;..}..
32f0: 09 70 61 63 6b 61 67 65 73 20 3d 20 61 70 70 66  .packages = appf
3300: 73 5f 67 65 74 69 6e 64 65 78 28 68 6f 73 74 6e  s_getindex(hostn
3310: 61 6d 65 2c 20 26 70 61 63 6b 61 67 65 73 5f 63  ame, &packages_c
3320: 6f 75 6e 74 29 3b 0a 0a 09 69 66 20 28 70 61 63  ount);...if (pac
3330: 6b 61 67 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  kages == NULL ||
3340: 20 70 61 63 6b 61 67 65 73 5f 63 6f 75 6e 74 20   packages_count 
3350: 3d 3d 20 30 29 20 7b 0a 09 09 41 50 50 46 53 5f  == 0) {...APPFS_
3360: 44 45 42 55 47 28 22 55 6e 61 62 6c 65 20 74 6f  DEBUG("Unable to
3370: 20 66 65 74 63 68 20 70 61 63 6b 61 67 65 20 69   fetch package i
3380: 6e 64 65 78 20 66 72 6f 6d 20 25 73 22 2c 20 68  ndex from %s", h
3390: 6f 73 74 6e 61 6d 65 29 3b 0a 0a 09 09 66 72 65  ostname);....fre
33a0: 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09 09 72 65  e(path_s);....re
33b0: 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b 0a 09  turn(-ENOENT);..
33c0: 7d 0a 0a 09 69 66 20 28 70 61 63 6b 61 67 65 6e  }...if (packagen
33d0: 61 6d 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ame == NULL) {..
33e0: 09 2f 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20  ./* Request for 
33f0: 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 6e 61 6d  a single hostnam
3400: 65 20 2a 2f 0a 09 09 70 61 74 68 69 6e 66 6f 2d  e */...pathinfo-
3410: 3e 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41  >type = APPFS_PA
3420: 54 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59  THTYPE_DIRECTORY
3430: 3b 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79  ;...pathinfo->ty
3440: 70 65 69 6e 66 6f 2e 64 69 72 2e 63 68 69 6c 64  peinfo.dir.child
3450: 63 6f 75 6e 74 20 3d 20 70 61 63 6b 61 67 65 73  count = packages
3460: 5f 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63  _count;....if (c
3470: 68 69 6c 64 72 65 6e 29 20 7b 0a 09 09 09 66 6f  hildren) {....fo
3480: 72 20 28 70 61 63 6b 61 67 65 20 3d 20 70 61 63  r (package = pac
3490: 6b 61 67 65 73 3b 20 70 61 63 6b 61 67 65 3b 20  kages; package; 
34a0: 70 61 63 6b 61 67 65 20 3d 20 70 61 63 6b 61 67  package = packag
34b0: 65 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09  e->_next) {.....
34c0: 6e 6f 64 65 20 3d 20 28 76 6f 69 64 20 2a 29 20  node = (void *) 
34d0: 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  ckalloc(sizeof(*
34e0: 6e 6f 64 65 29 29 3b 0a 09 09 09 09 6e 6f 64 65  node));.....node
34f0: 2d 3e 5f 6e 65 78 74 20 3d 20 2a 63 68 69 6c 64  ->_next = *child
3500: 72 65 6e 3b 0a 09 09 09 09 73 74 72 63 70 79 28  ren;.....strcpy(
3510: 6e 6f 64 65 2d 3e 6e 61 6d 65 2c 20 70 61 63 6b  node->name, pack
3520: 61 67 65 2d 3e 6e 61 6d 65 29 3b 0a 09 09 09 09  age->name);.....
3530: 2a 63 68 69 6c 64 72 65 6e 20 3d 20 6e 6f 64 65  *children = node
3540: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 61 70  ;....}...}....ap
3550: 70 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f 70 61  pfs_free_list_pa
3560: 63 6b 61 67 65 28 70 61 63 6b 61 67 65 73 29 3b  ckage(packages);
3570: 0a 0a 09 09 66 72 65 65 28 70 61 74 68 5f 73 29  ....free(path_s)
3580: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a  ;....return(0);.
3590: 09 7d 0a 0a 09 6f 73 5f 63 70 75 41 72 63 68 20  .}...os_cpuArch 
35a0: 3d 20 73 74 72 63 68 72 28 70 61 63 6b 61 67 65  = strchr(package
35b0: 6e 61 6d 65 2c 20 27 2f 27 29 3b 0a 09 69 66 20  name, '/');..if 
35c0: 28 6f 73 5f 63 70 75 41 72 63 68 20 3d 3d 20 4e  (os_cpuArch == N
35d0: 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 52 65 71 75  ULL) {.../* Requ
35e0: 65 73 74 20 66 6f 72 20 4f 53 20 61 6e 64 20 43  est for OS and C
35f0: 50 55 20 41 72 63 68 20 66 6f 72 20 61 20 73 70  PU Arch for a sp
3600: 65 63 69 66 69 63 20 70 61 63 6b 61 67 65 20 2a  ecific package *
3610: 2f 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79  /...pathinfo->ty
3620: 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54 48 54  pe = APPFS_PATHT
3630: 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a 0a  YPE_DIRECTORY;..
3640: 09 09 6f 73 5f 63 70 75 41 72 63 68 5f 63 6f 75  ..os_cpuArch_cou
3650: 6e 74 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 70  nt = 0;...for (p
3660: 61 63 6b 61 67 65 20 3d 20 70 61 63 6b 61 67 65  ackage = package
3670: 73 3b 20 70 61 63 6b 61 67 65 3b 20 70 61 63 6b  s; package; pack
3680: 61 67 65 20 3d 20 70 61 63 6b 61 67 65 2d 3e 5f  age = package->_
3690: 6e 65 78 74 29 20 7b 0a 09 09 09 69 66 20 28 73  next) {....if (s
36a0: 74 72 63 6d 70 28 70 61 63 6b 61 67 65 2d 3e 6e  trcmp(package->n
36b0: 61 6d 65 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65  ame, packagename
36c0: 29 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 41 50  ) != 0) {.....AP
36d0: 50 46 53 5f 44 45 42 55 47 28 22 53 6b 69 70 70  PFS_DEBUG("Skipp
36e0: 69 6e 67 20 70 61 63 6b 61 67 65 20 6e 61 6d 65  ing package name
36f0: 64 20 5c 22 25 73 5c 22 2c 20 64 6f 65 73 20 6e  d \"%s\", does n
3700: 6f 74 20 6d 61 74 63 68 20 72 65 71 75 65 73 74  ot match request
3710: 65 64 20 70 61 63 6b 61 67 65 3a 20 5c 22 25 73  ed package: \"%s
3720: 5c 22 22 2c 20 70 61 63 6b 61 67 65 2d 3e 6e 61  \"", package->na
3730: 6d 65 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65 29  me, packagename)
3740: 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
3750: 0a 09 09 09 7d 0a 0a 09 09 09 6f 73 5f 63 70 75  ....}.....os_cpu
3760: 41 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09  Arch_count++;...
3770: 09 09 69 66 20 28 63 68 69 6c 64 72 65 6e 29 20  ..if (children) 
3780: 7b 0a 09 09 09 09 6e 6f 64 65 20 3d 20 28 76 6f  {.....node = (vo
3790: 69 64 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69  id *) ckalloc(si
37a0: 7a 65 6f 66 28 2a 6e 6f 64 65 29 29 3b 0a 09 09  zeof(*node));...
37b0: 09 09 6e 6f 64 65 2d 3e 5f 6e 65 78 74 20 3d 20  ..node->_next = 
37c0: 2a 63 68 69 6c 64 72 65 6e 3b 0a 09 09 09 09 73  *children;.....s
37d0: 6e 70 72 69 6e 74 66 28 6e 6f 64 65 2d 3e 6e 61  nprintf(node->na
37e0: 6d 65 2c 20 73 69 7a 65 6f 66 28 6e 6f 64 65 2d  me, sizeof(node-
37f0: 3e 6e 61 6d 65 29 2c 20 22 25 73 2d 25 73 22 2c  >name), "%s-%s",
3800: 20 61 70 70 66 73 5f 63 6f 6e 76 65 72 74 5f 6f   appfs_convert_o
3810: 73 5f 74 6f 53 74 72 69 6e 67 28 70 61 63 6b 61  s_toString(packa
3820: 67 65 2d 3e 6f 73 29 2c 20 61 70 70 66 73 5f 63  ge->os), appfs_c
3830: 6f 6e 76 65 72 74 5f 63 70 75 41 72 63 68 5f 74  onvert_cpuArch_t
3840: 6f 53 74 72 69 6e 67 28 70 61 63 6b 61 67 65 2d  oString(package-
3850: 3e 63 70 75 41 72 63 68 29 29 3b 0a 09 09 09 09  >cpuArch));.....
3860: 2a 63 68 69 6c 64 72 65 6e 20 3d 20 6e 6f 64 65  *children = node
3870: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 61 70  ;....}...}....ap
3880: 70 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f 70 61  pfs_free_list_pa
3890: 63 6b 61 67 65 28 70 61 63 6b 61 67 65 73 29 3b  ckage(packages);
38a0: 0a 0a 09 09 66 72 65 65 28 70 61 74 68 5f 73 29  ....free(path_s)
38b0: 3b 0a 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74  ;....pathinfo->t
38c0: 79 70 65 69 6e 66 6f 2e 64 69 72 2e 63 68 69 6c  ypeinfo.dir.chil
38d0: 64 63 6f 75 6e 74 20 3d 20 6f 73 5f 63 70 75 41  dcount = os_cpuA
38e0: 72 63 68 5f 63 6f 75 6e 74 3b 0a 0a 09 09 72 65  rch_count;....re
38f0: 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 2a 6f  turn(0);..}...*o
3900: 73 5f 63 70 75 41 72 63 68 20 3d 20 27 5c 30 27  s_cpuArch = '\0'
3910: 3b 0a 09 6f 73 5f 63 70 75 41 72 63 68 2b 2b 3b  ;..os_cpuArch++;
3920: 0a 0a 09 76 65 72 73 69 6f 6e 20 3d 20 73 74 72  ...version = str
3930: 63 68 72 28 6f 73 5f 63 70 75 41 72 63 68 2c 20  chr(os_cpuArch, 
3940: 27 2f 27 29 3b 0a 0a 09 69 66 20 28 76 65 72 73  '/');...if (vers
3950: 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ion != NULL) {..
3960: 09 2a 76 65 72 73 69 6f 6e 20 3d 20 27 5c 30 27  .*version = '\0'
3970: 3b 0a 09 09 76 65 72 73 69 6f 6e 2b 2b 3b 0a 09  ;...version++;..
3980: 7d 0a 0a 09 6f 73 20 3d 20 6f 73 5f 63 70 75 41  }...os = os_cpuA
3990: 72 63 68 3b 0a 09 63 70 75 41 72 63 68 20 3d 20  rch;..cpuArch = 
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 2d 27 29 3b 0a 09 69 66 20 28 63 70  h, '-');..if (cp
39c0: 75 41 72 63 68 29 20 7b 0a 09 09 2a 63 70 75 41  uArch) {...*cpuA
39d0: 72 63 68 20 3d 20 27 5c 30 27 3b 0a 09 09 63 70  rch = '\0';...cp
39e0: 75 41 72 63 68 2b 2b 3b 0a 0a 09 09 63 70 75 41  uArch++;....cpuA
39f0: 72 63 68 5f 76 61 6c 20 3d 20 61 70 70 66 73 5f  rch_val = appfs_
3a00: 63 6f 6e 76 65 72 74 5f 63 70 75 41 72 63 68 5f  convert_cpuArch_
3a10: 66 72 6f 6d 53 74 72 69 6e 67 28 63 70 75 41 72  fromString(cpuAr
3a20: 63 68 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ch);..} else {..
3a30: 09 63 70 75 41 72 63 68 5f 76 61 6c 20 3d 20 41  .cpuArch_val = A
3a40: 50 50 46 53 5f 43 50 55 5f 55 4e 4b 4e 4f 57 4e  PPFS_CPU_UNKNOWN
3a50: 3b 0a 09 7d 0a 0a 09 6f 73 5f 76 61 6c 20 3d 20  ;..}...os_val = 
3a60: 61 70 70 66 73 5f 63 6f 6e 76 65 72 74 5f 6f 73  appfs_convert_os
3a70: 5f 66 72 6f 6d 53 74 72 69 6e 67 28 6f 73 29 3b  _fromString(os);
3a80: 0a 0a 09 69 66 20 28 76 65 72 73 69 6f 6e 20 3d  ...if (version =
3a90: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 52  = NULL) {.../* R
3aa0: 65 71 75 65 73 74 20 66 6f 72 20 76 65 72 73 69  equest for versi
3ab0: 6f 6e 20 6c 69 73 74 20 66 6f 72 20 61 20 70 61  on list for a pa
3ac0: 63 6b 61 67 65 20 6f 6e 20 61 6e 20 4f 53 2f 43  ckage on an OS/C
3ad0: 50 55 20 2a 2f 0a 09 09 70 61 74 68 69 6e 66 6f  PU */...pathinfo
3ae0: 2d 3e 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50  ->type = APPFS_P
3af0: 41 54 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52  ATHTYPE_DIRECTOR
3b00: 59 3b 0a 0a 09 09 76 65 72 73 69 6f 6e 5f 63 6f  Y;....version_co
3b10: 75 6e 74 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28  unt = 0;...for (
3b20: 70 61 63 6b 61 67 65 20 3d 20 70 61 63 6b 61 67  package = packag
3b30: 65 73 3b 20 70 61 63 6b 61 67 65 3b 20 70 61 63  es; package; pac
3b40: 6b 61 67 65 20 3d 20 70 61 63 6b 61 67 65 2d 3e  kage = package->
3b50: 5f 6e 65 78 74 29 20 7b 0a 09 09 09 69 66 20 28  _next) {....if (
3b60: 73 74 72 63 6d 70 28 70 61 63 6b 61 67 65 2d 3e  strcmp(package->
3b70: 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65 6e 61 6d  name, packagenam
3b80: 65 29 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 41  e) != 0) {.....A
3b90: 50 50 46 53 5f 44 45 42 55 47 28 22 53 6b 69 70  PPFS_DEBUG("Skip
3ba0: 70 69 6e 67 20 70 61 63 6b 61 67 65 20 6e 61 6d  ping package nam
3bb0: 65 64 20 5c 22 25 73 5c 22 2c 20 64 6f 65 73 20  ed \"%s\", does 
3bc0: 6e 6f 74 20 6d 61 74 63 68 20 72 65 71 75 65 73  not match reques
3bd0: 74 65 64 20 70 61 63 6b 61 67 65 3a 20 5c 22 25  ted package: \"%
3be0: 73 5c 22 22 2c 20 70 61 63 6b 61 67 65 2d 3e 6e  s\"", package->n
3bf0: 61 6d 65 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65  ame, packagename
3c00: 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  );......continue
3c10: 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 70  ;....}.....if (p
3c20: 61 63 6b 61 67 65 2d 3e 6f 73 20 21 3d 20 6f 73  ackage->os != os
3c30: 5f 76 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74  _val) {.....cont
3c40: 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  inue;....}.....i
3c50: 66 20 28 70 61 63 6b 61 67 65 2d 3e 63 70 75 41  f (package->cpuA
3c60: 72 63 68 20 21 3d 20 63 70 75 41 72 63 68 5f 76  rch != cpuArch_v
3c70: 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  al) {.....contin
3c80: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 76 65 72  ue;....}.....ver
3c90: 73 69 6f 6e 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09  sion_count++;...
3ca0: 09 09 69 66 20 28 63 68 69 6c 64 72 65 6e 29 20  ..if (children) 
3cb0: 7b 0a 09 09 09 09 6e 6f 64 65 20 3d 20 28 76 6f  {.....node = (vo
3cc0: 69 64 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69  id *) ckalloc(si
3cd0: 7a 65 6f 66 28 2a 6e 6f 64 65 29 29 3b 0a 09 09  zeof(*node));...
3ce0: 09 09 6e 6f 64 65 2d 3e 5f 6e 65 78 74 20 3d 20  ..node->_next = 
3cf0: 2a 63 68 69 6c 64 72 65 6e 3b 0a 09 09 09 09 73  *children;.....s
3d00: 74 72 63 70 79 28 6e 6f 64 65 2d 3e 6e 61 6d 65  trcpy(node->name
3d10: 2c 20 70 61 63 6b 61 67 65 2d 3e 76 65 72 73 69  , package->versi
3d20: 6f 6e 29 3b 0a 09 09 09 09 2a 63 68 69 6c 64 72  on);.....*childr
3d30: 65 6e 20 3d 20 6e 6f 64 65 3b 0a 09 09 09 7d 0a  en = node;....}.
3d40: 09 09 7d 0a 0a 09 09 61 70 70 66 73 5f 66 72 65  ..}....appfs_fre
3d50: 65 5f 6c 69 73 74 5f 70 61 63 6b 61 67 65 28 70  e_list_package(p
3d60: 61 63 6b 61 67 65 73 29 3b 0a 0a 09 09 66 72 65  ackages);....fre
3d70: 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09 09 70 61  e(path_s);....pa
3d80: 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f  thinfo->typeinfo
3d90: 2e 64 69 72 2e 63 68 69 6c 64 63 6f 75 6e 74 20  .dir.childcount 
3da0: 3d 20 76 65 72 73 69 6f 6e 5f 63 6f 75 6e 74 3b  = version_count;
3db0: 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  ....return(0);..
3dc0: 7d 0a 0a 09 61 70 70 66 73 5f 66 72 65 65 5f 6c  }...appfs_free_l
3dd0: 69 73 74 5f 70 61 63 6b 61 67 65 28 70 61 63 6b  ist_package(pack
3de0: 61 67 65 73 29 3b 0a 0a 09 70 61 74 68 20 3d 20  ages);...path = 
3df0: 73 74 72 63 68 72 28 76 65 72 73 69 6f 6e 2c 20  strchr(version, 
3e00: 27 2f 27 29 3b 0a 09 69 66 20 28 70 61 74 68 20  '/');..if (path 
3e10: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 61 74  == NULL) {...pat
3e20: 68 20 3d 20 22 22 3b 0a 09 7d 20 65 6c 73 65 20  h = "";..} else 
3e30: 7b 0a 09 09 2a 70 61 74 68 20 3d 20 27 5c 30 27  {...*path = '\0'
3e40: 3b 0a 09 09 70 61 74 68 2b 2b 3b 0a 09 7d 0a 0a  ;...path++;..}..
3e50: 09 2f 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20  ./* Request for 
3e60: 61 20 66 69 6c 65 20 69 6e 20 61 20 73 70 65 63  a file in a spec
3e70: 69 66 69 63 20 70 61 63 6b 61 67 65 20 2a 2f 0a  ific package */.
3e80: 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 52 65  .APPFS_DEBUG("Re
3e90: 71 75 65 73 74 69 6e 67 20 69 6e 66 6f 72 6d 61  questing informa
3ea0: 74 69 6f 6e 20 66 6f 72 20 68 6f 73 74 6e 61 6d  tion for hostnam
3eb0: 65 20 3d 20 25 73 2c 20 70 61 63 6b 61 67 65 20  e = %s, package 
3ec0: 3d 20 25 73 2c 20 6f 73 20 3d 20 25 73 2c 20 63  = %s, os = %s, c
3ed0: 70 75 41 72 63 68 20 3d 20 25 73 2c 20 76 65 72  puArch = %s, ver
3ee0: 73 69 6f 6e 20 3d 20 25 73 2c 20 70 61 74 68 20  sion = %s, path 
3ef0: 3d 20 25 73 22 2c 20 0a 09 09 68 6f 73 74 6e 61  = %s", ...hostna
3f00: 6d 65 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65 2c  me, packagename,
3f10: 20 6f 73 2c 20 63 70 75 41 72 63 68 2c 20 76 65   os, cpuArch, ve
3f20: 72 73 69 6f 6e 2c 20 70 61 74 68 0a 09 29 3b 0a  rsion, path..);.
3f30: 0a 09 70 61 63 6b 61 67 65 5f 68 61 73 68 20 3d  ..package_hash =
3f40: 20 61 70 70 66 73 5f 6c 6f 6f 6b 75 70 5f 70 61   appfs_lookup_pa
3f50: 63 6b 61 67 65 5f 68 61 73 68 28 68 6f 73 74 6e  ckage_hash(hostn
3f60: 61 6d 65 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65  ame, packagename
3f70: 2c 20 6f 73 5f 76 61 6c 2c 20 63 70 75 41 72 63  , os_val, cpuArc
3f80: 68 5f 76 61 6c 2c 20 76 65 72 73 69 6f 6e 29 3b  h_val, version);
3f90: 0a 09 69 66 20 28 70 61 63 6b 61 67 65 5f 68 61  ..if (package_ha
3fa0: 73 68 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  sh == NULL) {...
3fb0: 66 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09  free(path_s);...
3fc0: 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29  .return(-ENOENT)
3fd0: 3b 0a 09 7d 0a 0a 09 41 50 50 46 53 5f 44 45 42  ;..}...APPFS_DEB
3fe0: 55 47 28 22 20 20 2e 2e 2e 20 77 68 69 63 68 20  UG("  ... which 
3ff0: 68 61 73 68 20 61 20 68 61 73 68 20 6f 66 20 25  hash a hash of %
4000: 73 22 2c 20 70 61 63 6b 61 67 65 5f 68 61 73 68  s", package_hash
4010: 29 3b 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28  );...if (strcmp(
4020: 70 61 74 68 2c 20 22 22 29 20 3d 3d 20 30 29 20  path, "") == 0) 
4030: 7b 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79  {...pathinfo->ty
4040: 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54 48 54  pe = APPFS_PATHT
4050: 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09  YPE_DIRECTORY;..
4060: 7d 20 65 6c 73 65 20 7b 0a 09 09 66 69 6c 65 69  } else {...filei
4070: 6e 66 6f 5f 72 65 74 20 3d 20 61 70 70 66 73 5f  nfo_ret = appfs_
4080: 67 65 74 66 69 6c 65 69 6e 66 6f 28 68 6f 73 74  getfileinfo(host
4090: 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65 5f 68 61  name, package_ha
40a0: 73 68 2c 20 70 61 74 68 2c 20 70 61 74 68 69 6e  sh, path, pathin
40b0: 66 6f 29 3b 0a 09 09 69 66 20 28 66 69 6c 65 69  fo);...if (filei
40c0: 6e 66 6f 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nfo_ret != 0) {.
40d0: 09 09 09 66 72 65 65 28 70 61 74 68 5f 73 29 3b  ...free(path_s);
40e0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 66 69 6c 65  .....return(file
40f0: 69 6e 66 6f 5f 72 65 74 29 3b 0a 09 09 7d 0a 09  info_ret);...}..
4100: 7d 0a 0a 09 69 66 20 28 70 61 74 68 69 6e 66 6f  }...if (pathinfo
4110: 2d 3e 74 79 70 65 20 3d 3d 20 41 50 50 46 53 5f  ->type == APPFS_
4120: 50 41 54 48 54 59 50 45 5f 44 49 52 45 43 54 4f  PATHTYPE_DIRECTO
4130: 52 59 29 20 7b 0a 09 09 64 69 72 5f 63 68 69 6c  RY) {...dir_chil
4140: 64 72 65 6e 20 3d 20 61 70 70 66 73 5f 67 65 74  dren = appfs_get
4150: 63 68 69 6c 64 72 65 6e 28 68 6f 73 74 6e 61 6d  children(hostnam
4160: 65 2c 20 70 61 63 6b 61 67 65 5f 68 61 73 68 2c  e, package_hash,
4170: 20 70 61 74 68 2c 20 26 66 69 6c 65 73 5f 63 6f   path, &files_co
4180: 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28 64 69 72  unt);....if (dir
4190: 5f 63 68 69 6c 64 72 65 6e 20 21 3d 20 4e 55 4c  _children != NUL
41a0: 4c 29 20 7b 0a 09 09 09 70 61 74 68 69 6e 66 6f  L) {....pathinfo
41b0: 2d 3e 74 79 70 65 69 6e 66 6f 2e 64 69 72 2e 63  ->typeinfo.dir.c
41c0: 68 69 6c 64 63 6f 75 6e 74 20 3d 20 66 69 6c 65  hildcount = file
41d0: 73 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09  s_count;...}....
41e0: 69 66 20 28 63 68 69 6c 64 72 65 6e 29 20 7b 0a  if (children) {.
41f0: 09 09 09 2a 63 68 69 6c 64 72 65 6e 20 3d 20 64  ...*children = d
4200: 69 72 5f 63 68 69 6c 64 72 65 6e 3b 0a 09 09 7d  ir_children;...}
4210: 0a 09 7d 0a 0a 09 66 72 65 65 28 70 61 74 68 5f  ..}...free(path_
4220: 73 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  s);...return(0);
4230: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
4240: 70 70 66 73 5f 66 75 73 65 5f 67 65 74 61 74 74  ppfs_fuse_getatt
4250: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  r(const char *pa
4260: 74 68 2c 20 73 74 72 75 63 74 20 73 74 61 74 20  th, struct stat 
4270: 2a 73 74 62 75 66 29 20 7b 0a 09 73 74 72 75 63  *stbuf) {..struc
4280: 74 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f  t appfs_pathinfo
4290: 20 70 61 74 68 69 6e 66 6f 3b 0a 09 69 6e 74 20   pathinfo;..int 
42a0: 72 65 73 20 3d 20 30 3b 0a 0a 09 41 50 50 46 53  res = 0;...APPFS
42b0: 5f 44 45 42 55 47 28 22 45 6e 74 65 72 20 28 70  _DEBUG("Enter (p
42c0: 61 74 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c  ath = %s, ...)",
42d0: 20 70 61 74 68 29 3b 0a 0a 09 72 65 73 20 3d 20   path);...res = 
42e0: 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f 69  appfs_get_path_i
42f0: 6e 66 6f 28 70 61 74 68 2c 20 26 70 61 74 68 69  nfo(path, &pathi
4300: 6e 66 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  nfo, NULL);..if 
4310: 28 72 65 73 20 21 3d 20 30 29 20 7b 0a 09 09 72  (res != 0) {...r
4320: 65 74 75 72 6e 28 72 65 73 29 3b 0a 09 7d 0a 0a  eturn(res);..}..
4330: 09 6d 65 6d 73 65 74 28 73 74 62 75 66 2c 20 30  .memset(stbuf, 0
4340: 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
4350: 73 74 61 74 29 29 3b 0a 0a 09 73 74 62 75 66 2d  stat));...stbuf-
4360: 3e 73 74 5f 6d 74 69 6d 65 20 3d 20 70 61 74 68  >st_mtime = path
4370: 69 6e 66 6f 2e 74 69 6d 65 3b 0a 09 73 74 62 75  info.time;..stbu
4380: 66 2d 3e 73 74 5f 63 74 69 6d 65 20 3d 20 70 61  f->st_ctime = pa
4390: 74 68 69 6e 66 6f 2e 74 69 6d 65 3b 0a 09 73 74  thinfo.time;..st
43a0: 62 75 66 2d 3e 73 74 5f 61 74 69 6d 65 20 3d 20  buf->st_atime = 
43b0: 70 61 74 68 69 6e 66 6f 2e 74 69 6d 65 3b 0a 0a  pathinfo.time;..
43c0: 09 69 66 20 28 70 61 74 68 69 6e 66 6f 2e 74 79  .if (pathinfo.ty
43d0: 70 65 20 3d 3d 20 41 50 50 46 53 5f 50 41 54 48  pe == APPFS_PATH
43e0: 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 29 20  TYPE_DIRECTORY) 
43f0: 7b 0a 09 09 73 74 62 75 66 2d 3e 73 74 5f 6d 6f  {...stbuf->st_mo
4400: 64 65 20 3d 20 53 5f 49 46 44 49 52 20 7c 20 30  de = S_IFDIR | 0
4410: 37 35 35 3b 0a 09 09 73 74 62 75 66 2d 3e 73 74  755;...stbuf->st
4420: 5f 6e 6c 69 6e 6b 20 3d 20 32 20 2b 20 70 61 74  _nlink = 2 + pat
4430: 68 69 6e 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 64  hinfo.typeinfo.d
4440: 69 72 2e 63 68 69 6c 64 63 6f 75 6e 74 3b 0a 09  ir.childcount;..
4450: 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 70  } else {...if (p
4460: 61 74 68 69 6e 66 6f 2e 74 79 70 65 69 6e 66 6f  athinfo.typeinfo
4470: 2e 66 69 6c 65 2e 65 78 65 63 75 74 61 62 6c 65  .file.executable
4480: 29 20 7b 0a 09 09 09 73 74 62 75 66 2d 3e 73 74  ) {....stbuf->st
4490: 5f 6d 6f 64 65 20 3d 20 53 5f 49 46 52 45 47 20  _mode = S_IFREG 
44a0: 7c 20 30 37 35 35 3b 0a 09 09 7d 20 65 6c 73 65  | 0755;...} else
44b0: 20 7b 0a 09 09 09 73 74 62 75 66 2d 3e 73 74 5f   {....stbuf->st_
44c0: 6d 6f 64 65 20 3d 20 53 5f 49 46 52 45 47 20 7c  mode = S_IFREG |
44d0: 20 30 36 34 34 3b 0a 09 09 7d 0a 0a 09 09 73 74   0644;...}....st
44e0: 62 75 66 2d 3e 73 74 5f 6e 6c 69 6e 6b 20 3d 20  buf->st_nlink = 
44f0: 31 3b 0a 09 09 73 74 62 75 66 2d 3e 73 74 5f 73  1;...stbuf->st_s
4500: 69 7a 65 20 3d 20 70 61 74 68 69 6e 66 6f 2e 74  ize = pathinfo.t
4510: 79 70 65 69 6e 66 6f 2e 66 69 6c 65 2e 73 69 7a  ypeinfo.file.siz
4520: 65 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 72  e;..}...return r
4530: 65 73 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  es;.}..static in
4540: 74 20 61 70 70 66 73 5f 66 75 73 65 5f 72 65 61  t appfs_fuse_rea
4550: 64 64 69 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ddir(const char 
4560: 2a 70 61 74 68 2c 20 76 6f 69 64 20 2a 62 75 66  *path, void *buf
4570: 2c 20 66 75 73 65 5f 66 69 6c 6c 5f 64 69 72 5f  , fuse_fill_dir_
4580: 74 20 66 69 6c 6c 65 72 2c 20 6f 66 66 5f 74 20  t filler, off_t 
4590: 6f 66 66 73 65 74 2c 20 73 74 72 75 63 74 20 66  offset, struct f
45a0: 75 73 65 5f 66 69 6c 65 5f 69 6e 66 6f 20 2a 66  use_file_info *f
45b0: 69 29 20 7b 0a 09 73 74 72 75 63 74 20 61 70 70  i) {..struct app
45c0: 66 73 5f 70 61 74 68 69 6e 66 6f 20 70 61 74 68  fs_pathinfo path
45d0: 69 6e 66 6f 3b 0a 09 73 74 72 75 63 74 20 61 70  info;..struct ap
45e0: 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a 63 68  pfs_children *ch
45f0: 69 6c 64 72 65 6e 2c 20 2a 63 68 69 6c 64 3b 0a  ildren, *child;.
4600: 09 69 6e 74 20 72 65 73 3b 0a 0a 09 41 50 50 46  .int res;...APPF
4610: 53 5f 44 45 42 55 47 28 22 45 6e 74 65 72 20 28  S_DEBUG("Enter (
4620: 70 61 74 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22  path = %s, ...)"
4630: 2c 20 70 61 74 68 29 3b 0a 0a 09 72 65 73 20 3d  , path);...res =
4640: 20 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f   appfs_get_path_
4650: 69 6e 66 6f 28 70 61 74 68 2c 20 26 70 61 74 68  info(path, &path
4660: 69 6e 66 6f 2c 20 26 63 68 69 6c 64 72 65 6e 29  info, &children)
4670: 3b 0a 09 69 66 20 28 72 65 73 20 21 3d 20 30 29  ;..if (res != 0)
4680: 20 7b 0a 09 09 72 65 74 75 72 6e 28 72 65 73 29   {...return(res)
4690: 3b 0a 09 7d 0a 0a 09 66 69 6c 6c 65 72 28 62 75  ;..}...filler(bu
46a0: 66 2c 20 22 2e 22 2c 20 4e 55 4c 4c 2c 20 30 29  f, ".", NULL, 0)
46b0: 3b 0a 09 66 69 6c 6c 65 72 28 62 75 66 2c 20 22  ;..filler(buf, "
46c0: 2e 2e 22 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a  ..", NULL, 0);..
46d0: 09 66 6f 72 20 28 63 68 69 6c 64 20 3d 20 63 68  .for (child = ch
46e0: 69 6c 64 72 65 6e 3b 20 63 68 69 6c 64 3b 20 63  ildren; child; c
46f0: 68 69 6c 64 20 3d 20 63 68 69 6c 64 2d 3e 5f 6e  hild = child->_n
4700: 65 78 74 29 20 7b 0a 09 09 66 69 6c 6c 65 72 28  ext) {...filler(
4710: 62 75 66 2c 20 63 68 69 6c 64 2d 3e 6e 61 6d 65  buf, child->name
4720: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 7d 0a 0a  , NULL, 0);..}..
4730: 09 61 70 70 66 73 5f 66 72 65 65 5f 6c 69 73 74  .appfs_free_list
4740: 5f 63 68 69 6c 64 72 65 6e 28 63 68 69 6c 64 72  _children(childr
4750: 65 6e 29 3b 0a 0a 09 72 65 74 75 72 6e 20 30 3b  en);...return 0;
4760: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
4770: 70 70 66 73 5f 66 75 73 65 5f 6f 70 65 6e 28 63  ppfs_fuse_open(c
4780: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
4790: 20 73 74 72 75 63 74 20 66 75 73 65 5f 66 69 6c   struct fuse_fil
47a0: 65 5f 69 6e 66 6f 20 2a 66 69 29 20 7b 0a 09 72  e_info *fi) {..r
47b0: 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b 0a  eturn(-ENOENT);.
47c0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  }..static int ap
47d0: 70 66 73 5f 66 75 73 65 5f 72 65 61 64 28 63 6f  pfs_fuse_read(co
47e0: 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
47f0: 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f  char *buf, size_
4800: 74 20 73 69 7a 65 2c 20 6f 66 66 5f 74 20 6f 66  t size, off_t of
4810: 66 73 65 74 2c 20 73 74 72 75 63 74 20 66 75 73  fset, struct fus
4820: 65 5f 66 69 6c 65 5f 69 6e 66 6f 20 2a 66 69 29  e_file_info *fi)
4830: 20 7b 0a 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45   {..return(-ENOE
4840: 4e 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 41  NT);.}..#ifdef A
4850: 50 50 46 53 5f 54 45 53 54 5f 44 52 49 56 45 52  PPFS_TEST_DRIVER
4860: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
4870: 73 5f 74 65 73 74 5f 64 72 69 76 65 72 28 76 6f  s_test_driver(vo
4880: 69 64 29 20 7b 0a 09 73 74 72 75 63 74 20 61 70  id) {..struct ap
4890: 70 66 73 5f 73 69 74 65 20 2a 73 69 74 65 73 2c  pfs_site *sites,
48a0: 20 2a 73 69 74 65 3b 0a 09 73 74 72 75 63 74 20   *site;..struct 
48b0: 61 70 70 66 73 5f 70 61 63 6b 61 67 65 20 2a 70  appfs_package *p
48c0: 61 63 6b 61 67 65 73 2c 20 2a 70 61 63 6b 61 67  ackages, *packag
48d0: 65 3b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73  e;..struct appfs
48e0: 5f 63 68 69 6c 64 72 65 6e 20 2a 66 69 6c 65 73  _children *files
48f0: 2c 20 2a 66 69 6c 65 3b 0a 09 63 68 61 72 20 2a  , *file;..char *
4900: 73 68 61 31 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e  sha1 = NULL;..in
4910: 74 20 70 61 63 6b 61 67 65 73 5f 63 6f 75 6e 74  t packages_count
4920: 20 3d 20 30 2c 20 73 69 74 65 73 5f 63 6f 75 6e   = 0, sites_coun
4930: 74 20 3d 20 30 2c 20 66 69 6c 65 73 5f 63 6f 75  t = 0, files_cou
4940: 6e 74 3b 0a 0a 09 73 69 74 65 73 20 3d 20 61 70  nt;...sites = ap
4950: 70 66 73 5f 67 65 74 73 69 74 65 73 28 26 73 69  pfs_getsites(&si
4960: 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 70 72 69  tes_count);..pri
4970: 6e 74 66 28 22 53 69 74 65 73 3a 5c 6e 22 29 3b  ntf("Sites:\n");
4980: 0a 09 66 6f 72 20 28 73 69 74 65 20 3d 20 73 69  ..for (site = si
4990: 74 65 73 3b 20 73 69 74 65 3b 20 73 69 74 65 20  tes; site; site 
49a0: 3d 20 73 69 74 65 2d 3e 5f 6e 65 78 74 29 20 7b  = site->_next) {
49b0: 0a 09 09 70 72 69 6e 74 66 28 22 5c 74 6e 61 6d  ...printf("\tnam
49c0: 65 20 3d 20 25 73 5c 6e 22 2c 20 73 69 74 65 2d  e = %s\n", site-
49d0: 3e 6e 61 6d 65 29 3b 0a 09 7d 0a 0a 09 61 70 70  >name);..}...app
49e0: 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f 73 69 74  fs_free_list_sit
49f0: 65 28 73 69 74 65 73 29 3b 0a 0a 09 70 61 63 6b  e(sites);...pack
4a00: 61 67 65 73 20 3d 20 61 70 70 66 73 5f 67 65 74  ages = appfs_get
4a10: 69 6e 64 65 78 28 22 72 6b 65 65 6e 65 2e 6f 72  index("rkeene.or
4a20: 67 22 2c 20 26 70 61 63 6b 61 67 65 73 5f 63 6f  g", &packages_co
4a30: 75 6e 74 29 3b 0a 09 69 66 20 28 70 61 63 6b 61  unt);..if (packa
4a40: 67 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70  ges == NULL || p
4a50: 61 63 6b 61 67 65 73 5f 63 6f 75 6e 74 20 3d 3d  ackages_count ==
4a60: 20 30 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28   0) {...fprintf(
4a70: 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20  stderr, "Unable 
4a80: 74 6f 20 66 65 74 63 68 20 70 61 63 6b 61 67 65  to fetch package
4a90: 20 69 6e 64 65 78 20 66 72 6f 6d 20 72 6b 65 65   index from rkee
4aa0: 6e 65 2e 6f 72 67 2e 5c 6e 22 29 3b 0a 0a 09 09  ne.org.\n");....
4ab0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
4ac0: 66 6f 72 20 28 70 61 63 6b 61 67 65 20 3d 20 70  for (package = p
4ad0: 61 63 6b 61 67 65 73 3b 20 70 61 63 6b 61 67 65  ackages; package
4ae0: 3b 20 70 61 63 6b 61 67 65 20 3d 20 70 61 63 6b  ; package = pack
4af0: 61 67 65 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  age->_next) {...
4b00: 73 68 61 31 20 3d 20 70 61 63 6b 61 67 65 2d 3e  sha1 = package->
4b10: 73 68 61 31 3b 0a 0a 09 09 70 72 69 6e 74 66 28  sha1;....printf(
4b20: 22 50 61 63 6b 61 67 65 3a 5c 6e 5c 74 6e 61 6d  "Package:\n\tnam
4b30: 65 20 3d 20 25 73 5c 6e 5c 74 76 65 72 73 69 6f  e = %s\n\tversio
4b40: 6e 20 3d 20 25 73 5c 6e 5c 74 73 68 61 31 20 3d  n = %s\n\tsha1 =
4b50: 20 25 73 5c 6e 5c 74 6f 73 20 3d 20 25 73 5c 6e   %s\n\tos = %s\n
4b60: 5c 74 63 70 75 41 72 63 68 20 3d 20 25 73 5c 6e  \tcpuArch = %s\n
4b70: 22 2c 0a 09 09 09 70 61 63 6b 61 67 65 2d 3e 6e  ",....package->n
4b80: 61 6d 65 2c 0a 09 09 09 70 61 63 6b 61 67 65 2d  ame,....package-
4b90: 3e 76 65 72 73 69 6f 6e 2c 0a 09 09 09 70 61 63  >version,....pac
4ba0: 6b 61 67 65 2d 3e 73 68 61 31 2c 0a 09 09 09 61  kage->sha1,....a
4bb0: 70 70 66 73 5f 63 6f 6e 76 65 72 74 5f 6f 73 5f  ppfs_convert_os_
4bc0: 74 6f 53 74 72 69 6e 67 28 70 61 63 6b 61 67 65  toString(package
4bd0: 2d 3e 6f 73 29 2c 0a 09 09 09 61 70 70 66 73 5f  ->os),....appfs_
4be0: 63 6f 6e 76 65 72 74 5f 63 70 75 41 72 63 68 5f  convert_cpuArch_
4bf0: 74 6f 53 74 72 69 6e 67 28 70 61 63 6b 61 67 65  toString(package
4c00: 2d 3e 63 70 75 41 72 63 68 29 0a 09 09 29 3b 0a  ->cpuArch)...);.
4c10: 09 7d 0a 0a 09 66 69 6c 65 73 20 3d 20 61 70 70  .}...files = app
4c20: 66 73 5f 67 65 74 63 68 69 6c 64 72 65 6e 28 22  fs_getchildren("
4c30: 72 6b 65 65 6e 65 2e 6f 72 67 22 2c 20 73 68 61  rkeene.org", sha
4c40: 31 2c 20 22 22 2c 20 26 66 69 6c 65 73 5f 63 6f  1, "", &files_co
4c50: 75 6e 74 29 3b 0a 09 69 66 20 28 66 69 6c 65 73  unt);..if (files
4c60: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 70   == NULL) {...fp
4c70: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
4c80: 6e 61 62 6c 65 20 74 6f 20 6c 69 73 74 20 66 69  nable to list fi
4c90: 6c 65 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20  les in the last 
4ca0: 70 61 63 6b 61 67 65 2e 5c 6e 22 29 3b 0a 0a 09  package.\n");...
4cb0: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
4cc0: 09 70 72 69 6e 74 66 28 22 46 69 6c 65 73 3a 5c  .printf("Files:\
4cd0: 6e 22 29 3b 0a 09 66 6f 72 20 28 66 69 6c 65 20  n");..for (file 
4ce0: 3d 20 66 69 6c 65 73 3b 20 66 69 6c 65 3b 20 66  = files; file; f
4cf0: 69 6c 65 20 3d 20 66 69 6c 65 2d 3e 5f 6e 65 78  ile = file->_nex
4d00: 74 29 20 7b 0a 09 09 70 72 69 6e 74 66 28 22 5c  t) {...printf("\
4d10: 74 25 73 5c 6e 22 2c 20 66 69 6c 65 2d 3e 6e 61  t%s\n", file->na
4d20: 6d 65 29 3b 0a 09 7d 0a 0a 09 61 70 70 66 73 5f  me);..}...appfs_
4d30: 66 72 65 65 5f 6c 69 73 74 5f 63 68 69 6c 64 72  free_list_childr
4d40: 65 6e 28 66 69 6c 65 73 29 3b 0a 0a 09 66 69 6c  en(files);...fil
4d50: 65 73 20 3d 20 61 70 70 66 73 5f 67 65 74 63 68  es = appfs_getch
4d60: 69 6c 64 72 65 6e 28 22 72 6b 65 65 6e 65 2e 6f  ildren("rkeene.o
4d70: 72 67 22 2c 20 73 68 61 31 2c 20 22 74 63 6c 22  rg", sha1, "tcl"
4d80: 2c 20 26 66 69 6c 65 73 5f 63 6f 75 6e 74 29 3b  , &files_count);
4d90: 0a 09 69 66 20 28 66 69 6c 65 73 20 3d 3d 20 4e  ..if (files == N
4da0: 55 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  ULL) {...fprintf
4db0: 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65  (stderr, "Unable
4dc0: 20 74 6f 20 6c 69 73 74 20 66 69 6c 65 73 20 69   to list files i
4dd0: 6e 20 74 68 65 20 6c 61 73 74 20 70 61 63 6b 61  n the last packa
4de0: 67 65 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75  ge.\n");....retu
4df0: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 70 72 69 6e  rn(1);..}...prin
4e00: 74 66 28 22 46 69 6c 65 73 3a 5c 6e 22 29 3b 0a  tf("Files:\n");.
4e10: 09 66 6f 72 20 28 66 69 6c 65 20 3d 20 66 69 6c  .for (file = fil
4e20: 65 73 3b 20 66 69 6c 65 3b 20 66 69 6c 65 20 3d  es; file; file =
4e30: 20 66 69 6c 65 2d 3e 5f 6e 65 78 74 29 20 7b 0a   file->_next) {.
4e40: 09 09 70 72 69 6e 74 66 28 22 5c 74 74 63 6c 2f  ..printf("\ttcl/
4e50: 25 73 5c 6e 22 2c 20 66 69 6c 65 2d 3e 6e 61 6d  %s\n", file->nam
4e60: 65 29 3b 0a 09 7d 0a 0a 09 61 70 70 66 73 5f 66  e);..}...appfs_f
4e70: 72 65 65 5f 6c 69 73 74 5f 63 68 69 6c 64 72 65  ree_list_childre
4e80: 6e 28 66 69 6c 65 73 29 3b 0a 09 61 70 70 66 73  n(files);..appfs
4e90: 5f 66 72 65 65 5f 6c 69 73 74 5f 70 61 63 6b 61  _free_list_packa
4ea0: 67 65 28 70 61 63 6b 61 67 65 73 29 3b 0a 0a 09  ge(packages);...
4eb0: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 23 65 6c  return(0);.}.#el
4ec0: 73 65 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  se.static struct
4ed0: 20 66 75 73 65 5f 6f 70 65 72 61 74 69 6f 6e 73   fuse_operations
4ee0: 20 61 70 70 66 73 5f 6f 70 65 72 20 3d 20 7b 0a   appfs_oper = {.
4ef0: 09 2e 67 65 74 61 74 74 72 09 3d 20 61 70 70 66  ..getattr.= appf
4f00: 73 5f 66 75 73 65 5f 67 65 74 61 74 74 72 2c 0a  s_fuse_getattr,.
4f10: 09 2e 72 65 61 64 64 69 72 09 3d 20 61 70 70 66  ..readdir.= appf
4f20: 73 5f 66 75 73 65 5f 72 65 61 64 64 69 72 2c 0a  s_fuse_readdir,.
4f30: 09 2e 6f 70 65 6e 09 09 3d 20 61 70 70 66 73 5f  ..open..= appfs_
4f40: 66 75 73 65 5f 6f 70 65 6e 2c 0a 09 2e 72 65 61  fuse_open,...rea
4f50: 64 09 09 3d 20 61 70 70 66 73 5f 66 75 73 65 5f  d..= appfs_fuse_
4f60: 72 65 61 64 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a  read.};.#endif..
4f70: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
4f80: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 20  c, char **argv) 
4f90: 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  {..const char *c
4fa0: 61 63 68 65 64 69 72 20 3d 20 41 50 50 46 53 5f  achedir = APPFS_
4fb0: 43 41 43 48 45 44 49 52 3b 0a 09 63 68 61 72 20  CACHEDIR;..char 
4fc0: 64 62 66 69 6c 65 6e 61 6d 65 5b 31 30 32 34 5d  dbfilename[1024]
4fd0: 3b 0a 09 69 6e 74 20 74 63 6c 5f 72 65 74 2c 20  ;..int tcl_ret, 
4fe0: 73 6e 70 72 69 6e 74 66 5f 72 65 74 2c 20 73 71  snprintf_ret, sq
4ff0: 6c 69 74 65 5f 72 65 74 3b 0a 0a 09 67 6c 6f 62  lite_ret;...glob
5000: 61 6c 54 68 72 65 61 64 2e 69 6e 74 65 72 70 20  alThread.interp 
5010: 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65  = Tcl_CreateInte
5020: 72 70 28 29 3b 0a 09 69 66 20 28 67 6c 6f 62 61  rp();..if (globa
5030: 6c 54 68 72 65 61 64 2e 69 6e 74 65 72 70 20 3d  lThread.interp =
5040: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 70 72 69  = NULL) {...fpri
5050: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61  ntf(stderr, "Una
5060: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 54 63  ble to create Tc
5070: 6c 20 49 6e 74 65 72 70 72 65 74 65 72 2e 20 20  l Interpreter.  
5080: 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 0a  Aborting.\n");..
5090: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
50a0: 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f  ..tcl_ret = Tcl_
50b0: 49 6e 69 74 28 67 6c 6f 62 61 6c 54 68 72 65 61  Init(globalThrea
50c0: 64 2e 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28  d.interp);..if (
50d0: 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f  tcl_ret != TCL_O
50e0: 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73  K) {...fprintf(s
50f0: 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74  tderr, "Unable t
5100: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c  o initialize Tcl
5110: 2e 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29  .  Aborting.\n")
5120: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
5130: 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54  .}...tcl_ret = T
5140: 63 6c 5f 45 76 61 6c 28 67 6c 6f 62 61 6c 54 68  cl_Eval(globalTh
5150: 72 65 61 64 2e 69 6e 74 65 72 70 2c 20 22 22 0a  read.interp, "".
5160: 23 69 6e 63 6c 75 64 65 20 22 61 70 70 66 73 2e  #include "appfs.
5170: 74 63 6c 2e 68 22 0a 09 22 22 29 3b 0a 09 69 66  tcl.h".."");..if
5180: 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c   (tcl_ret != TCL
5190: 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  _OK) {...fprintf
51a0: 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65  (stderr, "Unable
51b0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 54   to initialize T
51c0: 63 6c 20 41 70 70 46 53 20 73 63 72 69 70 74 2e  cl AppFS script.
51d0: 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b    Aborting.\n");
51e0: 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ...fprintf(stder
51f0: 72 2c 20 22 54 63 6c 20 45 72 72 6f 72 20 69 73  r, "Tcl Error is
5200: 3a 20 25 73 5c 6e 22 2c 20 54 63 6c 5f 47 65 74  : %s\n", Tcl_Get
5210: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 67 6c 6f  StringResult(glo
5220: 62 61 6c 54 68 72 65 61 64 2e 69 6e 74 65 72 70  balThread.interp
5230: 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29  ));....return(1)
5240: 3b 0a 09 7d 0a 0a 09 69 66 20 28 54 63 6c 5f 53  ;..}...if (Tcl_S
5250: 65 74 56 61 72 28 67 6c 6f 62 61 6c 54 68 72 65  etVar(globalThre
5260: 61 64 2e 69 6e 74 65 72 70 2c 20 22 3a 3a 61 70  ad.interp, "::ap
5270: 70 66 73 3a 3a 63 61 63 68 65 64 69 72 22 2c 20  pfs::cachedir", 
5280: 63 61 63 68 65 64 69 72 2c 20 54 43 4c 5f 47 4c  cachedir, TCL_GL
5290: 4f 42 41 4c 5f 4f 4e 4c 59 29 20 3d 3d 20 4e 55  OBAL_ONLY) == NU
52a0: 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  LL) {...fprintf(
52b0: 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20  stderr, "Unable 
52c0: 74 6f 20 73 65 74 20 63 61 63 68 65 20 64 69 72  to set cache dir
52d0: 65 63 74 6f 72 79 2e 20 20 54 68 69 73 20 73 68  ectory.  This sh
52e0: 6f 75 6c 64 20 6e 65 76 65 72 20 66 61 69 6c 2e  ould never fail.
52f0: 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  \n");....return(
5300: 31 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74  1);..}...tcl_ret
5310: 20 3d 20 61 70 70 66 73 5f 54 63 6c 5f 45 76 61   = appfs_Tcl_Eva
5320: 6c 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 69  l(globalThread.i
5330: 6e 74 65 72 70 2c 20 31 2c 20 22 3a 3a 61 70 70  nterp, 1, "::app
5340: 66 73 3a 3a 69 6e 69 74 22 29 3b 0a 09 69 66 20  fs::init");..if 
5350: 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f  (tcl_ret != TCL_
5360: 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  OK) {...fprintf(
5370: 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20  stderr, "Unable 
5380: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63  to initialize Tc
5390: 6c 20 41 70 70 46 53 20 73 63 72 69 70 74 20 28  l AppFS script (
53a0: 3a 3a 61 70 70 66 73 3a 3a 69 6e 69 74 29 2e 20  ::appfs::init). 
53b0: 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a   Aborting.\n");.
53c0: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
53d0: 2c 20 22 54 63 6c 20 45 72 72 6f 72 20 69 73 3a  , "Tcl Error is:
53e0: 20 25 73 5c 6e 22 2c 20 54 63 6c 5f 47 65 74 53   %s\n", Tcl_GetS
53f0: 74 72 69 6e 67 52 65 73 75 6c 74 28 67 6c 6f 62  tringResult(glob
5400: 61 6c 54 68 72 65 61 64 2e 69 6e 74 65 72 70 29  alThread.interp)
5410: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
5420: 0a 09 7d 0a 0a 09 73 6e 70 72 69 6e 74 66 5f 72  ..}...snprintf_r
5430: 65 74 20 3d 20 73 6e 70 72 69 6e 74 66 28 64 62  et = snprintf(db
5440: 66 69 6c 65 6e 61 6d 65 2c 20 73 69 7a 65 6f 66  filename, sizeof
5450: 28 64 62 66 69 6c 65 6e 61 6d 65 29 2c 20 22 25  (dbfilename), "%
5460: 73 2f 25 73 22 2c 20 63 61 63 68 65 64 69 72 2c  s/%s", cachedir,
5470: 20 22 63 61 63 68 65 2e 64 62 22 29 3b 0a 09 69   "cache.db");..i
5480: 66 20 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20  f (snprintf_ret 
5490: 3e 3d 20 73 69 7a 65 6f 66 28 64 62 66 69 6c 65  >= sizeof(dbfile
54a0: 6e 61 6d 65 29 29 20 7b 0a 09 09 66 70 72 69 6e  name)) {...fprin
54b0: 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62  tf(stderr, "Unab
54c0: 6c 65 20 74 6f 20 73 65 74 20 64 61 74 61 62 61  le to set databa
54d0: 73 65 20 66 69 6c 65 6e 61 6d 65 2e 20 20 41 62  se filename.  Ab
54e0: 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 0a 09 09  orting.\n");....
54f0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
5500: 73 71 6c 69 74 65 5f 72 65 74 20 3d 20 73 71 6c  sqlite_ret = sql
5510: 69 74 65 33 5f 6f 70 65 6e 28 64 62 66 69 6c 65  ite3_open(dbfile
5520: 6e 61 6d 65 2c 20 26 67 6c 6f 62 61 6c 54 68 72  name, &globalThr
5530: 65 61 64 2e 64 62 29 3b 0a 09 69 66 20 28 73 71  ead.db);..if (sq
5540: 6c 69 74 65 5f 72 65 74 20 21 3d 20 53 51 4c 49  lite_ret != SQLI
5550: 54 45 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e  TE_OK) {...fprin
5560: 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62  tf(stderr, "Unab
5570: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
5580: 61 73 65 3a 20 25 73 5c 6e 22 2c 20 64 62 66 69  ase: %s\n", dbfi
5590: 6c 65 6e 61 6d 65 29 3b 0a 0a 09 09 72 65 74 75  lename);....retu
55a0: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 23 69 66 64 65  rn(1);..}..#ifde
55b0: 66 20 41 50 50 46 53 5f 54 45 53 54 5f 44 52 49  f APPFS_TEST_DRI
55c0: 56 45 52 0a 09 72 65 74 75 72 6e 28 61 70 70 66  VER..return(appf
55d0: 73 5f 74 65 73 74 5f 64 72 69 76 65 72 28 29 29  s_test_driver())
55e0: 3b 0a 23 65 6c 73 65 0a 09 72 65 74 75 72 6e 28  ;.#else..return(
55f0: 66 75 73 65 5f 6d 61 69 6e 28 61 72 67 63 2c 20  fuse_main(argc, 
5600: 61 72 67 76 2c 20 26 61 70 70 66 73 5f 6f 70 65  argv, &appfs_ope
5610: 72 2c 20 4e 55 4c 4c 29 29 3b 0a 23 65 6e 64 69  r, NULL));.#endi
5620: 66 0a 7d 0a 20 0a                                f.}. .