Hex Artifact Content

Artifact 799a55673971cbc2d0ed30f73ff9c8f599bb627f:


0000: 23 64 65 66 69 6e 65 20 46 55 53 45 5f 55 53 45  #define FUSE_USE
0010: 5f 56 45 52 53 49 4f 4e 20 32 36 0a 0a 23 69 6e  _VERSION 26..#in
0020: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0030: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71  .h>.#include <sq
0040: 6c 69 74 65 33 2e 68 3e 0a 23 69 6e 63 6c 75 64  lite3.h>.#includ
0050: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 69  e <pthread.h>.#i
0060: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0070: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61  >.#include <stda
0080: 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  rg.h>.#include <
0090: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
00a0: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69  de <unistd.h>.#i
00b0: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
00c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
00d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
00e0: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
00f0: 3c 66 75 73 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  <fuse.h>.#includ
0100: 65 20 3c 74 63 6c 2e 68 3e 0a 0a 23 64 65 66 69  e <tcl.h>..#defi
0110: 6e 65 20 41 50 50 46 53 5f 43 41 43 48 45 44 49  ne APPFS_CACHEDI
0120: 52 20 22 2f 74 6d 70 2f 61 70 70 66 73 2d 63 61  R "/tmp/appfs-ca
0130: 63 68 65 22 0a 0a 23 64 65 66 69 6e 65 20 41 50  che"..#define AP
0140: 50 46 53 5f 44 45 42 55 47 28 78 2e 2e 2e 29 20  PFS_DEBUG(x...) 
0150: 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  { fprintf(stderr
0160: 2c 20 22 5b 64 65 62 75 67 5d 20 25 73 3a 25 69  , "[debug] %s:%i
0170: 3a 25 73 3a 20 22 2c 20 5f 5f 46 49 4c 45 5f 5f  :%s: ", __FILE__
0180: 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 5f 5f 66 75  , __LINE__, __fu
0190: 6e 63 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28 73  nc__); fprintf(s
01a0: 74 64 65 72 72 2c 20 78 29 3b 20 66 70 72 69 6e  tderr, x); fprin
01b0: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29  tf(stderr, "\n")
01c0: 3b 20 7d 0a 0a 73 74 61 74 69 63 20 70 74 68 72  ; }..static pthr
01d0: 65 61 64 5f 6b 65 79 5f 74 20 69 6e 74 65 72 70  ead_key_t interp
01e0: 4b 65 79 3b 0a 0a 73 74 72 75 63 74 20 61 70 70  Key;..struct app
01f0: 66 73 5f 74 68 72 65 61 64 5f 64 61 74 61 20 7b  fs_thread_data {
0200: 0a 09 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 09  ..sqlite3 *db;..
0210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 61 63 68  const char *cach
0220: 65 64 69 72 3b 0a 09 74 69 6d 65 5f 74 20 62 6f  edir;..time_t bo
0230: 6f 74 74 69 6d 65 3b 0a 7d 3b 0a 0a 73 74 72 75  ottime;.};..stru
0240: 63 74 20 61 70 70 66 73 5f 74 68 72 65 61 64 5f  ct appfs_thread_
0250: 64 61 74 61 20 67 6c 6f 62 61 6c 54 68 72 65 61  data globalThrea
0260: 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  d;..typedef enum
0270: 20 7b 0a 09 41 50 50 46 53 5f 4f 53 5f 55 4e 4b   {..APPFS_OS_UNK
0280: 4e 4f 57 4e 2c 0a 09 41 50 50 46 53 5f 4f 53 5f  NOWN,..APPFS_OS_
0290: 41 4c 4c 2c 0a 09 41 50 50 46 53 5f 4f 53 5f 4c  ALL,..APPFS_OS_L
02a0: 49 4e 55 58 2c 0a 09 41 50 50 46 53 5f 4f 53 5f  INUX,..APPFS_OS_
02b0: 4d 41 43 4f 53 58 2c 0a 09 41 50 50 46 53 5f 4f  MACOSX,..APPFS_O
02c0: 53 5f 46 52 45 45 42 53 44 2c 0a 09 41 50 50 46  S_FREEBSD,..APPF
02d0: 53 5f 4f 53 5f 4f 50 45 4e 42 53 44 2c 0a 09 41  S_OS_OPENBSD,..A
02e0: 50 50 46 53 5f 4f 53 5f 53 4f 4c 41 52 49 53 0a  PPFS_OS_SOLARIS.
02f0: 7d 20 61 70 70 66 73 5f 6f 73 5f 74 3b 0a 0a 74  } appfs_os_t;..t
0300: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 41  ypedef enum {..A
0310: 50 50 46 53 5f 43 50 55 5f 55 4e 4b 4e 4f 57 4e  PPFS_CPU_UNKNOWN
0320: 2c 0a 09 41 50 50 46 53 5f 43 50 55 5f 41 4c 4c  ,..APPFS_CPU_ALL
0330: 2c 0a 09 41 50 50 46 53 5f 43 50 55 5f 41 4d 44  ,..APPFS_CPU_AMD
0340: 36 34 2c 0a 09 41 50 50 46 53 5f 43 50 55 5f 49  64,..APPFS_CPU_I
0350: 33 38 36 2c 0a 09 41 50 50 46 53 5f 43 50 55 5f  386,..APPFS_CPU_
0360: 41 52 4d 0a 7d 20 61 70 70 66 73 5f 63 70 75 41  ARM.} appfs_cpuA
0370: 72 63 68 5f 74 3b 0a 0a 74 79 70 65 64 65 66 20  rch_t;..typedef 
0380: 65 6e 75 6d 20 7b 0a 09 41 50 50 46 53 5f 50 41  enum {..APPFS_PA
0390: 54 48 54 59 50 45 5f 49 4e 56 41 4c 49 44 2c 0a  THTYPE_INVALID,.
03a0: 09 41 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f  .APPFS_PATHTYPE_
03b0: 46 49 4c 45 2c 0a 09 41 50 50 46 53 5f 50 41 54  FILE,..APPFS_PAT
03c0: 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 2c  HTYPE_DIRECTORY,
03d0: 0a 09 41 50 50 46 53 5f 50 41 54 48 54 59 50 45  ..APPFS_PATHTYPE
03e0: 5f 53 59 4d 4c 49 4e 4b 0a 7d 20 61 70 70 66 73  _SYMLINK.} appfs
03f0: 5f 70 61 74 68 74 79 70 65 5f 74 3b 0a 0a 73 74  _pathtype_t;..st
0400: 72 75 63 74 20 61 70 70 66 73 5f 70 61 63 6b 61  ruct appfs_packa
0410: 67 65 20 7b 0a 09 73 74 72 75 63 74 20 61 70 70  ge {..struct app
0420: 66 73 5f 70 61 63 6b 61 67 65 20 2a 5f 6e 65 78  fs_package *_nex
0430: 74 3b 0a 09 69 6e 74 20 63 6f 75 6e 74 65 72 3b  t;..int counter;
0440: 0a 0a 09 63 68 61 72 20 6e 61 6d 65 5b 32 35 36  ...char name[256
0450: 5d 3b 0a 09 63 68 61 72 20 76 65 72 73 69 6f 6e  ];..char version
0460: 5b 36 34 5d 3b 0a 09 63 68 61 72 20 73 68 61 31  [64];..char sha1
0470: 5b 34 31 5d 3b 0a 09 63 68 61 72 20 6f 73 5f 73  [41];..char os_s
0480: 74 72 5b 36 34 5d 3b 0a 09 63 68 61 72 20 63 70  tr[64];..char cp
0490: 75 41 72 63 68 5f 73 74 72 5b 36 34 5d 3b 0a 09  uArch_str[64];..
04a0: 61 70 70 66 73 5f 6f 73 5f 74 20 6f 73 3b 0a 09  appfs_os_t os;..
04b0: 61 70 70 66 73 5f 63 70 75 41 72 63 68 5f 74 20  appfs_cpuArch_t 
04c0: 63 70 75 41 72 63 68 3b 0a 09 69 6e 74 20 69 73  cpuArch;..int is
04d0: 4c 61 74 65 73 74 3b 0a 7d 3b 0a 0a 73 74 72 75  Latest;.};..stru
04e0: 63 74 20 61 70 70 66 73 5f 73 69 74 65 20 7b 0a  ct appfs_site {.
04f0: 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 73 69  .struct appfs_si
0500: 74 65 20 2a 5f 6e 65 78 74 3b 0a 09 69 6e 74 20  te *_next;..int 
0510: 63 6f 75 6e 74 65 72 3b 0a 0a 09 63 68 61 72 20  counter;...char 
0520: 6e 61 6d 65 5b 32 35 36 5d 3b 0a 7d 3b 0a 0a 73  name[256];.};..s
0530: 74 72 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c  truct appfs_chil
0540: 64 72 65 6e 20 7b 0a 09 73 74 72 75 63 74 20 61  dren {..struct a
0550: 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a 5f  ppfs_children *_
0560: 6e 65 78 74 3b 0a 09 69 6e 74 20 63 6f 75 6e 74  next;..int count
0570: 65 72 3b 0a 0a 09 63 68 61 72 20 6e 61 6d 65 5b  er;...char name[
0580: 32 35 36 5d 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  256];.};..struct
0590: 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20   appfs_pathinfo 
05a0: 7b 0a 09 61 70 70 66 73 5f 70 61 74 68 74 79 70  {..appfs_pathtyp
05b0: 65 5f 74 20 74 79 70 65 3b 0a 09 74 69 6d 65 5f  e_t type;..time_
05c0: 74 20 74 69 6d 65 3b 0a 09 63 68 61 72 20 68 6f  t time;..char ho
05d0: 73 74 6e 61 6d 65 5b 32 35 36 5d 3b 0a 09 75 6e  stname[256];..un
05e0: 69 6f 6e 20 7b 0a 09 09 73 74 72 75 63 74 20 7b  ion {...struct {
05f0: 0a 09 09 09 69 6e 74 20 63 68 69 6c 64 63 6f 75  ....int childcou
0600: 6e 74 3b 0a 09 09 7d 20 64 69 72 3b 0a 09 09 73  nt;...} dir;...s
0610: 74 72 75 63 74 20 7b 0a 09 09 09 69 6e 74 20 65  truct {....int e
0620: 78 65 63 75 74 61 62 6c 65 3b 0a 09 09 09 6f 66  xecutable;....of
0630: 66 5f 74 20 73 69 7a 65 3b 0a 09 09 09 63 68 61  f_t size;....cha
0640: 72 20 73 68 61 31 5b 34 31 5d 3b 0a 09 09 7d 20  r sha1[41];...} 
0650: 66 69 6c 65 3b 0a 09 7d 20 74 79 70 65 69 6e 66  file;..} typeinf
0660: 6f 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 61 70  o;.};..static ap
0670: 70 66 73 5f 6f 73 5f 74 20 61 70 70 66 73 5f 63  pfs_os_t appfs_c
0680: 6f 6e 76 65 72 74 5f 6f 73 5f 66 72 6f 6d 53 74  onvert_os_fromSt
0690: 72 69 6e 67 28 63 6f 6e 73 74 20 63 68 61 72 20  ring(const char 
06a0: 2a 6f 73 29 20 7b 0a 09 69 66 20 28 73 74 72 63  *os) {..if (strc
06b0: 61 73 65 63 6d 70 28 6f 73 2c 20 22 4c 69 6e 75  asecmp(os, "Linu
06c0: 78 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65  x") == 0) {...re
06d0: 74 75 72 6e 28 41 50 50 46 53 5f 4f 53 5f 4c 49  turn(APPFS_OS_LI
06e0: 4e 55 58 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  NUX);..}...if (s
06f0: 74 72 63 61 73 65 63 6d 70 28 6f 73 2c 20 22 44  trcasecmp(os, "D
0700: 61 72 77 69 6e 22 29 20 3d 3d 20 30 20 7c 7c 20  arwin") == 0 || 
0710: 73 74 72 63 61 73 65 63 6d 70 28 6f 73 2c 20 22  strcasecmp(os, "
0720: 4d 61 63 20 4f 53 22 29 20 3d 3d 20 30 20 7c 7c  Mac OS") == 0 ||
0730: 20 73 74 72 63 61 73 65 63 6d 70 28 6f 73 2c 20   strcasecmp(os, 
0740: 22 4d 61 63 20 4f 53 20 58 22 29 20 3d 3d 20 30  "Mac OS X") == 0
0750: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 41 50 50  ) {...return(APP
0760: 46 53 5f 4f 53 5f 4d 41 43 4f 53 58 29 3b 0a 09  FS_OS_MACOSX);..
0770: 7d 0a 0a 09 69 66 20 28 73 74 72 63 61 73 65 63  }...if (strcasec
0780: 6d 70 28 6f 73 2c 20 22 6e 6f 61 72 63 68 22 29  mp(os, "noarch")
0790: 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72   == 0) {...retur
07a0: 6e 28 41 50 50 46 53 5f 4f 53 5f 41 4c 4c 29 3b  n(APPFS_OS_ALL);
07b0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 41 50 50  ..}...return(APP
07c0: 46 53 5f 4f 53 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a  FS_OS_UNKNOWN);.
07d0: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
07e0: 63 68 61 72 20 2a 61 70 70 66 73 5f 63 6f 6e 76  char *appfs_conv
07f0: 65 72 74 5f 6f 73 5f 74 6f 53 74 72 69 6e 67 28  ert_os_toString(
0800: 61 70 70 66 73 5f 6f 73 5f 74 20 6f 73 29 20 7b  appfs_os_t os) {
0810: 0a 09 73 77 69 74 63 68 20 28 6f 73 29 20 7b 0a  ..switch (os) {.
0820: 09 09 63 61 73 65 20 41 50 50 46 53 5f 4f 53 5f  ..case APPFS_OS_
0830: 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ALL:....return("
0840: 6e 6f 61 72 63 68 22 29 3b 0a 09 09 63 61 73 65  noarch");...case
0850: 20 41 50 50 46 53 5f 4f 53 5f 4c 49 4e 55 58 3a   APPFS_OS_LINUX:
0860: 0a 09 09 09 72 65 74 75 72 6e 28 22 6c 69 6e 75  ....return("linu
0870: 78 22 29 3b 0a 09 09 63 61 73 65 20 41 50 50 46  x");...case APPF
0880: 53 5f 4f 53 5f 4d 41 43 4f 53 58 3a 0a 09 09 09  S_OS_MACOSX:....
0890: 72 65 74 75 72 6e 28 22 6d 61 63 6f 73 78 22 29  return("macosx")
08a0: 3b 0a 09 09 63 61 73 65 20 41 50 50 46 53 5f 4f  ;...case APPFS_O
08b0: 53 5f 46 52 45 45 42 53 44 3a 0a 09 09 09 72 65  S_FREEBSD:....re
08c0: 74 75 72 6e 28 22 66 72 65 65 62 73 64 22 29 3b  turn("freebsd");
08d0: 0a 09 09 63 61 73 65 20 41 50 50 46 53 5f 4f 53  ...case APPFS_OS
08e0: 5f 4f 50 45 4e 42 53 44 3a 0a 09 09 09 72 65 74  _OPENBSD:....ret
08f0: 75 72 6e 28 22 6f 70 65 6e 62 73 64 22 29 3b 0a  urn("openbsd");.
0900: 09 09 63 61 73 65 20 41 50 50 46 53 5f 4f 53 5f  ..case APPFS_OS_
0910: 53 4f 4c 41 52 49 53 3a 0a 09 09 09 72 65 74 75  SOLARIS:....retu
0920: 72 6e 28 22 66 72 65 65 62 73 64 22 29 3b 0a 09  rn("freebsd");..
0930: 09 63 61 73 65 20 41 50 50 46 53 5f 43 50 55 5f  .case APPFS_CPU_
0940: 55 4e 4b 4e 4f 57 4e 3a 0a 09 09 09 72 65 74 75  UNKNOWN:....retu
0950: 72 6e 28 22 75 6e 6b 6e 6f 77 6e 22 29 3b 0a 09  rn("unknown");..
0960: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 75 6e 6b 6e  }...return("unkn
0970: 6f 77 6e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  own");.}..static
0980: 20 61 70 70 66 73 5f 63 70 75 41 72 63 68 5f 74   appfs_cpuArch_t
0990: 20 61 70 70 66 73 5f 63 6f 6e 76 65 72 74 5f 63   appfs_convert_c
09a0: 70 75 41 72 63 68 5f 66 72 6f 6d 53 74 72 69 6e  puArch_fromStrin
09b0: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70  g(const char *cp
09c0: 75 29 20 7b 0a 09 69 66 20 28 73 74 72 63 61 73  u) {..if (strcas
09d0: 65 63 6d 70 28 63 70 75 2c 20 22 61 6d 64 36 34  ecmp(cpu, "amd64
09e0: 22 29 20 3d 3d 20 30 20 7c 7c 20 73 74 72 63 61  ") == 0 || strca
09f0: 73 65 63 6d 70 28 63 70 75 2c 20 22 78 38 36 5f  secmp(cpu, "x86_
0a00: 36 34 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72  64") == 0) {...r
0a10: 65 74 75 72 6e 28 41 50 50 46 53 5f 43 50 55 5f  eturn(APPFS_CPU_
0a20: 41 4d 44 36 34 29 3b 0a 09 7d 0a 0a 09 69 66 20  AMD64);..}...if 
0a30: 28 73 74 72 63 61 73 65 63 6d 70 28 63 70 75 2c  (strcasecmp(cpu,
0a40: 20 22 69 33 38 36 22 29 20 3d 3d 20 30 20 7c 7c   "i386") == 0 ||
0a50: 20 5c 0a 09 20 20 20 20 73 74 72 63 61 73 65 63   \..    strcasec
0a60: 6d 70 28 63 70 75 2c 20 22 69 34 38 36 22 29 20  mp(cpu, "i486") 
0a70: 3d 3d 20 30 20 7c 7c 20 5c 0a 09 20 20 20 20 73  == 0 || \..    s
0a80: 74 72 63 61 73 65 63 6d 70 28 63 70 75 2c 20 22  trcasecmp(cpu, "
0a90: 69 35 38 36 22 29 20 3d 3d 20 30 20 7c 7c 20 5c  i586") == 0 || \
0aa0: 0a 09 20 20 20 20 73 74 72 63 61 73 65 63 6d 70  ..    strcasecmp
0ab0: 28 63 70 75 2c 20 22 69 36 38 36 22 29 20 3d 3d  (cpu, "i686") ==
0ac0: 20 30 20 7c 7c 20 5c 0a 09 20 20 20 20 73 74 72   0 || \..    str
0ad0: 63 61 73 65 63 6d 70 28 63 70 75 2c 20 22 69 78  casecmp(cpu, "ix
0ae0: 38 36 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72  86") == 0) {...r
0af0: 65 74 75 72 6e 28 41 50 50 46 53 5f 43 50 55 5f  eturn(APPFS_CPU_
0b00: 49 33 38 36 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  I386);..}...if (
0b10: 73 74 72 63 61 73 65 63 6d 70 28 63 70 75 2c 20  strcasecmp(cpu, 
0b20: 22 61 72 6d 22 29 20 3d 3d 20 30 29 20 7b 0a 09  "arm") == 0) {..
0b30: 09 72 65 74 75 72 6e 28 41 50 50 46 53 5f 43 50  .return(APPFS_CP
0b40: 55 5f 41 52 4d 29 3b 0a 09 7d 0a 0a 09 69 66 20  U_ARM);..}...if 
0b50: 28 73 74 72 63 61 73 65 63 6d 70 28 63 70 75 2c  (strcasecmp(cpu,
0b60: 20 22 6e 6f 61 72 63 68 22 29 20 3d 3d 20 30 29   "noarch") == 0)
0b70: 20 7b 0a 09 09 72 65 74 75 72 6e 28 41 50 50 46   {...return(APPF
0b80: 53 5f 43 50 55 5f 41 4c 4c 29 3b 0a 09 7d 0a 0a  S_CPU_ALL);..}..
0b90: 09 72 65 74 75 72 6e 28 41 50 50 46 53 5f 43 50  .return(APPFS_CP
0ba0: 55 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a 7d 0a 0a 73  U_UNKNOWN);.}..s
0bb0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
0bc0: 20 2a 61 70 70 66 73 5f 63 6f 6e 76 65 72 74 5f   *appfs_convert_
0bd0: 63 70 75 41 72 63 68 5f 74 6f 53 74 72 69 6e 67  cpuArch_toString
0be0: 28 61 70 70 66 73 5f 63 70 75 41 72 63 68 5f 74  (appfs_cpuArch_t
0bf0: 20 63 70 75 29 20 7b 0a 09 73 77 69 74 63 68 20   cpu) {..switch 
0c00: 28 63 70 75 29 20 7b 0a 09 09 63 61 73 65 20 41  (cpu) {...case A
0c10: 50 50 46 53 5f 43 50 55 5f 41 4c 4c 3a 0a 09 09  PPFS_CPU_ALL:...
0c20: 09 72 65 74 75 72 6e 28 22 6e 6f 61 72 63 68 22  .return("noarch"
0c30: 29 3b 0a 09 09 63 61 73 65 20 41 50 50 46 53 5f  );...case APPFS_
0c40: 43 50 55 5f 41 4d 44 36 34 3a 0a 09 09 09 72 65  CPU_AMD64:....re
0c50: 74 75 72 6e 28 22 61 6d 64 36 34 22 29 3b 0a 09  turn("amd64");..
0c60: 09 63 61 73 65 20 41 50 50 46 53 5f 43 50 55 5f  .case APPFS_CPU_
0c70: 49 33 38 36 3a 0a 09 09 09 72 65 74 75 72 6e 28  I386:....return(
0c80: 22 69 78 38 36 22 29 3b 0a 09 09 63 61 73 65 20  "ix86");...case 
0c90: 41 50 50 46 53 5f 43 50 55 5f 41 52 4d 3a 0a 09  APPFS_CPU_ARM:..
0ca0: 09 09 72 65 74 75 72 6e 28 22 61 72 6d 22 29 3b  ..return("arm");
0cb0: 0a 09 09 63 61 73 65 20 41 50 50 46 53 5f 43 50  ...case APPFS_CP
0cc0: 55 5f 55 4e 4b 4e 4f 57 4e 3a 0a 09 09 09 72 65  U_UNKNOWN:....re
0cd0: 74 75 72 6e 28 22 75 6e 6b 6e 6f 77 6e 22 29 3b  turn("unknown");
0ce0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 75 6e  ..}...return("un
0cf0: 6b 6e 6f 77 6e 22 29 3b 0a 7d 0a 0a 73 74 61 74  known");.}..stat
0d00: 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 61  ic Tcl_Interp *a
0d10: 70 70 66 73 5f 63 72 65 61 74 65 5f 54 63 6c 49  ppfs_create_TclI
0d20: 6e 74 65 72 70 28 63 6f 6e 73 74 20 63 68 61 72  nterp(const char
0d30: 20 2a 63 61 63 68 65 64 69 72 29 20 7b 0a 09 54   *cachedir) {..T
0d40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0d50: 70 3b 0a 09 69 6e 74 20 74 63 6c 5f 72 65 74 3b  p;..int tcl_ret;
0d60: 0a 0a 09 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f  ...interp = Tcl_
0d70: 43 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a  CreateInterp();.
0d80: 09 69 66 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e  .if (interp == N
0d90: 55 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  ULL) {...fprintf
0da0: 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65  (stderr, "Unable
0db0: 20 74 6f 20 63 72 65 61 74 65 20 54 63 6c 20 49   to create Tcl I
0dc0: 6e 74 65 72 70 72 65 74 65 72 2e 20 20 41 62 6f  nterpreter.  Abo
0dd0: 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 0a 09 09 72  rting.\n");....r
0de0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
0df0: 0a 09 74 63 6c 5f 72 65 74 20 3d 20 54 63 6c 5f  ..tcl_ret = Tcl_
0e00: 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 09 69  Init(interp);..i
0e10: 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54 43  f (tcl_ret != TC
0e20: 4c 5f 4f 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74  L_OK) {...fprint
0e30: 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c  f(stderr, "Unabl
0e40: 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
0e50: 54 63 6c 2e 20 20 41 62 6f 72 74 69 6e 67 2e 5c  Tcl.  Aborting.\
0e60: 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  n");....return(N
0e70: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72  ULL);..}...tcl_r
0e80: 65 74 20 3d 20 54 63 6c 5f 45 76 61 6c 28 69 6e  et = Tcl_Eval(in
0e90: 74 65 72 70 2c 20 22 22 0a 23 69 6e 63 6c 75 64  terp, "".#includ
0ea0: 65 20 22 61 70 70 66 73 2e 74 63 6c 2e 68 22 0a  e "appfs.tcl.h".
0eb0: 09 22 22 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72  ."");..if (tcl_r
0ec0: 65 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  et != TCL_OK) {.
0ed0: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
0ee0: 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 69 6e 69  , "Unable to ini
0ef0: 74 69 61 6c 69 7a 65 20 54 63 6c 20 41 70 70 46  tialize Tcl AppF
0f00: 53 20 73 63 72 69 70 74 2e 20 20 41 62 6f 72 74  S script.  Abort
0f10: 69 6e 67 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69  ing.\n");...fpri
0f20: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 54 63 6c  ntf(stderr, "Tcl
0f30: 20 45 72 72 6f 72 20 69 73 3a 20 25 73 5c 6e 22   Error is: %s\n"
0f40: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
0f50: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a  esult(interp));.
0f60: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
0f70: 0a 09 7d 0a 0a 09 69 66 20 28 54 63 6c 5f 53 65  ..}...if (Tcl_Se
0f80: 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 3a 3a  tVar(interp, "::
0f90: 61 70 70 66 73 3a 3a 63 61 63 68 65 64 69 72 22  appfs::cachedir"
0fa0: 2c 20 63 61 63 68 65 64 69 72 2c 20 54 43 4c 5f  , cachedir, TCL_
0fb0: 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 20 3d 3d 20  GLOBAL_ONLY) == 
0fc0: 4e 55 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e 74  NULL) {...fprint
0fd0: 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c  f(stderr, "Unabl
0fe0: 65 20 74 6f 20 73 65 74 20 63 61 63 68 65 20 64  e to set cache d
0ff0: 69 72 65 63 74 6f 72 79 2e 20 20 54 68 69 73 20  irectory.  This 
1000: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 66 61 69  should never fai
1010: 6c 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72  l.\n");....retur
1020: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 63  n(NULL);..}...tc
1030: 6c 5f 72 65 74 20 3d 20 54 63 6c 5f 45 76 61 6c  l_ret = Tcl_Eval
1040: 28 69 6e 74 65 72 70 2c 20 22 3a 3a 61 70 70 66  (interp, "::appf
1050: 73 3a 3a 69 6e 69 74 22 29 3b 0a 09 69 66 20 28  s::init");..if (
1060: 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f  tcl_ret != TCL_O
1070: 4b 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73  K) {...fprintf(s
1080: 74 64 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74  tderr, "Unable t
1090: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c  o initialize Tcl
10a0: 20 41 70 70 46 53 20 73 63 72 69 70 74 20 28 3a   AppFS script (:
10b0: 3a 61 70 70 66 73 3a 3a 69 6e 69 74 29 2e 20 20  :appfs::init).  
10c0: 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b 0a 09  Aborting.\n");..
10d0: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
10e0: 20 22 54 63 6c 20 45 72 72 6f 72 20 69 73 3a 20   "Tcl Error is: 
10f0: 25 73 5c 6e 22 2c 20 54 63 6c 5f 47 65 74 53 74  %s\n", Tcl_GetSt
1100: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
1110: 70 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  p));....return(N
1120: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ULL);..}...retur
1130: 6e 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 73 74  n(interp);.}..st
1140: 61 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f 54  atic int appfs_T
1150: 63 6c 5f 45 76 61 6c 28 54 63 6c 5f 49 6e 74 65  cl_Eval(Tcl_Inte
1160: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1170: 6f 62 6a 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  objc, const char
1180: 20 2a 63 6d 64 2c 20 2e 2e 2e 29 20 7b 0a 09 54   *cmd, ...) {..T
1190: 63 6c 5f 4f 62 6a 20 2a 2a 6f 62 6a 76 3b 0a 09  cl_Obj **objv;..
11a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 72 67 3b  const char *arg;
11b0: 0a 09 76 61 5f 6c 69 73 74 20 61 72 67 70 3b 0a  ..va_list argp;.
11c0: 09 69 6e 74 20 72 65 74 76 61 6c 3b 0a 09 69 6e  .int retval;..in
11d0: 74 20 69 3b 0a 0a 09 6f 62 6a 76 20 3d 20 28 76  t i;...objv = (v
11e0: 6f 69 64 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73  oid *) ckalloc(s
11f0: 69 7a 65 6f 66 28 2a 6f 62 6a 76 29 20 2a 20 6f  izeof(*objv) * o
1200: 62 6a 63 29 3b 0a 09 6f 62 6a 76 5b 30 5d 20 3d  bjc);..objv[0] =
1210: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1220: 6a 28 63 6d 64 2c 20 2d 31 29 3b 0a 09 54 63 6c  j(cmd, -1);..Tcl
1230: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62  _IncrRefCount(ob
1240: 6a 76 5b 30 5d 29 3b 0a 0a 09 76 61 5f 73 74 61  jv[0]);...va_sta
1250: 72 74 28 61 72 67 70 2c 20 63 6d 64 29 3b 0a 09  rt(argp, cmd);..
1260: 66 6f 72 20 28 69 20 3d 20 31 3b 20 69 20 3c 20  for (i = 1; i < 
1270: 6f 62 6a 63 3b 20 69 2b 2b 29 20 7b 0a 09 09 61  objc; i++) {...a
1280: 72 67 20 3d 20 76 61 5f 61 72 67 28 61 72 67 70  rg = va_arg(argp
1290: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  , const char *);
12a0: 0a 09 09 6f 62 6a 76 5b 69 5d 20 3d 20 54 63 6c  ...objv[i] = Tcl
12b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 61 72  _NewStringObj(ar
12c0: 67 2c 20 2d 31 29 3b 0a 09 09 54 63 6c 5f 49 6e  g, -1);...Tcl_In
12d0: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b  crRefCount(objv[
12e0: 69 5d 29 3b 0a 09 7d 0a 09 76 61 5f 65 6e 64 28  i]);..}..va_end(
12f0: 61 72 67 70 29 3b 0a 0a 09 72 65 74 76 61 6c 20  argp);...retval 
1300: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 69  = Tcl_EvalObjv(i
1310: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
1320: 76 2c 20 30 29 3b 0a 0a 09 66 6f 72 20 28 69 20  v, 0);...for (i 
1330: 3d 20 30 3b 20 69 20 3c 20 6f 62 6a 63 3b 20 69  = 0; i < objc; i
1340: 2b 2b 29 20 7b 0a 09 09 54 63 6c 5f 44 65 63 72  ++) {...Tcl_Decr
1350: 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 69 5d  RefCount(objv[i]
1360: 29 3b 0a 09 7d 0a 0a 09 63 6b 66 72 65 65 28 28  );..}...ckfree((
1370: 76 6f 69 64 20 2a 29 20 6f 62 6a 76 29 3b 0a 0a  void *) objv);..
1380: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 54  .if (retval != T
1390: 43 4c 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46 53  CL_OK) {...APPFS
13a0: 5f 44 45 42 55 47 28 22 54 63 6c 20 63 6f 6d 6d  _DEBUG("Tcl comm
13b0: 61 6e 64 20 66 61 69 6c 65 64 2c 20 3a 3a 65 72  and failed, ::er
13c0: 72 6f 72 49 6e 66 6f 20 63 6f 6e 74 61 69 6e 73  rorInfo contains
13d0: 3a 20 25 73 5c 6e 22 2c 20 54 63 6c 5f 47 65 74  : %s\n", Tcl_Get
13e0: 56 61 72 28 69 6e 74 65 72 70 2c 20 22 3a 3a 65  Var(interp, "::e
13f0: 72 72 6f 72 49 6e 66 6f 22 2c 20 30 29 29 3b 0a  rrorInfo", 0));.
1400: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
1410: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  al);.}..static v
1420: 6f 69 64 20 61 70 70 66 73 5f 75 70 64 61 74 65  oid appfs_update
1430: 5f 69 6e 64 65 78 28 63 6f 6e 73 74 20 63 68 61  _index(const cha
1440: 72 20 2a 68 6f 73 74 6e 61 6d 65 29 20 7b 0a 09  r *hostname) {..
1450: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1460: 72 70 3b 0a 09 69 6e 74 20 74 63 6c 5f 72 65 74  rp;..int tcl_ret
1470: 3b 0a 0a 09 41 50 50 46 53 5f 44 45 42 55 47 28  ;...APPFS_DEBUG(
1480: 22 45 6e 74 65 72 3a 20 68 6f 73 74 6e 61 6d 65  "Enter: hostname
1490: 20 3d 20 25 73 22 2c 20 68 6f 73 74 6e 61 6d 65   = %s", hostname
14a0: 29 3b 0a 0a 09 69 6e 74 65 72 70 20 3d 20 70 74  );...interp = pt
14b0: 68 72 65 61 64 5f 67 65 74 73 70 65 63 69 66 69  hread_getspecifi
14c0: 63 28 69 6e 74 65 72 70 4b 65 79 29 3b 0a 09 69  c(interpKey);..i
14d0: 66 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c  f (interp == NUL
14e0: 4c 29 20 7b 0a 09 09 69 6e 74 65 72 70 20 3d 20  L) {...interp = 
14f0: 61 70 70 66 73 5f 63 72 65 61 74 65 5f 54 63 6c  appfs_create_Tcl
1500: 49 6e 74 65 72 70 28 67 6c 6f 62 61 6c 54 68 72  Interp(globalThr
1510: 65 61 64 2e 63 61 63 68 65 64 69 72 29 3b 0a 0a  ead.cachedir);..
1520: 09 09 70 74 68 72 65 61 64 5f 73 65 74 73 70 65  ..pthread_setspe
1530: 63 69 66 69 63 28 69 6e 74 65 72 70 4b 65 79 2c  cific(interpKey,
1540: 20 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 74   interp);..}...t
1550: 63 6c 5f 72 65 74 20 3d 20 61 70 70 66 73 5f 54  cl_ret = appfs_T
1560: 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  cl_Eval(interp, 
1570: 32 2c 20 22 3a 3a 61 70 70 66 73 3a 3a 67 65 74  2, "::appfs::get
1580: 69 6e 64 65 78 22 2c 20 68 6f 73 74 6e 61 6d 65  index", hostname
1590: 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20  );..if (tcl_ret 
15a0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 41  != TCL_OK) {...A
15b0: 50 50 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c  PPFS_DEBUG("Call
15c0: 20 74 6f 20 3a 3a 61 70 70 66 73 3a 3a 67 65 74   to ::appfs::get
15d0: 69 6e 64 65 78 20 66 61 69 6c 65 64 3a 20 25 73  index failed: %s
15e0: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
15f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b  Result(interp));
1600: 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  ....return;..}..
1610: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74  .return;.}..stat
1620: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
1630: 70 70 66 73 5f 67 65 74 66 69 6c 65 28 63 6f 6e  ppfs_getfile(con
1640: 73 74 20 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d  st char *hostnam
1650: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  e, const char *s
1660: 68 61 31 29 20 7b 0a 09 54 63 6c 5f 49 6e 74 65  ha1) {..Tcl_Inte
1670: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 09 63 68 61  rp *interp;..cha
1680: 72 20 2a 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  r *retval;..int 
1690: 74 63 6c 5f 72 65 74 3b 0a 0a 09 69 6e 74 65 72  tcl_ret;...inter
16a0: 70 20 3d 20 70 74 68 72 65 61 64 5f 67 65 74 73  p = pthread_gets
16b0: 70 65 63 69 66 69 63 28 69 6e 74 65 72 70 4b 65  pecific(interpKe
16c0: 79 29 3b 0a 09 69 66 20 28 69 6e 74 65 72 70 20  y);..if (interp 
16d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 74  == NULL) {...int
16e0: 65 72 70 20 3d 20 61 70 70 66 73 5f 63 72 65 61  erp = appfs_crea
16f0: 74 65 5f 54 63 6c 49 6e 74 65 72 70 28 67 6c 6f  te_TclInterp(glo
1700: 62 61 6c 54 68 72 65 61 64 2e 63 61 63 68 65 64  balThread.cached
1710: 69 72 29 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f  ir);....pthread_
1720: 73 65 74 73 70 65 63 69 66 69 63 28 69 6e 74 65  setspecific(inte
1730: 72 70 4b 65 79 2c 20 69 6e 74 65 72 70 29 3b 0a  rpKey, interp);.
1740: 09 7d 0a 0a 09 74 63 6c 5f 72 65 74 20 3d 20 61  .}...tcl_ret = a
1750: 70 70 66 73 5f 54 63 6c 5f 45 76 61 6c 28 69 6e  ppfs_Tcl_Eval(in
1760: 74 65 72 70 2c 20 33 2c 20 22 3a 3a 61 70 70 66  terp, 3, "::appf
1770: 73 3a 3a 64 6f 77 6e 6c 6f 61 64 22 2c 20 68 6f  s::download", ho
1780: 73 74 6e 61 6d 65 2c 20 73 68 61 31 29 3b 0a 09  stname, sha1);..
1790: 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d 20 54  if (tcl_ret != T
17a0: 43 4c 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46 53  CL_OK) {...APPFS
17b0: 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20  _DEBUG("Call to 
17c0: 3a 3a 61 70 70 66 73 3a 3a 64 6f 77 6e 6c 6f 61  ::appfs::downloa
17d0: 64 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 54  d failed: %s", T
17e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
17f0: 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09  lt(interp));....
1800: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
1810: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64  ...retval = strd
1820: 75 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  up(Tcl_GetString
1830: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b  Result(interp));
1840: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
1850: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
1860: 64 20 61 70 70 66 73 5f 75 70 64 61 74 65 5f 6d  d appfs_update_m
1870: 61 6e 69 66 65 73 74 28 63 6f 6e 73 74 20 63 68  anifest(const ch
1880: 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 63 6f  ar *hostname, co
1890: 6e 73 74 20 63 68 61 72 20 2a 73 68 61 31 29 20  nst char *sha1) 
18a0: 7b 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  {..Tcl_Interp *i
18b0: 6e 74 65 72 70 3b 0a 09 69 6e 74 20 74 63 6c 5f  nterp;..int tcl_
18c0: 72 65 74 3b 0a 0a 09 69 6e 74 65 72 70 20 3d 20  ret;...interp = 
18d0: 70 74 68 72 65 61 64 5f 67 65 74 73 70 65 63 69  pthread_getspeci
18e0: 66 69 63 28 69 6e 74 65 72 70 4b 65 79 29 3b 0a  fic(interpKey);.
18f0: 09 69 66 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e  .if (interp == N
1900: 55 4c 4c 29 20 7b 0a 09 09 69 6e 74 65 72 70 20  ULL) {...interp 
1910: 3d 20 61 70 70 66 73 5f 63 72 65 61 74 65 5f 54  = appfs_create_T
1920: 63 6c 49 6e 74 65 72 70 28 67 6c 6f 62 61 6c 54  clInterp(globalT
1930: 68 72 65 61 64 2e 63 61 63 68 65 64 69 72 29 3b  hread.cachedir);
1940: 0a 0a 09 09 70 74 68 72 65 61 64 5f 73 65 74 73  ....pthread_sets
1950: 70 65 63 69 66 69 63 28 69 6e 74 65 72 70 4b 65  pecific(interpKe
1960: 79 2c 20 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a  y, interp);..}..
1970: 09 74 63 6c 5f 72 65 74 20 3d 20 61 70 70 66 73  .tcl_ret = appfs
1980: 5f 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70  _Tcl_Eval(interp
1990: 2c 20 33 2c 20 22 3a 3a 61 70 70 66 73 3a 3a 67  , 3, "::appfs::g
19a0: 65 74 70 6b 67 6d 61 6e 69 66 65 73 74 22 2c 20  etpkgmanifest", 
19b0: 68 6f 73 74 6e 61 6d 65 2c 20 73 68 61 31 29 3b  hostname, sha1);
19c0: 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21 3d  ..if (tcl_ret !=
19d0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 41 50 50   TCL_OK) {...APP
19e0: 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74  FS_DEBUG("Call t
19f0: 6f 20 3a 3a 61 70 70 66 73 3a 3a 67 65 74 70 6b  o ::appfs::getpk
1a00: 67 6d 61 6e 69 66 65 73 74 20 66 61 69 6c 65 64  gmanifest failed
1a10: 3a 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 53 74  : %s", Tcl_GetSt
1a20: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
1a30: 70 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a  p));....return;.
1a40: 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .}...return;.}..
1a50: 0a 23 64 65 66 69 6e 65 20 61 70 70 66 73 5f 66  .#define appfs_f
1a60: 72 65 65 5f 6c 69 73 74 5f 74 79 70 65 28 69 64  ree_list_type(id
1a70: 2c 20 74 79 70 65 29 20 73 74 61 74 69 63 20 76  , type) static v
1a80: 6f 69 64 20 61 70 70 66 73 5f 66 72 65 65 5f 6c  oid appfs_free_l
1a90: 69 73 74 5f 20 23 23 20 69 64 28 74 79 70 65 20  ist_ ## id(type 
1aa0: 2a 68 65 61 64 29 20 7b 20 5c 0a 09 74 79 70 65  *head) { \..type
1ab0: 20 2a 6f 62 6a 2c 20 2a 6e 65 78 74 3b 20 5c 0a   *obj, *next; \.
1ac0: 09 66 6f 72 20 28 6f 62 6a 20 3d 20 68 65 61 64  .for (obj = head
1ad0: 3b 20 6f 62 6a 3b 20 6f 62 6a 20 3d 20 6e 65 78  ; obj; obj = nex
1ae0: 74 29 20 7b 20 5c 0a 09 09 6e 65 78 74 20 3d 20  t) { \...next = 
1af0: 6f 62 6a 2d 3e 5f 6e 65 78 74 3b 20 5c 0a 09 09  obj->_next; \...
1b00: 63 6b 66 72 65 65 28 28 76 6f 69 64 20 2a 29 20  ckfree((void *) 
1b10: 6f 62 6a 29 3b 20 5c 0a 09 7d 20 5c 0a 7d 0a 0a  obj); \..} \.}..
1b20: 61 70 70 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f  appfs_free_list_
1b30: 74 79 70 65 28 73 69 74 65 2c 20 73 74 72 75 63  type(site, struc
1b40: 74 20 61 70 70 66 73 5f 73 69 74 65 29 0a 61 70  t appfs_site).ap
1b50: 70 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f 74 79  pfs_free_list_ty
1b60: 70 65 28 70 61 63 6b 61 67 65 2c 20 73 74 72 75  pe(package, stru
1b70: 63 74 20 61 70 70 66 73 5f 70 61 63 6b 61 67 65  ct appfs_package
1b80: 29 0a 61 70 70 66 73 5f 66 72 65 65 5f 6c 69 73  ).appfs_free_lis
1b90: 74 5f 74 79 70 65 28 63 68 69 6c 64 72 65 6e 2c  t_type(children,
1ba0: 20 73 74 72 75 63 74 20 61 70 70 66 73 5f 63 68   struct appfs_ch
1bb0: 69 6c 64 72 65 6e 29 0a 0a 73 74 61 74 69 63 20  ildren)..static 
1bc0: 69 6e 74 20 61 70 70 66 73 5f 67 65 74 73 69 74  int appfs_getsit
1bd0: 65 73 5f 63 62 28 76 6f 69 64 20 2a 5f 68 65 61  es_cb(void *_hea
1be0: 64 2c 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 2c 20  d, int columns, 
1bf0: 63 68 61 72 20 2a 2a 76 61 6c 75 65 73 2c 20 63  char **values, c
1c00: 68 61 72 20 2a 2a 6e 61 6d 65 73 29 20 7b 0a 09  har **names) {..
1c10: 73 74 72 75 63 74 20 61 70 70 66 73 5f 73 69 74  struct appfs_sit
1c20: 65 20 2a 2a 68 65 61 64 5f 70 2c 20 2a 6f 62 6a  e **head_p, *obj
1c30: 3b 0a 0a 09 68 65 61 64 5f 70 20 3d 20 5f 68 65  ;...head_p = _he
1c40: 61 64 3b 0a 0a 09 6f 62 6a 20 3d 20 28 76 6f 69  ad;...obj = (voi
1c50: 64 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a  d *) ckalloc(siz
1c60: 65 6f 66 28 2a 6f 62 6a 29 29 3b 0a 09 73 6e 70  eof(*obj));..snp
1c70: 72 69 6e 74 66 28 6f 62 6a 2d 3e 6e 61 6d 65 2c  rintf(obj->name,
1c80: 20 73 69 7a 65 6f 66 28 6f 62 6a 2d 3e 6e 61 6d   sizeof(obj->nam
1c90: 65 29 2c 20 22 25 73 22 2c 20 76 61 6c 75 65 73  e), "%s", values
1ca0: 5b 30 5d 29 3b 0a 0a 09 69 66 20 28 2a 68 65 61  [0]);...if (*hea
1cb0: 64 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  d_p == NULL) {..
1cc0: 09 6f 62 6a 2d 3e 63 6f 75 6e 74 65 72 20 3d 20  .obj->counter = 
1cd0: 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6f  0;..} else {...o
1ce0: 62 6a 2d 3e 63 6f 75 6e 74 65 72 20 3d 20 28 2a  bj->counter = (*
1cf0: 68 65 61 64 5f 70 29 2d 3e 63 6f 75 6e 74 65 72  head_p)->counter
1d00: 20 2b 20 31 3b 0a 09 7d 0a 0a 09 6f 62 6a 2d 3e   + 1;..}...obj->
1d10: 5f 6e 65 78 74 20 3d 20 2a 68 65 61 64 5f 70 3b  _next = *head_p;
1d20: 0a 09 2a 68 65 61 64 5f 70 20 3d 20 6f 62 6a 3b  ..*head_p = obj;
1d30: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
1d40: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1d50: 70 70 66 73 5f 73 69 74 65 20 2a 61 70 70 66 73  ppfs_site *appfs
1d60: 5f 67 65 74 73 69 74 65 73 28 69 6e 74 20 2a 73  _getsites(int *s
1d70: 69 74 65 5f 63 6f 75 6e 74 5f 70 29 20 7b 0a 09  ite_count_p) {..
1d80: 73 74 72 75 63 74 20 61 70 70 66 73 5f 73 69 74  struct appfs_sit
1d90: 65 20 2a 68 65 61 64 20 3d 20 4e 55 4c 4c 3b 0a  e *head = NULL;.
1da0: 09 69 6e 74 20 73 71 6c 69 74 65 5f 72 65 74 3b  .int sqlite_ret;
1db0: 0a 0a 09 69 66 20 28 73 69 74 65 5f 63 6f 75 6e  ...if (site_coun
1dc0: 74 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  t_p == NULL) {..
1dd0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
1de0: 7d 0a 0a 09 73 71 6c 69 74 65 5f 72 65 74 20 3d  }...sqlite_ret =
1df0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c   sqlite3_exec(gl
1e00: 6f 62 61 6c 54 68 72 65 61 64 2e 64 62 2c 20 22  obalThread.db, "
1e10: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
1e20: 68 6f 73 74 6e 61 6d 65 20 46 52 4f 4d 20 70 61  hostname FROM pa
1e30: 63 6b 61 67 65 73 3b 22 2c 20 61 70 70 66 73 5f  ckages;", appfs_
1e40: 67 65 74 73 69 74 65 73 5f 63 62 2c 20 26 68 65  getsites_cb, &he
1e50: 61 64 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  ad, NULL);..if (
1e60: 73 71 6c 69 74 65 5f 72 65 74 20 21 3d 20 53 51  sqlite_ret != SQ
1e70: 4c 49 54 45 5f 4f 4b 29 20 7b 0a 09 09 41 50 50  LITE_OK) {...APP
1e80: 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74  FS_DEBUG("Call t
1e90: 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 66  o sqlite3_exec f
1ea0: 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1eb0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
1ec0: 69 66 20 28 68 65 61 64 20 21 3d 20 4e 55 4c 4c  if (head != NULL
1ed0: 29 20 7b 0a 09 09 2a 73 69 74 65 5f 63 6f 75 6e  ) {...*site_coun
1ee0: 74 5f 70 20 3d 20 68 65 61 64 2d 3e 63 6f 75 6e  t_p = head->coun
1ef0: 74 65 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09 72 65  ter + 1;..}...re
1f00: 74 75 72 6e 28 68 65 61 64 29 3b 0a 7d 0a 0a 73  turn(head);.}..s
1f10: 74 61 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f  tatic int appfs_
1f20: 67 65 74 69 6e 64 65 78 5f 63 62 28 76 6f 69 64  getindex_cb(void
1f30: 20 2a 5f 68 65 61 64 2c 20 69 6e 74 20 63 6f 6c   *_head, int col
1f40: 75 6d 6e 73 2c 20 63 68 61 72 20 2a 2a 76 61 6c  umns, char **val
1f50: 75 65 73 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65  ues, char **name
1f60: 73 29 20 7b 0a 09 73 74 72 75 63 74 20 61 70 70  s) {..struct app
1f70: 66 73 5f 70 61 63 6b 61 67 65 20 2a 2a 68 65 61  fs_package **hea
1f80: 64 5f 70 2c 20 2a 6f 62 6a 3b 0a 0a 09 68 65 61  d_p, *obj;...hea
1f90: 64 5f 70 20 3d 20 5f 68 65 61 64 3b 0a 0a 09 6f  d_p = _head;...o
1fa0: 62 6a 20 3d 20 28 76 6f 69 64 20 2a 29 20 63 6b  bj = (void *) ck
1fb0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6f 62  alloc(sizeof(*ob
1fc0: 6a 29 29 3b 0a 0a 09 73 6e 70 72 69 6e 74 66 28  j));...snprintf(
1fd0: 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 73 69 7a 65 6f  obj->name, sizeo
1fe0: 66 28 6f 62 6a 2d 3e 6e 61 6d 65 29 2c 20 22 25  f(obj->name), "%
1ff0: 73 22 2c 20 76 61 6c 75 65 73 5b 30 5d 29 3b 0a  s", values[0]);.
2000: 09 73 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 76  .snprintf(obj->v
2010: 65 72 73 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6f  ersion, sizeof(o
2020: 62 6a 2d 3e 76 65 72 73 69 6f 6e 29 2c 20 22 25  bj->version), "%
2030: 73 22 2c 20 76 61 6c 75 65 73 5b 31 5d 29 3b 0a  s", values[1]);.
2040: 09 73 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 73  .snprintf(obj->s
2050: 68 61 31 2c 20 73 69 7a 65 6f 66 28 6f 62 6a 2d  ha1, sizeof(obj-
2060: 3e 73 68 61 31 29 2c 20 22 25 73 22 2c 20 76 61  >sha1), "%s", va
2070: 6c 75 65 73 5b 32 5d 29 3b 0a 09 6f 62 6a 2d 3e  lues[2]);..obj->
2080: 6f 73 20 3d 20 61 70 70 66 73 5f 63 6f 6e 76 65  os = appfs_conve
2090: 72 74 5f 6f 73 5f 66 72 6f 6d 53 74 72 69 6e 67  rt_os_fromString
20a0: 28 76 61 6c 75 65 73 5b 33 5d 29 3b 0a 09 6f 62  (values[3]);..ob
20b0: 6a 2d 3e 63 70 75 41 72 63 68 20 3d 20 61 70 70  j->cpuArch = app
20c0: 66 73 5f 63 6f 6e 76 65 72 74 5f 63 70 75 41 72  fs_convert_cpuAr
20d0: 63 68 5f 66 72 6f 6d 53 74 72 69 6e 67 28 76 61  ch_fromString(va
20e0: 6c 75 65 73 5b 34 5d 29 3b 0a 09 73 6e 70 72 69  lues[4]);..snpri
20f0: 6e 74 66 28 6f 62 6a 2d 3e 6f 73 5f 73 74 72 2c  ntf(obj->os_str,
2100: 20 73 69 7a 65 6f 66 28 6f 62 6a 2d 3e 6f 73 5f   sizeof(obj->os_
2110: 73 74 72 29 2c 20 22 25 73 22 2c 20 76 61 6c 75  str), "%s", valu
2120: 65 73 5b 33 5d 29 3b 0a 09 73 6e 70 72 69 6e 74  es[3]);..snprint
2130: 66 28 6f 62 6a 2d 3e 63 70 75 41 72 63 68 5f 73  f(obj->cpuArch_s
2140: 74 72 2c 20 73 69 7a 65 6f 66 28 6f 62 6a 2d 3e  tr, sizeof(obj->
2150: 63 70 75 41 72 63 68 5f 73 74 72 29 2c 20 22 25  cpuArch_str), "%
2160: 73 22 2c 20 76 61 6c 75 65 73 5b 34 5d 29 3b 0a  s", values[4]);.
2170: 09 69 66 20 28 76 61 6c 75 65 73 5b 35 5d 5b 30  .if (values[5][0
2180: 5d 20 3d 3d 20 27 31 27 29 20 7b 0a 09 09 6f 62  ] == '1') {...ob
2190: 6a 2d 3e 69 73 4c 61 74 65 73 74 20 3d 20 31 3b  j->isLatest = 1;
21a0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6f 62 6a  ..} else {...obj
21b0: 2d 3e 69 73 4c 61 74 65 73 74 20 3d 20 30 3b 0a  ->isLatest = 0;.
21c0: 09 7d 0a 0a 09 69 66 20 28 2a 68 65 61 64 5f 70  .}...if (*head_p
21d0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6f 62   == NULL) {...ob
21e0: 6a 2d 3e 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  j->counter = 0;.
21f0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6f 62 6a 2d  .} else {...obj-
2200: 3e 63 6f 75 6e 74 65 72 20 3d 20 28 2a 68 65 61  >counter = (*hea
2210: 64 5f 70 29 2d 3e 63 6f 75 6e 74 65 72 20 2b 20  d_p)->counter + 
2220: 31 3b 0a 09 7d 0a 0a 09 6f 62 6a 2d 3e 5f 6e 65  1;..}...obj->_ne
2230: 78 74 20 3d 20 2a 68 65 61 64 5f 70 3b 0a 09 2a  xt = *head_p;..*
2240: 68 65 61 64 5f 70 20 3d 20 6f 62 6a 3b 0a 0a 09  head_p = obj;...
2250: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74  return(0);.}..st
2260: 61 74 69 63 20 73 74 72 75 63 74 20 61 70 70 66  atic struct appf
2270: 73 5f 70 61 63 6b 61 67 65 20 2a 61 70 70 66 73  s_package *appfs
2280: 5f 67 65 74 69 6e 64 65 78 28 63 6f 6e 73 74 20  _getindex(const 
2290: 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20  char *hostname, 
22a0: 69 6e 74 20 2a 70 61 63 6b 61 67 65 5f 63 6f 75  int *package_cou
22b0: 6e 74 5f 70 29 20 7b 0a 09 73 74 72 75 63 74 20  nt_p) {..struct 
22c0: 61 70 70 66 73 5f 70 61 63 6b 61 67 65 20 2a 68  appfs_package *h
22d0: 65 61 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61  ead = NULL;..cha
22e0: 72 20 2a 73 71 6c 3b 0a 09 69 6e 74 20 73 71 6c  r *sql;..int sql
22f0: 69 74 65 5f 72 65 74 3b 0a 0a 09 69 66 20 28 70  ite_ret;...if (p
2300: 61 63 6b 61 67 65 5f 63 6f 75 6e 74 5f 70 20 3d  ackage_count_p =
2310: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
2320: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 61  rn(NULL);..}...a
2330: 70 70 66 73 5f 75 70 64 61 74 65 5f 69 6e 64 65  ppfs_update_inde
2340: 78 28 68 6f 73 74 6e 61 6d 65 29 3b 0a 0a 09 73  x(hostname);...s
2350: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
2360: 69 6e 74 66 28 22 53 45 4c 45 43 54 20 70 61 63  intf("SELECT pac
2370: 6b 61 67 65 2c 20 76 65 72 73 69 6f 6e 2c 20 73  kage, version, s
2380: 68 61 31 2c 20 6f 73 2c 20 63 70 75 41 72 63 68  ha1, os, cpuArch
2390: 2c 20 69 73 4c 61 74 65 73 74 20 46 52 4f 4d 20  , isLatest 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 3b 22 2c 20  ostname = %Q;", 
23c0: 68 6f 73 74 6e 61 6d 65 29 3b 0a 09 69 66 20 28  hostname);..if (
23d0: 73 71 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  sql == NULL) {..
23e0: 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 43 61  .APPFS_DEBUG("Ca
23f0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d 70  ll to sqlite3_mp
2400: 72 69 6e 74 66 20 66 61 69 6c 65 64 2e 22 29 3b  rintf failed.");
2410: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
2420: 3b 0a 09 7d 0a 0a 09 73 71 6c 69 74 65 5f 72 65  ;..}...sqlite_re
2430: 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  t = sqlite3_exec
2440: 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 64 62  (globalThread.db
2450: 2c 20 73 71 6c 2c 20 61 70 70 66 73 5f 67 65 74  , sql, appfs_get
2460: 69 6e 64 65 78 5f 63 62 2c 20 26 68 65 61 64 2c  index_cb, &head,
2470: 20 4e 55 4c 4c 29 3b 0a 09 73 71 6c 69 74 65 33   NULL);..sqlite3
2480: 5f 66 72 65 65 28 73 71 6c 29 3b 0a 0a 09 69 66  _free(sql);...if
2490: 20 28 73 71 6c 69 74 65 5f 72 65 74 20 21 3d 20   (sqlite_ret != 
24a0: 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 09 09 41  SQLITE_OK) {...A
24b0: 50 50 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c  PPFS_DEBUG("Call
24c0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
24d0: 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
24e0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
24f0: 0a 09 69 66 20 28 68 65 61 64 20 21 3d 20 4e 55  ..if (head != NU
2500: 4c 4c 29 20 7b 0a 09 09 2a 70 61 63 6b 61 67 65  LL) {...*package
2510: 5f 63 6f 75 6e 74 5f 70 20 3d 20 68 65 61 64 2d  _count_p = head-
2520: 3e 63 6f 75 6e 74 65 72 20 2b 20 31 3b 0a 09 7d  >counter + 1;..}
2530: 0a 0a 09 72 65 74 75 72 6e 28 68 65 61 64 29 3b  ...return(head);
2540: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
2550: 70 70 66 73 5f 67 65 74 63 68 69 6c 64 72 65 6e  ppfs_getchildren
2560: 5f 63 62 28 76 6f 69 64 20 2a 5f 68 65 61 64 2c  _cb(void *_head,
2570: 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 68   int columns, ch
2580: 61 72 20 2a 2a 76 61 6c 75 65 73 2c 20 63 68 61  ar **values, cha
2590: 72 20 2a 2a 6e 61 6d 65 73 29 20 7b 0a 09 73 74  r **names) {..st
25a0: 72 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64  ruct appfs_child
25b0: 72 65 6e 20 2a 2a 68 65 61 64 5f 70 2c 20 2a 6f  ren **head_p, *o
25c0: 62 6a 3b 0a 0a 09 68 65 61 64 5f 70 20 3d 20 5f  bj;...head_p = _
25d0: 68 65 61 64 3b 0a 0a 09 6f 62 6a 20 3d 20 28 76  head;...obj = (v
25e0: 6f 69 64 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73  oid *) ckalloc(s
25f0: 69 7a 65 6f 66 28 2a 6f 62 6a 29 29 3b 0a 0a 09  izeof(*obj));...
2600: 73 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 6e 61  snprintf(obj->na
2610: 6d 65 2c 20 73 69 7a 65 6f 66 28 6f 62 6a 2d 3e  me, sizeof(obj->
2620: 6e 61 6d 65 29 2c 20 22 25 73 22 2c 20 76 61 6c  name), "%s", val
2630: 75 65 73 5b 30 5d 29 3b 0a 0a 09 69 66 20 28 2a  ues[0]);...if (*
2640: 68 65 61 64 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  head_p == NULL) 
2650: 7b 0a 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74 65 72  {...obj->counter
2660: 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 0;..} else {.
2670: 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74 65 72 20 3d  ..obj->counter =
2680: 20 28 2a 68 65 61 64 5f 70 29 2d 3e 63 6f 75 6e   (*head_p)->coun
2690: 74 65 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09 6f 62  ter + 1;..}...ob
26a0: 6a 2d 3e 5f 6e 65 78 74 20 3d 20 2a 68 65 61 64  j->_next = *head
26b0: 5f 70 3b 0a 09 2a 68 65 61 64 5f 70 20 3d 20 6f  _p;..*head_p = o
26c0: 62 6a 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  bj;...return(0);
26d0: 0a 09 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72  ...}..static str
26e0: 75 63 74 20 61 70 70 66 73 5f 63 68 69 6c 64 72  uct appfs_childr
26f0: 65 6e 20 2a 61 70 70 66 73 5f 67 65 74 63 68 69  en *appfs_getchi
2700: 6c 64 72 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  ldren(const char
2710: 20 2a 68 6f 73 74 6e 61 6d 65 2c 20 63 6f 6e 73   *hostname, cons
2720: 74 20 63 68 61 72 20 2a 70 61 63 6b 61 67 65 5f  t char *package_
2730: 68 61 73 68 2c 20 63 6f 6e 73 74 20 63 68 61 72  hash, const char
2740: 20 2a 70 61 74 68 2c 20 69 6e 74 20 2a 63 68 69   *path, int *chi
2750: 6c 64 72 65 6e 5f 63 6f 75 6e 74 5f 70 29 20 7b  ldren_count_p) {
2760: 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 63  ..struct appfs_c
2770: 68 69 6c 64 72 65 6e 20 2a 68 65 61 64 20 3d 20  hildren *head = 
2780: 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 73 71 6c  NULL;..char *sql
2790: 3b 0a 09 69 6e 74 20 73 71 6c 69 74 65 5f 72 65  ;..int sqlite_re
27a0: 74 3b 0a 0a 09 69 66 20 28 63 68 69 6c 64 72 65  t;...if (childre
27b0: 6e 5f 63 6f 75 6e 74 5f 70 20 3d 3d 20 4e 55 4c  n_count_p == NUL
27c0: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55  L) {...return(NU
27d0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 61 70 70 66 73 5f  LL);..}...appfs_
27e0: 75 70 64 61 74 65 5f 69 6e 64 65 78 28 68 6f 73  update_index(hos
27f0: 74 6e 61 6d 65 29 3b 0a 09 61 70 70 66 73 5f 75  tname);..appfs_u
2800: 70 64 61 74 65 5f 6d 61 6e 69 66 65 73 74 28 68  pdate_manifest(h
2810: 6f 73 74 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65  ostname, package
2820: 5f 68 61 73 68 29 3b 0a 0a 09 73 71 6c 20 3d 20  _hash);...sql = 
2830: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2840: 22 53 45 4c 45 43 54 20 66 69 6c 65 5f 6e 61 6d  "SELECT file_nam
2850: 65 20 46 52 4f 4d 20 66 69 6c 65 73 20 57 48 45  e FROM files WHE
2860: 52 45 20 70 61 63 6b 61 67 65 5f 73 68 61 31 20  RE package_sha1 
2870: 3d 20 25 51 20 41 4e 44 20 66 69 6c 65 5f 64 69  = %Q AND file_di
2880: 72 65 63 74 6f 72 79 20 3d 20 25 51 3b 22 2c 20  rectory = %Q;", 
2890: 70 61 63 6b 61 67 65 5f 68 61 73 68 2c 20 70 61  package_hash, pa
28a0: 74 68 29 3b 0a 09 69 66 20 28 73 71 6c 20 3d 3d  th);..if (sql ==
28b0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 41 50 50 46 53   NULL) {...APPFS
28c0: 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20  _DEBUG("Call to 
28d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
28e0: 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
28f0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
2900: 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 53 51  .APPFS_DEBUG("SQ
2910: 4c 3a 20 25 73 22 2c 20 73 71 6c 29 3b 0a 09 73  L: %s", sql);..s
2920: 71 6c 69 74 65 5f 72 65 74 20 3d 20 73 71 6c 69  qlite_ret = sqli
2930: 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c 54  te3_exec(globalT
2940: 68 72 65 61 64 2e 64 62 2c 20 73 71 6c 2c 20 61  hread.db, sql, a
2950: 70 70 66 73 5f 67 65 74 63 68 69 6c 64 72 65 6e  ppfs_getchildren
2960: 5f 63 62 2c 20 26 68 65 61 64 2c 20 4e 55 4c 4c  _cb, &head, NULL
2970: 29 3b 0a 09 73 71 6c 69 74 65 33 5f 66 72 65 65  );..sqlite3_free
2980: 28 73 71 6c 29 3b 0a 0a 09 69 66 20 28 73 71 6c  (sql);...if (sql
2990: 69 74 65 5f 72 65 74 20 21 3d 20 53 51 4c 49 54  ite_ret != SQLIT
29a0: 45 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46 53 5f  E_OK) {...APPFS_
29b0: 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20 73  DEBUG("Call to s
29c0: 71 6c 69 74 65 33 5f 65 78 65 63 20 66 61 69 6c  qlite3_exec fail
29d0: 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29e0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
29f0: 28 68 65 61 64 20 21 3d 20 4e 55 4c 4c 29 20 7b  (head != NULL) {
2a00: 0a 09 09 2a 63 68 69 6c 64 72 65 6e 5f 63 6f 75  ...*children_cou
2a10: 6e 74 5f 70 20 3d 20 68 65 61 64 2d 3e 63 6f 75  nt_p = head->cou
2a20: 6e 74 65 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09 72  nter + 1;..}...r
2a30: 65 74 75 72 6e 28 68 65 61 64 29 3b 0a 7d 0a 0a  eturn(head);.}..
2a40: 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66 73  static int appfs
2a50: 5f 6c 6f 6f 6b 75 70 5f 70 61 63 6b 61 67 65 5f  _lookup_package_
2a60: 68 61 73 68 5f 63 62 28 76 6f 69 64 20 2a 5f 72  hash_cb(void *_r
2a70: 65 74 76 61 6c 2c 20 69 6e 74 20 63 6f 6c 75 6d  etval, int colum
2a80: 6e 73 2c 20 63 68 61 72 20 2a 2a 76 61 6c 75 65  ns, char **value
2a90: 73 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 73 29  s, char **names)
2aa0: 20 7b 0a 09 63 68 61 72 20 2a 2a 72 65 74 76 61   {..char **retva
2ab0: 6c 20 3d 20 5f 72 65 74 76 61 6c 3b 0a 0a 09 2a  l = _retval;...*
2ac0: 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75 70 28  retval = strdup(
2ad0: 76 61 6c 75 65 73 5b 30 5d 29 3b 0a 0a 09 72 65  values[0]);...re
2ae0: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74  turn(0);.}..stat
2af0: 69 63 20 63 68 61 72 20 2a 61 70 70 66 73 5f 6c  ic char *appfs_l
2b00: 6f 6f 6b 75 70 5f 70 61 63 6b 61 67 65 5f 68 61  ookup_package_ha
2b10: 73 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 68  sh(const char *h
2b20: 6f 73 74 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ostname, const c
2b30: 68 61 72 20 2a 70 61 63 6b 61 67 65 2c 20 63 6f  har *package, co
2b40: 6e 73 74 20 63 68 61 72 20 2a 6f 73 2c 20 63 6f  nst char *os, co
2b50: 6e 73 74 20 63 68 61 72 20 2a 63 70 75 41 72 63  nst char *cpuArc
2b60: 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76  h, const char *v
2b70: 65 72 73 69 6f 6e 29 20 7b 0a 09 63 68 61 72 20  ersion) {..char 
2b80: 2a 73 71 6c 3b 0a 09 63 68 61 72 20 2a 72 65 74  *sql;..char *ret
2b90: 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74  val = NULL;..int
2ba0: 20 73 71 6c 69 74 65 5f 72 65 74 3b 0a 0a 09 61   sqlite_ret;...a
2bb0: 70 70 66 73 5f 75 70 64 61 74 65 5f 69 6e 64 65  ppfs_update_inde
2bc0: 78 28 68 6f 73 74 6e 61 6d 65 29 3b 0a 0a 09 73  x(hostname);...s
2bd0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
2be0: 69 6e 74 66 28 22 53 45 4c 45 43 54 20 73 68 61  intf("SELECT sha
2bf0: 31 20 46 52 4f 4d 20 70 61 63 6b 61 67 65 73 20  1 FROM packages 
2c00: 57 48 45 52 45 20 68 6f 73 74 6e 61 6d 65 20 3d  WHERE hostname =
2c10: 20 25 51 20 41 4e 44 20 70 61 63 6b 61 67 65 20   %Q AND package 
2c20: 3d 20 25 51 20 41 4e 44 20 6f 73 20 3d 20 25 51  = %Q AND os = %Q
2c30: 20 41 4e 44 20 63 70 75 41 72 63 68 20 3d 20 25   AND cpuArch = %
2c40: 51 20 41 4e 44 20 76 65 72 73 69 6f 6e 20 3d 20  Q AND version = 
2c50: 25 51 3b 22 2c 0a 09 09 68 6f 73 74 6e 61 6d 65  %Q;",...hostname
2c60: 2c 0a 09 09 70 61 63 6b 61 67 65 2c 0a 09 09 6f  ,...package,...o
2c70: 73 2c 0a 09 09 63 70 75 41 72 63 68 2c 0a 09 09  s,...cpuArch,...
2c80: 76 65 72 73 69 6f 6e 0a 09 29 3b 0a 09 69 66 20  version..);..if 
2c90: 28 73 71 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (sql == NULL) {.
2ca0: 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 43  ..APPFS_DEBUG("C
2cb0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d  all to sqlite3_m
2cc0: 70 72 69 6e 74 66 20 66 61 69 6c 65 64 2e 22 29  printf failed.")
2cd0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
2ce0: 29 3b 0a 09 7d 0a 0a 09 41 50 50 46 53 5f 44 45  );..}...APPFS_DE
2cf0: 42 55 47 28 22 53 51 4c 3a 20 25 73 22 2c 20 73  BUG("SQL: %s", s
2d00: 71 6c 29 3b 0a 09 73 71 6c 69 74 65 5f 72 65 74  ql);..sqlite_ret
2d10: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2d20: 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 64 62 2c  globalThread.db,
2d30: 20 73 71 6c 2c 20 61 70 70 66 73 5f 6c 6f 6f 6b   sql, appfs_look
2d40: 75 70 5f 70 61 63 6b 61 67 65 5f 68 61 73 68 5f  up_package_hash_
2d50: 63 62 2c 20 26 72 65 74 76 61 6c 2c 20 4e 55 4c  cb, &retval, NUL
2d60: 4c 29 3b 0a 09 73 71 6c 69 74 65 33 5f 66 72 65  L);..sqlite3_fre
2d70: 65 28 73 71 6c 29 3b 0a 0a 09 69 66 20 28 73 71  e(sql);...if (sq
2d80: 6c 69 74 65 5f 72 65 74 20 21 3d 20 53 51 4c 49  lite_ret != SQLI
2d90: 54 45 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46 53  TE_OK) {...APPFS
2da0: 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f 20  _DEBUG("Call to 
2db0: 73 71 6c 69 74 65 33 5f 65 78 65 63 20 66 61 69  sqlite3_exec fai
2dc0: 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2dd0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
2de0: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
2df0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
2e00: 73 5f 67 65 74 66 69 6c 65 69 6e 66 6f 5f 63 62  s_getfileinfo_cb
2e10: 28 76 6f 69 64 20 2a 5f 70 61 74 68 69 6e 66 6f  (void *_pathinfo
2e20: 2c 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 2c 20 63  , int columns, c
2e30: 68 61 72 20 2a 2a 76 61 6c 75 65 73 2c 20 63 68  har **values, ch
2e40: 61 72 20 2a 2a 6e 61 6d 65 73 29 20 7b 0a 09 73  ar **names) {..s
2e50: 74 72 75 63 74 20 61 70 70 66 73 5f 70 61 74 68  truct appfs_path
2e60: 69 6e 66 6f 20 2a 70 61 74 68 69 6e 66 6f 20 3d  info *pathinfo =
2e70: 20 5f 70 61 74 68 69 6e 66 6f 3b 0a 09 63 6f 6e   _pathinfo;..con
2e80: 73 74 20 63 68 61 72 20 2a 74 79 70 65 2c 20 2a  st char *type, *
2e90: 74 69 6d 65 2c 20 2a 73 6f 75 72 63 65 2c 20 2a  time, *source, *
2ea0: 73 69 7a 65 2c 20 2a 70 65 72 6d 73 2c 20 2a 73  size, *perms, *s
2eb0: 68 61 31 3b 0a 0a 09 74 79 70 65 20 3d 20 76 61  ha1;...type = va
2ec0: 6c 75 65 73 5b 30 5d 3b 0a 09 74 69 6d 65 20 3d  lues[0];..time =
2ed0: 20 76 61 6c 75 65 73 5b 31 5d 3b 0a 09 73 6f 75   values[1];..sou
2ee0: 72 63 65 20 3d 20 76 61 6c 75 65 73 5b 32 5d 3b  rce = values[2];
2ef0: 0a 09 73 69 7a 65 20 3d 20 76 61 6c 75 65 73 5b  ..size = values[
2f00: 33 5d 3b 0a 09 70 65 72 6d 73 20 3d 20 76 61 6c  3];..perms = val
2f10: 75 65 73 5b 34 5d 3b 0a 09 73 68 61 31 20 3d 20  ues[4];..sha1 = 
2f20: 76 61 6c 75 65 73 5b 35 5d 3b 0a 0a 09 70 61 74  values[5];...pat
2f30: 68 69 6e 66 6f 2d 3e 74 69 6d 65 20 3d 20 73 74  hinfo->time = st
2f40: 72 74 6f 75 6c 6c 28 74 69 6d 65 2c 20 4e 55 4c  rtoull(time, NUL
2f50: 4c 2c 20 31 30 29 3b 0a 0a 09 69 66 20 28 73 74  L, 10);...if (st
2f60: 72 63 6d 70 28 74 79 70 65 2c 20 22 66 69 6c 65  rcmp(type, "file
2f70: 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 70 61 74  ") == 0) {...pat
2f80: 68 69 6e 66 6f 2d 3e 74 79 70 65 20 3d 20 41 50  hinfo->type = AP
2f90: 50 46 53 5f 50 41 54 48 54 59 50 45 5f 46 49 4c  PFS_PATHTYPE_FIL
2fa0: 45 3b 0a 0a 09 09 69 66 20 28 21 73 69 7a 65 29  E;....if (!size)
2fb0: 20 7b 0a 09 09 09 73 69 7a 65 20 3d 20 22 30 22   {....size = "0"
2fc0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 21 70 65  ;...}....if (!pe
2fd0: 72 6d 73 29 20 7b 0a 09 09 09 70 65 72 6d 73 20  rms) {....perms 
2fe0: 3d 20 22 22 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  = "";...}....if 
2ff0: 28 21 73 68 61 31 29 20 7b 0a 09 09 09 73 68 61  (!sha1) {....sha
3000: 31 20 3d 20 22 22 3b 0a 09 09 7d 0a 0a 09 09 70  1 = "";...}....p
3010: 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66  athinfo->typeinf
3020: 6f 2e 66 69 6c 65 2e 73 69 7a 65 20 3d 20 73 74  o.file.size = st
3030: 72 74 6f 75 6c 6c 28 73 69 7a 65 2c 20 4e 55 4c  rtoull(size, NUL
3040: 4c 2c 20 31 30 29 3b 0a 09 09 73 6e 70 72 69 6e  L, 10);...snprin
3050: 74 66 28 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70  tf(pathinfo->typ
3060: 65 69 6e 66 6f 2e 66 69 6c 65 2e 73 68 61 31 2c  einfo.file.sha1,
3070: 20 73 69 7a 65 6f 66 28 70 61 74 68 69 6e 66 6f   sizeof(pathinfo
3080: 2d 3e 74 79 70 65 69 6e 66 6f 2e 66 69 6c 65 2e  ->typeinfo.file.
3090: 73 68 61 31 29 2c 20 22 25 73 22 2c 20 73 68 61  sha1), "%s", sha
30a0: 31 29 3b 0a 0a 09 09 69 66 20 28 73 74 72 63 6d  1);....if (strcm
30b0: 70 28 70 65 72 6d 73 2c 20 22 78 22 29 20 3d 3d  p(perms, "x") ==
30c0: 20 30 29 20 7b 0a 09 09 09 70 61 74 68 69 6e 66   0) {....pathinf
30d0: 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 66 69 6c 65  o->typeinfo.file
30e0: 2e 65 78 65 63 75 74 61 62 6c 65 20 3d 20 31 3b  .executable = 1;
30f0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 70  ...} else {....p
3100: 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 69 6e 66  athinfo->typeinf
3110: 6f 2e 66 69 6c 65 2e 65 78 65 63 75 74 61 62 6c  o.file.executabl
3120: 65 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 72 65  e = 0;...}....re
3130: 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 69 66  turn(0);..}...if
3140: 20 28 73 74 72 63 6d 70 28 74 79 70 65 2c 20 22   (strcmp(type, "
3150: 64 69 72 65 63 74 6f 72 79 22 29 20 3d 3d 20 30  directory") == 0
3160: 29 20 7b 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e  ) {...pathinfo->
3170: 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54  type = APPFS_PAT
3180: 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b  HTYPE_DIRECTORY;
3190: 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70  ...pathinfo->typ
31a0: 65 69 6e 66 6f 2e 64 69 72 2e 63 68 69 6c 64 63  einfo.dir.childc
31b0: 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 72 65 74  ount = 0;....ret
31c0: 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 72 65 74  urn(0);..}...ret
31d0: 75 72 6e 28 30 29 3b 0a 0a 09 2f 2a 20 55 6e 74  urn(0);.../* Unt
31e0: 69 6c 20 74 68 69 73 20 69 73 20 75 73 65 64 2c  il this is used,
31f0: 20 70 72 65 76 65 6e 74 20 74 68 65 20 63 6f 6d   prevent the com
3200: 70 69 6c 65 72 20 66 72 6f 6d 20 63 6f 6d 70 6c  piler from compl
3210: 61 69 6e 69 6e 67 20 2a 2f 0a 09 73 6f 75 72 63  aining */..sourc
3220: 65 20 3d 20 73 6f 75 72 63 65 3b 0a 7d 0a 0a 73  e = source;.}..s
3230: 74 61 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f  tatic int appfs_
3240: 67 65 74 66 69 6c 65 69 6e 66 6f 28 63 6f 6e 73  getfileinfo(cons
3250: 74 20 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65  t char *hostname
3260: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
3270: 63 6b 61 67 65 5f 68 61 73 68 2c 20 63 6f 6e 73  ckage_hash, cons
3280: 74 20 63 68 61 72 20 2a 5f 70 61 74 68 2c 20 73  t char *_path, s
3290: 74 72 75 63 74 20 61 70 70 66 73 5f 70 61 74 68  truct appfs_path
32a0: 69 6e 66 6f 20 2a 70 61 74 68 69 6e 66 6f 29 20  info *pathinfo) 
32b0: 7b 0a 09 63 68 61 72 20 2a 64 69 72 65 63 74 6f  {..char *directo
32c0: 72 79 2c 20 2a 66 69 6c 65 2c 20 2a 70 61 74 68  ry, *file, *path
32d0: 3b 0a 09 63 68 61 72 20 2a 73 71 6c 3b 0a 09 69  ;..char *sql;..i
32e0: 6e 74 20 73 71 6c 69 74 65 5f 72 65 74 3b 0a 0a  nt sqlite_ret;..
32f0: 09 69 66 20 28 70 61 74 68 69 6e 66 6f 20 3d 3d  .if (pathinfo ==
3300: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
3310: 6e 28 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 61 70  n(-EIO);..}...ap
3320: 70 66 73 5f 75 70 64 61 74 65 5f 69 6e 64 65 78  pfs_update_index
3330: 28 68 6f 73 74 6e 61 6d 65 29 3b 0a 09 61 70 70  (hostname);..app
3340: 66 73 5f 75 70 64 61 74 65 5f 6d 61 6e 69 66 65  fs_update_manife
3350: 73 74 28 68 6f 73 74 6e 61 6d 65 2c 20 70 61 63  st(hostname, pac
3360: 6b 61 67 65 5f 68 61 73 68 29 3b 0a 0a 09 70 61  kage_hash);...pa
3370: 74 68 20 3d 20 73 74 72 64 75 70 28 5f 70 61 74  th = strdup(_pat
3380: 68 29 3b 0a 09 64 69 72 65 63 74 6f 72 79 20 3d  h);..directory =
3390: 20 70 61 74 68 3b 0a 09 66 69 6c 65 20 3d 20 73   path;..file = s
33a0: 74 72 72 63 68 72 28 70 61 74 68 2c 20 27 2f 27  trrchr(path, '/'
33b0: 29 3b 0a 09 69 66 20 28 66 69 6c 65 20 3d 3d 20  );..if (file == 
33c0: 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65 20 3d  NULL) {...file =
33d0: 20 70 61 74 68 3b 0a 09 09 64 69 72 65 63 74 6f   path;...directo
33e0: 72 79 20 3d 20 22 22 3b 0a 09 7d 20 65 6c 73 65  ry = "";..} else
33f0: 20 7b 0a 09 09 2a 66 69 6c 65 20 3d 20 27 5c 30   {...*file = '\0
3400: 27 3b 0a 09 09 66 69 6c 65 2b 2b 3b 0a 09 7d 0a  ';...file++;..}.
3410: 0a 09 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  ..sql = sqlite3_
3420: 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
3430: 74 79 70 65 2c 20 74 69 6d 65 2c 20 73 6f 75 72  type, time, sour
3440: 63 65 2c 20 73 69 7a 65 2c 20 70 65 72 6d 73 2c  ce, size, perms,
3450: 20 66 69 6c 65 5f 73 68 61 31 20 46 52 4f 4d 20   file_sha1 FROM 
3460: 66 69 6c 65 73 20 57 48 45 52 45 20 70 61 63 6b  files WHERE pack
3470: 61 67 65 5f 73 68 61 31 20 3d 20 25 51 20 41 4e  age_sha1 = %Q AN
3480: 44 20 66 69 6c 65 5f 64 69 72 65 63 74 6f 72 79  D file_directory
3490: 20 3d 20 25 51 20 41 4e 44 20 66 69 6c 65 5f 6e   = %Q AND file_n
34a0: 61 6d 65 20 3d 20 25 51 3b 22 2c 20 70 61 63 6b  ame = %Q;", pack
34b0: 61 67 65 5f 68 61 73 68 2c 20 64 69 72 65 63 74  age_hash, direct
34c0: 6f 72 79 2c 20 66 69 6c 65 29 3b 0a 09 69 66 20  ory, file);..if 
34d0: 28 73 71 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (sql == NULL) {.
34e0: 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22 43  ..APPFS_DEBUG("C
34f0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d  all to sqlite3_m
3500: 70 72 69 6e 74 66 20 66 61 69 6c 65 64 2e 22 29  printf failed.")
3510: 3b 0a 0a 09 09 66 72 65 65 28 70 61 74 68 29 3b  ;....free(path);
3520: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 45 49 4f 29  ....return(-EIO)
3530: 3b 0a 09 7d 0a 0a 09 66 72 65 65 28 70 61 74 68  ;..}...free(path
3540: 29 3b 0a 0a 09 70 61 74 68 69 6e 66 6f 2d 3e 74  );...pathinfo->t
3550: 79 70 65 20 3d 20 41 50 50 46 53 5f 50 41 54 48  ype = APPFS_PATH
3560: 54 59 50 45 5f 49 4e 56 41 4c 49 44 3b 0a 0a 09  TYPE_INVALID;...
3570: 41 50 50 46 53 5f 44 45 42 55 47 28 22 53 51 4c  APPFS_DEBUG("SQL
3580: 3a 20 25 73 22 2c 20 73 71 6c 29 3b 0a 09 73 71  : %s", sql);..sq
3590: 6c 69 74 65 5f 72 65 74 20 3d 20 73 71 6c 69 74  lite_ret = sqlit
35a0: 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c 54 68  e3_exec(globalTh
35b0: 72 65 61 64 2e 64 62 2c 20 73 71 6c 2c 20 61 70  read.db, sql, ap
35c0: 70 66 73 5f 67 65 74 66 69 6c 65 69 6e 66 6f 5f  pfs_getfileinfo_
35d0: 63 62 2c 20 70 61 74 68 69 6e 66 6f 2c 20 4e 55  cb, pathinfo, NU
35e0: 4c 4c 29 3b 0a 09 73 71 6c 69 74 65 33 5f 66 72  LL);..sqlite3_fr
35f0: 65 65 28 73 71 6c 29 3b 0a 0a 09 69 66 20 28 73  ee(sql);...if (s
3600: 71 6c 69 74 65 5f 72 65 74 20 21 3d 20 53 51 4c  qlite_ret != SQL
3610: 49 54 45 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46  ITE_OK) {...APPF
3620: 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f  S_DEBUG("Call to
3630: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 66 61   sqlite3_exec fa
3640: 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
3650: 72 6e 28 2d 45 49 4f 29 3b 0a 09 7d 0a 0a 09 69  rn(-EIO);..}...i
3660: 66 20 28 70 61 74 68 69 6e 66 6f 2d 3e 74 79 70  f (pathinfo->typ
3670: 65 20 3d 3d 20 41 50 50 46 53 5f 50 41 54 48 54  e == APPFS_PATHT
3680: 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09  YPE_INVALID) {..
3690: 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29  .return(-ENOENT)
36a0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29  ;..}...return(0)
36b0: 3b 0a 7d 0a 0a 2f 2a 20 47 65 74 20 69 6e 66 6f  ;.}../* Get info
36c0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
36d0: 70 61 74 68 2c 20 61 6e 64 20 6f 70 74 69 6f 6e  path, and option
36e0: 61 6c 6c 79 20 6c 69 73 74 20 63 68 69 6c 64 72  ally list childr
36f0: 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  en */.static int
3700: 20 61 70 70 66 73 5f 67 65 74 5f 70 61 74 68 5f   appfs_get_path_
3710: 69 6e 66 6f 28 63 6f 6e 73 74 20 63 68 61 72 20  info(const char 
3720: 2a 5f 70 61 74 68 2c 20 73 74 72 75 63 74 20 61  *_path, struct a
3730: 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20 2a 70  ppfs_pathinfo *p
3740: 61 74 68 69 6e 66 6f 2c 20 73 74 72 75 63 74 20  athinfo, struct 
3750: 61 70 70 66 73 5f 63 68 69 6c 64 72 65 6e 20 2a  appfs_children *
3760: 2a 63 68 69 6c 64 72 65 6e 29 20 7b 0a 09 73 74  *children) {..st
3770: 72 75 63 74 20 61 70 70 66 73 5f 73 69 74 65 20  ruct appfs_site 
3780: 2a 73 69 74 65 73 2c 20 2a 73 69 74 65 3b 0a 09  *sites, *site;..
3790: 73 74 72 75 63 74 20 61 70 70 66 73 5f 63 68 69  struct appfs_chi
37a0: 6c 64 72 65 6e 20 2a 6e 6f 64 65 2c 20 2a 64 69  ldren *node, *di
37b0: 72 5f 63 68 69 6c 64 72 65 6e 3b 0a 09 73 74 72  r_children;..str
37c0: 75 63 74 20 61 70 70 66 73 5f 70 61 63 6b 61 67  uct appfs_packag
37d0: 65 20 2a 70 61 63 6b 61 67 65 73 2c 20 2a 70 61  e *packages, *pa
37e0: 63 6b 61 67 65 3b 0a 09 61 70 70 66 73 5f 6f 73  ckage;..appfs_os
37f0: 5f 74 20 6f 73 5f 76 61 6c 3b 0a 09 61 70 70 66  _t os_val;..appf
3800: 73 5f 63 70 75 41 72 63 68 5f 74 20 63 70 75 41  s_cpuArch_t cpuA
3810: 72 63 68 5f 76 61 6c 3b 0a 09 63 68 61 72 20 2a  rch_val;..char *
3820: 68 6f 73 74 6e 61 6d 65 2c 20 2a 70 61 63 6b 61  hostname, *packa
3830: 67 65 6e 61 6d 65 2c 20 2a 6f 73 5f 63 70 75 41  gename, *os_cpuA
3840: 72 63 68 2c 20 2a 6f 73 2c 20 2a 63 70 75 41 72  rch, *os, *cpuAr
3850: 63 68 2c 20 2a 76 65 72 73 69 6f 6e 3b 0a 09 63  ch, *version;..c
3860: 68 61 72 20 2a 70 61 74 68 2c 20 2a 70 61 74 68  har *path, *path
3870: 5f 73 3b 0a 09 63 68 61 72 20 2a 70 61 63 6b 61  _s;..char *packa
3880: 67 65 5f 68 61 73 68 3b 0a 09 69 6e 74 20 73 69  ge_hash;..int si
3890: 74 65 73 5f 63 6f 75 6e 74 2c 20 70 61 63 6b 61  tes_count, packa
38a0: 67 65 73 5f 63 6f 75 6e 74 2c 20 6f 73 5f 63 70  ges_count, os_cp
38b0: 75 41 72 63 68 5f 63 6f 75 6e 74 2c 20 76 65 72  uArch_count, ver
38c0: 73 69 6f 6e 5f 63 6f 75 6e 74 2c 20 66 69 6c 65  sion_count, file
38d0: 73 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 66 69  s_count;..int fi
38e0: 6c 65 69 6e 66 6f 5f 72 65 74 3b 0a 0a 09 69 66  leinfo_ret;...if
38f0: 20 28 63 68 69 6c 64 72 65 6e 29 20 7b 0a 09 09   (children) {...
3900: 2a 63 68 69 6c 64 72 65 6e 20 3d 20 4e 55 4c 4c  *children = NULL
3910: 3b 0a 09 7d 0a 0a 09 69 66 20 28 5f 70 61 74 68  ;..}...if (_path
3920: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
3930: 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b 0a 09  turn(-ENOENT);..
3940: 7d 0a 0a 09 69 66 20 28 5f 70 61 74 68 5b 30 5d  }...if (_path[0]
3950: 20 21 3d 20 27 2f 27 29 20 7b 0a 09 09 72 65 74   != '/') {...ret
3960: 75 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b 0a 09 7d  urn(-ENOENT);..}
3970: 0a 0a 09 69 66 20 28 5f 70 61 74 68 5b 31 5d 20  ...if (_path[1] 
3980: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 2f 2a 20  == '\0') {.../* 
3990: 52 65 71 75 65 73 74 20 66 6f 72 20 74 68 65 20  Request for the 
39a0: 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20 2a  root directory *
39b0: 2f 0a 09 09 73 69 74 65 73 20 3d 20 61 70 70 66  /...sites = appf
39c0: 73 5f 67 65 74 73 69 74 65 73 28 26 73 69 74 65  s_getsites(&site
39d0: 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 70 61 74  s_count);....pat
39e0: 68 69 6e 66 6f 2d 3e 74 79 70 65 20 3d 20 41 50  hinfo->type = AP
39f0: 50 46 53 5f 50 41 54 48 54 59 50 45 5f 44 49 52  PFS_PATHTYPE_DIR
3a00: 45 43 54 4f 52 59 3b 0a 09 09 70 61 74 68 69 6e  ECTORY;...pathin
3a10: 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 64 69 72  fo->typeinfo.dir
3a20: 2e 63 68 69 6c 64 63 6f 75 6e 74 20 3d 20 73 69  .childcount = si
3a30: 74 65 73 5f 63 6f 75 6e 74 3b 0a 09 09 70 61 74  tes_count;...pat
3a40: 68 69 6e 66 6f 2d 3e 68 6f 73 74 6e 61 6d 65 5b  hinfo->hostname[
3a50: 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 70 61 74  0] = '\0';...pat
3a60: 68 69 6e 66 6f 2d 3e 74 69 6d 65 20 3d 20 67 6c  hinfo->time = gl
3a70: 6f 62 61 6c 54 68 72 65 61 64 2e 62 6f 6f 74 74  obalThread.boott
3a80: 69 6d 65 3b 0a 0a 09 09 69 66 20 28 63 68 69 6c  ime;....if (chil
3a90: 64 72 65 6e 29 20 7b 0a 09 09 09 66 6f 72 20 28  dren) {....for (
3aa0: 73 69 74 65 20 3d 20 73 69 74 65 73 3b 20 73 69  site = sites; si
3ab0: 74 65 3b 20 73 69 74 65 20 3d 20 73 69 74 65 2d  te; site = site-
3ac0: 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 6e 6f  >_next) {.....no
3ad0: 64 65 20 3d 20 28 76 6f 69 64 20 2a 29 20 63 6b  de = (void *) ck
3ae0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6e 6f  alloc(sizeof(*no
3af0: 64 65 29 29 3b 0a 09 09 09 09 6e 6f 64 65 2d 3e  de));.....node->
3b00: 5f 6e 65 78 74 20 3d 20 2a 63 68 69 6c 64 72 65  _next = *childre
3b10: 6e 3b 0a 09 09 09 09 73 74 72 63 70 79 28 6e 6f  n;.....strcpy(no
3b20: 64 65 2d 3e 6e 61 6d 65 2c 20 73 69 74 65 2d 3e  de->name, site->
3b30: 6e 61 6d 65 29 3b 0a 09 09 09 09 2a 63 68 69 6c  name);.....*chil
3b40: 64 72 65 6e 20 3d 20 6e 6f 64 65 3b 0a 09 09 09  dren = node;....
3b50: 7d 0a 09 09 7d 0a 0a 09 09 61 70 70 66 73 5f 66  }...}....appfs_f
3b60: 72 65 65 5f 6c 69 73 74 5f 73 69 74 65 28 73 69  ree_list_site(si
3b70: 74 65 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tes);....return(
3b80: 30 29 3b 0a 09 7d 0a 0a 09 70 61 74 68 20 3d 20  0);..}...path = 
3b90: 73 74 72 64 75 70 28 5f 70 61 74 68 29 3b 0a 09  strdup(_path);..
3ba0: 70 61 74 68 5f 73 20 3d 20 70 61 74 68 3b 0a 0a  path_s = path;..
3bb0: 09 68 6f 73 74 6e 61 6d 65 20 3d 20 70 61 74 68  .hostname = path
3bc0: 20 2b 20 31 3b 0a 09 70 61 63 6b 61 67 65 6e 61   + 1;..packagena
3bd0: 6d 65 20 3d 20 73 74 72 63 68 72 28 68 6f 73 74  me = strchr(host
3be0: 6e 61 6d 65 2c 20 27 2f 27 29 3b 0a 0a 09 69 66  name, '/');...if
3bf0: 20 28 70 61 63 6b 61 67 65 6e 61 6d 65 20 21 3d   (packagename !=
3c00: 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 61 63 6b   NULL) {...*pack
3c10: 61 67 65 6e 61 6d 65 20 3d 20 27 5c 30 27 3b 0a  agename = '\0';.
3c20: 09 09 70 61 63 6b 61 67 65 6e 61 6d 65 2b 2b 3b  ..packagename++;
3c30: 0a 09 7d 0a 0a 09 73 6e 70 72 69 6e 74 66 28 70  ..}...snprintf(p
3c40: 61 74 68 69 6e 66 6f 2d 3e 68 6f 73 74 6e 61 6d  athinfo->hostnam
3c50: 65 2c 20 73 69 7a 65 6f 66 28 70 61 74 68 69 6e  e, sizeof(pathin
3c60: 66 6f 2d 3e 68 6f 73 74 6e 61 6d 65 29 2c 20 22  fo->hostname), "
3c70: 25 73 22 2c 20 68 6f 73 74 6e 61 6d 65 29 3b 0a  %s", hostname);.
3c80: 0a 09 70 61 63 6b 61 67 65 73 20 3d 20 61 70 70  ..packages = app
3c90: 66 73 5f 67 65 74 69 6e 64 65 78 28 68 6f 73 74  fs_getindex(host
3ca0: 6e 61 6d 65 2c 20 26 70 61 63 6b 61 67 65 73 5f  name, &packages_
3cb0: 63 6f 75 6e 74 29 3b 0a 0a 09 69 66 20 28 70 61  count);...if (pa
3cc0: 63 6b 61 67 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c  ckages == NULL |
3cd0: 7c 20 70 61 63 6b 61 67 65 73 5f 63 6f 75 6e 74  | packages_count
3ce0: 20 3d 3d 20 30 29 20 7b 0a 09 09 41 50 50 46 53   == 0) {...APPFS
3cf0: 5f 44 45 42 55 47 28 22 55 6e 61 62 6c 65 20 74  _DEBUG("Unable t
3d00: 6f 20 66 65 74 63 68 20 70 61 63 6b 61 67 65 20  o fetch package 
3d10: 69 6e 64 65 78 20 66 72 6f 6d 20 25 73 22 2c 20  index from %s", 
3d20: 68 6f 73 74 6e 61 6d 65 29 3b 0a 0a 09 09 66 72  hostname);....fr
3d30: 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09 09 72  ee(path_s);....r
3d40: 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b 0a  eturn(-ENOENT);.
3d50: 09 7d 0a 0a 09 69 66 20 28 70 61 63 6b 61 67 65  .}...if (package
3d60: 6e 61 6d 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  name == NULL) {.
3d70: 09 09 2f 2a 20 52 65 71 75 65 73 74 20 66 6f 72  ../* Request for
3d80: 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 6e 61   a single hostna
3d90: 6d 65 20 2a 2f 0a 09 09 70 61 74 68 69 6e 66 6f  me */...pathinfo
3da0: 2d 3e 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50  ->type = APPFS_P
3db0: 41 54 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52  ATHTYPE_DIRECTOR
3dc0: 59 3b 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74  Y;...pathinfo->t
3dd0: 79 70 65 69 6e 66 6f 2e 64 69 72 2e 63 68 69 6c  ypeinfo.dir.chil
3de0: 64 63 6f 75 6e 74 20 3d 20 70 61 63 6b 61 67 65  dcount = package
3df0: 73 5f 63 6f 75 6e 74 3b 0a 09 09 70 61 74 68 69  s_count;...pathi
3e00: 6e 66 6f 2d 3e 74 69 6d 65 20 3d 20 67 6c 6f 62  nfo->time = glob
3e10: 61 6c 54 68 72 65 61 64 2e 62 6f 6f 74 74 69 6d  alThread.boottim
3e20: 65 3b 0a 0a 09 09 69 66 20 28 63 68 69 6c 64 72  e;....if (childr
3e30: 65 6e 29 20 7b 0a 09 09 09 66 6f 72 20 28 70 61  en) {....for (pa
3e40: 63 6b 61 67 65 20 3d 20 70 61 63 6b 61 67 65 73  ckage = packages
3e50: 3b 20 70 61 63 6b 61 67 65 3b 20 70 61 63 6b 61  ; package; packa
3e60: 67 65 20 3d 20 70 61 63 6b 61 67 65 2d 3e 5f 6e  ge = package->_n
3e70: 65 78 74 29 20 7b 0a 09 09 09 09 6e 6f 64 65 20  ext) {.....node 
3e80: 3d 20 28 76 6f 69 64 20 2a 29 20 63 6b 61 6c 6c  = (void *) ckall
3e90: 6f 63 28 73 69 7a 65 6f 66 28 2a 6e 6f 64 65 29  oc(sizeof(*node)
3ea0: 29 3b 0a 09 09 09 09 6e 6f 64 65 2d 3e 5f 6e 65  );.....node->_ne
3eb0: 78 74 20 3d 20 2a 63 68 69 6c 64 72 65 6e 3b 0a  xt = *children;.
3ec0: 09 09 09 09 73 74 72 63 70 79 28 6e 6f 64 65 2d  ....strcpy(node-
3ed0: 3e 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65 2d 3e  >name, package->
3ee0: 6e 61 6d 65 29 3b 0a 09 09 09 09 2a 63 68 69 6c  name);.....*chil
3ef0: 64 72 65 6e 20 3d 20 6e 6f 64 65 3b 0a 09 09 09  dren = node;....
3f00: 7d 0a 09 09 7d 0a 0a 09 09 61 70 70 66 73 5f 66  }...}....appfs_f
3f10: 72 65 65 5f 6c 69 73 74 5f 70 61 63 6b 61 67 65  ree_list_package
3f20: 28 70 61 63 6b 61 67 65 73 29 3b 0a 0a 09 09 66  (packages);....f
3f30: 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a 09 09  ree(path_s);....
3f40: 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
3f50: 6f 73 5f 63 70 75 41 72 63 68 20 3d 20 73 74 72  os_cpuArch = str
3f60: 63 68 72 28 70 61 63 6b 61 67 65 6e 61 6d 65 2c  chr(packagename,
3f70: 20 27 2f 27 29 3b 0a 09 69 66 20 28 6f 73 5f 63   '/');..if (os_c
3f80: 70 75 41 72 63 68 20 3d 3d 20 4e 55 4c 4c 29 20  puArch == NULL) 
3f90: 7b 0a 09 09 2f 2a 20 52 65 71 75 65 73 74 20 66  {.../* Request f
3fa0: 6f 72 20 4f 53 20 61 6e 64 20 43 50 55 20 41 72  or OS and CPU Ar
3fb0: 63 68 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  ch for a specifi
3fc0: 63 20 70 61 63 6b 61 67 65 20 2a 2f 0a 09 09 70  c package */...p
3fd0: 61 74 68 69 6e 66 6f 2d 3e 74 79 70 65 20 3d 20  athinfo->type = 
3fe0: 41 50 50 46 53 5f 50 41 54 48 54 59 50 45 5f 44  APPFS_PATHTYPE_D
3ff0: 49 52 45 43 54 4f 52 59 3b 0a 09 09 70 61 74 68  IRECTORY;...path
4000: 69 6e 66 6f 2d 3e 74 69 6d 65 20 3d 20 67 6c 6f  info->time = glo
4010: 62 61 6c 54 68 72 65 61 64 2e 62 6f 6f 74 74 69  balThread.bootti
4020: 6d 65 3b 0a 0a 09 09 6f 73 5f 63 70 75 41 72 63  me;....os_cpuArc
4030: 68 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 66  h_count = 0;...f
4040: 6f 72 20 28 70 61 63 6b 61 67 65 20 3d 20 70 61  or (package = pa
4050: 63 6b 61 67 65 73 3b 20 70 61 63 6b 61 67 65 3b  ckages; package;
4060: 20 70 61 63 6b 61 67 65 20 3d 20 70 61 63 6b 61   package = packa
4070: 67 65 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09  ge->_next) {....
4080: 69 66 20 28 73 74 72 63 6d 70 28 70 61 63 6b 61  if (strcmp(packa
4090: 67 65 2d 3e 6e 61 6d 65 2c 20 70 61 63 6b 61 67  ge->name, packag
40a0: 65 6e 61 6d 65 29 20 21 3d 20 30 29 20 7b 0a 09  ename) != 0) {..
40b0: 09 09 09 41 50 50 46 53 5f 44 45 42 55 47 28 22  ...APPFS_DEBUG("
40c0: 53 6b 69 70 70 69 6e 67 20 70 61 63 6b 61 67 65  Skipping package
40d0: 20 6e 61 6d 65 64 20 5c 22 25 73 5c 22 2c 20 64   named \"%s\", d
40e0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 72 65  oes not match re
40f0: 71 75 65 73 74 65 64 20 70 61 63 6b 61 67 65 3a  quested package:
4100: 20 5c 22 25 73 5c 22 22 2c 20 70 61 63 6b 61 67   \"%s\"", packag
4110: 65 2d 3e 6e 61 6d 65 2c 20 70 61 63 6b 61 67 65  e->name, package
4120: 6e 61 6d 65 29 3b 0a 0a 09 09 09 09 63 6f 6e 74  name);......cont
4130: 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 6f  inue;....}.....o
4140: 73 5f 63 70 75 41 72 63 68 5f 63 6f 75 6e 74 2b  s_cpuArch_count+
4150: 2b 3b 0a 0a 09 09 09 69 66 20 28 63 68 69 6c 64  +;.....if (child
4160: 72 65 6e 29 20 7b 0a 09 09 09 09 6e 6f 64 65 20  ren) {.....node 
4170: 3d 20 28 76 6f 69 64 20 2a 29 20 63 6b 61 6c 6c  = (void *) ckall
4180: 6f 63 28 73 69 7a 65 6f 66 28 2a 6e 6f 64 65 29  oc(sizeof(*node)
4190: 29 3b 0a 09 09 09 09 6e 6f 64 65 2d 3e 5f 6e 65  );.....node->_ne
41a0: 78 74 20 3d 20 2a 63 68 69 6c 64 72 65 6e 3b 0a  xt = *children;.
41b0: 09 09 09 09 73 6e 70 72 69 6e 74 66 28 6e 6f 64  ....snprintf(nod
41c0: 65 2d 3e 6e 61 6d 65 2c 20 73 69 7a 65 6f 66 28  e->name, sizeof(
41d0: 6e 6f 64 65 2d 3e 6e 61 6d 65 29 2c 20 22 25 73  node->name), "%s
41e0: 2d 25 73 22 2c 20 70 61 63 6b 61 67 65 2d 3e 6f  -%s", package->o
41f0: 73 5f 73 74 72 2c 20 70 61 63 6b 61 67 65 2d 3e  s_str, package->
4200: 63 70 75 41 72 63 68 5f 73 74 72 29 3b 0a 09 09  cpuArch_str);...
4210: 09 09 2a 63 68 69 6c 64 72 65 6e 20 3d 20 6e 6f  ..*children = no
4220: 64 65 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  de;....}...}....
4230: 61 70 70 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f  appfs_free_list_
4240: 70 61 63 6b 61 67 65 28 70 61 63 6b 61 67 65 73  package(packages
4250: 29 3b 0a 0a 09 09 66 72 65 65 28 70 61 74 68 5f  );....free(path_
4260: 73 29 3b 0a 0a 09 09 70 61 74 68 69 6e 66 6f 2d  s);....pathinfo-
4270: 3e 74 79 70 65 69 6e 66 6f 2e 64 69 72 2e 63 68  >typeinfo.dir.ch
4280: 69 6c 64 63 6f 75 6e 74 20 3d 20 6f 73 5f 63 70  ildcount = os_cp
4290: 75 41 72 63 68 5f 63 6f 75 6e 74 3b 0a 0a 09 09  uArch_count;....
42a0: 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
42b0: 2a 6f 73 5f 63 70 75 41 72 63 68 20 3d 20 27 5c  *os_cpuArch = '\
42c0: 30 27 3b 0a 09 6f 73 5f 63 70 75 41 72 63 68 2b  0';..os_cpuArch+
42d0: 2b 3b 0a 0a 09 76 65 72 73 69 6f 6e 20 3d 20 73  +;...version = s
42e0: 74 72 63 68 72 28 6f 73 5f 63 70 75 41 72 63 68  trchr(os_cpuArch
42f0: 2c 20 27 2f 27 29 3b 0a 0a 09 69 66 20 28 76 65  , '/');...if (ve
4300: 72 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b  rsion != NULL) {
4310: 0a 09 09 2a 76 65 72 73 69 6f 6e 20 3d 20 27 5c  ...*version = '\
4320: 30 27 3b 0a 09 09 76 65 72 73 69 6f 6e 2b 2b 3b  0';...version++;
4330: 0a 09 7d 0a 0a 09 6f 73 20 3d 20 6f 73 5f 63 70  ..}...os = os_cp
4340: 75 41 72 63 68 3b 0a 09 63 70 75 41 72 63 68 20  uArch;..cpuArch 
4350: 3d 20 73 74 72 63 68 72 28 6f 73 5f 63 70 75 41  = strchr(os_cpuA
4360: 72 63 68 2c 20 27 2d 27 29 3b 0a 09 69 66 20 28  rch, '-');..if (
4370: 63 70 75 41 72 63 68 29 20 7b 0a 09 09 2a 63 70  cpuArch) {...*cp
4380: 75 41 72 63 68 20 3d 20 27 5c 30 27 3b 0a 09 09  uArch = '\0';...
4390: 63 70 75 41 72 63 68 2b 2b 3b 0a 0a 09 09 63 70  cpuArch++;....cp
43a0: 75 41 72 63 68 5f 76 61 6c 20 3d 20 61 70 70 66  uArch_val = appf
43b0: 73 5f 63 6f 6e 76 65 72 74 5f 63 70 75 41 72 63  s_convert_cpuArc
43c0: 68 5f 66 72 6f 6d 53 74 72 69 6e 67 28 63 70 75  h_fromString(cpu
43d0: 41 72 63 68 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  Arch);..} else {
43e0: 0a 09 09 63 70 75 41 72 63 68 5f 76 61 6c 20 3d  ...cpuArch_val =
43f0: 20 41 50 50 46 53 5f 43 50 55 5f 55 4e 4b 4e 4f   APPFS_CPU_UNKNO
4400: 57 4e 3b 0a 09 7d 0a 0a 09 6f 73 5f 76 61 6c 20  WN;..}...os_val 
4410: 3d 20 61 70 70 66 73 5f 63 6f 6e 76 65 72 74 5f  = appfs_convert_
4420: 6f 73 5f 66 72 6f 6d 53 74 72 69 6e 67 28 6f 73  os_fromString(os
4430: 29 3b 0a 0a 09 69 66 20 28 76 65 72 73 69 6f 6e  );...if (version
4440: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a   == NULL) {.../*
4450: 20 52 65 71 75 65 73 74 20 66 6f 72 20 76 65 72   Request for ver
4460: 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 61 20  sion list for a 
4470: 70 61 63 6b 61 67 65 20 6f 6e 20 61 6e 20 4f 53  package on an OS
4480: 2f 43 50 55 20 2a 2f 0a 09 09 70 61 74 68 69 6e  /CPU */...pathin
4490: 66 6f 2d 3e 74 79 70 65 20 3d 20 41 50 50 46 53  fo->type = APPFS
44a0: 5f 50 41 54 48 54 59 50 45 5f 44 49 52 45 43 54  _PATHTYPE_DIRECT
44b0: 4f 52 59 3b 0a 09 09 70 61 74 68 69 6e 66 6f 2d  ORY;...pathinfo-
44c0: 3e 74 69 6d 65 20 3d 20 67 6c 6f 62 61 6c 54 68  >time = globalTh
44d0: 72 65 61 64 2e 62 6f 6f 74 74 69 6d 65 3b 0a 0a  read.boottime;..
44e0: 09 09 76 65 72 73 69 6f 6e 5f 63 6f 75 6e 74 20  ..version_count 
44f0: 3d 20 30 3b 0a 09 09 66 6f 72 20 28 70 61 63 6b  = 0;...for (pack
4500: 61 67 65 20 3d 20 70 61 63 6b 61 67 65 73 3b 20  age = packages; 
4510: 70 61 63 6b 61 67 65 3b 20 70 61 63 6b 61 67 65  package; package
4520: 20 3d 20 70 61 63 6b 61 67 65 2d 3e 5f 6e 65 78   = package->_nex
4530: 74 29 20 7b 0a 09 09 09 69 66 20 28 73 74 72 63  t) {....if (strc
4540: 6d 70 28 70 61 63 6b 61 67 65 2d 3e 6e 61 6d 65  mp(package->name
4550: 2c 20 70 61 63 6b 61 67 65 6e 61 6d 65 29 20 21  , packagename) !
4560: 3d 20 30 29 20 7b 0a 09 09 09 09 41 50 50 46 53  = 0) {.....APPFS
4570: 5f 44 45 42 55 47 28 22 53 6b 69 70 70 69 6e 67  _DEBUG("Skipping
4580: 20 70 61 63 6b 61 67 65 20 6e 61 6d 65 64 20 5c   package named \
4590: 22 25 73 5c 22 2c 20 64 6f 65 73 20 6e 6f 74 20  "%s\", does not 
45a0: 6d 61 74 63 68 20 72 65 71 75 65 73 74 65 64 20  match requested 
45b0: 70 61 63 6b 61 67 65 3a 20 5c 22 25 73 5c 22 22  package: \"%s\""
45c0: 2c 20 70 61 63 6b 61 67 65 2d 3e 6e 61 6d 65 2c  , package->name,
45d0: 20 70 61 63 6b 61 67 65 6e 61 6d 65 29 3b 0a 0a   packagename);..
45e0: 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
45f0: 09 7d 0a 0a 09 09 09 69 66 20 28 70 61 63 6b 61  .}.....if (packa
4600: 67 65 2d 3e 6f 73 20 21 3d 20 6f 73 5f 76 61 6c  ge->os != os_val
4610: 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  ) {.....continue
4620: 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 70  ;....}.....if (p
4630: 61 63 6b 61 67 65 2d 3e 63 70 75 41 72 63 68 20  ackage->cpuArch 
4640: 21 3d 20 63 70 75 41 72 63 68 5f 76 61 6c 29 20  != cpuArch_val) 
4650: 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
4660: 09 09 09 7d 0a 0a 09 09 09 76 65 72 73 69 6f 6e  ...}.....version
4670: 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 69 66  _count++;.....if
4680: 20 28 63 68 69 6c 64 72 65 6e 29 20 7b 0a 09 09   (children) {...
4690: 09 09 6e 6f 64 65 20 3d 20 28 76 6f 69 64 20 2a  ..node = (void *
46a0: 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  ) ckalloc(sizeof
46b0: 28 2a 6e 6f 64 65 29 29 3b 0a 09 09 09 09 6e 6f  (*node));.....no
46c0: 64 65 2d 3e 5f 6e 65 78 74 20 3d 20 2a 63 68 69  de->_next = *chi
46d0: 6c 64 72 65 6e 3b 0a 09 09 09 09 73 74 72 63 70  ldren;.....strcp
46e0: 79 28 6e 6f 64 65 2d 3e 6e 61 6d 65 2c 20 70 61  y(node->name, pa
46f0: 63 6b 61 67 65 2d 3e 76 65 72 73 69 6f 6e 29 3b  ckage->version);
4700: 0a 09 09 09 09 2a 63 68 69 6c 64 72 65 6e 20 3d  .....*children =
4710: 20 6e 6f 64 65 3b 0a 09 09 09 7d 0a 09 09 7d 0a   node;....}...}.
4720: 0a 09 09 61 70 70 66 73 5f 66 72 65 65 5f 6c 69  ...appfs_free_li
4730: 73 74 5f 70 61 63 6b 61 67 65 28 70 61 63 6b 61  st_package(packa
4740: 67 65 73 29 3b 0a 0a 09 09 66 72 65 65 28 70 61  ges);....free(pa
4750: 74 68 5f 73 29 3b 0a 0a 09 09 70 61 74 68 69 6e  th_s);....pathin
4760: 66 6f 2d 3e 74 79 70 65 69 6e 66 6f 2e 64 69 72  fo->typeinfo.dir
4770: 2e 63 68 69 6c 64 63 6f 75 6e 74 20 3d 20 76 65  .childcount = ve
4780: 72 73 69 6f 6e 5f 63 6f 75 6e 74 3b 0a 0a 09 09  rsion_count;....
4790: 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
47a0: 61 70 70 66 73 5f 66 72 65 65 5f 6c 69 73 74 5f  appfs_free_list_
47b0: 70 61 63 6b 61 67 65 28 70 61 63 6b 61 67 65 73  package(packages
47c0: 29 3b 0a 0a 09 70 61 74 68 20 3d 20 73 74 72 63  );...path = strc
47d0: 68 72 28 76 65 72 73 69 6f 6e 2c 20 27 2f 27 29  hr(version, '/')
47e0: 3b 0a 09 69 66 20 28 70 61 74 68 20 3d 3d 20 4e  ;..if (path == N
47f0: 55 4c 4c 29 20 7b 0a 09 09 70 61 74 68 20 3d 20  ULL) {...path = 
4800: 22 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  "";..} else {...
4810: 2a 70 61 74 68 20 3d 20 27 5c 30 27 3b 0a 09 09  *path = '\0';...
4820: 70 61 74 68 2b 2b 3b 0a 09 7d 0a 0a 09 2f 2a 20  path++;..}.../* 
4830: 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 66 69  Request for a fi
4840: 6c 65 20 69 6e 20 61 20 73 70 65 63 69 66 69 63  le in a specific
4850: 20 70 61 63 6b 61 67 65 20 2a 2f 0a 09 41 50 50   package */..APP
4860: 46 53 5f 44 45 42 55 47 28 22 52 65 71 75 65 73  FS_DEBUG("Reques
4870: 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
4880: 20 66 6f 72 20 68 6f 73 74 6e 61 6d 65 20 3d 20   for hostname = 
4890: 25 73 2c 20 70 61 63 6b 61 67 65 20 3d 20 25 73  %s, package = %s
48a0: 2c 20 6f 73 20 3d 20 25 73 2c 20 63 70 75 41 72  , os = %s, cpuAr
48b0: 63 68 20 3d 20 25 73 2c 20 76 65 72 73 69 6f 6e  ch = %s, version
48c0: 20 3d 20 25 73 2c 20 70 61 74 68 20 3d 20 25 73   = %s, path = %s
48d0: 22 2c 20 0a 09 09 68 6f 73 74 6e 61 6d 65 2c 20  ", ...hostname, 
48e0: 70 61 63 6b 61 67 65 6e 61 6d 65 2c 20 6f 73 2c  packagename, os,
48f0: 20 63 70 75 41 72 63 68 2c 20 76 65 72 73 69 6f   cpuArch, versio
4900: 6e 2c 20 70 61 74 68 0a 09 29 3b 0a 0a 09 70 61  n, path..);...pa
4910: 63 6b 61 67 65 5f 68 61 73 68 20 3d 20 61 70 70  ckage_hash = app
4920: 66 73 5f 6c 6f 6f 6b 75 70 5f 70 61 63 6b 61 67  fs_lookup_packag
4930: 65 5f 68 61 73 68 28 68 6f 73 74 6e 61 6d 65 2c  e_hash(hostname,
4940: 20 70 61 63 6b 61 67 65 6e 61 6d 65 2c 20 6f 73   packagename, os
4950: 2c 20 63 70 75 41 72 63 68 2c 20 76 65 72 73 69  , cpuArch, versi
4960: 6f 6e 29 3b 0a 09 69 66 20 28 70 61 63 6b 61 67  on);..if (packag
4970: 65 5f 68 61 73 68 20 3d 3d 20 4e 55 4c 4c 29 20  e_hash == NULL) 
4980: 7b 0a 09 09 66 72 65 65 28 70 61 74 68 5f 73 29  {...free(path_s)
4990: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 45 4e 4f  ;....return(-ENO
49a0: 45 4e 54 29 3b 0a 09 7d 0a 0a 09 41 50 50 46 53  ENT);..}...APPFS
49b0: 5f 44 45 42 55 47 28 22 20 20 2e 2e 2e 20 77 68  _DEBUG("  ... wh
49c0: 69 63 68 20 68 61 73 68 20 61 20 68 61 73 68 20  ich hash a hash 
49d0: 6f 66 20 25 73 22 2c 20 70 61 63 6b 61 67 65 5f  of %s", package_
49e0: 68 61 73 68 29 3b 0a 0a 09 69 66 20 28 73 74 72  hash);...if (str
49f0: 63 6d 70 28 70 61 74 68 2c 20 22 22 29 20 3d 3d  cmp(path, "") ==
4a00: 20 30 29 20 7b 0a 09 09 70 61 74 68 69 6e 66 6f   0) {...pathinfo
4a10: 2d 3e 74 79 70 65 20 3d 20 41 50 50 46 53 5f 50  ->type = APPFS_P
4a20: 41 54 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52  ATHTYPE_DIRECTOR
4a30: 59 3b 0a 09 09 70 61 74 68 69 6e 66 6f 2d 3e 74  Y;...pathinfo->t
4a40: 69 6d 65 20 3d 20 67 6c 6f 62 61 6c 54 68 72 65  ime = globalThre
4a50: 61 64 2e 62 6f 6f 74 74 69 6d 65 3b 0a 09 7d 20  ad.boottime;..} 
4a60: 65 6c 73 65 20 7b 0a 09 09 66 69 6c 65 69 6e 66  else {...fileinf
4a70: 6f 5f 72 65 74 20 3d 20 61 70 70 66 73 5f 67 65  o_ret = appfs_ge
4a80: 74 66 69 6c 65 69 6e 66 6f 28 68 6f 73 74 6e 61  tfileinfo(hostna
4a90: 6d 65 2c 20 70 61 63 6b 61 67 65 5f 68 61 73 68  me, package_hash
4aa0: 2c 20 70 61 74 68 2c 20 70 61 74 68 69 6e 66 6f  , path, pathinfo
4ab0: 29 3b 0a 09 09 69 66 20 28 66 69 6c 65 69 6e 66  );...if (fileinf
4ac0: 6f 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  o_ret != 0) {...
4ad0: 09 66 72 65 65 28 70 61 74 68 5f 73 29 3b 0a 0a  .free(path_s);..
4ae0: 09 09 09 72 65 74 75 72 6e 28 66 69 6c 65 69 6e  ...return(filein
4af0: 66 6f 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a  fo_ret);...}..}.
4b00: 0a 09 69 66 20 28 70 61 74 68 69 6e 66 6f 2d 3e  ..if (pathinfo->
4b10: 74 79 70 65 20 3d 3d 20 41 50 50 46 53 5f 50 41  type == APPFS_PA
4b20: 54 48 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59  THTYPE_DIRECTORY
4b30: 29 20 7b 0a 09 09 64 69 72 5f 63 68 69 6c 64 72  ) {...dir_childr
4b40: 65 6e 20 3d 20 61 70 70 66 73 5f 67 65 74 63 68  en = appfs_getch
4b50: 69 6c 64 72 65 6e 28 68 6f 73 74 6e 61 6d 65 2c  ildren(hostname,
4b60: 20 70 61 63 6b 61 67 65 5f 68 61 73 68 2c 20 70   package_hash, p
4b70: 61 74 68 2c 20 26 66 69 6c 65 73 5f 63 6f 75 6e  ath, &files_coun
4b80: 74 29 3b 0a 0a 09 09 69 66 20 28 64 69 72 5f 63  t);....if (dir_c
4b90: 68 69 6c 64 72 65 6e 20 21 3d 20 4e 55 4c 4c 29  hildren != NULL)
4ba0: 20 7b 0a 09 09 09 70 61 74 68 69 6e 66 6f 2d 3e   {....pathinfo->
4bb0: 74 79 70 65 69 6e 66 6f 2e 64 69 72 2e 63 68 69  typeinfo.dir.chi
4bc0: 6c 64 63 6f 75 6e 74 20 3d 20 66 69 6c 65 73 5f  ldcount = files_
4bd0: 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 69 66  count;...}....if
4be0: 20 28 63 68 69 6c 64 72 65 6e 29 20 7b 0a 09 09   (children) {...
4bf0: 09 2a 63 68 69 6c 64 72 65 6e 20 3d 20 64 69 72  .*children = dir
4c00: 5f 63 68 69 6c 64 72 65 6e 3b 0a 09 09 7d 0a 09  _children;...}..
4c10: 7d 0a 0a 09 66 72 65 65 28 70 61 74 68 5f 73 29  }...free(path_s)
4c20: 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
4c30: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70  ..static int app
4c40: 66 73 5f 66 75 73 65 5f 67 65 74 61 74 74 72 28  fs_fuse_getattr(
4c50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
4c60: 2c 20 73 74 72 75 63 74 20 73 74 61 74 20 2a 73  , struct stat *s
4c70: 74 62 75 66 29 20 7b 0a 09 73 74 72 75 63 74 20  tbuf) {..struct 
4c80: 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20 70  appfs_pathinfo p
4c90: 61 74 68 69 6e 66 6f 3b 0a 09 69 6e 74 20 72 65  athinfo;..int re
4ca0: 73 20 3d 20 30 3b 0a 0a 09 41 50 50 46 53 5f 44  s = 0;...APPFS_D
4cb0: 45 42 55 47 28 22 45 6e 74 65 72 20 28 70 61 74  EBUG("Enter (pat
4cc0: 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c 20 70  h = %s, ...)", p
4cd0: 61 74 68 29 3b 0a 0a 09 72 65 73 20 3d 20 61 70  ath);...res = ap
4ce0: 70 66 73 5f 67 65 74 5f 70 61 74 68 5f 69 6e 66  pfs_get_path_inf
4cf0: 6f 28 70 61 74 68 2c 20 26 70 61 74 68 69 6e 66  o(path, &pathinf
4d00: 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 72  o, NULL);..if (r
4d10: 65 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74  es != 0) {...ret
4d20: 75 72 6e 28 72 65 73 29 3b 0a 09 7d 0a 0a 09 6d  urn(res);..}...m
4d30: 65 6d 73 65 74 28 73 74 62 75 66 2c 20 30 2c 20  emset(stbuf, 0, 
4d40: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74  sizeof(struct st
4d50: 61 74 29 29 3b 0a 0a 09 73 74 62 75 66 2d 3e 73  at));...stbuf->s
4d60: 74 5f 6d 74 69 6d 65 20 3d 20 70 61 74 68 69 6e  t_mtime = pathin
4d70: 66 6f 2e 74 69 6d 65 3b 0a 09 73 74 62 75 66 2d  fo.time;..stbuf-
4d80: 3e 73 74 5f 63 74 69 6d 65 20 3d 20 70 61 74 68  >st_ctime = path
4d90: 69 6e 66 6f 2e 74 69 6d 65 3b 0a 09 73 74 62 75  info.time;..stbu
4da0: 66 2d 3e 73 74 5f 61 74 69 6d 65 20 3d 20 70 61  f->st_atime = pa
4db0: 74 68 69 6e 66 6f 2e 74 69 6d 65 3b 0a 0a 09 69  thinfo.time;...i
4dc0: 66 20 28 70 61 74 68 69 6e 66 6f 2e 74 79 70 65  f (pathinfo.type
4dd0: 20 3d 3d 20 41 50 50 46 53 5f 50 41 54 48 54 59   == APPFS_PATHTY
4de0: 50 45 5f 44 49 52 45 43 54 4f 52 59 29 20 7b 0a  PE_DIRECTORY) {.
4df0: 09 09 73 74 62 75 66 2d 3e 73 74 5f 6d 6f 64 65  ..stbuf->st_mode
4e00: 20 3d 20 53 5f 49 46 44 49 52 20 7c 20 30 35 35   = S_IFDIR | 055
4e10: 35 3b 0a 09 09 73 74 62 75 66 2d 3e 73 74 5f 6e  5;...stbuf->st_n
4e20: 6c 69 6e 6b 20 3d 20 32 20 2b 20 70 61 74 68 69  link = 2 + pathi
4e30: 6e 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 64 69 72  nfo.typeinfo.dir
4e40: 2e 63 68 69 6c 64 63 6f 75 6e 74 3b 0a 09 7d 20  .childcount;..} 
4e50: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 70 61 74  else {...if (pat
4e60: 68 69 6e 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 66  hinfo.typeinfo.f
4e70: 69 6c 65 2e 65 78 65 63 75 74 61 62 6c 65 29 20  ile.executable) 
4e80: 7b 0a 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 6d  {....stbuf->st_m
4e90: 6f 64 65 20 3d 20 53 5f 49 46 52 45 47 20 7c 20  ode = S_IFREG | 
4ea0: 30 35 35 35 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  0555;...} else {
4eb0: 0a 09 09 09 73 74 62 75 66 2d 3e 73 74 5f 6d 6f  ....stbuf->st_mo
4ec0: 64 65 20 3d 20 53 5f 49 46 52 45 47 20 7c 20 30  de = S_IFREG | 0
4ed0: 34 34 34 3b 0a 09 09 7d 0a 0a 09 09 73 74 62 75  444;...}....stbu
4ee0: 66 2d 3e 73 74 5f 6e 6c 69 6e 6b 20 3d 20 31 3b  f->st_nlink = 1;
4ef0: 0a 09 09 73 74 62 75 66 2d 3e 73 74 5f 73 69 7a  ...stbuf->st_siz
4f00: 65 20 3d 20 70 61 74 68 69 6e 66 6f 2e 74 79 70  e = pathinfo.typ
4f10: 65 69 6e 66 6f 2e 66 69 6c 65 2e 73 69 7a 65 3b  einfo.file.size;
4f20: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 72 65 73  ..}...return res
4f30: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
4f40: 61 70 70 66 73 5f 66 75 73 65 5f 72 65 61 64 64  appfs_fuse_readd
4f50: 69 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  ir(const char *p
4f60: 61 74 68 2c 20 76 6f 69 64 20 2a 62 75 66 2c 20  ath, void *buf, 
4f70: 66 75 73 65 5f 66 69 6c 6c 5f 64 69 72 5f 74 20  fuse_fill_dir_t 
4f80: 66 69 6c 6c 65 72 2c 20 6f 66 66 5f 74 20 6f 66  filler, off_t of
4f90: 66 73 65 74 2c 20 73 74 72 75 63 74 20 66 75 73  fset, struct fus
4fa0: 65 5f 66 69 6c 65 5f 69 6e 66 6f 20 2a 66 69 29  e_file_info *fi)
4fb0: 20 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73   {..struct appfs
4fc0: 5f 70 61 74 68 69 6e 66 6f 20 70 61 74 68 69 6e  _pathinfo pathin
4fd0: 66 6f 3b 0a 09 73 74 72 75 63 74 20 61 70 70 66  fo;..struct appf
4fe0: 73 5f 63 68 69 6c 64 72 65 6e 20 2a 63 68 69 6c  s_children *chil
4ff0: 64 72 65 6e 2c 20 2a 63 68 69 6c 64 3b 0a 09 69  dren, *child;..i
5000: 6e 74 20 72 65 74 76 61 6c 3b 0a 0a 09 41 50 50  nt retval;...APP
5010: 46 53 5f 44 45 42 55 47 28 22 45 6e 74 65 72 20  FS_DEBUG("Enter 
5020: 28 70 61 74 68 20 3d 20 25 73 2c 20 2e 2e 2e 29  (path = %s, ...)
5030: 22 2c 20 70 61 74 68 29 3b 0a 0a 09 72 65 74 76  ", path);...retv
5040: 61 6c 20 3d 20 61 70 70 66 73 5f 67 65 74 5f 70  al = appfs_get_p
5050: 61 74 68 5f 69 6e 66 6f 28 70 61 74 68 2c 20 26  ath_info(path, &
5060: 70 61 74 68 69 6e 66 6f 2c 20 26 63 68 69 6c 64  pathinfo, &child
5070: 72 65 6e 29 3b 0a 09 69 66 20 28 72 65 74 76 61  ren);..if (retva
5080: 6c 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  l != 0) {...retu
5090: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  rn(retval);..}..
50a0: 09 66 69 6c 6c 65 72 28 62 75 66 2c 20 22 2e 22  .filler(buf, "."
50b0: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 66 69 6c  , NULL, 0);..fil
50c0: 6c 65 72 28 62 75 66 2c 20 22 2e 2e 22 2c 20 4e  ler(buf, "..", N
50d0: 55 4c 4c 2c 20 30 29 3b 0a 0a 09 66 6f 72 20 28  ULL, 0);...for (
50e0: 63 68 69 6c 64 20 3d 20 63 68 69 6c 64 72 65 6e  child = children
50f0: 3b 20 63 68 69 6c 64 3b 20 63 68 69 6c 64 20 3d  ; child; child =
5100: 20 63 68 69 6c 64 2d 3e 5f 6e 65 78 74 29 20 7b   child->_next) {
5110: 0a 09 09 66 69 6c 6c 65 72 28 62 75 66 2c 20 63  ...filler(buf, c
5120: 68 69 6c 64 2d 3e 6e 61 6d 65 2c 20 4e 55 4c 4c  hild->name, NULL
5130: 2c 20 30 29 3b 0a 09 7d 0a 0a 09 61 70 70 66 73  , 0);..}...appfs
5140: 5f 66 72 65 65 5f 6c 69 73 74 5f 63 68 69 6c 64  _free_list_child
5150: 72 65 6e 28 63 68 69 6c 64 72 65 6e 29 3b 0a 0a  ren(children);..
5160: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73  .return(0);.}..s
5170: 74 61 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f  tatic int appfs_
5180: 66 75 73 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  fuse_open(const 
5190: 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74 72 75  char *path, stru
51a0: 63 74 20 66 75 73 65 5f 66 69 6c 65 5f 69 6e 66  ct fuse_file_inf
51b0: 6f 20 2a 66 69 29 20 7b 0a 09 73 74 72 75 63 74  o *fi) {..struct
51c0: 20 61 70 70 66 73 5f 70 61 74 68 69 6e 66 6f 20   appfs_pathinfo 
51d0: 70 61 74 68 69 6e 66 6f 3b 0a 09 63 6f 6e 73 74  pathinfo;..const
51e0: 20 63 68 61 72 20 2a 72 65 61 6c 5f 70 61 74 68   char *real_path
51f0: 3b 0a 09 69 6e 74 20 66 68 3b 0a 09 69 6e 74 20  ;..int fh;..int 
5200: 67 70 69 5f 72 65 74 3b 0a 0a 09 41 50 50 46 53  gpi_ret;...APPFS
5210: 5f 44 45 42 55 47 28 22 45 6e 74 65 72 20 28 70  _DEBUG("Enter (p
5220: 61 74 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c  ath = %s, ...)",
5230: 20 70 61 74 68 29 3b 0a 0a 09 69 66 20 28 28 66   path);...if ((f
5240: 69 2d 3e 66 6c 61 67 73 20 26 20 33 29 20 21 3d  i->flags & 3) !=
5250: 20 4f 5f 52 44 4f 4e 4c 59 29 20 7b 0a 20 20 20   O_RDONLY) {.   
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
5270: 75 72 6e 28 2d 45 41 43 43 45 53 29 3b 0a 09 7d  urn(-EACCES);..}
5280: 0a 0a 09 67 70 69 5f 72 65 74 20 3d 20 61 70 70  ...gpi_ret = app
5290: 66 73 5f 67 65 74 5f 70 61 74 68 5f 69 6e 66 6f  fs_get_path_info
52a0: 28 70 61 74 68 2c 20 26 70 61 74 68 69 6e 66 6f  (path, &pathinfo
52b0: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 67 70  , NULL);..if (gp
52c0: 69 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  i_ret != 0) {...
52d0: 72 65 74 75 72 6e 28 67 70 69 5f 72 65 74 29 3b  return(gpi_ret);
52e0: 0a 09 7d 0a 0a 09 69 66 20 28 70 61 74 68 69 6e  ..}...if (pathin
52f0: 66 6f 2e 74 79 70 65 20 3d 3d 20 41 50 50 46 53  fo.type == APPFS
5300: 5f 50 41 54 48 54 59 50 45 5f 44 49 52 45 43 54  _PATHTYPE_DIRECT
5310: 4f 52 59 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ORY) {...return(
5320: 2d 45 49 53 44 49 52 29 3b 0a 09 7d 0a 0a 09 72  -EISDIR);..}...r
5330: 65 61 6c 5f 70 61 74 68 20 3d 20 61 70 70 66 73  eal_path = appfs
5340: 5f 67 65 74 66 69 6c 65 28 70 61 74 68 69 6e 66  _getfile(pathinf
5350: 6f 2e 68 6f 73 74 6e 61 6d 65 2c 20 70 61 74 68  o.hostname, path
5360: 69 6e 66 6f 2e 74 79 70 65 69 6e 66 6f 2e 66 69  info.typeinfo.fi
5370: 6c 65 2e 73 68 61 31 29 3b 0a 09 69 66 20 28 72  le.sha1);..if (r
5380: 65 61 6c 5f 70 61 74 68 20 3d 3d 20 4e 55 4c 4c  eal_path == NULL
5390: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 49  ) {...return(-EI
53a0: 4f 29 3b 0a 09 7d 0a 0a 09 66 68 20 3d 20 6f 70  O);..}...fh = op
53b0: 65 6e 28 72 65 61 6c 5f 70 61 74 68 2c 20 4f 5f  en(real_path, O_
53c0: 52 44 4f 4e 4c 59 29 3b 0a 09 66 72 65 65 28 28  RDONLY);..free((
53d0: 76 6f 69 64 20 2a 29 20 72 65 61 6c 5f 70 61 74  void *) real_pat
53e0: 68 29 3b 0a 09 69 66 20 28 66 68 20 3c 20 30 29  h);..if (fh < 0)
53f0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 49 4f   {...return(-EIO
5400: 29 3b 0a 09 7d 0a 0a 09 66 69 2d 3e 66 68 20 3d  );..}...fi->fh =
5410: 20 66 68 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29   fh;...return(0)
5420: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
5430: 61 70 70 66 73 5f 66 75 73 65 5f 72 65 61 64 28  appfs_fuse_read(
5440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
5450: 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a  , char *buf, siz
5460: 65 5f 74 20 73 69 7a 65 2c 20 6f 66 66 5f 74 20  e_t size, off_t 
5470: 6f 66 66 73 65 74 2c 20 73 74 72 75 63 74 20 66  offset, struct f
5480: 75 73 65 5f 66 69 6c 65 5f 69 6e 66 6f 20 2a 66  use_file_info *f
5490: 69 29 20 7b 0a 09 6f 66 66 5f 74 20 6c 73 65 65  i) {..off_t lsee
54a0: 6b 5f 72 65 74 3b 0a 09 73 73 69 7a 65 5f 74 20  k_ret;..ssize_t 
54b0: 72 65 61 64 5f 72 65 74 3b 0a 0a 09 41 50 50 46  read_ret;...APPF
54c0: 53 5f 44 45 42 55 47 28 22 45 6e 74 65 72 20 28  S_DEBUG("Enter (
54d0: 70 61 74 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22  path = %s, ...)"
54e0: 2c 20 70 61 74 68 29 3b 0a 0a 09 6c 73 65 65 6b  , path);...lseek
54f0: 5f 72 65 74 20 3d 20 6c 73 65 65 6b 28 66 69 2d  _ret = lseek(fi-
5500: 3e 66 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  >fh, offset, SEE
5510: 4b 5f 53 45 54 29 3b 0a 09 69 66 20 28 6c 73 65  K_SET);..if (lse
5520: 65 6b 5f 72 65 74 20 21 3d 20 6f 66 66 73 65 74  ek_ret != offset
5530: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 49  ) {...return(-EI
5540: 4f 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65  O);..}...read_re
5550: 74 20 3d 20 72 65 61 64 28 66 69 2d 3e 66 68 2c  t = read(fi->fh,
5560: 20 62 75 66 2c 20 73 69 7a 65 29 3b 0a 0a 09 72   buf, size);...r
5570: 65 74 75 72 6e 28 72 65 61 64 5f 72 65 74 29 3b  eturn(read_ret);
5580: 0a 7d 0a 0a 23 69 66 64 65 66 20 41 50 50 46 53  .}..#ifdef APPFS
5590: 5f 54 45 53 54 5f 44 52 49 56 45 52 0a 73 74 61  _TEST_DRIVER.sta
55a0: 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f 74 65  tic int appfs_te
55b0: 73 74 5f 64 72 69 76 65 72 28 76 6f 69 64 29 20  st_driver(void) 
55c0: 7b 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f  {..struct appfs_
55d0: 73 69 74 65 20 2a 73 69 74 65 73 2c 20 2a 73 69  site *sites, *si
55e0: 74 65 3b 0a 09 73 74 72 75 63 74 20 61 70 70 66  te;..struct appf
55f0: 73 5f 70 61 63 6b 61 67 65 20 2a 70 61 63 6b 61  s_package *packa
5600: 67 65 73 2c 20 2a 70 61 63 6b 61 67 65 3b 0a 09  ges, *package;..
5610: 73 74 72 75 63 74 20 61 70 70 66 73 5f 63 68 69  struct appfs_chi
5620: 6c 64 72 65 6e 20 2a 66 69 6c 65 73 2c 20 2a 66  ldren *files, *f
5630: 69 6c 65 3b 0a 09 63 68 61 72 20 2a 73 68 61 31  ile;..char *sha1
5640: 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 70 61   = NULL;..int pa
5650: 63 6b 61 67 65 73 5f 63 6f 75 6e 74 20 3d 20 30  ckages_count = 0
5660: 2c 20 73 69 74 65 73 5f 63 6f 75 6e 74 20 3d 20  , sites_count = 
5670: 30 2c 20 66 69 6c 65 73 5f 63 6f 75 6e 74 3b 0a  0, files_count;.
5680: 0a 09 73 69 74 65 73 20 3d 20 61 70 70 66 73 5f  ..sites = appfs_
5690: 67 65 74 73 69 74 65 73 28 26 73 69 74 65 73 5f  getsites(&sites_
56a0: 63 6f 75 6e 74 29 3b 0a 09 70 72 69 6e 74 66 28  count);..printf(
56b0: 22 53 69 74 65 73 3a 5c 6e 22 29 3b 0a 09 66 6f  "Sites:\n");..fo
56c0: 72 20 28 73 69 74 65 20 3d 20 73 69 74 65 73 3b  r (site = sites;
56d0: 20 73 69 74 65 3b 20 73 69 74 65 20 3d 20 73 69   site; site = si
56e0: 74 65 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 70  te->_next) {...p
56f0: 72 69 6e 74 66 28 22 5c 74 6e 61 6d 65 20 3d 20  rintf("\tname = 
5700: 25 73 5c 6e 22 2c 20 73 69 74 65 2d 3e 6e 61 6d  %s\n", site->nam
5710: 65 29 3b 0a 09 7d 0a 0a 09 61 70 70 66 73 5f 66  e);..}...appfs_f
5720: 72 65 65 5f 6c 69 73 74 5f 73 69 74 65 28 73 69  ree_list_site(si
5730: 74 65 73 29 3b 0a 0a 09 70 61 63 6b 61 67 65 73  tes);...packages
5740: 20 3d 20 61 70 70 66 73 5f 67 65 74 69 6e 64 65   = appfs_getinde
5750: 78 28 22 72 6b 65 65 6e 65 2e 6f 72 67 22 2c 20  x("rkeene.org", 
5760: 26 70 61 63 6b 61 67 65 73 5f 63 6f 75 6e 74 29  &packages_count)
5770: 3b 0a 09 69 66 20 28 70 61 63 6b 61 67 65 73 20  ;..if (packages 
5780: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 61 63 6b 61  == NULL || packa
5790: 67 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20  ges_count == 0) 
57a0: 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65  {...fprintf(stde
57b0: 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 66  rr, "Unable to f
57c0: 65 74 63 68 20 70 61 63 6b 61 67 65 20 69 6e 64  etch package ind
57d0: 65 78 20 66 72 6f 6d 20 72 6b 65 65 6e 65 2e 6f  ex from rkeene.o
57e0: 72 67 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75  rg.\n");....retu
57f0: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  rn(1);..}...for 
5800: 28 70 61 63 6b 61 67 65 20 3d 20 70 61 63 6b 61  (package = packa
5810: 67 65 73 3b 20 70 61 63 6b 61 67 65 3b 20 70 61  ges; package; pa
5820: 63 6b 61 67 65 20 3d 20 70 61 63 6b 61 67 65 2d  ckage = package-
5830: 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 73 68 61 31  >_next) {...sha1
5840: 20 3d 20 70 61 63 6b 61 67 65 2d 3e 73 68 61 31   = package->sha1
5850: 3b 0a 0a 09 09 70 72 69 6e 74 66 28 22 50 61 63  ;....printf("Pac
5860: 6b 61 67 65 3a 5c 6e 5c 74 6e 61 6d 65 20 3d 20  kage:\n\tname = 
5870: 25 73 5c 6e 5c 74 76 65 72 73 69 6f 6e 20 3d 20  %s\n\tversion = 
5880: 25 73 5c 6e 5c 74 73 68 61 31 20 3d 20 25 73 5c  %s\n\tsha1 = %s\
5890: 6e 5c 74 6f 73 20 3d 20 25 73 5c 6e 5c 74 63 70  n\tos = %s\n\tcp
58a0: 75 41 72 63 68 20 3d 20 25 73 5c 6e 22 2c 0a 09  uArch = %s\n",..
58b0: 09 09 70 61 63 6b 61 67 65 2d 3e 6e 61 6d 65 2c  ..package->name,
58c0: 0a 09 09 09 70 61 63 6b 61 67 65 2d 3e 76 65 72  ....package->ver
58d0: 73 69 6f 6e 2c 0a 09 09 09 70 61 63 6b 61 67 65  sion,....package
58e0: 2d 3e 73 68 61 31 2c 0a 09 09 09 61 70 70 66 73  ->sha1,....appfs
58f0: 5f 63 6f 6e 76 65 72 74 5f 6f 73 5f 74 6f 53 74  _convert_os_toSt
5900: 72 69 6e 67 28 70 61 63 6b 61 67 65 2d 3e 6f 73  ring(package->os
5910: 29 2c 0a 09 09 09 61 70 70 66 73 5f 63 6f 6e 76  ),....appfs_conv
5920: 65 72 74 5f 63 70 75 41 72 63 68 5f 74 6f 53 74  ert_cpuArch_toSt
5930: 72 69 6e 67 28 70 61 63 6b 61 67 65 2d 3e 63 70  ring(package->cp
5940: 75 41 72 63 68 29 0a 09 09 29 3b 0a 09 7d 0a 0a  uArch)...);..}..
5950: 09 66 69 6c 65 73 20 3d 20 61 70 70 66 73 5f 67  .files = appfs_g
5960: 65 74 63 68 69 6c 64 72 65 6e 28 22 72 6b 65 65  etchildren("rkee
5970: 6e 65 2e 6f 72 67 22 2c 20 73 68 61 31 2c 20 22  ne.org", sha1, "
5980: 22 2c 20 26 66 69 6c 65 73 5f 63 6f 75 6e 74 29  ", &files_count)
5990: 3b 0a 09 69 66 20 28 66 69 6c 65 73 20 3d 3d 20  ;..if (files == 
59a0: 4e 55 4c 4c 29 20 7b 0a 09 09 66 70 72 69 6e 74  NULL) {...fprint
59b0: 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61 62 6c  f(stderr, "Unabl
59c0: 65 20 74 6f 20 6c 69 73 74 20 66 69 6c 65 73 20  e to list files 
59d0: 69 6e 20 74 68 65 20 6c 61 73 74 20 70 61 63 6b  in the last pack
59e0: 61 67 65 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74  age.\n");....ret
59f0: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 70 72 69  urn(1);..}...pri
5a00: 6e 74 66 28 22 46 69 6c 65 73 3a 5c 6e 22 29 3b  ntf("Files:\n");
5a10: 0a 09 66 6f 72 20 28 66 69 6c 65 20 3d 20 66 69  ..for (file = fi
5a20: 6c 65 73 3b 20 66 69 6c 65 3b 20 66 69 6c 65 20  les; file; file 
5a30: 3d 20 66 69 6c 65 2d 3e 5f 6e 65 78 74 29 20 7b  = file->_next) {
5a40: 0a 09 09 70 72 69 6e 74 66 28 22 5c 74 25 73 5c  ...printf("\t%s\
5a50: 6e 22 2c 20 66 69 6c 65 2d 3e 6e 61 6d 65 29 3b  n", file->name);
5a60: 0a 09 7d 0a 0a 09 61 70 70 66 73 5f 66 72 65 65  ..}...appfs_free
5a70: 5f 6c 69 73 74 5f 63 68 69 6c 64 72 65 6e 28 66  _list_children(f
5a80: 69 6c 65 73 29 3b 0a 0a 09 66 69 6c 65 73 20 3d  iles);...files =
5a90: 20 61 70 70 66 73 5f 67 65 74 63 68 69 6c 64 72   appfs_getchildr
5aa0: 65 6e 28 22 72 6b 65 65 6e 65 2e 6f 72 67 22 2c  en("rkeene.org",
5ab0: 20 73 68 61 31 2c 20 22 74 63 6c 22 2c 20 26 66   sha1, "tcl", &f
5ac0: 69 6c 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 69 66  iles_count);..if
5ad0: 20 28 66 69 6c 65 73 20 3d 3d 20 4e 55 4c 4c 29   (files == NULL)
5ae0: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64   {...fprintf(std
5af0: 65 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20  err, "Unable to 
5b00: 6c 69 73 74 20 66 69 6c 65 73 20 69 6e 20 74 68  list files in th
5b10: 65 20 6c 61 73 74 20 70 61 63 6b 61 67 65 2e 5c  e last package.\
5b20: 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  n");....return(1
5b30: 29 3b 0a 09 7d 0a 0a 09 70 72 69 6e 74 66 28 22  );..}...printf("
5b40: 46 69 6c 65 73 3a 5c 6e 22 29 3b 0a 09 66 6f 72  Files:\n");..for
5b50: 20 28 66 69 6c 65 20 3d 20 66 69 6c 65 73 3b 20   (file = files; 
5b60: 66 69 6c 65 3b 20 66 69 6c 65 20 3d 20 66 69 6c  file; file = fil
5b70: 65 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 70 72  e->_next) {...pr
5b80: 69 6e 74 66 28 22 5c 74 74 63 6c 2f 25 73 5c 6e  intf("\ttcl/%s\n
5b90: 22 2c 20 66 69 6c 65 2d 3e 6e 61 6d 65 29 3b 0a  ", file->name);.
5ba0: 09 7d 0a 0a 09 61 70 70 66 73 5f 66 72 65 65 5f  .}...appfs_free_
5bb0: 6c 69 73 74 5f 63 68 69 6c 64 72 65 6e 28 66 69  list_children(fi
5bc0: 6c 65 73 29 3b 0a 09 61 70 70 66 73 5f 66 72 65  les);..appfs_fre
5bd0: 65 5f 6c 69 73 74 5f 70 61 63 6b 61 67 65 28 70  e_list_package(p
5be0: 61 63 6b 61 67 65 73 29 3b 0a 0a 09 72 65 74 75  ackages);...retu
5bf0: 72 6e 28 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 73  rn(0);.}.#else.s
5c00: 74 61 74 69 63 20 73 74 72 75 63 74 20 66 75 73  tatic struct fus
5c10: 65 5f 6f 70 65 72 61 74 69 6f 6e 73 20 61 70 70  e_operations app
5c20: 66 73 5f 6f 70 65 72 20 3d 20 7b 0a 09 2e 67 65  fs_oper = {...ge
5c30: 74 61 74 74 72 09 3d 20 61 70 70 66 73 5f 66 75  tattr.= appfs_fu
5c40: 73 65 5f 67 65 74 61 74 74 72 2c 0a 09 2e 72 65  se_getattr,...re
5c50: 61 64 64 69 72 09 3d 20 61 70 70 66 73 5f 66 75  addir.= appfs_fu
5c60: 73 65 5f 72 65 61 64 64 69 72 2c 0a 09 2e 6f 70  se_readdir,...op
5c70: 65 6e 09 09 3d 20 61 70 70 66 73 5f 66 75 73 65  en..= appfs_fuse
5c80: 5f 6f 70 65 6e 2c 0a 09 2e 72 65 61 64 09 09 3d  _open,...read..=
5c90: 20 61 70 70 66 73 5f 66 75 73 65 5f 72 65 61 64   appfs_fuse_read
5ca0: 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 20  .};.#endif..int 
5cb0: 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
5cc0: 68 61 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09 63  har **argv) {..c
5cd0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 61 63 68 65  onst char *cache
5ce0: 64 69 72 20 3d 20 41 50 50 46 53 5f 43 41 43 48  dir = APPFS_CACH
5cf0: 45 44 49 52 3b 0a 09 63 68 61 72 20 64 62 66 69  EDIR;..char dbfi
5d00: 6c 65 6e 61 6d 65 5b 31 30 32 34 5d 3b 0a 09 69  lename[1024];..i
5d10: 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 2c 20  nt pthread_ret, 
5d20: 73 6e 70 72 69 6e 74 66 5f 72 65 74 2c 20 73 71  snprintf_ret, sq
5d30: 6c 69 74 65 5f 72 65 74 3b 0a 0a 09 67 6c 6f 62  lite_ret;...glob
5d40: 61 6c 54 68 72 65 61 64 2e 63 61 63 68 65 64 69  alThread.cachedi
5d50: 72 20 3d 20 63 61 63 68 65 64 69 72 3b 0a 09 67  r = cachedir;..g
5d60: 6c 6f 62 61 6c 54 68 72 65 61 64 2e 62 6f 6f 74  lobalThread.boot
5d70: 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c  time = time(NULL
5d80: 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 72 65 74  );...pthread_ret
5d90: 20 3d 20 70 74 68 72 65 61 64 5f 6b 65 79 5f 63   = pthread_key_c
5da0: 72 65 61 74 65 28 26 69 6e 74 65 72 70 4b 65 79  reate(&interpKey
5db0: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 70 74  , NULL);..if (pt
5dc0: 68 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20  hread_ret != 0) 
5dd0: 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65  {...fprintf(stde
5de0: 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 63  rr, "Unable to c
5df0: 72 65 61 74 65 20 54 53 44 20 6b 65 79 20 66 6f  reate TSD key fo
5e00: 72 20 54 63 6c 2e 20 20 41 62 6f 72 74 69 6e 67  r Tcl.  Aborting
5e10: 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  .\n");....return
5e20: 28 31 29 3b 0a 09 7d 0a 0a 09 73 6e 70 72 69 6e  (1);..}...snprin
5e30: 74 66 5f 72 65 74 20 3d 20 73 6e 70 72 69 6e 74  tf_ret = snprint
5e40: 66 28 64 62 66 69 6c 65 6e 61 6d 65 2c 20 73 69  f(dbfilename, si
5e50: 7a 65 6f 66 28 64 62 66 69 6c 65 6e 61 6d 65 29  zeof(dbfilename)
5e60: 2c 20 22 25 73 2f 25 73 22 2c 20 63 61 63 68 65  , "%s/%s", cache
5e70: 64 69 72 2c 20 22 63 61 63 68 65 2e 64 62 22 29  dir, "cache.db")
5e80: 3b 0a 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f  ;..if (snprintf_
5e90: 72 65 74 20 3e 3d 20 73 69 7a 65 6f 66 28 64 62  ret >= sizeof(db
5ea0: 66 69 6c 65 6e 61 6d 65 29 29 20 7b 0a 09 09 66  filename)) {...f
5eb0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
5ec0: 55 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 64 61  Unable to set da
5ed0: 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 2e  tabase filename.
5ee0: 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e 22 29 3b    Aborting.\n");
5ef0: 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
5f00: 7d 0a 0a 09 73 71 6c 69 74 65 5f 72 65 74 20 3d  }...sqlite_ret =
5f10: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 64 62   sqlite3_open(db
5f20: 66 69 6c 65 6e 61 6d 65 2c 20 26 67 6c 6f 62 61  filename, &globa
5f30: 6c 54 68 72 65 61 64 2e 64 62 29 3b 0a 09 69 66  lThread.db);..if
5f40: 20 28 73 71 6c 69 74 65 5f 72 65 74 20 21 3d 20   (sqlite_ret != 
5f50: 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 09 09 66  SQLITE_OK) {...f
5f60: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
5f70: 55 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  Unable to open d
5f80: 61 74 61 62 61 73 65 3a 20 25 73 5c 6e 22 2c 20  atabase: %s\n", 
5f90: 64 62 66 69 6c 65 6e 61 6d 65 29 3b 0a 0a 09 09  dbfilename);....
5fa0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 23  return(1);..}..#
5fb0: 69 66 64 65 66 20 41 50 50 46 53 5f 54 45 53 54  ifdef APPFS_TEST
5fc0: 5f 44 52 49 56 45 52 0a 09 72 65 74 75 72 6e 28  _DRIVER..return(
5fd0: 61 70 70 66 73 5f 74 65 73 74 5f 64 72 69 76 65  appfs_test_drive
5fe0: 72 28 29 29 3b 0a 23 65 6c 73 65 0a 09 72 65 74  r());.#else..ret
5ff0: 75 72 6e 28 66 75 73 65 5f 6d 61 69 6e 28 61 72  urn(fuse_main(ar
6000: 67 63 2c 20 61 72 67 76 2c 20 26 61 70 70 66 73  gc, argv, &appfs
6010: 5f 6f 70 65 72 2c 20 4e 55 4c 4c 29 29 3b 0a 23  _oper, NULL));.#
6020: 65 6e 64 69 66 0a 7d 0a 20 0a                    endif.}. .