Hex Artifact Content

Artifact 62dbc078fa4c44c500152ceaeec4da0366e59282:


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 2c 20 2a 70 65 72 6d 73  e, *size, *perms
2690: 2c 20 2a 73 68 61 31 3b 0a 0a 09 74 79 70 65 20  , *sha1;...type 
26a0: 3d 20 76 61 6c 75 65 73 5b 30 5d 3b 0a 09 74 69  = values[0];..ti
26b0: 6d 65 20 3d 20 76 61 6c 75 65 73 5b 31 5d 3b 0a  me = values[1];.
26c0: 09 73 6f 75 72 63 65 20 3d 20 76 61 6c 75 65 73  .source = values
26d0: 5b 32 5d 3b 0a 09 73 69 7a 65 20 3d 20 76 61 6c  [2];..size = val
26e0: 75 65 73 5b 33 5d 3b 0a 09 70 65 72 6d 73 20 3d  ues[3];..perms =
26f0: 20 76 61 6c 75 65 73 5b 34 5d 3b 0a 09 73 68 61   values[4];..sha
2700: 31 20 3d 20 76 61 6c 75 65 73 5b 35 5d 3b 0a 0a  1 = values[5];..
2710: 09 70 61 74 68 69 6e 66 6f 2d 3e 74 69 6d 65 20  .pathinfo->time 
2720: 3d 20 73 74 72 74 6f 75 6c 6c 28 74 69 6d 65 2c  = strtoull(time,
2730: 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 0a 09 69 66   NULL, 10);...if
2740: 20 28 73 74 72 63 6d 70 28 74 79 70 65 2c 20 22   (strcmp(type, "
2750: 66 69 6c 65 22 29 20 3d 3d 20 30 29 20 7b 0a 09  file") == 0) {..
2760: 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 20  .pathinfo->type 
2770: 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  = APPFS_PATHTYPE
2780: 5f 46 49 4c 45 3b 0a 0a 09 09 69 66 20 28 21 73  _FILE;....if (!s
2790: 69 7a 65 29 20 7b 0a 09 09 09 73 69 7a 65 20 3d  ize) {....size =
27a0: 20 22 30 22 3b 0a 09 09 7d 0a 0a 09 09 69 66 20   "0";...}....if 
27b0: 28 21 70 65 72 6d 73 29 20 7b 0a 09 09 09 70 65  (!perms) {....pe
27c0: 72 6d 73 20 3d 20 22 22 3b 0a 09 09 7d 0a 0a 09  rms = "";...}...
27d0: 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69  .pathinfo->typei
27e0: 6e 66 6f 2e 66 69 6c 65 2e 73 69 7a 65 20 3d 20  nfo.file.size = 
27f0: 73 74 72 74 6f 75 6c 6c 28 73 69 7a 65 2c 20 4e  strtoull(size, N
2800: 55 4c 4c 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20  ULL, 10);....if 
2810: 28 73 74 72 63 6d 70 28 70 65 72 6d 73 2c 20 22  (strcmp(perms, "
2820: 78 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 70  x") == 0) {....p
2830: 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66  athinfo->typeinf
2840: 6f 2e 66 69 6c 65 2e 65 78 65 63 75 74 61 62 6c  o.file.executabl
2850: 65 20 3d 20 31 3b 0a 09 09 7d 20 65 6c 73 65 20  e = 1;...} else 
2860: 7b 0a 09 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74  {....pathinfo->t
2870: 79 70 65 69 6e 66 6f 2e 66 69 6c 65 2e 65 78 65  ypeinfo.file.exe
2880: 63 75 74 61 62 6c 65 20 3d 20 30 3b 0a 09 09 7d  cutable = 0;...}
2890: 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  ....return(0);..
28a0: 7d 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28 74  }...if (strcmp(t
28b0: 79 70 65 2c 20 22 64 69 72 65 63 74 6f 72 79 22  ype, "directory"
28c0: 29 20 3d 3d 20 30 29 20 7b 0a 09 09 70 61 74 68  ) == 0) {...path
28d0: 69 6e 66 6f 2d 3e 74 79 70 65 20 3d 20 41 50 50  info->type = APP
28e0: 46 53 5f 50 41 54 48 54 59 50 45 5f 44 49 52 45  FS_PATHTYPE_DIRE
28f0: 43 54 4f 52 59 3b 0a 09 09 70 61 74 68 69 6e 66  CTORY;...pathinf
2900: 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 64 69 72 2e  o->typeinfo.dir.
2910: 63 68 69 6c 64 63 6f 75 6e 74 20 3d 20 30 3b 0a  childcount = 0;.
2920: 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
2930: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 0a 09  ...return(0);...
2940: 2f 2a 20 55 6e 74 69 6c 20 74 68 69 73 20 69 73  /* Until this is
2950: 20 75 73 65 64 2c 20 70 72 65 76 65 6e 74 20 74   used, prevent t
2960: 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 72 6f 6d  he compiler from
2970: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 20 2a 2f 0a   complaining */.
2980: 09 73 6f 75 72 63 65 20 3d 20 73 6f 75 72 63 65  .source = source
2990: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
29a0: 61 70 70 66 73 5f 67 65 74 66 69 6c 65 69 6e 66  appfs_getfileinf
29b0: 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f  o(const char *ho
29c0: 73 74 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  stname, const ch
29d0: 61 72 20 2a 70 61 63 6b 61 67 65 5f 68 61 73 68  ar *package_hash
29e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 70  , const char *_p
29f0: 61 74 68 2c 20 73 74 72 75 63 74 20 61 70 70 66  ath, struct appf
2a00: 73 5f 70 61 74 68 69 6e 66 6f 20 2a 70 61 74 68  s_pathinfo *path
2a10: 69 6e 66 6f 29 20 7b 0a 09 63 68 61 72 20 2a 64  info) {..char *d
2a20: 69 72 65 63 74 6f 72 79 2c 20 2a 66 69 6c 65 2c  irectory, *file,
2a30: 20 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a 73   *path;..char *s
2a40: 71 6c 3b 0a 09 69 6e 74 20 69 6e 64 65 78 5f 72  ql;..int index_r
2a50: 65 74 2c 20 73 71 6c 69 74 65 5f 72 65 74 2c 20  et, sqlite_ret, 
2a60: 6d 61 6e 69 66 65 73 74 5f 72 65 74 3b 0a 0a 09  manifest_ret;...
2a70: 69 66 20 28 70 61 74 68 69 6e 66 6f 20 3d 3d 20  if (pathinfo == 
2a80: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
2a90: 28 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 69 6e 64  (-EIO);..}...ind
2aa0: 65 78 5f 72 65 74 20 3d 20 61 70 70 66 73 5f 75  ex_ret = appfs_u
2ab0: 70 64 61 74 65 5f 69 6e 64 65 78 28 68 6f 73 74  pdate_index(host
2ac0: 6e 61 6d 65 29 3b 0a 09 69 66 20 28 69 6e 64 65  name);..if (inde
2ad0: 78 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  x_ret != 0) {...
2ae0: 72 65 74 75 72 6e 28 2d 45 49 4f 29 3b 0a 09 7d  return(-EIO);..}
2af0: 0a 0a 09 6d 61 6e 69 66 65 73 74 5f 72 65 74 20  ...manifest_ret 
2b00: 3d 20 61 70 70 66 73 5f 75 70 64 61 74 65 5f 6d  = appfs_update_m
2b10: 61 6e 69 66 65 73 74 28 68 6f 73 74 6e 61 6d 65  anifest(hostname
2b20: 2c 20 70 61 63 6b 61 67 65 5f 68 61 73 68 29 3b  , package_hash);
2b30: 0a 09 69 66 20 28 6d 61 6e 69 66 65 73 74 5f 72  ..if (manifest_r
2b40: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74  et != 0) {...ret
2b50: 75 72 6e 28 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09  urn(-EIO);..}...
2b60: 70 61 74 68 20 3d 20 73 74 72 64 75 70 28 5f 70  path = strdup(_p
2b70: 61 74 68 29 3b 0a 09 64 69 72 65 63 74 6f 72 79  ath);..directory
2b80: 20 3d 20 70 61 74 68 3b 0a 09 66 69 6c 65 20 3d   = path;..file =
2b90: 20 73 74 72 72 63 68 72 28 70 61 74 68 2c 20 27   strrchr(path, '
2ba0: 2f 27 29 3b 0a 09 69 66 20 28 66 69 6c 65 20 3d  /');..if (file =
2bb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65  = NULL) {...file
2bc0: 20 3d 20 70 61 74 68 3b 0a 09 09 64 69 72 65 63   = path;...direc
2bd0: 74 6f 72 79 20 3d 20 22 22 3b 0a 09 7d 20 65 6c  tory = "";..} el
2be0: 73 65 20 7b 0a 09 09 2a 66 69 6c 65 20 3d 20 27  se {...*file = '
2bf0: 5c 30 27 3b 0a 09 09 66 69 6c 65 2b 2b 3b 0a 09  \0';...file++;..
2c00: 7d 0a 0a 09 73 71 6c 20 3d 20 73 71 6c 69 74 65  }...sql = sqlite
2c10: 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
2c20: 54 20 74 79 70 65 2c 20 74 69 6d 65 2c 20 73 6f  T type, time, so
2c30: 75 72 63 65 2c 20 73 69 7a 65 2c 20 70 65 72 6d  urce, size, perm
2c40: 73 2c 20 66 69 6c 65 5f 73 68 61 31 20 46 52 4f  s, file_sha1 FRO
2c50: 4d 20 66 69 6c 65 73 20 57 48 45 52 45 20 70 61  M files WHERE pa
2c60: 63 6b 61 67 65 5f 73 68 61 31 20 3d 20 25 51 20  ckage_sha1 = %Q 
2c70: 41 4e 44 20 66 69 6c 65 5f 64 69 72 65 63 74 6f  AND file_directo
2c80: 72 79 20 3d 20 25 51 20 41 4e 44 20 66 69 6c 65  ry = %Q AND file
2c90: 5f 6e 61 6d 65 20 3d 20 25 51 3b 22 2c 20 70 61  _name = %Q;", pa
2ca0: 63 6b 61 67 65 5f 68 61 73 68 2c 20 64 69 72 65  ckage_hash, dire
2cb0: 63 74 6f 72 79 2c 20 66 69 6c 65 29 3b 0a 09 69  ctory, file);..i
2cc0: 66 20 28 73 71 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (sql == NULL) 
2cd0: 7b 0a 09 09 41 50 50 46 53 5f 44 45 42 55 47 28  {...APPFS_DEBUG(
2ce0: 22 43 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33  "Call to sqlite3
2cf0: 5f 6d 70 72 69 6e 74 66 20 66 61 69 6c 65 64 2e  _mprintf failed.
2d00: 22 29 3b 0a 0a 09 09 66 72 65 65 28 70 61 74 68  ");....free(path
2d10: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 45 49  );....return(-EI
2d20: 4f 29 3b 0a 09 7d 0a 0a 09 66 72 65 65 28 70 61  O);..}...free(pa
2d30: 74 68 29 3b 0a 0a 09 70 61 74 68 69 6e 66 6f 2d  th);...pathinfo-
2d40: 3e 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41  >type = APPFS_PA
2d50: 54 48 54 59 50 45 5f 49 4e 56 41 4c 49 44 3b 0a  THTYPE_INVALID;.
2d60: 0a 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 53  ..APPFS_DEBUG("S
2d70: 51 4c 3a 20 25 73 22 2c 20 73 71 6c 29 3b 0a 09  QL: %s", sql);..
2d80: 73 71 6c 69 74 65 5f 72 65 74 20 3d 20 73 71 6c  sqlite_ret = sql
2d90: 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c  ite3_exec(global
2da0: 54 68 72 65 61 64 2e 64 62 2c 20 73 71 6c 2c 20  Thread.db, sql, 
2db0: 61 70 70 66 73 5f 67 65 74 66 69 6c 65 69 6e 66  appfs_getfileinf
2dc0: 6f 5f 63 62 2c 20 70 61 74 68 69 6e 66 6f 2c 20  o_cb, pathinfo, 
2dd0: 4e 55 4c 4c 29 3b 0a 09 73 71 6c 69 74 65 33 5f  NULL);..sqlite3_
2de0: 66 72 65 65 28 73 71 6c 29 3b 0a 0a 09 69 66 20  free(sql);...if 
2df0: 28 73 71 6c 69 74 65 5f 72 65 74 20 21 3d 20 53  (sqlite_ret != S
2e00: 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 09 09 41 50  QLITE_OK) {...AP
2e10: 50 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20  PFS_DEBUG("Call 
2e20: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20  to sqlite3_exec 
2e30: 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2e40: 74 75 72 6e 28 2d 45 49 4f 29 3b 0a 09 7d 0a 0a  turn(-EIO);..}..
2e50: 09 69 66 20 28 70 61 74 68 69 6e 66 6f 2d 3e 74  .if (pathinfo->t
2e60: 79 70 65 20 3d 3d 20 41 50 50 46 53 5f 50 41 54  ype == APPFS_PAT
2e70: 48 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b  HTYPE_INVALID) {
2e80: 0a 09 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e  ...return(-ENOEN
2e90: 54 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  T);..}...return(
2ea0: 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 74 20 69 6e  0);.}../* Get in
2eb0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
2ec0: 61 20 70 61 74 68 2c 20 61 6e 64 20 6f 70 74 69  a path, and opti
2ed0: 6f 6e 61 6c 6c 79 20 6c 69 73 74 20 63 68 69 6c  onally list chil
2ee0: 64 72 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  dren */.static i
2ef0: 6e 74 20 61 70 70 66 73 5f 67 65 74 5f 70 61 74  nt appfs_get_pat
2f00: 68 5f 69 6e 66 6f 28 63 6f 6e 73 74 20 63 68 61  h_info(const cha
2f10: 72 20 2a 5f 70 61 74 68 2c 20 73 74 72 75 63 74  r *_path, struct
2f20: 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20   appfs_pathinfo 
2f30: 2a 70 61 74 68 69 6e 66 6f 2c 20 73 74 72 75 63  *pathinfo, struc
2f40: 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e  t appfs_children
2f50: 20 2a 2a 63 68 69 6c 64 72 65 6e 29 20 7b 0a 09   **children) {..
2f60: 73 74 72 75 63 74 20 61 70 70 66 73 5f 73 69 74  struct appfs_sit
2f70: 65 20 2a 73 69 74 65 73 2c 20 2a 73 69 74 65 3b  e *sites, *site;
2f80: 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 63  ..struct appfs_c
2f90: 68 69 6c 64 72 65 6e 20 2a 6e 6f 64 65 2c 20 2a  hildren *node, *
2fa0: 64 69 72 5f 63 68 69 6c 64 72 65 6e 3b 0a 09 73  dir_children;..s
2fb0: 74 72 75 63 74 20 61 70 70 66 73 5f 70 61 63 6b  truct appfs_pack
2fc0: 61 67 65 20 2a 70 61 63 6b 61 67 65 73 2c 20 2a  age *packages, *
2fd0: 70 61 63 6b 61 67 65 3b 0a 09 61 70 70 66 73 5f  package;..appfs_
2fe0: 6f 73 5f 74 20 6f 73 5f 76 61 6c 3b 0a 09 61 70  os_t os_val;..ap
2ff0: 70 66 73 5f 63 70 75 41 72 63 68 5f 74 20 63 70  pfs_cpuArch_t cp
3000: 75 41 72 63 68 5f 76 61 6c 3b 0a 09 63 68 61 72  uArch_val;..char
3010: 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 2a 70 61 63   *hostname, *pac
3020: 6b 61 67 65 6e 61 6d 65 2c 20 2a 6f 73 5f 63 70  kagename, *os_cp
3030: 75 41 72 63 68 2c 20 2a 6f 73 2c 20 2a 63 70 75  uArch, *os, *cpu
3040: 41 72 63 68 2c 20 2a 76 65 72 73 69 6f 6e 3b 0a  Arch, *version;.
3050: 09 63 68 61 72 20 2a 70 61 74 68 2c 20 2a 70 61  .char *path, *pa
3060: 74 68 5f 73 3b 0a 09 63 68 61 72 20 2a 70 61 63  th_s;..char *pac
3070: 6b 61 67 65 5f 68 61 73 68 3b 0a 09 69 6e 74 20  kage_hash;..int 
3080: 73 69 74 65 73 5f 63 6f 75 6e 74 2c 20 70 61 63  sites_count, pac
3090: 6b 61 67 65 73 5f 63 6f 75 6e 74 2c 20 6f 73 5f  kages_count, os_
30a0: 63 70 75 41 72 63 68 5f 63 6f 75 6e 74 2c 20 76  cpuArch_count, v
30b0: 65 72 73 69 6f 6e 5f 63 6f 75 6e 74 2c 20 66 69  ersion_count, fi
30c0: 6c 65 73 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20  les_count;..int 
30d0: 66 69 6c 65 69 6e 66 6f 5f 72 65 74 3b 0a 0a 09  fileinfo_ret;...
30e0: 69 66 20 28 63 68 69 6c 64 72 65 6e 29 20 7b 0a  if (children) {.
30f0: 09 09 2a 63 68 69 6c 64 72 65 6e 20 3d 20 4e 55  ..*children = NU
3100: 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 5f 70 61  LL;..}...if (_pa
3110: 74 68 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  th == NULL) {...
3120: 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b  return(-ENOENT);
3130: 0a 09 7d 0a 0a 09 69 66 20 28 5f 70 61 74 68 5b  ..}...if (_path[
3140: 30 5d 20 21 3d 20 27 2f 27 29 20 7b 0a 09 09 72  0] != '/') {...r
3150: 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b 0a  eturn(-ENOENT);.
3160: 09 7d 0a 0a 09 69 66 20 28 5f 70 61 74 68 5b 31  .}...if (_path[1
3170: 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 2f  ] == '\0') {.../
3180: 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 74 68  * Request for th
3190: 65 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 79  e root directory
31a0: 20 2a 2f 0a 09 09 73 69 74 65 73 20 3d 20 61 70   */...sites = ap
31b0: 70 66 73 5f 67 65 74 73 69 74 65 73 28 26 73 69  pfs_getsites(&si
31c0: 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 70  tes_count);....p
31d0: 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 20 3d 20  athinfo->type = 
31e0: 41 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f 44  APPFS_PATHTYPE_D
31f0: 49 52 45 43 54 4f 52 59 3b 0a 09 09 70 61 74 68  IRECTORY;...path
3200: 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 64  info->typeinfo.d
3210: 69 72 2e 63 68 69 6c 64 63 6f 75 6e 74 20 3d 20  ir.childcount = 
3220: 73 69 74 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 09  sites_count;....
3230: 69 66 20 28 63 68 69 6c 64 72 65 6e 29 20 7b 0a  if (children) {.
3240: 09 09 09 66 6f 72 20 28 73 69 74 65 20 3d 20 73  ...for (site = s
3250: 69 74 65 73 3b 20 73 69 74 65 3b 20 73 69 74 65  ites; site; site
3260: 20 3d 20 73 69 74 65 2d 3e 5f 6e 65 78 74 29 20   = site->_next) 
3270: 7b 0a 09 09 09 09 6e 6f 64 65 20 3d 20 28 76 6f  {.....node = (vo
3280: 69 64 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69  id *) ckalloc(si
3290: 7a 65 6f 66 28 2a 6e 6f 64 65 29 29 3b 0a 09 09  zeof(*node));...
32a0: 09 09 6e 6f 64 65 2d 3e 5f 6e 65 78 74 20 3d 20  ..node->_next = 
32b0: 2a 63 68 69 6c 64 72 65 6e 3b 0a 09 09 09 09 73  *children;.....s
32c0: 74 72 63 70 79 28 6e 6f 64 65 2d 3e 6e 61 6d 65  trcpy(node->name
32d0: 2c 20 73 69 74 65 2d 3e 6e 61 6d 65 29 3b 0a 09  , site->name);..
32e0: 09 09 09 2a 63 68 69 6c 64 72 65 6e 20 3d 20 6e  ...*children = n
32f0: 6f 64 65 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  ode;....}...}...
3300: 09 61 70 70 66 73 5f 66 72 65 65 5f 6c 69 73 74  .appfs_free_list
3310: 5f 73 69 74 65 28 73 69 74 65 73 29 3b 0a 0a 09  _site(sites);...
3320: 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a  .return(0);..}..
3330: 09 70 61 74 68 20 3d 20 73 74 72 64 75 70 28 5f  .path = strdup(_
3340: 70 61 74 68 29 3b 0a 09 70 61 74 68 5f 73 20 3d  path);..path_s =
3350: 20 70 61 74 68 3b 0a 0a 09 68 6f 73 74 6e 61 6d   path;...hostnam
3360: 65 20 3d 20 70 61 74 68 20 2b 20 31 3b 0a 09 70  e = path + 1;..p
3370: 61 63 6b 61 67 65 6e 61 6d 65 20 3d 20 73 74 72  ackagename = str
3380: 63 68 72 28 68 6f 73 74 6e 61 6d 65 2c 20 27 2f  chr(hostname, '/
3390: 27 29 3b 0a 0a 09 69 66 20 28 70 61 63 6b 61 67  ');...if (packag
33a0: 65 6e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  ename != NULL) {
33b0: 0a 09 09 2a 70 61 63 6b 61 67 65 6e 61 6d 65 20  ...*packagename 
33c0: 3d 20 27 5c 30 27 3b 0a 09 09 70 61 63 6b 61 67  = '\0';...packag
33d0: 65 6e 61 6d 65 2b 2b 3b 0a 09 7d 0a 0a 09 70 61  ename++;..}...pa
33e0: 63 6b 61 67 65 73 20 3d 20 61 70 70 66 73 5f 67  ckages = appfs_g
33f0: 65 74 69 6e 64 65 78 28 68 6f 73 74 6e 61 6d 65  etindex(hostname
3400: 2c 20 26 70 61 63 6b 61 67 65 73 5f 63 6f 75 6e  , &packages_coun
3410: 74 29 3b 0a 0a 09 69 66 20 28 70 61 63 6b 61 67  t);...if (packag
3420: 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 61  es == NULL || pa
3430: 63 6b 61 67 65 73 5f 63 6f 75 6e 74 20 3d 3d 20  ckages_count == 
3440: 30 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42  0) {...APPFS_DEB
3450: 55 47 28 22 55 6e 61 62 6c 65 20 74 6f 20 66 65  UG("Unable to fe
3460: 74 63 68 20 70 61 63 6b 61 67 65 20 69 6e 64 65  tch package inde
3470: 78 20 66 72 6f 6d 20 25 73 22 2c 20 68 6f 73 74  x from %s", host
3480: 6e 61 6d 65 29 3b 0a 0a 09 09 66 72 65 65 28 70  name);....free(p
3490: 61 74 68 5f 73 29 3b 0a 0a 09 09 72 65 74 75 72  ath_s);....retur
34a0: 6e 28 2d 45 4e 4f 45 4e 54 29 3b 0a 09 7d 0a 0a  n(-ENOENT);..}..
34b0: 09 69 66 20 28 70 61 63 6b 61 67 65 6e 61 6d 65  .if (packagename
34c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a   == NULL) {.../*
34d0: 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 73   Request for a s
34e0: 69 6e 67 6c 65 20 68 6f 73 74 6e 61 6d 65 20 2a  ingle hostname *
34f0: 2f 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79  /...pathinfo->ty
3500: 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54 48 54  pe = APPFS_PATHT
3510: 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09  YPE_DIRECTORY;..
3520: 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69  .pathinfo->typei
3530: 6e 66 6f 2e 64 69 72 2e 63 68 69 6c 64 63 6f 75  nfo.dir.childcou
3540: 6e 74 20 3d 20 70 61 63 6b 61 67 65 73 5f 63 6f  nt = packages_co
3550: 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63 68 69 6c  unt;....if (chil
3560: 64 72 65 6e 29 20 7b 0a 09 09 09 66 6f 72 20 28  dren) {....for (
3570: 70 61 63 6b 61 67 65 20 3d 20 70 61 63 6b 61 67  package = packag
3580: 65 73 3b 20 70 61 63 6b 61 67 65 3b 20 70 61 63  es; package; pac
3590: 6b 61 67 65 20 3d 20 70 61 63 6b 61 67 65 2d 3e  kage = package->
35a0: 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 6e 6f 64  _next) {.....nod
35b0: 65 20 3d 20 28 76 6f 69 64 20 2a 29 20 63 6b 61  e = (void *) cka
35c0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6e 6f 64  lloc(sizeof(*nod
35d0: 65 29 29 3b 0a 09 09 09 09 6e 6f 64 65 2d 3e 5f  e));.....node->_
35e0: 6e 65 78 74 20 3d 20 2a 63 68 69 6c 64 72 65 6e  next = *children
35f0: 3b 0a 09 09 09 09 73 74 72 63 70 79 28 6e 6f 64  ;.....strcpy(nod
3600: 65 2d 3e 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65  e->name, package
3610: 2d 3e 6e 61 6d 65 29 3b 0a 09 09 09 09 2a 63 68  ->name);.....*ch
3620: 69 6c 64 72 65 6e 20 3d 20 6e 6f 64 65 3b 0a 09  ildren = node;..
3630: 09 09 7d 0a 09 09 7d 0a 0a 09 09 61 70 70 66 73  ..}...}....appfs
3640: 5f 66 72 65 65 5f 6c 69 73 74 5f 70 61 63 6b 61  _free_list_packa
3650: 67 65 28 70 61 63 6b 61 67 65 73 29 3b 0a 0a 09  ge(packages);...
3660: 09 66 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a  .free(path_s);..
3670: 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
3680: 0a 09 6f 73 5f 63 70 75 41 72 63 68 20 3d 20 73  ..os_cpuArch = s
3690: 74 72 63 68 72 28 70 61 63 6b 61 67 65 6e 61 6d  trchr(packagenam
36a0: 65 2c 20 27 2f 27 29 3b 0a 09 69 66 20 28 6f 73  e, '/');..if (os
36b0: 5f 63 70 75 41 72 63 68 20 3d 3d 20 4e 55 4c 4c  _cpuArch == NULL
36c0: 29 20 7b 0a 09 09 2f 2a 20 52 65 71 75 65 73 74  ) {.../* Request
36d0: 20 66 6f 72 20 4f 53 20 61 6e 64 20 43 50 55 20   for OS and CPU 
36e0: 41 72 63 68 20 66 6f 72 20 61 20 73 70 65 63 69  Arch for a speci
36f0: 66 69 63 20 70 61 63 6b 61 67 65 20 2a 2f 0a 09  fic package */..
3700: 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 20  .pathinfo->type 
3710: 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  = APPFS_PATHTYPE
3720: 5f 44 49 52 45 43 54 4f 52 59 3b 0a 0a 09 09 6f  _DIRECTORY;....o
3730: 73 5f 63 70 75 41 72 63 68 5f 63 6f 75 6e 74 20  s_cpuArch_count 
3740: 3d 20 30 3b 0a 09 09 66 6f 72 20 28 70 61 63 6b  = 0;...for (pack
3750: 61 67 65 20 3d 20 70 61 63 6b 61 67 65 73 3b 20  age = packages; 
3760: 70 61 63 6b 61 67 65 3b 20 70 61 63 6b 61 67 65  package; package
3770: 20 3d 20 70 61 63 6b 61 67 65 2d 3e 5f 6e 65 78   = package->_nex
3780: 74 29 20 7b 0a 09 09 09 69 66 20 28 73 74 72 63  t) {....if (strc
3790: 6d 70 28 70 61 63 6b 61 67 65 2d 3e 6e 61 6d 65  mp(package->name
37a0: 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65 29 20 21  , packagename) !
37b0: 3d 20 30 29 20 7b 0a 09 09 09 09 41 50 50 46 53  = 0) {.....APPFS
37c0: 5f 44 45 42 55 47 28 22 53 6b 69 70 70 69 6e 67  _DEBUG("Skipping
37d0: 20 70 61 63 6b 61 67 65 20 6e 61 6d 65 64 20 5c   package named \
37e0: 22 25 73 5c 22 2c 20 64 6f 65 73 20 6e 6f 74 20  "%s\", does not 
37f0: 6d 61 74 63 68 20 72 65 71 75 65 73 74 65 64 20  match requested 
3800: 70 61 63 6b 61 67 65 3a 20 5c 22 25 73 5c 22 22  package: \"%s\""
3810: 2c 20 70 61 63 6b 61 67 65 2d 3e 6e 61 6d 65 2c  , package->name,
3820: 20 70 61 63 6b 61 67 65 6e 61 6d 65 29 3b 0a 0a   packagename);..
3830: 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
3840: 09 7d 0a 0a 09 09 09 6f 73 5f 63 70 75 41 72 63  .}.....os_cpuArc
3850: 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 69  h_count++;.....i
3860: 66 20 28 63 68 69 6c 64 72 65 6e 29 20 7b 0a 09  f (children) {..
3870: 09 09 09 6e 6f 64 65 20 3d 20 28 76 6f 69 64 20  ...node = (void 
3880: 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f  *) ckalloc(sizeo
3890: 66 28 2a 6e 6f 64 65 29 29 3b 0a 09 09 09 09 6e  f(*node));.....n
38a0: 6f 64 65 2d 3e 5f 6e 65 78 74 20 3d 20 2a 63 68  ode->_next = *ch
38b0: 69 6c 64 72 65 6e 3b 0a 09 09 09 09 73 6e 70 72  ildren;.....snpr
38c0: 69 6e 74 66 28 6e 6f 64 65 2d 3e 6e 61 6d 65 2c  intf(node->name,
38d0: 20 73 69 7a 65 6f 66 28 6e 6f 64 65 2d 3e 6e 61   sizeof(node->na
38e0: 6d 65 29 2c 20 22 25 73 2d 25 73 22 2c 20 61 70  me), "%s-%s", ap
38f0: 70 66 73 5f 63 6f 6e 76 65 72 74 5f 6f 73 5f 74  pfs_convert_os_t
3900: 6f 53 74 72 69 6e 67 28 70 61 63 6b 61 67 65 2d  oString(package-
3910: 3e 6f 73 29 2c 20 61 70 70 66 73 5f 63 6f 6e 76  >os), appfs_conv
3920: 65 72 74 5f 63 70 75 41 72 63 68 5f 74 6f 53 74  ert_cpuArch_toSt
3930: 72 69 6e 67 28 70 61 63 6b 61 67 65 2d 3e 63 70  ring(package->cp
3940: 75 41 72 63 68 29 29 3b 0a 09 09 09 09 2a 63 68  uArch));.....*ch
3950: 69 6c 64 72 65 6e 20 3d 20 6e 6f 64 65 3b 0a 09  ildren = node;..
3960: 09 09 7d 0a 09 09 7d 0a 0a 09 09 61 70 70 66 73  ..}...}....appfs
3970: 5f 66 72 65 65 5f 6c 69 73 74 5f 70 61 63 6b 61  _free_list_packa
3980: 67 65 28 70 61 63 6b 61 67 65 73 29 3b 0a 0a 09  ge(packages);...
3990: 09 66 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a  .free(path_s);..
39a0: 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65  ..pathinfo->type
39b0: 69 6e 66 6f 2e 64 69 72 2e 63 68 69 6c 64 63 6f  info.dir.childco
39c0: 75 6e 74 20 3d 20 6f 73 5f 63 70 75 41 72 63 68  unt = os_cpuArch
39d0: 5f 63 6f 75 6e 74 3b 0a 0a 09 09 72 65 74 75 72  _count;....retur
39e0: 6e 28 30 29 3b 0a 09 7d 0a 0a 09 2a 6f 73 5f 63  n(0);..}...*os_c
39f0: 70 75 41 72 63 68 20 3d 20 27 5c 30 27 3b 0a 09  puArch = '\0';..
3a00: 6f 73 5f 63 70 75 41 72 63 68 2b 2b 3b 0a 0a 09  os_cpuArch++;...
3a10: 76 65 72 73 69 6f 6e 20 3d 20 73 74 72 63 68 72  version = strchr
3a20: 28 6f 73 5f 63 70 75 41 72 63 68 2c 20 27 2f 27  (os_cpuArch, '/'
3a30: 29 3b 0a 0a 09 69 66 20 28 76 65 72 73 69 6f 6e  );...if (version
3a40: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 76   != NULL) {...*v
3a50: 65 72 73 69 6f 6e 20 3d 20 27 5c 30 27 3b 0a 09  ersion = '\0';..
3a60: 09 76 65 72 73 69 6f 6e 2b 2b 3b 0a 09 7d 0a 0a  .version++;..}..
3a70: 09 6f 73 20 3d 20 6f 73 5f 63 70 75 41 72 63 68  .os = os_cpuArch
3a80: 3b 0a 09 63 70 75 41 72 63 68 20 3d 20 73 74 72  ;..cpuArch = str
3a90: 63 68 72 28 6f 73 5f 63 70 75 41 72 63 68 2c 20  chr(os_cpuArch, 
3aa0: 27 2d 27 29 3b 0a 09 69 66 20 28 63 70 75 41 72  '-');..if (cpuAr
3ab0: 63 68 29 20 7b 0a 09 09 2a 63 70 75 41 72 63 68  ch) {...*cpuArch
3ac0: 20 3d 20 27 5c 30 27 3b 0a 09 09 63 70 75 41 72   = '\0';...cpuAr
3ad0: 63 68 2b 2b 3b 0a 0a 09 09 63 70 75 41 72 63 68  ch++;....cpuArch
3ae0: 5f 76 61 6c 20 3d 20 61 70 70 66 73 5f 63 6f 6e  _val = appfs_con
3af0: 76 65 72 74 5f 63 70 75 41 72 63 68 5f 66 72 6f  vert_cpuArch_fro
3b00: 6d 53 74 72 69 6e 67 28 63 70 75 41 72 63 68 29  mString(cpuArch)
3b10: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 70  ;..} else {...cp
3b20: 75 41 72 63 68 5f 76 61 6c 20 3d 20 41 50 50 46  uArch_val = APPF
3b30: 53 5f 43 50 55 5f 55 4e 4b 4e 4f 57 4e 3b 0a 09  S_CPU_UNKNOWN;..
3b40: 7d 0a 0a 09 6f 73 5f 76 61 6c 20 3d 20 61 70 70  }...os_val = app
3b50: 66 73 5f 63 6f 6e 76 65 72 74 5f 6f 73 5f 66 72  fs_convert_os_fr
3b60: 6f 6d 53 74 72 69 6e 67 28 6f 73 29 3b 0a 0a 09  omString(os);...
3b70: 69 66 20 28 76 65 72 73 69 6f 6e 20 3d 3d 20 4e  if (version == N
3b80: 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 52 65 71 75  ULL) {.../* Requ
3b90: 65 73 74 20 66 6f 72 20 76 65 72 73 69 6f 6e 20  est for version 
3ba0: 6c 69 73 74 20 66 6f 72 20 61 20 70 61 63 6b 61  list for a packa
3bb0: 67 65 20 6f 6e 20 61 6e 20 4f 53 2f 43 50 55 20  ge on an OS/CPU 
3bc0: 2a 2f 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74  */...pathinfo->t
3bd0: 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54 48  ype = APPFS_PATH
3be0: 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a  TYPE_DIRECTORY;.
3bf0: 0a 09 09 76 65 72 73 69 6f 6e 5f 63 6f 75 6e 74  ...version_count
3c00: 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 70 61 63   = 0;...for (pac
3c10: 6b 61 67 65 20 3d 20 70 61 63 6b 61 67 65 73 3b  kage = packages;
3c20: 20 70 61 63 6b 61 67 65 3b 20 70 61 63 6b 61 67   package; packag
3c30: 65 20 3d 20 70 61 63 6b 61 67 65 2d 3e 5f 6e 65  e = package->_ne
3c40: 78 74 29 20 7b 0a 09 09 09 69 66 20 28 73 74 72  xt) {....if (str
3c50: 63 6d 70 28 70 61 63 6b 61 67 65 2d 3e 6e 61 6d  cmp(package->nam
3c60: 65 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65 29 20  e, packagename) 
3c70: 21 3d 20 30 29 20 7b 0a 09 09 09 09 41 50 50 46  != 0) {.....APPF
3c80: 53 5f 44 45 42 55 47 28 22 53 6b 69 70 70 69 6e  S_DEBUG("Skippin
3c90: 67 20 70 61 63 6b 61 67 65 20 6e 61 6d 65 64 20  g package named 
3ca0: 5c 22 25 73 5c 22 2c 20 64 6f 65 73 20 6e 6f 74  \"%s\", does not
3cb0: 20 6d 61 74 63 68 20 72 65 71 75 65 73 74 65 64   match requested
3cc0: 20 70 61 63 6b 61 67 65 3a 20 5c 22 25 73 5c 22   package: \"%s\"
3cd0: 22 2c 20 70 61 63 6b 61 67 65 2d 3e 6e 61 6d 65  ", package->name
3ce0: 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65 29 3b 0a  , packagename);.
3cf0: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
3d00: 09 09 7d 0a 0a 09 09 09 69 66 20 28 70 61 63 6b  ..}.....if (pack
3d10: 61 67 65 2d 3e 6f 73 20 21 3d 20 6f 73 5f 76 61  age->os != os_va
3d20: 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  l) {.....continu
3d30: 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  e;....}.....if (
3d40: 70 61 63 6b 61 67 65 2d 3e 63 70 75 41 72 63 68  package->cpuArch
3d50: 20 21 3d 20 63 70 75 41 72 63 68 5f 76 61 6c 29   != cpuArch_val)
3d60: 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
3d70: 0a 09 09 09 7d 0a 0a 09 09 09 76 65 72 73 69 6f  ....}.....versio
3d80: 6e 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 69  n_count++;.....i
3d90: 66 20 28 63 68 69 6c 64 72 65 6e 29 20 7b 0a 09  f (children) {..
3da0: 09 09 09 6e 6f 64 65 20 3d 20 28 76 6f 69 64 20  ...node = (void 
3db0: 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f  *) ckalloc(sizeo
3dc0: 66 28 2a 6e 6f 64 65 29 29 3b 0a 09 09 09 09 6e  f(*node));.....n
3dd0: 6f 64 65 2d 3e 5f 6e 65 78 74 20 3d 20 2a 63 68  ode->_next = *ch
3de0: 69 6c 64 72 65 6e 3b 0a 09 09 09 09 73 74 72 63  ildren;.....strc
3df0: 70 79 28 6e 6f 64 65 2d 3e 6e 61 6d 65 2c 20 70  py(node->name, p
3e00: 61 63 6b 61 67 65 2d 3e 76 65 72 73 69 6f 6e 29  ackage->version)
3e10: 3b 0a 09 09 09 09 2a 63 68 69 6c 64 72 65 6e 20  ;.....*children 
3e20: 3d 20 6e 6f 64 65 3b 0a 09 09 09 7d 0a 09 09 7d  = node;....}...}
3e30: 0a 0a 09 09 61 70 70 66 73 5f 66 72 65 65 5f 6c  ....appfs_free_l
3e40: 69 73 74 5f 70 61 63 6b 61 67 65 28 70 61 63 6b  ist_package(pack
3e50: 61 67 65 73 29 3b 0a 0a 09 09 66 72 65 65 28 70  ages);....free(p
3e60: 61 74 68 5f 73 29 3b 0a 0a 09 09 70 61 74 68 69  ath_s);....pathi
3e70: 6e 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 64 69  nfo->typeinfo.di
3e80: 72 2e 63 68 69 6c 64 63 6f 75 6e 74 20 3d 20 76  r.childcount = v
3e90: 65 72 73 69 6f 6e 5f 63 6f 75 6e 74 3b 0a 0a 09  ersion_count;...
3ea0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a  .return(0);..}..
3eb0: 09 61 70 70 66 73 5f 66 72 65 65 5f 6c 69 73 74  .appfs_free_list
3ec0: 5f 70 61 63 6b 61 67 65 28 70 61 63 6b 61 67 65  _package(package
3ed0: 73 29 3b 0a 0a 09 70 61 74 68 20 3d 20 73 74 72  s);...path = str
3ee0: 63 68 72 28 76 65 72 73 69 6f 6e 2c 20 27 2f 27  chr(version, '/'
3ef0: 29 3b 0a 09 69 66 20 28 70 61 74 68 20 3d 3d 20  );..if (path == 
3f00: 4e 55 4c 4c 29 20 7b 0a 09 09 70 61 74 68 20 3d  NULL) {...path =
3f10: 20 22 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09   "";..} else {..
3f20: 09 2a 70 61 74 68 20 3d 20 27 5c 30 27 3b 0a 09  .*path = '\0';..
3f30: 09 70 61 74 68 2b 2b 3b 0a 09 7d 0a 0a 09 2f 2a  .path++;..}.../*
3f40: 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 66   Request for a f
3f50: 69 6c 65 20 69 6e 20 61 20 73 70 65 63 69 66 69  ile in a specifi
3f60: 63 20 70 61 63 6b 61 67 65 20 2a 2f 0a 09 41 50  c package */..AP
3f70: 50 46 53 5f 44 45 42 55 47 28 22 52 65 71 75 65  PFS_DEBUG("Reque
3f80: 73 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  sting informatio
3f90: 6e 20 66 6f 72 20 68 6f 73 74 6e 61 6d 65 20 3d  n for hostname =
3fa0: 20 25 73 2c 20 70 61 63 6b 61 67 65 20 3d 20 25   %s, package = %
3fb0: 73 2c 20 6f 73 20 3d 20 25 73 2c 20 63 70 75 41  s, os = %s, cpuA
3fc0: 72 63 68 20 3d 20 25 73 2c 20 76 65 72 73 69 6f  rch = %s, versio
3fd0: 6e 20 3d 20 25 73 2c 20 70 61 74 68 20 3d 20 25  n = %s, path = %
3fe0: 73 22 2c 20 0a 09 09 68 6f 73 74 6e 61 6d 65 2c  s", ...hostname,
3ff0: 20 70 61 63 6b 61 67 65 6e 61 6d 65 2c 20 6f 73   packagename, os
4000: 2c 20 63 70 75 41 72 63 68 2c 20 76 65 72 73 69  , cpuArch, versi
4010: 6f 6e 2c 20 70 61 74 68 0a 09 29 3b 0a 0a 09 70  on, path..);...p
4020: 61 63 6b 61 67 65 5f 68 61 73 68 20 3d 20 61 70  ackage_hash = ap
4030: 70 66 73 5f 6c 6f 6f 6b 75 70 5f 70 61 63 6b 61  pfs_lookup_packa
4040: 67 65 5f 68 61 73 68 28 68 6f 73 74 6e 61 6d 65  ge_hash(hostname
4050: 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65 2c 20 6f  , packagename, o
4060: 73 5f 76 61 6c 2c 20 63 70 75 41 72 63 68 5f 76  s_val, cpuArch_v
4070: 61 6c 2c 20 76 65 72 73 69 6f 6e 29 3b 0a 09 69  al, version);..i
4080: 66 20 28 70 61 63 6b 61 67 65 5f 68 61 73 68 20  f (package_hash 
4090: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65  == NULL) {...fre
40a0: 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09 09 72 65  e(path_s);....re
40b0: 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b 0a 09  turn(-ENOENT);..
40c0: 7d 0a 0a 09 41 50 50 46 53 5f 44 45 42 55 47 28  }...APPFS_DEBUG(
40d0: 22 20 20 2e 2e 2e 20 77 68 69 63 68 20 68 61 73  "  ... which has
40e0: 68 20 61 20 68 61 73 68 20 6f 66 20 25 73 22 2c  h a hash of %s",
40f0: 20 70 61 63 6b 61 67 65 5f 68 61 73 68 29 3b 0a   package_hash);.
4100: 0a 09 69 66 20 28 73 74 72 63 6d 70 28 70 61 74  ..if (strcmp(pat
4110: 68 2c 20 22 22 29 20 3d 3d 20 30 29 20 7b 0a 09  h, "") == 0) {..
4120: 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 20  .pathinfo->type 
4130: 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  = APPFS_PATHTYPE
4140: 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09 7d 20 65  _DIRECTORY;..} e
4150: 6c 73 65 20 7b 0a 09 09 66 69 6c 65 69 6e 66 6f  lse {...fileinfo
4160: 5f 72 65 74 20 3d 20 61 70 70 66 73 5f 67 65 74  _ret = appfs_get
4170: 66 69 6c 65 69 6e 66 6f 28 68 6f 73 74 6e 61 6d  fileinfo(hostnam
4180: 65 2c 20 70 61 63 6b 61 67 65 5f 68 61 73 68 2c  e, package_hash,
4190: 20 70 61 74 68 2c 20 70 61 74 68 69 6e 66 6f 29   path, pathinfo)
41a0: 3b 0a 09 09 69 66 20 28 66 69 6c 65 69 6e 66 6f  ;...if (fileinfo
41b0: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
41c0: 66 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09  free(path_s);...
41d0: 09 09 72 65 74 75 72 6e 28 66 69 6c 65 69 6e 66  ..return(fileinf
41e0: 6f 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  o_ret);...}..}..
41f0: 09 69 66 20 28 70 61 74 68 69 6e 66 6f 2d 3e 74  .if (pathinfo->t
4200: 79 70 65 20 3d 3d 20 41 50 50 46 53 5f 50 41 54  ype == APPFS_PAT
4210: 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 29  HTYPE_DIRECTORY)
4220: 20 7b 0a 09 09 64 69 72 5f 63 68 69 6c 64 72 65   {...dir_childre
4230: 6e 20 3d 20 61 70 70 66 73 5f 67 65 74 63 68 69  n = appfs_getchi
4240: 6c 64 72 65 6e 28 68 6f 73 74 6e 61 6d 65 2c 20  ldren(hostname, 
4250: 70 61 63 6b 61 67 65 5f 68 61 73 68 2c 20 70 61  package_hash, pa
4260: 74 68 2c 20 26 66 69 6c 65 73 5f 63 6f 75 6e 74  th, &files_count
4270: 29 3b 0a 0a 09 09 69 66 20 28 64 69 72 5f 63 68  );....if (dir_ch
4280: 69 6c 64 72 65 6e 20 21 3d 20 4e 55 4c 4c 29 20  ildren != NULL) 
4290: 7b 0a 09 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74  {....pathinfo->t
42a0: 79 70 65 69 6e 66 6f 2e 64 69 72 2e 63 68 69 6c  ypeinfo.dir.chil
42b0: 64 63 6f 75 6e 74 20 3d 20 66 69 6c 65 73 5f 63  dcount = files_c
42c0: 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  ount;...}....if 
42d0: 28 63 68 69 6c 64 72 65 6e 29 20 7b 0a 09 09 09  (children) {....
42e0: 2a 63 68 69 6c 64 72 65 6e 20 3d 20 64 69 72 5f  *children = dir_
42f0: 63 68 69 6c 64 72 65 6e 3b 0a 09 09 7d 0a 09 7d  children;...}..}
4300: 0a 0a 09 66 72 65 65 28 70 61 74 68 5f 73 29 3b  ...free(path_s);
4310: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
4320: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
4330: 73 5f 66 75 73 65 5f 67 65 74 61 74 74 72 28 63  s_fuse_getattr(c
4340: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
4350: 20 73 74 72 75 63 74 20 73 74 61 74 20 2a 73 74   struct stat *st
4360: 62 75 66 29 20 7b 0a 09 73 74 72 75 63 74 20 61  buf) {..struct a
4370: 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20 70 61  ppfs_pathinfo pa
4380: 74 68 69 6e 66 6f 3b 0a 09 69 6e 74 20 72 65 73  thinfo;..int res
4390: 20 3d 20 30 3b 0a 0a 09 41 50 50 46 53 5f 44 45   = 0;...APPFS_DE
43a0: 42 55 47 28 22 45 6e 74 65 72 20 28 70 61 74 68  BUG("Enter (path
43b0: 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c 20 70 61   = %s, ...)", pa
43c0: 74 68 29 3b 0a 0a 09 72 65 73 20 3d 20 61 70 70  th);...res = app
43d0: 66 73 5f 67 65 74 5f 70 61 74 68 5f 69 6e 66 6f  fs_get_path_info
43e0: 28 70 61 74 68 2c 20 26 70 61 74 68 69 6e 66 6f  (path, &pathinfo
43f0: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 72 65  , NULL);..if (re
4400: 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  s != 0) {...retu
4410: 72 6e 28 72 65 73 29 3b 0a 09 7d 0a 0a 09 6d 65  rn(res);..}...me
4420: 6d 73 65 74 28 73 74 62 75 66 2c 20 30 2c 20 73  mset(stbuf, 0, s
4430: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61  izeof(struct sta
4440: 74 29 29 3b 0a 0a 09 73 74 62 75 66 2d 3e 73 74  t));...stbuf->st
4450: 5f 6d 74 69 6d 65 20 3d 20 70 61 74 68 69 6e 66  _mtime = pathinf
4460: 6f 2e 74 69 6d 65 3b 0a 09 73 74 62 75 66 2d 3e  o.time;..stbuf->
4470: 73 74 5f 63 74 69 6d 65 20 3d 20 70 61 74 68 69  st_ctime = pathi
4480: 6e 66 6f 2e 74 69 6d 65 3b 0a 09 73 74 62 75 66  nfo.time;..stbuf
4490: 2d 3e 73 74 5f 61 74 69 6d 65 20 3d 20 70 61 74  ->st_atime = pat
44a0: 68 69 6e 66 6f 2e 74 69 6d 65 3b 0a 0a 09 69 66  hinfo.time;...if
44b0: 20 28 70 61 74 68 69 6e 66 6f 2e 74 79 70 65 20   (pathinfo.type 
44c0: 3d 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59 50  == APPFS_PATHTYP
44d0: 45 5f 44 49 52 45 43 54 4f 52 59 29 20 7b 0a 09  E_DIRECTORY) {..
44e0: 09 73 74 62 75 66 2d 3e 73 74 5f 6d 6f 64 65 20  .stbuf->st_mode 
44f0: 3d 20 53 5f 49 46 44 49 52 20 7c 20 30 37 35 35  = S_IFDIR | 0755
4500: 3b 0a 09 09 73 74 62 75 66 2d 3e 73 74 5f 6e 6c  ;...stbuf->st_nl
4510: 69 6e 6b 20 3d 20 32 20 2b 20 70 61 74 68 69 6e  ink = 2 + pathin
4520: 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 64 69 72 2e  fo.typeinfo.dir.
4530: 63 68 69 6c 64 63 6f 75 6e 74 3b 0a 09 7d 20 65  childcount;..} e
4540: 6c 73 65 20 7b 0a 09 09 69 66 20 28 70 61 74 68  lse {...if (path
4550: 69 6e 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 66 69  info.typeinfo.fi
4560: 6c 65 2e 65 78 65 63 75 74 61 62 6c 65 29 20 7b  le.executable) {
4570: 0a 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 6d 6f  ....stbuf->st_mo
4580: 64 65 20 3d 20 53 5f 49 46 52 45 47 20 7c 20 30  de = S_IFREG | 0
4590: 37 35 35 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  755;...} else {.
45a0: 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 6d 6f 64  ...stbuf->st_mod
45b0: 65 20 3d 20 53 5f 49 46 52 45 47 20 7c 20 30 36  e = S_IFREG | 06
45c0: 34 34 3b 0a 09 09 7d 0a 0a 09 09 73 74 62 75 66  44;...}....stbuf
45d0: 2d 3e 73 74 5f 6e 6c 69 6e 6b 20 3d 20 31 3b 0a  ->st_nlink = 1;.
45e0: 09 09 73 74 62 75 66 2d 3e 73 74 5f 73 69 7a 65  ..stbuf->st_size
45f0: 20 3d 20 70 61 74 68 69 6e 66 6f 2e 74 79 70 65   = pathinfo.type
4600: 69 6e 66 6f 2e 66 69 6c 65 2e 73 69 7a 65 3b 0a  info.file.size;.
4610: 09 7d 0a 0a 09 72 65 74 75 72 6e 20 72 65 73 3b  .}...return res;
4620: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
4630: 70 70 66 73 5f 66 75 73 65 5f 72 65 61 64 64 69  ppfs_fuse_readdi
4640: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  r(const char *pa
4650: 74 68 2c 20 76 6f 69 64 20 2a 62 75 66 2c 20 66  th, void *buf, f
4660: 75 73 65 5f 66 69 6c 6c 5f 64 69 72 5f 74 20 66  use_fill_dir_t f
4670: 69 6c 6c 65 72 2c 20 6f 66 66 5f 74 20 6f 66 66  iller, off_t off
4680: 73 65 74 2c 20 73 74 72 75 63 74 20 66 75 73 65  set, struct fuse
4690: 5f 66 69 6c 65 5f 69 6e 66 6f 20 2a 66 69 29 20  _file_info *fi) 
46a0: 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f  {..struct appfs_
46b0: 70 61 74 68 69 6e 66 6f 20 70 61 74 68 69 6e 66  pathinfo pathinf
46c0: 6f 3b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73  o;..struct appfs
46d0: 5f 63 68 69 6c 64 72 65 6e 20 2a 63 68 69 6c 64  _children *child
46e0: 72 65 6e 2c 20 2a 63 68 69 6c 64 3b 0a 09 69 6e  ren, *child;..in
46f0: 74 20 72 65 73 3b 0a 0a 09 41 50 50 46 53 5f 44  t res;...APPFS_D
4700: 45 42 55 47 28 22 45 6e 74 65 72 20 28 70 61 74  EBUG("Enter (pat
4710: 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c 20 70  h = %s, ...)", p
4720: 61 74 68 29 3b 0a 0a 09 72 65 73 20 3d 20 61 70  ath);...res = ap
4730: 70 66 73 5f 67 65 74 5f 70 61 74 68 5f 69 6e 66  pfs_get_path_inf
4740: 6f 28 70 61 74 68 2c 20 26 70 61 74 68 69 6e 66  o(path, &pathinf
4750: 6f 2c 20 26 63 68 69 6c 64 72 65 6e 29 3b 0a 09  o, &children);..
4760: 69 66 20 28 72 65 73 20 21 3d 20 30 29 20 7b 0a  if (res != 0) {.
4770: 09 09 72 65 74 75 72 6e 28 72 65 73 29 3b 0a 09  ..return(res);..
4780: 7d 0a 0a 09 66 69 6c 6c 65 72 28 62 75 66 2c 20  }...filler(buf, 
4790: 22 2e 22 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09  ".", NULL, 0);..
47a0: 66 69 6c 6c 65 72 28 62 75 66 2c 20 22 2e 2e 22  filler(buf, ".."
47b0: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 66 6f  , NULL, 0);...fo
47c0: 72 20 28 63 68 69 6c 64 20 3d 20 63 68 69 6c 64  r (child = child
47d0: 72 65 6e 3b 20 63 68 69 6c 64 3b 20 63 68 69 6c  ren; child; chil
47e0: 64 20 3d 20 63 68 69 6c 64 2d 3e 5f 6e 65 78 74  d = child->_next
47f0: 29 20 7b 0a 09 09 66 69 6c 6c 65 72 28 62 75 66  ) {...filler(buf
4800: 2c 20 63 68 69 6c 64 2d 3e 6e 61 6d 65 2c 20 4e  , child->name, N
4810: 55 4c 4c 2c 20 30 29 3b 0a 09 7d 0a 0a 09 61 70  ULL, 0);..}...ap
4820: 70 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f 63 68  pfs_free_list_ch
4830: 69 6c 64 72 65 6e 28 63 68 69 6c 64 72 65 6e 29  ildren(children)
4840: 3b 0a 0a 09 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;...return 0;.}.
4850: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
4860: 73 5f 66 75 73 65 5f 6f 70 65 6e 28 63 6f 6e 73  s_fuse_open(cons
4870: 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74  t char *path, st
4880: 72 75 63 74 20 66 75 73 65 5f 66 69 6c 65 5f 69  ruct fuse_file_i
4890: 6e 66 6f 20 2a 66 69 29 20 7b 0a 09 72 65 74 75  nfo *fi) {..retu
48a0: 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b 0a 7d 0a 0a  rn(-ENOENT);.}..
48b0: 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66 73  static int appfs
48c0: 5f 66 75 73 65 5f 72 65 61 64 28 63 6f 6e 73 74  _fuse_read(const
48d0: 20 63 68 61 72 20 2a 70 61 74 68 2c 20 63 68 61   char *path, cha
48e0: 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 73  r *buf, size_t s
48f0: 69 7a 65 2c 20 6f 66 66 5f 74 20 6f 66 66 73 65  ize, off_t offse
4900: 74 2c 20 73 74 72 75 63 74 20 66 75 73 65 5f 66  t, struct fuse_f
4910: 69 6c 65 5f 69 6e 66 6f 20 2a 66 69 29 20 7b 0a  ile_info *fi) {.
4920: 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29  .return(-ENOENT)
4930: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 41 50 50 46  ;.}..#ifdef APPF
4940: 53 5f 54 45 53 54 5f 44 52 49 56 45 52 0a 73 74  S_TEST_DRIVER.st
4950: 61 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f 74  atic int appfs_t
4960: 65 73 74 5f 64 72 69 76 65 72 28 76 6f 69 64 29  est_driver(void)
4970: 20 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73   {..struct appfs
4980: 5f 73 69 74 65 20 2a 73 69 74 65 73 2c 20 2a 73  _site *sites, *s
4990: 69 74 65 3b 0a 09 73 74 72 75 63 74 20 61 70 70  ite;..struct app
49a0: 66 73 5f 70 61 63 6b 61 67 65 20 2a 70 61 63 6b  fs_package *pack
49b0: 61 67 65 73 2c 20 2a 70 61 63 6b 61 67 65 3b 0a  ages, *package;.
49c0: 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 63 68  .struct appfs_ch
49d0: 69 6c 64 72 65 6e 20 2a 66 69 6c 65 73 2c 20 2a  ildren *files, *
49e0: 66 69 6c 65 3b 0a 09 63 68 61 72 20 2a 73 68 61  file;..char *sha
49f0: 31 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 70  1 = NULL;..int p
4a00: 61 63 6b 61 67 65 73 5f 63 6f 75 6e 74 20 3d 20  ackages_count = 
4a10: 30 2c 20 73 69 74 65 73 5f 63 6f 75 6e 74 20 3d  0, sites_count =
4a20: 20 30 2c 20 66 69 6c 65 73 5f 63 6f 75 6e 74 3b   0, files_count;
4a30: 0a 0a 09 73 69 74 65 73 20 3d 20 61 70 70 66 73  ...sites = appfs
4a40: 5f 67 65 74 73 69 74 65 73 28 26 73 69 74 65 73  _getsites(&sites
4a50: 5f 63 6f 75 6e 74 29 3b 0a 09 70 72 69 6e 74 66  _count);..printf
4a60: 28 22 53 69 74 65 73 3a 5c 6e 22 29 3b 0a 09 66  ("Sites:\n");..f
4a70: 6f 72 20 28 73 69 74 65 20 3d 20 73 69 74 65 73  or (site = sites
4a80: 3b 20 73 69 74 65 3b 20 73 69 74 65 20 3d 20 73  ; site; site = s
4a90: 69 74 65 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  ite->_next) {...
4aa0: 70 72 69 6e 74 66 28 22 5c 74 6e 61 6d 65 20 3d  printf("\tname =
4ab0: 20 25 73 5c 6e 22 2c 20 73 69 74 65 2d 3e 6e 61   %s\n", site->na
4ac0: 6d 65 29 3b 0a 09 7d 0a 0a 09 61 70 70 66 73 5f  me);..}...appfs_
4ad0: 66 72 65 65 5f 6c 69 73 74 5f 73 69 74 65 28 73  free_list_site(s
4ae0: 69 74 65 73 29 3b 0a 0a 09 70 61 63 6b 61 67 65  ites);...package
4af0: 73 20 3d 20 61 70 70 66 73 5f 67 65 74 69 6e 64  s = appfs_getind
4b00: 65 78 28 22 72 6b 65 65 6e 65 2e 6f 72 67 22 2c  ex("rkeene.org",
4b10: 20 26 70 61 63 6b 61 67 65 73 5f 63 6f 75 6e 74   &packages_count
4b20: 29 3b 0a 09 69 66 20 28 70 61 63 6b 61 67 65 73  );..if (packages
4b30: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 61 63 6b   == NULL || pack
4b40: 61 67 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29  ages_count == 0)
4b50: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64   {...fprintf(std
4b60: 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20  err, "Unable to 
4b70: 66 65 74 63 68 20 70 61 63 6b 61 67 65 20 69 6e  fetch package in
4b80: 64 65 78 20 66 72 6f 6d 20 72 6b 65 65 6e 65 2e  dex from rkeene.
4b90: 6f 72 67 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74  org.\n");....ret
4ba0: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72  urn(1);..}...for
4bb0: 20 28 70 61 63 6b 61 67 65 20 3d 20 70 61 63 6b   (package = pack
4bc0: 61 67 65 73 3b 20 70 61 63 6b 61 67 65 3b 20 70  ages; package; p
4bd0: 61 63 6b 61 67 65 20 3d 20 70 61 63 6b 61 67 65  ackage = package
4be0: 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 73 68 61  ->_next) {...sha
4bf0: 31 20 3d 20 70 61 63 6b 61 67 65 2d 3e 73 68 61  1 = package->sha
4c00: 31 3b 0a 0a 09 09 70 72 69 6e 74 66 28 22 50 61  1;....printf("Pa
4c10: 63 6b 61 67 65 3a 5c 6e 5c 74 6e 61 6d 65 20 3d  ckage:\n\tname =
4c20: 20 25 73 5c 6e 5c 74 76 65 72 73 69 6f 6e 20 3d   %s\n\tversion =
4c30: 20 25 73 5c 6e 5c 74 73 68 61 31 20 3d 20 25 73   %s\n\tsha1 = %s
4c40: 5c 6e 5c 74 6f 73 20 3d 20 25 73 5c 6e 5c 74 63  \n\tos = %s\n\tc
4c50: 70 75 41 72 63 68 20 3d 20 25 73 5c 6e 22 2c 0a  puArch = %s\n",.
4c60: 09 09 09 70 61 63 6b 61 67 65 2d 3e 6e 61 6d 65  ...package->name
4c70: 2c 0a 09 09 09 70 61 63 6b 61 67 65 2d 3e 76 65  ,....package->ve
4c80: 72 73 69 6f 6e 2c 0a 09 09 09 70 61 63 6b 61 67  rsion,....packag
4c90: 65 2d 3e 73 68 61 31 2c 0a 09 09 09 61 70 70 66  e->sha1,....appf
4ca0: 73 5f 63 6f 6e 76 65 72 74 5f 6f 73 5f 74 6f 53  s_convert_os_toS
4cb0: 74 72 69 6e 67 28 70 61 63 6b 61 67 65 2d 3e 6f  tring(package->o
4cc0: 73 29 2c 0a 09 09 09 61 70 70 66 73 5f 63 6f 6e  s),....appfs_con
4cd0: 76 65 72 74 5f 63 70 75 41 72 63 68 5f 74 6f 53  vert_cpuArch_toS
4ce0: 74 72 69 6e 67 28 70 61 63 6b 61 67 65 2d 3e 63  tring(package->c
4cf0: 70 75 41 72 63 68 29 0a 09 09 29 3b 0a 09 7d 0a  puArch)...);..}.
4d00: 0a 09 66 69 6c 65 73 20 3d 20 61 70 70 66 73 5f  ..files = appfs_
4d10: 67 65 74 63 68 69 6c 64 72 65 6e 28 22 72 6b 65  getchildren("rke
4d20: 65 6e 65 2e 6f 72 67 22 2c 20 73 68 61 31 2c 20  ene.org", sha1, 
4d30: 22 22 2c 20 26 66 69 6c 65 73 5f 63 6f 75 6e 74  "", &files_count
4d40: 29 3b 0a 09 69 66 20 28 66 69 6c 65 73 20 3d 3d  );..if (files ==
4d50: 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e   NULL) {...fprin
4d60: 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62  tf(stderr, "Unab
4d70: 6c 65 20 74 6f 20 6c 69 73 74 20 66 69 6c 65 73  le to list files
4d80: 20 69 6e 20 74 68 65 20 6c 61 73 74 20 70 61 63   in the last pac
4d90: 6b 61 67 65 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65  kage.\n");....re
4da0: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 70 72  turn(1);..}...pr
4db0: 69 6e 74 66 28 22 46 69 6c 65 73 3a 5c 6e 22 29  intf("Files:\n")
4dc0: 3b 0a 09 66 6f 72 20 28 66 69 6c 65 20 3d 20 66  ;..for (file = f
4dd0: 69 6c 65 73 3b 20 66 69 6c 65 3b 20 66 69 6c 65  iles; file; file
4de0: 20 3d 20 66 69 6c 65 2d 3e 5f 6e 65 78 74 29 20   = file->_next) 
4df0: 7b 0a 09 09 70 72 69 6e 74 66 28 22 5c 74 25 73  {...printf("\t%s
4e00: 5c 6e 22 2c 20 66 69 6c 65 2d 3e 6e 61 6d 65 29  \n", file->name)
4e10: 3b 0a 09 7d 0a 0a 09 61 70 70 66 73 5f 66 72 65  ;..}...appfs_fre
4e20: 65 5f 6c 69 73 74 5f 63 68 69 6c 64 72 65 6e 28  e_list_children(
4e30: 66 69 6c 65 73 29 3b 0a 0a 09 66 69 6c 65 73 20  files);...files 
4e40: 3d 20 61 70 70 66 73 5f 67 65 74 63 68 69 6c 64  = appfs_getchild
4e50: 72 65 6e 28 22 72 6b 65 65 6e 65 2e 6f 72 67 22  ren("rkeene.org"
4e60: 2c 20 73 68 61 31 2c 20 22 74 63 6c 22 2c 20 26  , sha1, "tcl", &
4e70: 66 69 6c 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 69  files_count);..i
4e80: 66 20 28 66 69 6c 65 73 20 3d 3d 20 4e 55 4c 4c  f (files == NULL
4e90: 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74  ) {...fprintf(st
4ea0: 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f  derr, "Unable to
4eb0: 20 6c 69 73 74 20 66 69 6c 65 73 20 69 6e 20 74   list files in t
4ec0: 68 65 20 6c 61 73 74 20 70 61 63 6b 61 67 65 2e  he last package.
4ed0: 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  \n");....return(
4ee0: 31 29 3b 0a 09 7d 0a 0a 09 70 72 69 6e 74 66 28  1);..}...printf(
4ef0: 22 46 69 6c 65 73 3a 5c 6e 22 29 3b 0a 09 66 6f  "Files:\n");..fo
4f00: 72 20 28 66 69 6c 65 20 3d 20 66 69 6c 65 73 3b  r (file = files;
4f10: 20 66 69 6c 65 3b 20 66 69 6c 65 20 3d 20 66 69   file; file = fi
4f20: 6c 65 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 70  le->_next) {...p
4f30: 72 69 6e 74 66 28 22 5c 74 74 63 6c 2f 25 73 5c  rintf("\ttcl/%s\
4f40: 6e 22 2c 20 66 69 6c 65 2d 3e 6e 61 6d 65 29 3b  n", file->name);
4f50: 0a 09 7d 0a 0a 09 61 70 70 66 73 5f 66 72 65 65  ..}...appfs_free
4f60: 5f 6c 69 73 74 5f 63 68 69 6c 64 72 65 6e 28 66  _list_children(f
4f70: 69 6c 65 73 29 3b 0a 09 61 70 70 66 73 5f 66 72  iles);..appfs_fr
4f80: 65 65 5f 6c 69 73 74 5f 70 61 63 6b 61 67 65 28  ee_list_package(
4f90: 70 61 63 6b 61 67 65 73 29 3b 0a 0a 09 72 65 74  packages);...ret
4fa0: 75 72 6e 28 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a  urn(0);.}.#else.
4fb0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 66 75  static struct fu
4fc0: 73 65 5f 6f 70 65 72 61 74 69 6f 6e 73 20 61 70  se_operations ap
4fd0: 70 66 73 5f 6f 70 65 72 20 3d 20 7b 0a 09 2e 67  pfs_oper = {...g
4fe0: 65 74 61 74 74 72 09 3d 20 61 70 70 66 73 5f 66  etattr.= appfs_f
4ff0: 75 73 65 5f 67 65 74 61 74 74 72 2c 0a 09 2e 72  use_getattr,...r
5000: 65 61 64 64 69 72 09 3d 20 61 70 70 66 73 5f 66  eaddir.= appfs_f
5010: 75 73 65 5f 72 65 61 64 64 69 72 2c 0a 09 2e 6f  use_readdir,...o
5020: 70 65 6e 09 09 3d 20 61 70 70 66 73 5f 66 75 73  pen..= appfs_fus
5030: 65 5f 6f 70 65 6e 2c 0a 09 2e 72 65 61 64 09 09  e_open,...read..
5040: 3d 20 61 70 70 66 73 5f 66 75 73 65 5f 72 65 61  = appfs_fuse_rea
5050: 64 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 69 6e 74  d.};.#endif..int
5060: 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
5070: 63 68 61 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09  char **argv) {..
5080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 61 63 68  const char *cach
5090: 65 64 69 72 20 3d 20 41 50 50 46 53 5f 43 41 43  edir = APPFS_CAC
50a0: 48 45 44 49 52 3b 0a 09 63 68 61 72 20 64 62 66  HEDIR;..char dbf
50b0: 69 6c 65 6e 61 6d 65 5b 31 30 32 34 5d 3b 0a 09  ilename[1024];..
50c0: 69 6e 74 20 74 63 6c 5f 72 65 74 2c 20 73 6e 70  int tcl_ret, snp
50d0: 72 69 6e 74 66 5f 72 65 74 2c 20 73 71 6c 69 74  rintf_ret, sqlit
50e0: 65 5f 72 65 74 3b 0a 0a 09 67 6c 6f 62 61 6c 54  e_ret;...globalT
50f0: 68 72 65 61 64 2e 69 6e 74 65 72 70 20 3d 20 54  hread.interp = T
5100: 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28  cl_CreateInterp(
5110: 29 3b 0a 09 69 66 20 28 67 6c 6f 62 61 6c 54 68  );..if (globalTh
5120: 72 65 61 64 2e 69 6e 74 65 72 70 20 3d 3d 20 4e  read.interp == N
5130: 55 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  ULL) {...fprintf
5140: 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65  (stderr, "Unable
5150: 20 74 6f 20 63 72 65 61 74 65 20 54 63 6c 20 49   to create Tcl I
5160: 6e 74 65 72 70 72 65 74 65 72 2e 20 20 41 62 6f  nterpreter.  Abo
5170: 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 0a 09 09 72  rting.\n");....r
5180: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 74  eturn(1);..}...t
5190: 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 49 6e 69  cl_ret = Tcl_Ini
51a0: 74 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 69  t(globalThread.i
51b0: 6e 74 65 72 70 29 3b 0a 09 69 66 20 28 74 63 6c  nterp);..if (tcl
51c0: 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  _ret != TCL_OK) 
51d0: 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65  {...fprintf(stde
51e0: 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 69  rr, "Unable to i
51f0: 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 2e 20 20  nitialize Tcl.  
5200: 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 0a  Aborting.\n");..
5210: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
5220: 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f  ..tcl_ret = Tcl_
5230: 45 76 61 6c 28 67 6c 6f 62 61 6c 54 68 72 65 61  Eval(globalThrea
5240: 64 2e 69 6e 74 65 72 70 2c 20 22 22 0a 23 69 6e  d.interp, "".#in
5250: 63 6c 75 64 65 20 22 61 70 70 66 73 2e 74 63 6c  clude "appfs.tcl
5260: 2e 68 22 0a 09 22 22 29 3b 0a 09 69 66 20 28 74  .h".."");..if (t
5270: 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b  cl_ret != TCL_OK
5280: 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74  ) {...fprintf(st
5290: 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f  derr, "Unable to
52a0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20   initialize Tcl 
52b0: 41 70 70 46 53 20 73 63 72 69 70 74 2e 20 20 41  AppFS script.  A
52c0: 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 09 09  borting.\n");...
52d0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
52e0: 22 54 63 6c 20 45 72 72 6f 72 20 69 73 3a 20 25  "Tcl Error is: %
52f0: 73 5c 6e 22 2c 20 54 63 6c 5f 47 65 74 53 74 72  s\n", Tcl_GetStr
5300: 69 6e 67 52 65 73 75 6c 74 28 67 6c 6f 62 61 6c  ingResult(global
5310: 54 68 72 65 61 64 2e 69 6e 74 65 72 70 29 29 3b  Thread.interp));
5320: 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
5330: 7d 0a 0a 09 69 66 20 28 54 63 6c 5f 53 65 74 56  }...if (Tcl_SetV
5340: 61 72 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e  ar(globalThread.
5350: 69 6e 74 65 72 70 2c 20 22 3a 3a 61 70 70 66 73  interp, "::appfs
5360: 3a 3a 63 61 63 68 65 64 69 72 22 2c 20 63 61 63  ::cachedir", cac
5370: 68 65 64 69 72 2c 20 54 43 4c 5f 47 4c 4f 42 41  hedir, TCL_GLOBA
5380: 4c 5f 4f 4e 4c 59 29 20 3d 3d 20 4e 55 4c 4c 29  L_ONLY) == NULL)
5390: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64   {...fprintf(std
53a0: 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20  err, "Unable to 
53b0: 73 65 74 20 63 61 63 68 65 20 64 69 72 65 63 74  set cache direct
53c0: 6f 72 79 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  ory.  This shoul
53d0: 64 20 6e 65 76 65 72 20 66 61 69 6c 2e 5c 6e 22  d never fail.\n"
53e0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
53f0: 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20  ..}...tcl_ret = 
5400: 61 70 70 66 73 5f 54 63 6c 5f 45 76 61 6c 28 67  appfs_Tcl_Eval(g
5410: 6c 6f 62 61 6c 54 68 72 65 61 64 2e 69 6e 74 65  lobalThread.inte
5420: 72 70 2c 20 31 2c 20 22 3a 3a 61 70 70 66 73 3a  rp, 1, "::appfs:
5430: 3a 69 6e 69 74 22 29 3b 0a 09 69 66 20 28 74 63  :init");..if (tc
5440: 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29  l_ret != TCL_OK)
5450: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64   {...fprintf(std
5460: 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20  err, "Unable to 
5470: 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 41  initialize Tcl A
5480: 70 70 46 53 20 73 63 72 69 70 74 20 28 3a 3a 61  ppFS script (::a
5490: 70 70 66 73 3a 3a 69 6e 69 74 29 2e 20 20 41 62  ppfs::init).  Ab
54a0: 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 09 09 66  orting.\n");...f
54b0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
54c0: 54 63 6c 20 45 72 72 6f 72 20 69 73 3a 20 25 73  Tcl Error is: %s
54d0: 5c 6e 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  \n", Tcl_GetStri
54e0: 6e 67 52 65 73 75 6c 74 28 67 6c 6f 62 61 6c 54  ngResult(globalT
54f0: 68 72 65 61 64 2e 69 6e 74 65 72 70 29 29 3b 0a  hread.interp));.
5500: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
5510: 0a 0a 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20  ...snprintf_ret 
5520: 3d 20 73 6e 70 72 69 6e 74 66 28 64 62 66 69 6c  = snprintf(dbfil
5530: 65 6e 61 6d 65 2c 20 73 69 7a 65 6f 66 28 64 62  ename, sizeof(db
5540: 66 69 6c 65 6e 61 6d 65 29 2c 20 22 25 73 2f 25  filename), "%s/%
5550: 73 22 2c 20 63 61 63 68 65 64 69 72 2c 20 22 63  s", cachedir, "c
5560: 61 63 68 65 2e 64 62 22 29 3b 0a 09 69 66 20 28  ache.db");..if (
5570: 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3e 3d 20  snprintf_ret >= 
5580: 73 69 7a 65 6f 66 28 64 62 66 69 6c 65 6e 61 6d  sizeof(dbfilenam
5590: 65 29 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  e)) {...fprintf(
55a0: 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20  stderr, "Unable 
55b0: 74 6f 20 73 65 74 20 64 61 74 61 62 61 73 65 20  to set database 
55c0: 66 69 6c 65 6e 61 6d 65 2e 20 20 41 62 6f 72 74  filename.  Abort
55d0: 69 6e 67 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74  ing.\n");....ret
55e0: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 71 6c  urn(1);..}...sql
55f0: 69 74 65 5f 72 65 74 20 3d 20 73 71 6c 69 74 65  ite_ret = sqlite
5600: 33 5f 6f 70 65 6e 28 64 62 66 69 6c 65 6e 61 6d  3_open(dbfilenam
5610: 65 2c 20 26 67 6c 6f 62 61 6c 54 68 72 65 61 64  e, &globalThread
5620: 2e 64 62 29 3b 0a 09 69 66 20 28 73 71 6c 69 74  .db);..if (sqlit
5630: 65 5f 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f  e_ret != SQLITE_
5640: 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  OK) {...fprintf(
5650: 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20  stderr, "Unable 
5660: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
5670: 3a 20 25 73 5c 6e 22 2c 20 64 62 66 69 6c 65 6e  : %s\n", dbfilen
5680: 61 6d 65 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ame);....return(
5690: 31 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 41  1);..}..#ifdef A
56a0: 50 50 46 53 5f 54 45 53 54 5f 44 52 49 56 45 52  PPFS_TEST_DRIVER
56b0: 0a 09 72 65 74 75 72 6e 28 61 70 70 66 73 5f 74  ..return(appfs_t
56c0: 65 73 74 5f 64 72 69 76 65 72 28 29 29 3b 0a 23  est_driver());.#
56d0: 65 6c 73 65 0a 09 72 65 74 75 72 6e 28 66 75 73  else..return(fus
56e0: 65 5f 6d 61 69 6e 28 61 72 67 63 2c 20 61 72 67  e_main(argc, arg
56f0: 76 2c 20 26 61 70 70 66 73 5f 6f 70 65 72 2c 20  v, &appfs_oper, 
5700: 4e 55 4c 4c 29 29 3b 0a 23 65 6e 64 69 66 0a 7d  NULL));.#endif.}
5710: 0a 20 0a                                         . .