Hex Artifact Content

Artifact 0ffa90a2b2cd7d7e48392007ba5503c9b2e75a8e:


0000: 23 64 65 66 69 6e 65 20 46 55 53 45 5f 55 53 45  #define FUSE_USE
0010: 5f 56 45 52 53 49 4f 4e 20 32 36 0a 0a 23 69 6e  _VERSION 26..#in
0020: 63 6c 75 64 65 20 3c 73 71 6c 69 74 65 33 2e 68  clude <sqlite3.h
0030: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0040: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
0050: 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75  stdarg.h>.#inclu
0060: 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e  de <errno.h>.#in
0070: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a  clude <fcntl.h>.
0080: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
0090: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 75 73  h>.#include <fus
00a0: 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  e.h>.#include <t
00b0: 63 6c 2e 68 3e 0a 0a 23 64 65 66 69 6e 65 20 41  cl.h>..#define A
00c0: 50 50 46 53 5f 43 41 43 48 45 44 49 52 20 22 2f  PPFS_CACHEDIR "/
00d0: 74 6d 70 2f 61 70 70 66 73 2d 63 61 63 68 65 22  tmp/appfs-cache"
00e0: 0a 0a 23 64 65 66 69 6e 65 20 41 50 50 46 53 5f  ..#define APPFS_
00f0: 44 45 42 55 47 28 78 2e 2e 2e 29 20 7b 20 66 70  DEBUG(x...) { fp
0100: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
0110: 69 3a 25 73 3a 20 22 2c 20 5f 5f 4c 49 4e 45 5f  i:%s: ", __LINE_
0120: 5f 2c 20 5f 5f 66 75 6e 63 5f 5f 29 3b 20 66 70  _, __func__); fp
0130: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 78 29  rintf(stderr, x)
0140: 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ; fprintf(stderr
0150: 2c 20 22 5c 6e 22 29 3b 20 7d 0a 0a 73 74 72 75  , "\n"); }..stru
0160: 63 74 20 61 70 70 66 73 5f 74 68 72 65 61 64 5f  ct appfs_thread_
0170: 64 61 74 61 20 7b 0a 09 54 63 6c 5f 49 6e 74 65  data {..Tcl_Inte
0180: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 09 73 71 6c  rp *interp;..sql
0190: 69 74 65 33 20 2a 64 62 3b 0a 7d 3b 0a 0a 73 74  ite3 *db;.};..st
01a0: 72 75 63 74 20 61 70 70 66 73 5f 74 68 72 65 61  ruct appfs_threa
01b0: 64 5f 64 61 74 61 20 67 6c 6f 62 61 6c 54 68 72  d_data globalThr
01c0: 65 61 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  ead;..typedef en
01d0: 75 6d 20 7b 0a 09 41 50 50 46 53 5f 4f 53 5f 55  um {..APPFS_OS_U
01e0: 4e 4b 4e 4f 57 4e 2c 0a 09 41 50 50 46 53 5f 4f  NKNOWN,..APPFS_O
01f0: 53 5f 41 4c 4c 2c 0a 09 41 50 50 46 53 5f 4f 53  S_ALL,..APPFS_OS
0200: 5f 4c 49 4e 55 58 2c 0a 09 41 50 50 46 53 5f 4f  _LINUX,..APPFS_O
0210: 53 5f 4d 41 43 4f 53 58 2c 0a 09 41 50 50 46 53  S_MACOSX,..APPFS
0220: 5f 4f 53 5f 46 52 45 45 42 53 44 2c 0a 09 41 50  _OS_FREEBSD,..AP
0230: 50 46 53 5f 4f 53 5f 4f 50 45 4e 42 53 44 2c 0a  PFS_OS_OPENBSD,.
0240: 09 41 50 50 46 53 5f 4f 53 5f 53 4f 4c 41 52 49  .APPFS_OS_SOLARI
0250: 53 0a 7d 20 61 70 70 66 73 5f 6f 73 5f 74 3b 0a  S.} appfs_os_t;.
0260: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a  .typedef enum {.
0270: 09 41 50 50 46 53 5f 43 50 55 5f 55 4e 4b 4e 4f  .APPFS_CPU_UNKNO
0280: 57 4e 2c 0a 09 41 50 50 46 53 5f 43 50 55 5f 41  WN,..APPFS_CPU_A
0290: 4c 4c 2c 0a 09 41 50 50 46 53 5f 43 50 55 5f 41  LL,..APPFS_CPU_A
02a0: 4d 44 36 34 2c 0a 09 41 50 50 46 53 5f 43 50 55  MD64,..APPFS_CPU
02b0: 5f 49 33 38 36 2c 0a 09 41 50 50 46 53 5f 43 50  _I386,..APPFS_CP
02c0: 55 5f 41 52 4d 0a 7d 20 61 70 70 66 73 5f 63 70  U_ARM.} appfs_cp
02d0: 75 41 72 63 68 5f 74 3b 0a 0a 73 74 72 75 63 74  uArch_t;..struct
02e0: 20 61 70 70 66 73 5f 70 61 63 6b 61 67 65 20 7b   appfs_package {
02f0: 0a 09 63 68 61 72 20 6e 61 6d 65 5b 31 32 38 5d  ..char name[128]
0300: 3b 0a 09 63 68 61 72 20 76 65 72 73 69 6f 6e 5b  ;..char version[
0310: 36 34 5d 3b 0a 09 63 68 61 72 20 73 68 61 31 5b  64];..char sha1[
0320: 34 31 5d 3b 0a 09 61 70 70 66 73 5f 6f 73 5f 74  41];..appfs_os_t
0330: 20 6f 73 3b 0a 09 61 70 70 66 73 5f 63 70 75 41   os;..appfs_cpuA
0340: 72 63 68 5f 74 20 63 70 75 41 72 63 68 3b 0a 09  rch_t cpuArch;..
0350: 69 6e 74 20 69 73 4c 61 74 65 73 74 3b 0a 0a 09  int isLatest;...
0360: 69 6e 74 20 63 6f 75 6e 74 65 72 3b 0a 09 73 74  int counter;..st
0370: 72 75 63 74 20 61 70 70 66 73 5f 70 61 63 6b 61  ruct appfs_packa
0380: 67 65 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 73  ge *_next;.};..s
0390: 74 61 74 69 63 20 61 70 70 66 73 5f 6f 73 5f 74  tatic appfs_os_t
03a0: 20 61 70 70 66 73 5f 63 6f 6e 76 65 72 74 5f 6f   appfs_convert_o
03b0: 73 5f 66 72 6f 6d 53 74 72 69 6e 67 28 63 6f 6e  s_fromString(con
03c0: 73 74 20 63 68 61 72 20 2a 6f 73 29 20 7b 0a 09  st char *os) {..
03d0: 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 28 6f  if (strcasecmp(o
03e0: 73 2c 20 22 4c 69 6e 75 78 22 29 20 3d 3d 20 30  s, "Linux") == 0
03f0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 41 50 50  ) {...return(APP
0400: 46 53 5f 4f 53 5f 4c 49 4e 55 58 29 3b 0a 09 7d  FS_OS_LINUX);..}
0410: 0a 0a 09 69 66 20 28 73 74 72 63 61 73 65 63 6d  ...if (strcasecm
0420: 70 28 6f 73 2c 20 22 44 61 72 77 69 6e 22 29 20  p(os, "Darwin") 
0430: 3d 3d 20 30 20 7c 7c 20 73 74 72 63 61 73 65 63  == 0 || strcasec
0440: 6d 70 28 6f 73 2c 20 22 4d 61 63 20 4f 53 22 29  mp(os, "Mac OS")
0450: 20 3d 3d 20 30 20 7c 7c 20 73 74 72 63 61 73 65   == 0 || strcase
0460: 63 6d 70 28 6f 73 2c 20 22 4d 61 63 20 4f 53 20  cmp(os, "Mac OS 
0470: 58 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65  X") == 0) {...re
0480: 74 75 72 6e 28 41 50 50 46 53 5f 4f 53 5f 4d 41  turn(APPFS_OS_MA
0490: 43 4f 53 58 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  COSX);..}...if (
04a0: 73 74 72 63 61 73 65 63 6d 70 28 6f 73 2c 20 22  strcasecmp(os, "
04b0: 6e 6f 61 72 63 68 22 29 20 3d 3d 20 30 29 20 7b  noarch") == 0) {
04c0: 0a 09 09 72 65 74 75 72 6e 28 41 50 50 46 53 5f  ...return(APPFS_
04d0: 4f 53 5f 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  OS_ALL);..}...re
04e0: 74 75 72 6e 28 41 50 50 46 53 5f 4f 53 5f 55 4e  turn(APPFS_OS_UN
04f0: 4b 4e 4f 57 4e 29 3b 0a 7d 0a 0a 73 74 61 74 69  KNOWN);.}..stati
0500: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 70  c const char *ap
0510: 70 66 73 5f 63 6f 6e 76 65 72 74 5f 6f 73 5f 74  pfs_convert_os_t
0520: 6f 53 74 72 69 6e 67 28 61 70 70 66 73 5f 6f 73  oString(appfs_os
0530: 5f 74 20 6f 73 29 20 7b 0a 09 73 77 69 74 63 68  _t os) {..switch
0540: 20 28 6f 73 29 20 7b 0a 09 09 63 61 73 65 20 41   (os) {...case A
0550: 50 50 46 53 5f 4f 53 5f 41 4c 4c 3a 0a 09 09 09  PPFS_OS_ALL:....
0560: 72 65 74 75 72 6e 28 22 6e 6f 61 72 63 68 22 29  return("noarch")
0570: 3b 0a 09 09 63 61 73 65 20 41 50 50 46 53 5f 4f  ;...case APPFS_O
0580: 53 5f 4c 49 4e 55 58 3a 0a 09 09 09 72 65 74 75  S_LINUX:....retu
0590: 72 6e 28 22 6c 69 6e 75 78 22 29 3b 0a 09 09 63  rn("linux");...c
05a0: 61 73 65 20 41 50 50 46 53 5f 4f 53 5f 4d 41 43  ase APPFS_OS_MAC
05b0: 4f 53 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OSX:....return("
05c0: 6d 61 63 6f 73 78 22 29 3b 0a 09 09 63 61 73 65  macosx");...case
05d0: 20 41 50 50 46 53 5f 4f 53 5f 46 52 45 45 42 53   APPFS_OS_FREEBS
05e0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 66 72  D:....return("fr
05f0: 65 65 62 73 64 22 29 3b 0a 09 09 63 61 73 65 20  eebsd");...case 
0600: 41 50 50 46 53 5f 4f 53 5f 4f 50 45 4e 42 53 44  APPFS_OS_OPENBSD
0610: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 6f 70 65  :....return("ope
0620: 6e 62 73 64 22 29 3b 0a 09 09 63 61 73 65 20 41  nbsd");...case A
0630: 50 50 46 53 5f 4f 53 5f 53 4f 4c 41 52 49 53 3a  PPFS_OS_SOLARIS:
0640: 0a 09 09 09 72 65 74 75 72 6e 28 22 66 72 65 65  ....return("free
0650: 62 73 64 22 29 3b 0a 09 09 63 61 73 65 20 41 50  bsd");...case AP
0660: 50 46 53 5f 43 50 55 5f 55 4e 4b 4e 4f 57 4e 3a  PFS_CPU_UNKNOWN:
0670: 0a 09 09 09 72 65 74 75 72 6e 28 22 75 6e 6b 6e  ....return("unkn
0680: 6f 77 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  own");..}...retu
0690: 72 6e 28 22 75 6e 6b 6e 6f 77 6e 22 29 3b 0a 7d  rn("unknown");.}
06a0: 0a 0a 73 74 61 74 69 63 20 61 70 70 66 73 5f 63  ..static appfs_c
06b0: 70 75 41 72 63 68 5f 74 20 61 70 70 66 73 5f 63  puArch_t appfs_c
06c0: 6f 6e 76 65 72 74 5f 63 70 75 41 72 63 68 5f 66  onvert_cpuArch_f
06d0: 72 6f 6d 53 74 72 69 6e 67 28 63 6f 6e 73 74 20  romString(const 
06e0: 63 68 61 72 20 2a 63 70 75 29 20 7b 0a 09 69 66  char *cpu) {..if
06f0: 20 28 73 74 72 63 61 73 65 63 6d 70 28 63 70 75   (strcasecmp(cpu
0700: 2c 20 22 61 6d 64 36 34 22 29 20 3d 3d 20 30 20  , "amd64") == 0 
0710: 7c 7c 20 73 74 72 63 61 73 65 63 6d 70 28 63 70  || strcasecmp(cp
0720: 75 2c 20 22 78 38 36 5f 36 34 22 29 20 3d 3d 20  u, "x86_64") == 
0730: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 41 50  0) {...return(AP
0740: 50 46 53 5f 43 50 55 5f 41 4d 44 36 34 29 3b 0a  PFS_CPU_AMD64);.
0750: 09 7d 0a 0a 09 69 66 20 28 73 74 72 63 61 73 65  .}...if (strcase
0760: 63 6d 70 28 63 70 75 2c 20 22 69 33 38 36 22 29  cmp(cpu, "i386")
0770: 20 3d 3d 20 30 20 7c 7c 20 5c 0a 09 20 20 20 20   == 0 || \..    
0780: 73 74 72 63 61 73 65 63 6d 70 28 63 70 75 2c 20  strcasecmp(cpu, 
0790: 22 69 34 38 36 22 29 20 3d 3d 20 30 20 7c 7c 20  "i486") == 0 || 
07a0: 5c 0a 09 20 20 20 20 73 74 72 63 61 73 65 63 6d  \..    strcasecm
07b0: 70 28 63 70 75 2c 20 22 69 35 38 36 22 29 20 3d  p(cpu, "i586") =
07c0: 3d 20 30 20 7c 7c 20 5c 0a 09 20 20 20 20 73 74  = 0 || \..    st
07d0: 72 63 61 73 65 63 6d 70 28 63 70 75 2c 20 22 69  rcasecmp(cpu, "i
07e0: 36 38 36 22 29 20 3d 3d 20 30 20 7c 7c 20 5c 0a  686") == 0 || \.
07f0: 09 20 20 20 20 73 74 72 63 61 73 65 63 6d 70 28  .    strcasecmp(
0800: 63 70 75 2c 20 22 69 78 38 36 22 29 20 3d 3d 20  cpu, "ix86") == 
0810: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 41 50  0) {...return(AP
0820: 50 46 53 5f 43 50 55 5f 49 33 38 36 29 3b 0a 09  PFS_CPU_I386);..
0830: 7d 0a 0a 09 69 66 20 28 73 74 72 63 61 73 65 63  }...if (strcasec
0840: 6d 70 28 63 70 75 2c 20 22 61 72 6d 22 29 20 3d  mp(cpu, "arm") =
0850: 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  = 0) {...return(
0860: 41 50 50 46 53 5f 43 50 55 5f 41 52 4d 29 3b 0a  APPFS_CPU_ARM);.
0870: 09 7d 0a 0a 09 69 66 20 28 73 74 72 63 61 73 65  .}...if (strcase
0880: 63 6d 70 28 63 70 75 2c 20 22 6e 6f 61 72 63 68  cmp(cpu, "noarch
0890: 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74  ") == 0) {...ret
08a0: 75 72 6e 28 41 50 50 46 53 5f 43 50 55 5f 41 4c  urn(APPFS_CPU_AL
08b0: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  L);..}...return(
08c0: 41 50 50 46 53 5f 43 50 55 5f 55 4e 4b 4e 4f 57  APPFS_CPU_UNKNOW
08d0: 4e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f  N);.}..static co
08e0: 6e 73 74 20 63 68 61 72 20 2a 61 70 70 66 73 5f  nst char *appfs_
08f0: 63 6f 6e 76 65 72 74 5f 63 70 75 41 72 63 68 5f  convert_cpuArch_
0900: 74 6f 53 74 72 69 6e 67 28 61 70 70 66 73 5f 63  toString(appfs_c
0910: 70 75 41 72 63 68 5f 74 20 63 70 75 29 20 7b 0a  puArch_t cpu) {.
0920: 09 73 77 69 74 63 68 20 28 63 70 75 29 20 7b 0a  .switch (cpu) {.
0930: 09 09 63 61 73 65 20 41 50 50 46 53 5f 43 50 55  ..case APPFS_CPU
0940: 5f 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  _ALL:....return(
0950: 22 6e 6f 61 72 63 68 22 29 3b 0a 09 09 63 61 73  "noarch");...cas
0960: 65 20 41 50 50 46 53 5f 43 50 55 5f 41 4d 44 36  e APPFS_CPU_AMD6
0970: 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 61 6d  4:....return("am
0980: 64 36 34 22 29 3b 0a 09 09 63 61 73 65 20 41 50  d64");...case AP
0990: 50 46 53 5f 43 50 55 5f 49 33 38 36 3a 0a 09 09  PFS_CPU_I386:...
09a0: 09 72 65 74 75 72 6e 28 22 69 78 38 36 22 29 3b  .return("ix86");
09b0: 0a 09 09 63 61 73 65 20 41 50 50 46 53 5f 43 50  ...case APPFS_CP
09c0: 55 5f 41 52 4d 3a 0a 09 09 09 72 65 74 75 72 6e  U_ARM:....return
09d0: 28 22 61 72 6d 22 29 3b 0a 09 09 63 61 73 65 20  ("arm");...case 
09e0: 41 50 50 46 53 5f 43 50 55 5f 55 4e 4b 4e 4f 57  APPFS_CPU_UNKNOW
09f0: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 75 6e  N:....return("un
0a00: 6b 6e 6f 77 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65  known");..}...re
0a10: 74 75 72 6e 28 22 75 6e 6b 6e 6f 77 6e 22 29 3b  turn("unknown");
0a20: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
0a30: 70 70 66 73 5f 54 63 6c 5f 45 76 61 6c 28 54 63  ppfs_Tcl_Eval(Tc
0a40: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0a50: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 63 6f 6e 73  , int objc, cons
0a60: 74 20 63 68 61 72 20 2a 63 6d 64 2c 20 2e 2e 2e  t char *cmd, ...
0a70: 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6f  ) {..Tcl_Obj **o
0a80: 62 6a 76 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72  bjv;..const char
0a90: 20 2a 61 72 67 3b 0a 09 76 61 5f 6c 69 73 74 20   *arg;..va_list 
0aa0: 61 72 67 70 3b 0a 09 69 6e 74 20 72 65 74 76 61  argp;..int retva
0ab0: 6c 3b 0a 09 69 6e 74 20 69 3b 0a 0a 09 6f 62 6a  l;..int i;...obj
0ac0: 76 20 3d 20 28 76 6f 69 64 20 2a 29 20 63 6b 61  v = (void *) cka
0ad0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6f 62 6a  lloc(sizeof(*obj
0ae0: 76 29 20 2a 20 6f 62 6a 63 29 3b 0a 09 6f 62 6a  v) * objc);..obj
0af0: 76 5b 30 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74  v[0] = Tcl_NewSt
0b00: 72 69 6e 67 4f 62 6a 28 63 6d 64 2c 20 2d 31 29  ringObj(cmd, -1)
0b10: 3b 0a 0a 09 76 61 5f 73 74 61 72 74 28 61 72 67  ;...va_start(arg
0b20: 70 2c 20 63 6d 64 29 3b 0a 09 66 6f 72 20 28 69  p, cmd);..for (i
0b30: 20 3d 20 31 3b 20 69 20 3c 20 6f 62 6a 63 3b 20   = 1; i < objc; 
0b40: 69 2b 2b 29 20 7b 0a 09 09 61 72 67 20 3d 20 76  i++) {...arg = v
0b50: 61 5f 61 72 67 28 61 72 67 70 2c 20 63 6f 6e 73  a_arg(argp, cons
0b60: 74 20 63 68 61 72 20 2a 29 3b 0a 09 09 6f 62 6a  t char *);...obj
0b70: 76 5b 69 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74  v[i] = Tcl_NewSt
0b80: 72 69 6e 67 4f 62 6a 28 61 72 67 2c 20 2d 31 29  ringObj(arg, -1)
0b90: 3b 0a 09 7d 0a 09 76 61 5f 65 6e 64 28 61 72 67  ;..}..va_end(arg
0ba0: 70 29 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 54  p);...retval = T
0bb0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65  cl_EvalObjv(inte
0bc0: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20  rp, objc, objv, 
0bd0: 30 29 3b 0a 0a 09 63 6b 66 72 65 65 28 28 76 6f  0);...ckfree((vo
0be0: 69 64 20 2a 29 20 6f 62 6a 76 29 3b 0a 0a 09 72  id *) objv);...r
0bf0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
0c00: 0a 0a 69 6e 74 20 61 70 70 66 73 5f 67 65 74 69  ..int appfs_geti
0c10: 6e 64 65 78 5f 63 62 28 76 6f 69 64 20 2a 5f 68  ndex_cb(void *_h
0c20: 65 61 64 2c 20 69 6e 74 20 63 6f 6c 75 6d 6e 73  ead, int columns
0c30: 2c 20 63 68 61 72 20 2a 2a 76 61 6c 75 65 73 2c  , char **values,
0c40: 20 63 68 61 72 20 2a 2a 6e 61 6d 65 73 29 20 7b   char **names) {
0c50: 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 70  ..struct appfs_p
0c60: 61 63 6b 61 67 65 20 2a 2a 68 65 61 64 20 3d 20  ackage **head = 
0c70: 5f 68 65 61 64 2c 20 2a 6f 62 6a 3b 0a 0a 09 6f  _head, *obj;...o
0c80: 62 6a 20 3d 20 28 76 6f 69 64 20 2a 29 20 63 6b  bj = (void *) ck
0c90: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6f 62  alloc(sizeof(*ob
0ca0: 6a 29 29 3b 0a 0a 09 73 6e 70 72 69 6e 74 66 28  j));...snprintf(
0cb0: 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 73 69 7a 65 6f  obj->name, sizeo
0cc0: 66 28 6f 62 6a 2d 3e 6e 61 6d 65 29 2c 20 22 25  f(obj->name), "%
0cd0: 73 22 2c 20 76 61 6c 75 65 73 5b 30 5d 29 3b 0a  s", values[0]);.
0ce0: 09 73 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 76  .snprintf(obj->v
0cf0: 65 72 73 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6f  ersion, sizeof(o
0d00: 62 6a 2d 3e 76 65 72 73 69 6f 6e 29 2c 20 22 25  bj->version), "%
0d10: 73 22 2c 20 76 61 6c 75 65 73 5b 31 5d 29 3b 0a  s", values[1]);.
0d20: 09 73 6e 70 72 69 6e 74 66 28 6f 62 6a 2d 3e 73  .snprintf(obj->s
0d30: 68 61 31 2c 20 73 69 7a 65 6f 66 28 6f 62 6a 2d  ha1, sizeof(obj-
0d40: 3e 73 68 61 31 29 2c 20 22 25 73 22 2c 20 76 61  >sha1), "%s", va
0d50: 6c 75 65 73 5b 32 5d 29 3b 0a 09 6f 62 6a 2d 3e  lues[2]);..obj->
0d60: 6f 73 20 3d 20 61 70 70 66 73 5f 63 6f 6e 76 65  os = appfs_conve
0d70: 72 74 5f 6f 73 5f 66 72 6f 6d 53 74 72 69 6e 67  rt_os_fromString
0d80: 28 76 61 6c 75 65 73 5b 33 5d 29 3b 0a 09 6f 62  (values[3]);..ob
0d90: 6a 2d 3e 63 70 75 41 72 63 68 20 3d 20 61 70 70  j->cpuArch = app
0da0: 66 73 5f 63 6f 6e 76 65 72 74 5f 63 70 75 41 72  fs_convert_cpuAr
0db0: 63 68 5f 66 72 6f 6d 53 74 72 69 6e 67 28 76 61  ch_fromString(va
0dc0: 6c 75 65 73 5b 34 5d 29 3b 0a 09 69 66 20 28 76  lues[4]);..if (v
0dd0: 61 6c 75 65 73 5b 35 5d 5b 30 5d 20 3d 3d 20 27  alues[5][0] == '
0de0: 31 27 29 20 7b 0a 09 09 6f 62 6a 2d 3e 69 73 4c  1') {...obj->isL
0df0: 61 74 65 73 74 20 3d 20 31 3b 0a 09 7d 20 65 6c  atest = 1;..} el
0e00: 73 65 20 7b 0a 09 09 6f 62 6a 2d 3e 69 73 4c 61  se {...obj->isLa
0e10: 74 65 73 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  test = 0;..}...i
0e20: 66 20 28 2a 68 65 61 64 20 3d 3d 20 4e 55 4c 4c  f (*head == NULL
0e30: 29 20 7b 0a 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74  ) {...obj->count
0e40: 65 72 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  er = 0;..} else 
0e50: 7b 0a 09 09 6f 62 6a 2d 3e 63 6f 75 6e 74 65 72  {...obj->counter
0e60: 20 3d 20 28 2a 68 65 61 64 29 2d 3e 63 6f 75 6e   = (*head)->coun
0e70: 74 65 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09 6f 62  ter + 1;..}...ob
0e80: 6a 2d 3e 5f 6e 65 78 74 20 3d 20 2a 68 65 61 64  j->_next = *head
0e90: 3b 0a 09 2a 68 65 61 64 20 3d 20 6f 62 6a 3b 0a  ;..*head = obj;.
0ea0: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
0eb0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61 70  static struct ap
0ec0: 70 66 73 5f 70 61 63 6b 61 67 65 20 2a 61 70 70  pfs_package *app
0ed0: 66 73 5f 67 65 74 69 6e 64 65 78 28 63 6f 6e 73  fs_getindex(cons
0ee0: 74 20 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65  t char *hostname
0ef0: 2c 20 69 6e 74 20 2a 70 61 63 6b 61 67 65 5f 63  , int *package_c
0f00: 6f 75 6e 74 5f 70 29 20 7b 0a 09 73 74 72 75 63  ount_p) {..struc
0f10: 74 20 61 70 70 66 73 5f 70 61 63 6b 61 67 65 20  t appfs_package 
0f20: 2a 68 65 61 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63  *head = NULL;..c
0f30: 68 61 72 20 2a 73 71 6c 3b 0a 09 69 6e 74 20 74  har *sql;..int t
0f40: 63 6c 5f 72 65 74 2c 20 73 71 6c 69 74 65 5f 72  cl_ret, sqlite_r
0f50: 65 74 3b 0a 0a 09 69 66 20 28 70 61 63 6b 61 67  et;...if (packag
0f60: 65 5f 63 6f 75 6e 74 5f 70 20 3d 3d 20 4e 55 4c  e_count_p == NUL
0f70: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55  L) {...return(NU
0f80: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65  LL);..}...tcl_re
0f90: 74 20 3d 20 61 70 70 66 73 5f 54 63 6c 5f 45 76  t = appfs_Tcl_Ev
0fa0: 61 6c 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e  al(globalThread.
0fb0: 69 6e 74 65 72 70 2c 20 32 2c 20 22 3a 3a 61 70  interp, 2, "::ap
0fc0: 70 66 73 3a 3a 67 65 74 69 6e 64 65 78 22 2c 20  pfs::getindex", 
0fd0: 68 6f 73 74 6e 61 6d 65 29 3b 0a 09 69 66 20 28  hostname);..if (
0fe0: 74 63 6c 5f 72 65 74 20 21 3d 20 54 43 4c 5f 4f  tcl_ret != TCL_O
0ff0: 4b 29 20 7b 0a 09 09 41 50 50 46 53 5f 44 45 42  K) {...APPFS_DEB
1000: 55 47 28 22 43 61 6c 6c 20 74 6f 20 3a 3a 61 70  UG("Call to ::ap
1010: 70 66 73 3a 3a 67 65 74 69 6e 64 65 78 20 66 61  pfs::getindex fa
1020: 69 6c 65 64 3a 20 25 73 22 2c 20 54 63 6c 5f 47  iled: %s", Tcl_G
1030: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 67  etStringResult(g
1040: 6c 6f 62 61 6c 54 68 72 65 61 64 2e 69 6e 74 65  lobalThread.inte
1050: 72 70 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  rp));....return(
1060: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 73 71 6c 20  NULL);..}...sql 
1070: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1080: 66 28 22 53 45 4c 45 43 54 20 70 61 63 6b 61 67  f("SELECT packag
1090: 65 2c 20 76 65 72 73 69 6f 6e 2c 20 73 68 61 31  e, version, sha1
10a0: 2c 20 6f 73 2c 20 63 70 75 41 72 63 68 2c 20 69  , os, cpuArch, i
10b0: 73 4c 61 74 65 73 74 20 46 52 4f 4d 20 70 61 63  sLatest FROM pac
10c0: 6b 61 67 65 73 20 57 48 45 52 45 20 68 6f 73 74  kages WHERE host
10d0: 6e 61 6d 65 20 3d 20 25 51 3b 22 2c 20 68 6f 73  name = %Q;", hos
10e0: 74 6e 61 6d 65 29 3b 0a 09 69 66 20 28 73 71 6c  tname);..if (sql
10f0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 41 50   == NULL) {...AP
1100: 50 46 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20  PFS_DEBUG("Call 
1110: 74 6f 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  to sqlite3_mprin
1120: 74 66 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  tf failed.");...
1130: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
1140: 7d 0a 0a 09 73 71 6c 69 74 65 5f 72 65 74 20 3d  }...sqlite_ret =
1150: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c   sqlite3_exec(gl
1160: 6f 62 61 6c 54 68 72 65 61 64 2e 64 62 2c 20 73  obalThread.db, s
1170: 71 6c 2c 20 61 70 70 66 73 5f 67 65 74 69 6e 64  ql, appfs_getind
1180: 65 78 5f 63 62 2c 20 26 68 65 61 64 2c 20 4e 55  ex_cb, &head, NU
1190: 4c 4c 29 3b 0a 09 73 71 6c 69 74 65 33 5f 66 72  LL);..sqlite3_fr
11a0: 65 65 28 73 71 6c 29 3b 0a 0a 09 69 66 20 28 73  ee(sql);...if (s
11b0: 71 6c 69 74 65 5f 72 65 74 20 21 3d 20 53 51 4c  qlite_ret != SQL
11c0: 49 54 45 5f 4f 4b 29 20 7b 0a 09 09 41 50 50 46  ITE_OK) {...APPF
11d0: 53 5f 44 45 42 55 47 28 22 43 61 6c 6c 20 74 6f  S_DEBUG("Call to
11e0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 66 61   sqlite3_exec fa
11f0: 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1200: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
1210: 66 20 28 68 65 61 64 20 21 3d 20 4e 55 4c 4c 29  f (head != NULL)
1220: 20 7b 0a 09 09 2a 70 61 63 6b 61 67 65 5f 63 6f   {...*package_co
1230: 75 6e 74 5f 70 20 3d 20 68 65 61 64 2d 3e 63 6f  unt_p = head->co
1240: 75 6e 74 65 72 20 2b 20 31 3b 0a 09 7d 0a 0a 09  unter + 1;..}...
1250: 72 65 74 75 72 6e 28 68 65 61 64 29 3b 0a 7d 0a  return(head);.}.
1260: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 66  .static int appf
1270: 73 5f 67 65 74 66 69 6c 65 28 63 6f 6e 73 74 20  s_getfile(const 
1280: 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 2c 20  char *hostname, 
1290: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 68 61 31  const char *sha1
12a0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  ) {..return(0);.
12b0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  }..static int ap
12c0: 70 66 73 5f 67 65 74 6d 61 6e 69 66 65 73 74 28  pfs_getmanifest(
12d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f 73 74  const char *host
12e0: 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  name, const char
12f0: 20 2a 73 68 61 31 29 20 7b 0a 09 72 65 74 75 72   *sha1) {..retur
1300: 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(0);.}..static 
1310: 69 6e 74 20 61 70 70 66 73 5f 66 75 73 65 5f 67  int appfs_fuse_g
1320: 65 74 61 74 74 72 28 63 6f 6e 73 74 20 63 68 61  etattr(const cha
1330: 72 20 2a 70 61 74 68 2c 20 73 74 72 75 63 74 20  r *path, struct 
1340: 73 74 61 74 20 2a 73 74 62 75 66 29 20 7b 0a 09  stat *stbuf) {..
1350: 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65 3b 0a  char *hostname;.
1360: 09 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 0a 09  .int res = 0;...
1370: 69 66 20 28 70 61 74 68 20 3d 3d 20 4e 55 4c 4c  if (path == NULL
1380: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 45 4e  ) {...return(-EN
1390: 4f 45 4e 54 29 3b 0a 09 7d 0a 0a 09 41 50 50 46  OENT);..}...APPF
13a0: 53 5f 44 45 42 55 47 28 22 45 6e 74 65 72 20 28  S_DEBUG("Enter (
13b0: 70 61 74 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22  path = %s, ...)"
13c0: 2c 20 70 61 74 68 29 3b 0a 0a 09 69 66 20 28 70  , path);...if (p
13d0: 61 74 68 5b 30 5d 20 21 3d 20 27 2f 27 29 20 7b  ath[0] != '/') {
13e0: 0a 09 09 72 65 74 75 72 6e 28 2d 45 4e 4f 45 4e  ...return(-ENOEN
13f0: 54 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  T);..}...memset(
1400: 73 74 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66  stbuf, 0, sizeof
1410: 28 73 74 72 75 63 74 20 73 74 61 74 29 29 3b 0a  (struct stat));.
1420: 0a 09 73 74 62 75 66 2d 3e 73 74 5f 6d 6f 64 65  ..stbuf->st_mode
1430: 20 3d 20 53 5f 49 46 44 49 52 20 7c 20 30 37 35   = S_IFDIR | 075
1440: 35 3b 0a 09 73 74 62 75 66 2d 3e 73 74 5f 6e 6c  5;..stbuf->st_nl
1450: 69 6e 6b 20 3d 20 32 3b 0a 0a 09 72 65 74 75 72  ink = 2;...retur
1460: 6e 20 72 65 73 3b 0a 7d 0a 0a 73 74 61 74 69 63  n res;.}..static
1470: 20 69 6e 74 20 61 70 70 66 73 5f 66 75 73 65 5f   int appfs_fuse_
1480: 72 65 61 64 64 69 72 28 63 6f 6e 73 74 20 63 68  readdir(const ch
1490: 61 72 20 2a 70 61 74 68 2c 20 76 6f 69 64 20 2a  ar *path, void *
14a0: 62 75 66 2c 20 66 75 73 65 5f 66 69 6c 6c 5f 64  buf, fuse_fill_d
14b0: 69 72 5f 74 20 66 69 6c 6c 65 72 2c 20 6f 66 66  ir_t filler, off
14c0: 5f 74 20 6f 66 66 73 65 74 2c 20 73 74 72 75 63  _t offset, struc
14d0: 74 20 66 75 73 65 5f 66 69 6c 65 5f 69 6e 66 6f  t fuse_file_info
14e0: 20 2a 66 69 29 20 7b 0a 09 41 50 50 46 53 5f 44   *fi) {..APPFS_D
14f0: 45 42 55 47 28 22 45 6e 74 65 72 20 28 70 61 74  EBUG("Enter (pat
1500: 68 20 3d 20 25 73 2c 20 2e 2e 2e 29 22 2c 20 70  h = %s, ...)", p
1510: 61 74 68 29 3b 0a 0a 09 66 69 6c 6c 65 72 28 62  ath);...filler(b
1520: 75 66 2c 20 22 2e 22 2c 20 4e 55 4c 4c 2c 20 30  uf, ".", NULL, 0
1530: 29 3b 0a 09 66 69 6c 6c 65 72 28 62 75 66 2c 20  );..filler(buf, 
1540: 22 2e 2e 22 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  "..", NULL, 0);.
1550: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73  ..return 0;.}..s
1560: 74 61 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f  tatic int appfs_
1570: 66 75 73 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  fuse_open(const 
1580: 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74 72 75  char *path, stru
1590: 63 74 20 66 75 73 65 5f 66 69 6c 65 5f 69 6e 66  ct fuse_file_inf
15a0: 6f 20 2a 66 69 29 20 7b 0a 09 72 65 74 75 72 6e  o *fi) {..return
15b0: 28 2d 45 4e 4f 45 4e 54 29 3b 0a 7d 0a 0a 73 74  (-ENOENT);.}..st
15c0: 61 74 69 63 20 69 6e 74 20 61 70 70 66 73 5f 66  atic int appfs_f
15d0: 75 73 65 5f 72 65 61 64 28 63 6f 6e 73 74 20 63  use_read(const c
15e0: 68 61 72 20 2a 70 61 74 68 2c 20 63 68 61 72 20  har *path, char 
15f0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 73 69 7a  *buf, size_t siz
1600: 65 2c 20 6f 66 66 5f 74 20 6f 66 66 73 65 74 2c  e, off_t offset,
1610: 20 73 74 72 75 63 74 20 66 75 73 65 5f 66 69 6c   struct fuse_fil
1620: 65 5f 69 6e 66 6f 20 2a 66 69 29 20 7b 0a 09 72  e_info *fi) {..r
1630: 65 74 75 72 6e 28 2d 45 4e 4f 45 4e 54 29 3b 0a  eturn(-ENOENT);.
1640: 7d 0a 0a 23 69 66 64 65 66 20 41 50 50 46 53 5f  }..#ifdef APPFS_
1650: 54 45 53 54 5f 44 52 49 56 45 52 0a 73 74 61 74  TEST_DRIVER.stat
1660: 69 63 20 69 6e 74 20 61 70 70 66 73 5f 74 65 73  ic int appfs_tes
1670: 74 5f 64 72 69 76 65 72 28 76 6f 69 64 29 20 7b  t_driver(void) {
1680: 0a 09 73 74 72 75 63 74 20 61 70 70 66 73 5f 70  ..struct appfs_p
1690: 61 63 6b 61 67 65 20 2a 70 61 63 6b 61 67 65 73  ackage *packages
16a0: 2c 20 2a 70 61 63 6b 61 67 65 3b 0a 09 69 6e 74  , *package;..int
16b0: 20 70 61 63 6b 61 67 65 73 5f 63 6f 75 6e 74 20   packages_count 
16c0: 3d 20 30 3b 0a 0a 09 70 61 63 6b 61 67 65 73 20  = 0;...packages 
16d0: 3d 20 61 70 70 66 73 5f 67 65 74 69 6e 64 65 78  = appfs_getindex
16e0: 28 22 72 6b 65 65 6e 65 2e 6f 72 67 22 2c 20 26  ("rkeene.org", &
16f0: 70 61 63 6b 61 67 65 73 5f 63 6f 75 6e 74 29 3b  packages_count);
1700: 0a 09 69 66 20 28 70 61 63 6b 61 67 65 73 20 3d  ..if (packages =
1710: 3d 20 4e 55 4c 4c 20 7c 7c 20 70 61 63 6b 61 67  = NULL || packag
1720: 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  es_count == 0) {
1730: 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ...fprintf(stder
1740: 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 66 65  r, "Unable to fe
1750: 74 63 68 20 70 61 63 6b 61 67 65 20 69 6e 64 65  tch package inde
1760: 78 20 66 72 6f 6d 20 72 6b 65 65 6e 65 2e 6f 72  x from rkeene.or
1770: 67 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72  g.\n");....retur
1780: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  n(1);..}...for (
1790: 70 61 63 6b 61 67 65 20 3d 20 70 61 63 6b 61 67  package = packag
17a0: 65 73 3b 20 70 61 63 6b 61 67 65 3b 20 70 61 63  es; package; pac
17b0: 6b 61 67 65 20 3d 20 70 61 63 6b 61 67 65 2d 3e  kage = package->
17c0: 5f 6e 65 78 74 29 20 7b 0a 09 09 70 72 69 6e 74  _next) {...print
17d0: 66 28 22 50 61 63 6b 61 67 65 3a 5c 6e 5c 74 6e  f("Package:\n\tn
17e0: 61 6d 65 20 3d 20 25 73 5c 6e 5c 74 76 65 72 73  ame = %s\n\tvers
17f0: 69 6f 6e 20 3d 20 25 73 5c 6e 5c 74 73 68 61 31  ion = %s\n\tsha1
1800: 20 3d 20 25 73 5c 6e 5c 74 6f 73 20 3d 20 25 73   = %s\n\tos = %s
1810: 5c 6e 5c 74 63 70 75 41 72 63 68 20 3d 20 25 73  \n\tcpuArch = %s
1820: 5c 6e 22 2c 0a 09 09 09 70 61 63 6b 61 67 65 2d  \n",....package-
1830: 3e 6e 61 6d 65 2c 0a 09 09 09 70 61 63 6b 61 67  >name,....packag
1840: 65 2d 3e 76 65 72 73 69 6f 6e 2c 0a 09 09 09 70  e->version,....p
1850: 61 63 6b 61 67 65 2d 3e 73 68 61 31 2c 0a 09 09  ackage->sha1,...
1860: 09 61 70 70 66 73 5f 63 6f 6e 76 65 72 74 5f 6f  .appfs_convert_o
1870: 73 5f 74 6f 53 74 72 69 6e 67 28 70 61 63 6b 61  s_toString(packa
1880: 67 65 2d 3e 6f 73 29 2c 0a 09 09 09 61 70 70 66  ge->os),....appf
1890: 73 5f 63 6f 6e 76 65 72 74 5f 63 70 75 41 72 63  s_convert_cpuArc
18a0: 68 5f 74 6f 53 74 72 69 6e 67 28 70 61 63 6b 61  h_toString(packa
18b0: 67 65 2d 3e 63 70 75 41 72 63 68 29 0a 09 09 29  ge->cpuArch)...)
18c0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29  ;..}...return(0)
18d0: 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 61 74 69 63  ;.}.#else.static
18e0: 20 73 74 72 75 63 74 20 66 75 73 65 5f 6f 70 65   struct fuse_ope
18f0: 72 61 74 69 6f 6e 73 20 61 70 70 66 73 5f 6f 70  rations appfs_op
1900: 65 72 20 3d 20 7b 0a 09 2e 67 65 74 61 74 74 72  er = {...getattr
1910: 09 3d 20 61 70 70 66 73 5f 66 75 73 65 5f 67 65  .= appfs_fuse_ge
1920: 74 61 74 74 72 2c 0a 09 2e 72 65 61 64 64 69 72  tattr,...readdir
1930: 09 3d 20 61 70 70 66 73 5f 66 75 73 65 5f 72 65  .= appfs_fuse_re
1940: 61 64 64 69 72 2c 0a 09 2e 6f 70 65 6e 09 09 3d  addir,...open..=
1950: 20 61 70 70 66 73 5f 66 75 73 65 5f 6f 70 65 6e   appfs_fuse_open
1960: 2c 0a 09 2e 72 65 61 64 09 09 3d 20 61 70 70 66  ,...read..= appf
1970: 73 5f 66 75 73 65 5f 72 65 61 64 0a 7d 3b 0a 23  s_fuse_read.};.#
1980: 65 6e 64 69 66 0a 0a 69 6e 74 20 6d 61 69 6e 28  endif..int main(
1990: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
19a0: 2a 61 72 67 76 29 20 7b 0a 09 63 6f 6e 73 74 20  *argv) {..const 
19b0: 63 68 61 72 20 2a 63 61 63 68 65 64 69 72 20 3d  char *cachedir =
19c0: 20 41 50 50 46 53 5f 43 41 43 48 45 44 49 52 3b   APPFS_CACHEDIR;
19d0: 0a 09 63 68 61 72 20 64 62 66 69 6c 65 6e 61 6d  ..char dbfilenam
19e0: 65 5b 31 30 32 34 5d 3b 0a 09 69 6e 74 20 74 63  e[1024];..int tc
19f0: 6c 5f 72 65 74 2c 20 73 6e 70 72 69 6e 74 66 5f  l_ret, snprintf_
1a00: 72 65 74 2c 20 73 71 6c 69 74 65 5f 72 65 74 3b  ret, sqlite_ret;
1a10: 0a 0a 09 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e  ...globalThread.
1a20: 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65  interp = Tcl_Cre
1a30: 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 09 69 66  ateInterp();..if
1a40: 20 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e 69   (globalThread.i
1a50: 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  nterp == NULL) {
1a60: 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ...fprintf(stder
1a70: 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 63 72  r, "Unable to cr
1a80: 65 61 74 65 20 54 63 6c 20 49 6e 74 65 72 70 72  eate Tcl Interpr
1a90: 65 74 65 72 2e 20 20 41 62 6f 72 74 69 6e 67 2e  eter.  Aborting.
1aa0: 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  \n");....return(
1ab0: 31 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f 72 65 74  1);..}...tcl_ret
1ac0: 20 3d 20 54 63 6c 5f 49 6e 69 74 28 67 6c 6f 62   = Tcl_Init(glob
1ad0: 61 6c 54 68 72 65 61 64 2e 69 6e 74 65 72 70 29  alThread.interp)
1ae0: 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20 21  ;..if (tcl_ret !
1af0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 66 70  = TCL_OK) {...fp
1b00: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
1b10: 6e 61 62 6c 65 20 74 6f 20 69 6e 69 74 69 61 6c  nable to initial
1b20: 69 7a 65 20 54 63 6c 2e 20 20 41 62 6f 72 74 69  ize Tcl.  Aborti
1b30: 6e 67 2e 5c 6e 22 29 3b 0a 0a 09 09 72 65 74 75  ng.\n");....retu
1b40: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 74 63 6c 5f  rn(1);..}...tcl_
1b50: 72 65 74 20 3d 20 54 63 6c 5f 45 76 61 6c 28 67  ret = Tcl_Eval(g
1b60: 6c 6f 62 61 6c 54 68 72 65 61 64 2e 69 6e 74 65  lobalThread.inte
1b70: 72 70 2c 20 22 22 0a 23 69 6e 63 6c 75 64 65 20  rp, "".#include 
1b80: 22 61 70 70 66 73 2e 74 63 6c 2e 68 22 0a 09 22  "appfs.tcl.h".."
1b90: 22 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74  ");..if (tcl_ret
1ba0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
1bb0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
1bc0: 22 55 6e 61 62 6c 65 20 74 6f 20 69 6e 69 74 69  "Unable to initi
1bd0: 61 6c 69 7a 65 20 54 63 6c 20 41 70 70 46 53 20  alize Tcl AppFS 
1be0: 73 63 72 69 70 74 2e 20 20 41 62 6f 72 74 69 6e  script.  Abortin
1bf0: 67 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  g.\n");...fprint
1c00: 66 28 73 74 64 65 72 72 2c 20 22 54 63 6c 20 45  f(stderr, "Tcl E
1c10: 72 72 6f 72 20 69 73 3a 20 25 73 5c 6e 22 2c 20  rror is: %s\n", 
1c20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
1c30: 75 6c 74 28 67 6c 6f 62 61 6c 54 68 72 65 61 64  ult(globalThread
1c40: 2e 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09 72 65  .interp));....re
1c50: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66  turn(1);..}...if
1c60: 20 28 54 63 6c 5f 53 65 74 56 61 72 28 67 6c 6f   (Tcl_SetVar(glo
1c70: 62 61 6c 54 68 72 65 61 64 2e 69 6e 74 65 72 70  balThread.interp
1c80: 2c 20 22 3a 3a 61 70 70 66 73 3a 3a 63 61 63 68  , "::appfs::cach
1c90: 65 64 69 72 22 2c 20 63 61 63 68 65 64 69 72 2c  edir", cachedir,
1ca0: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
1cb0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66  ) == NULL) {...f
1cc0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1cd0: 55 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 61  Unable to set ca
1ce0: 63 68 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20  che directory.  
1cf0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
1d00: 72 20 66 61 69 6c 2e 5c 6e 22 29 3b 0a 0a 09 09  r fail.\n");....
1d10: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
1d20: 74 63 6c 5f 72 65 74 20 3d 20 61 70 70 66 73 5f  tcl_ret = appfs_
1d30: 54 63 6c 5f 45 76 61 6c 28 67 6c 6f 62 61 6c 54  Tcl_Eval(globalT
1d40: 68 72 65 61 64 2e 69 6e 74 65 72 70 2c 20 31 2c  hread.interp, 1,
1d50: 20 22 3a 3a 61 70 70 66 73 3a 3a 69 6e 69 74 22   "::appfs::init"
1d60: 29 3b 0a 09 69 66 20 28 74 63 6c 5f 72 65 74 20  );..if (tcl_ret 
1d70: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 66  != TCL_OK) {...f
1d80: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1d90: 55 6e 61 62 6c 65 20 74 6f 20 69 6e 69 74 69 61  Unable to initia
1da0: 6c 69 7a 65 20 54 63 6c 20 41 70 70 46 53 20 73  lize Tcl AppFS s
1db0: 63 72 69 70 74 20 28 3a 3a 61 70 70 66 73 3a 3a  cript (::appfs::
1dc0: 69 6e 69 74 29 2e 20 20 41 62 6f 72 74 69 6e 67  init).  Aborting
1dd0: 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  .\n");...fprintf
1de0: 28 73 74 64 65 72 72 2c 20 22 54 63 6c 20 45 72  (stderr, "Tcl Er
1df0: 72 6f 72 20 69 73 3a 20 25 73 5c 6e 22 2c 20 54  ror is: %s\n", T
1e00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1e10: 6c 74 28 67 6c 6f 62 61 6c 54 68 72 65 61 64 2e  lt(globalThread.
1e20: 69 6e 74 65 72 70 29 29 3b 0a 0a 09 09 72 65 74  interp));....ret
1e30: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 6e 70  urn(1);..}...snp
1e40: 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70 72  rintf_ret = snpr
1e50: 69 6e 74 66 28 64 62 66 69 6c 65 6e 61 6d 65 2c  intf(dbfilename,
1e60: 20 73 69 7a 65 6f 66 28 64 62 66 69 6c 65 6e 61   sizeof(dbfilena
1e70: 6d 65 29 2c 20 22 25 73 2f 25 73 22 2c 20 63 61  me), "%s/%s", ca
1e80: 63 68 65 64 69 72 2c 20 22 63 61 63 68 65 2e 64  chedir, "cache.d
1e90: 62 22 29 3b 0a 09 69 66 20 28 73 6e 70 72 69 6e  b");..if (snprin
1ea0: 74 66 5f 72 65 74 20 3e 3d 20 73 69 7a 65 6f 66  tf_ret >= sizeof
1eb0: 28 64 62 66 69 6c 65 6e 61 6d 65 29 29 20 7b 0a  (dbfilename)) {.
1ec0: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
1ed0: 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "Unable to set
1ee0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
1ef0: 6d 65 2e 20 20 41 62 6f 72 74 69 6e 67 2e 5c 6e  me.  Aborting.\n
1f00: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29  ");....return(1)
1f10: 3b 0a 09 7d 0a 0a 09 73 71 6c 69 74 65 5f 72 65  ;..}...sqlite_re
1f20: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  t = sqlite3_open
1f30: 28 64 62 66 69 6c 65 6e 61 6d 65 2c 20 26 67 6c  (dbfilename, &gl
1f40: 6f 62 61 6c 54 68 72 65 61 64 2e 64 62 29 3b 0a  obalThread.db);.
1f50: 09 69 66 20 28 73 71 6c 69 74 65 5f 72 65 74 20  .if (sqlite_ret 
1f60: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  != SQLITE_OK) {.
1f70: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
1f80: 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "Unable to ope
1f90: 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e  n database: %s\n
1fa0: 22 2c 20 64 62 66 69 6c 65 6e 61 6d 65 29 3b 0a  ", dbfilename);.
1fb0: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
1fc0: 0a 0a 23 69 66 64 65 66 20 41 50 50 46 53 5f 54  ..#ifdef APPFS_T
1fd0: 45 53 54 5f 44 52 49 56 45 52 0a 09 72 65 74 75  EST_DRIVER..retu
1fe0: 72 6e 28 61 70 70 66 73 5f 74 65 73 74 5f 64 72  rn(appfs_test_dr
1ff0: 69 76 65 72 28 29 29 3b 0a 23 65 6c 73 65 0a 09  iver());.#else..
2000: 72 65 74 75 72 6e 28 66 75 73 65 5f 6d 61 69 6e  return(fuse_main
2010: 28 61 72 67 63 2c 20 61 72 67 76 2c 20 26 61 70  (argc, argv, &ap
2020: 70 66 73 5f 6f 70 65 72 2c 20 4e 55 4c 4c 29 29  pfs_oper, NULL))
2030: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 20 0a           ;.#endif.}. .