Hex Artifact Content
Not logged in

Artifact 4b3dcbe795893b7156aed17a20c5991fb7bd58ec:

File src/xfer.c part of check-in [bf75ea9852] - The "configuration" command will now sync ticket report formats, shunned UUIDs, and user information (but not user passwords). Added the "config merge" method. Fix an initialization bug that was given Admin privilege to anonymous by default. by drh on 2008-10-04 20:40:27.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74   contains code t
0380: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
0390: 66 69 6c 65 20 74 72 61 6e 73 66 65 72 20 70 72  file transfer pr
03a0: 6f 74 6f 63 6f 6c 2e 0a 2a 2f 0a 23 69 6e 63 6c  otocol..*/.#incl
03b0: 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23  ude "config.h".#
03c0: 69 6e 63 6c 75 64 65 20 22 78 66 65 72 2e 68 22  include "xfer.h"
03d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72  ../*.** This str
03e0: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66  ucture holds inf
03f0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
0400: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
0410: 20 6f 66 20 65 69 74 68 65 72 0a 2a 2a 20 61 20   of either.** a 
0420: 63 6c 69 65 6e 74 20 6f 72 20 61 20 73 65 72 76  client or a serv
0430: 65 72 20 74 68 61 74 20 69 73 20 70 61 72 74 69  er that is parti
0440: 63 69 70 61 74 69 6e 67 20 69 6e 20 78 66 65 72  cipating in xfer
0450: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0460: 75 63 74 20 58 66 65 72 20 58 66 65 72 3b 0a 73  uct Xfer Xfer;.s
0470: 74 72 75 63 74 20 58 66 65 72 20 7b 0a 20 20 42  truct Xfer {.  B
0480: 6c 6f 62 20 2a 70 49 6e 3b 20 20 20 20 20 20 20  lob *pIn;       
0490: 20 20 20 2f 2a 20 49 6e 70 75 74 20 74 65 78 74     /* Input text
04a0: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20   from the other 
04b0: 73 69 64 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a  side */.  Blob *
04c0: 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  pOut;         /*
04d0: 20 43 6f 6d 70 6f 73 65 20 6f 75 72 20 72 65 70   Compose our rep
04e0: 6c 79 20 68 65 72 65 20 2a 2f 0a 20 20 42 6c 6f  ly here */.  Blo
04f0: 62 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  b line;         
0500: 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
0510: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 2a 2f  line of input */
0520: 0a 20 20 42 6c 6f 62 20 61 54 6f 6b 65 6e 5b 35  .  Blob aToken[5
0530: 5d 3b 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 69  ];     /* Tokeni
0540: 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6c  zed version of l
0550: 69 6e 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 65 72  ine */.  Blob er
0560: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
0570: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  Error message te
0580: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b  xt */.  int nTok
0590: 65 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  en;         /* N
05a0: 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20  umber of tokens 
05b0: 69 6e 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  in line */.  int
05c0: 20 6e 49 47 6f 74 53 65 6e 74 3b 20 20 20 20 20   nIGotSent;     
05d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22 69   /* Number of "i
05e0: 67 6f 74 22 20 63 61 72 64 73 20 73 65 6e 74 20  got" cards sent 
05f0: 2a 2f 0a 20 20 69 6e 74 20 6e 47 69 6d 6d 65 53  */.  int nGimmeS
0600: 65 6e 74 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ent;     /* Numb
0610: 65 72 20 6f 66 20 67 69 6d 6d 65 20 63 61 72 64  er of gimme card
0620: 73 20 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  s sent */.  int 
0630: 6e 46 69 6c 65 53 65 6e 74 3b 20 20 20 20 20 20  nFileSent;      
0640: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 6c  /* Number of fil
0650: 65 73 20 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  es sent */.  int
0660: 20 6e 44 65 6c 74 61 53 65 6e 74 3b 20 20 20 20   nDeltaSent;    
0670: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 65   /* Number of de
0680: 6c 74 61 73 20 73 65 6e 74 20 2a 2f 0a 20 20 69  ltas sent */.  i
0690: 6e 74 20 6e 46 69 6c 65 52 63 76 64 3b 20 20 20  nt nFileRcvd;   
06a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
06b0: 66 69 6c 65 73 20 72 65 63 65 69 76 65 64 20 2a  files received *
06c0: 2f 0a 20 20 69 6e 74 20 6e 44 65 6c 74 61 52 63  /.  int nDeltaRc
06d0: 76 64 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  vd;     /* Numbe
06e0: 72 20 6f 66 20 64 65 6c 74 61 73 20 72 65 63 65  r of deltas rece
06f0: 69 76 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ived */.  int nD
0700: 61 6e 67 6c 69 6e 67 46 69 6c 65 3b 20 20 2f 2a  anglingFile;  /*
0710: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 6e 67 6c   Number of dangl
0720: 69 6e 67 20 64 65 6c 74 61 73 20 72 65 63 65 69  ing deltas recei
0730: 76 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 53  ved */.  int mxS
0740: 65 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  end;         /* 
0750: 53 74 6f 70 20 73 65 6e 64 69 6e 67 20 22 66 69  Stop sending "fi
0760: 6c 65 22 20 77 69 74 68 20 70 4f 75 74 20 72 65  le" with pOut re
0770: 61 63 68 65 73 20 74 68 69 73 20 73 69 7a 65 20  aches this size 
0780: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  */.};.../*.** Th
0790: 65 20 69 6e 70 75 74 20 62 6c 6f 62 20 63 6f 6e  e input blob con
07a0: 74 61 69 6e 73 20 61 20 55 55 49 44 2e 20 20 43  tains a UUID.  C
07b0: 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61  onvert it into a
07c0: 20 72 65 63 6f 72 64 20 49 44 2e 0a 2a 2a 20 43   record ID..** C
07d0: 72 65 61 74 65 20 61 20 70 68 61 6e 74 6f 6d 20  reate a phantom 
07e0: 72 65 63 6f 72 64 20 69 66 20 6e 6f 20 70 72 69  record if no pri
07f0: 6f 72 20 72 65 63 6f 72 64 20 65 78 69 73 74 73  or record exists
0800: 20 61 6e 64 0a 2a 2a 20 70 68 61 6e 74 6f 6d 69   and.** phantomi
0810: 7a 65 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ze is true..**.*
0820: 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20 75 75 69  * Compare to uui
0830: 64 5f 74 6f 5f 72 69 64 28 29 2e 20 20 54 68 69  d_to_rid().  Thi
0840: 73 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20  s routine takes 
0850: 61 20 62 6c 6f 62 20 61 72 67 75 6d 65 6e 74 0a  a blob argument.
0860: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6c 65 73 73  ** and does less
0870: 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 2e   error checking.
0880: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
0890: 69 64 5f 66 72 6f 6d 5f 75 75 69 64 28 42 6c 6f  id_from_uuid(Blo
08a0: 62 20 2a 70 55 75 69 64 2c 20 69 6e 74 20 70 68  b *pUuid, int ph
08b0: 61 6e 74 6f 6d 69 7a 65 29 7b 0a 20 20 73 74 61  antomize){.  sta
08c0: 74 69 63 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e  tic Stmt q;.  in
08d0: 74 20 72 69 64 3b 0a 0a 20 20 64 62 5f 73 74 61  t rid;..  db_sta
08e0: 74 69 63 5f 70 72 65 70 61 72 65 28 26 71 2c 20  tic_prepare(&q, 
08f0: 22 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d  "SELECT rid FROM
0900: 20 62 6c 6f 62 20 57 48 45 52 45 20 75 75 69 64   blob WHERE uuid
0910: 3d 3a 75 75 69 64 22 29 3b 0a 20 20 64 62 5f 62  =:uuid");.  db_b
0920: 69 6e 64 5f 73 74 72 28 26 71 2c 20 22 3a 75 75  ind_str(&q, ":uu
0930: 69 64 22 2c 20 70 55 75 69 64 29 3b 0a 20 20 69  id", pUuid);.  i
0940: 66 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  f( db_step(&q)==
0950: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
0960: 20 20 72 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d    rid = db_colum
0970: 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20  n_int(&q, 0);.  
0980: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 69 64 20 3d  }else{.    rid =
0990: 20 30 3b 0a 20 20 7d 0a 20 20 64 62 5f 72 65 73   0;.  }.  db_res
09a0: 65 74 28 26 71 29 3b 0a 20 20 69 66 28 20 72 69  et(&q);.  if( ri
09b0: 64 3d 3d 30 20 26 26 20 70 68 61 6e 74 6f 6d 69  d==0 && phantomi
09c0: 7a 65 20 29 7b 0a 20 20 20 20 72 69 64 20 3d 20  ze ){.    rid = 
09d0: 63 6f 6e 74 65 6e 74 5f 6e 65 77 28 62 6c 6f 62  content_new(blob
09e0: 5f 73 74 72 28 70 55 75 69 64 29 29 3b 0a 20 20  _str(pUuid));.  
09f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 69 64 3b 0a  }.  return rid;.
0a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
0a10: 72 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  r that the other
0a20: 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6e   side of the con
0a30: 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20  nection already 
0a40: 68 61 73 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66  has a copy.** of
0a50: 20 74 68 65 20 66 69 6c 65 20 72 69 64 2e 0a 2a   the file rid..*
0a60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
0a70: 6d 6f 74 65 5f 68 61 73 28 69 6e 74 20 72 69 64  mote_has(int rid
0a80: 29 7b 0a 20 20 69 66 28 20 72 69 64 20 29 20 64  ){.  if( rid ) d
0a90: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 49 4e  b_multi_exec("IN
0aa0: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
0ab0: 4e 54 4f 20 6f 6e 72 65 6d 6f 74 65 20 56 41 4c  NTO onremote VAL
0ac0: 55 45 53 28 25 64 29 22 2c 20 72 69 64 29 3b 0a  UES(%d)", rid);.
0ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 54 6f  }../*.** The aTo
0ae0: 6b 65 6e 5b 30 2e 2e 6e 54 6f 6b 65 6e 2d 31 5d  ken[0..nToken-1]
0af0: 20 62 6c 6f 62 20 61 72 72 61 79 20 69 73 20 61   blob array is a
0b00: 20 70 61 72 73 65 20 6f 66 20 61 20 22 66 69 6c   parse of a "fil
0b10: 65 22 20 6c 69 6e 65 20 0a 2a 2a 20 6d 65 73 73  e" line .** mess
0b20: 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
0b30: 6e 65 20 66 69 6e 69 73 68 65 73 20 70 61 72 73  ne finishes pars
0b40: 69 6e 67 20 74 68 61 74 20 6d 65 73 73 61 67 65  ing that message
0b50: 20 61 6e 64 20 64 6f 65 73 0a 2a 2a 20 61 20 72   and does.** a r
0b60: 65 63 6f 72 64 20 69 6e 73 65 72 74 20 6f 66 20  ecord insert of 
0b70: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
0b80: 54 68 65 20 66 69 6c 65 20 6c 69 6e 65 20 69 73  The file line is
0b90: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   in one of the f
0ba0: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 66 6f 72  ollowing two for
0bb0: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ms:.**.**      f
0bc0: 69 6c 65 20 55 55 49 44 20 53 49 5a 45 20 5c 6e  ile UUID SIZE \n
0bd0: 20 43 4f 4e 54 45 4e 54 0a 2a 2a 20 20 20 20 20   CONTENT.**     
0be0: 20 66 69 6c 65 20 55 55 49 44 20 44 45 4c 54 41   file UUID DELTA
0bf0: 53 52 43 20 53 49 5a 45 20 5c 6e 20 43 4f 4e 54  SRC SIZE \n CONT
0c00: 45 4e 54 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ENT.**.** The co
0c10: 6e 74 65 6e 74 20 69 73 20 53 49 5a 45 20 62 79  ntent is SIZE by
0c20: 74 65 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  tes immediately 
0c30: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6e 65  following the ne
0c40: 77 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 44 45 4c  wline..** If DEL
0c50: 54 41 53 52 43 20 65 78 69 73 74 73 2c 20 74 68  TASRC exists, th
0c60: 65 6e 20 74 68 65 20 43 4f 4e 54 45 4e 54 20 69  en the CONTENT i
0c70: 73 20 61 20 64 65 6c 74 61 20 61 67 61 69 6e 73  s a delta agains
0c80: 74 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  t the.** content
0c90: 20 6f 66 20 44 45 4c 54 41 53 52 43 2e 0a 2a 2a   of DELTASRC..**
0ca0: 0a 2a 2a 20 49 66 20 61 6e 79 20 65 72 72 6f 72  .** If any error
0cb0: 20 6f 63 63 75 72 73 2c 20 77 72 69 74 65 20 61   occurs, write a
0cc0: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 70 45   message into pE
0cd0: 72 72 20 77 68 69 63 68 20 68 61 73 20 61 6c 72  rr which has alr
0ce0: 65 61 64 79 0a 2a 2a 20 62 65 20 69 6e 69 74 69  eady.** be initi
0cf0: 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20 65 6d 70  alized to an emp
0d00: 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  ty string..*/.st
0d10: 61 74 69 63 20 76 6f 69 64 20 78 66 65 72 5f 61  atic void xfer_a
0d20: 63 63 65 70 74 5f 66 69 6c 65 28 58 66 65 72 20  ccept_file(Xfer 
0d30: 2a 70 58 66 65 72 29 7b 0a 20 20 69 6e 74 20 6e  *pXfer){.  int n
0d40: 3b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 69  ;.  int rid;.  i
0d50: 6e 74 20 73 72 63 69 64 20 3d 20 30 3b 0a 20 20  nt srcid = 0;.  
0d60: 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 2c 20 68 61  Blob content, ha
0d70: 73 68 3b 0a 20 20 0a 20 20 69 66 28 20 70 58 66  sh;.  .  if( pXf
0d80: 65 72 2d 3e 6e 54 6f 6b 65 6e 3c 33 20 0a 20 20  er->nToken<3 .  
0d90: 20 7c 7c 20 70 58 66 65 72 2d 3e 6e 54 6f 6b 65   || pXfer->nToke
0da0: 6e 3e 34 0a 20 20 20 7c 7c 20 21 62 6c 6f 62 5f  n>4.   || !blob_
0db0: 69 73 5f 75 75 69 64 28 26 70 58 66 65 72 2d 3e  is_uuid(&pXfer->
0dc0: 61 54 6f 6b 65 6e 5b 31 5d 29 0a 20 20 20 7c 7c  aToken[1]).   ||
0dd0: 20 21 62 6c 6f 62 5f 69 73 5f 69 6e 74 28 26 70   !blob_is_int(&p
0de0: 58 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 70 58 66  Xfer->aToken[pXf
0df0: 65 72 2d 3e 6e 54 6f 6b 65 6e 2d 31 5d 2c 20 26  er->nToken-1], &
0e00: 6e 29 0a 20 20 20 7c 7c 20 6e 3c 30 0a 20 20 20  n).   || n<0.   
0e10: 7c 7c 20 28 70 58 66 65 72 2d 3e 6e 54 6f 6b 65  || (pXfer->nToke
0e20: 6e 3d 3d 34 20 26 26 20 21 62 6c 6f 62 5f 69 73  n==4 && !blob_is
0e30: 5f 75 75 69 64 28 26 70 58 66 65 72 2d 3e 61 54  _uuid(&pXfer->aT
0e40: 6f 6b 65 6e 5b 32 5d 29 29 0a 20 20 29 7b 0a 20  oken[2])).  ){. 
0e50: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
0e60: 26 70 58 66 65 72 2d 3e 65 72 72 2c 20 22 6d 61  &pXfer->err, "ma
0e70: 6c 66 6f 72 6d 65 64 20 66 69 6c 65 20 6c 69 6e  lformed file lin
0e80: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  e");.    return;
0e90: 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f  .  }.  blob_zero
0ea0: 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 62 6c  (&content);.  bl
0eb0: 6f 62 5f 7a 65 72 6f 28 26 68 61 73 68 29 3b 0a  ob_zero(&hash);.
0ec0: 20 20 62 6c 6f 62 5f 65 78 74 72 61 63 74 28 70    blob_extract(p
0ed0: 58 66 65 72 2d 3e 70 49 6e 2c 20 6e 2c 20 26 63  Xfer->pIn, n, &c
0ee0: 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 75  ontent);.  if( u
0ef0: 75 69 64 5f 69 73 5f 73 68 75 6e 6e 65 64 28 62  uid_is_shunned(b
0f00: 6c 6f 62 5f 73 74 72 28 26 70 58 66 65 72 2d 3e  lob_str(&pXfer->
0f10: 61 54 6f 6b 65 6e 5b 31 5d 29 29 20 29 7b 0a 20  aToken[1])) ){. 
0f20: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 66 69 6c     /* Ignore fil
0f30: 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
0f40: 6e 20 73 68 75 6e 6e 65 64 20 2a 2f 0a 20 20 20  n shunned */.   
0f50: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
0f60: 66 28 20 70 58 66 65 72 2d 3e 6e 54 6f 6b 65 6e  f( pXfer->nToken
0f70: 3d 3d 34 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20  ==4 ){.    Blob 
0f80: 73 72 63 3b 0a 20 20 20 20 73 72 63 69 64 20 3d  src;.    srcid =
0f90: 20 72 69 64 5f 66 72 6f 6d 5f 75 75 69 64 28 26   rid_from_uuid(&
0fa0: 70 58 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 32 5d  pXfer->aToken[2]
0fb0: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 63 6f  , 1);.    if( co
0fc0: 6e 74 65 6e 74 5f 67 65 74 28 73 72 63 69 64 2c  ntent_get(srcid,
0fd0: 20 26 73 72 63 29 3d 3d 30 20 29 7b 0a 20 20 20   &src)==0 ){.   
0fe0: 20 20 20 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26     content_put(&
0ff0: 63 6f 6e 74 65 6e 74 2c 20 62 6c 6f 62 5f 73 74  content, blob_st
1000: 72 28 26 70 58 66 65 72 2d 3e 61 54 6f 6b 65 6e  r(&pXfer->aToken
1010: 5b 31 5d 29 2c 20 73 72 63 69 64 29 3b 0a 20 20  [1]), srcid);.  
1020: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
1030: 28 70 58 66 65 72 2d 3e 70 4f 75 74 2c 20 22 67  (pXfer->pOut, "g
1040: 69 6d 6d 65 20 25 62 5c 6e 22 2c 20 26 70 58 66  imme %b\n", &pXf
1050: 65 72 2d 3e 61 54 6f 6b 65 6e 5b 32 5d 29 3b 0a  er->aToken[2]);.
1060: 20 20 20 20 20 20 70 58 66 65 72 2d 3e 6e 47 69        pXfer->nGi
1070: 6d 6d 65 53 65 6e 74 2b 2b 3b 0a 20 20 20 20 20  mmeSent++;.     
1080: 20 70 58 66 65 72 2d 3e 6e 44 61 6e 67 6c 69 6e   pXfer->nDanglin
1090: 67 46 69 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 72  gFile++;.      r
10a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
10b0: 20 70 58 66 65 72 2d 3e 6e 44 65 6c 74 61 52 63   pXfer->nDeltaRc
10c0: 76 64 2b 2b 3b 0a 20 20 20 20 62 6c 6f 62 5f 64  vd++;.    blob_d
10d0: 65 6c 74 61 5f 61 70 70 6c 79 28 26 73 72 63 2c  elta_apply(&src,
10e0: 20 26 63 6f 6e 74 65 6e 74 2c 20 26 63 6f 6e 74   &content, &cont
10f0: 65 6e 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72  ent);.    blob_r
1100: 65 73 65 74 28 26 73 72 63 29 3b 0a 20 20 7d 65  eset(&src);.  }e
1110: 6c 73 65 7b 0a 20 20 20 20 70 58 66 65 72 2d 3e  lse{.    pXfer->
1120: 6e 46 69 6c 65 52 63 76 64 2b 2b 3b 0a 20 20 7d  nFileRcvd++;.  }
1130: 0a 20 20 73 68 61 31 73 75 6d 5f 62 6c 6f 62 28  .  sha1sum_blob(
1140: 26 63 6f 6e 74 65 6e 74 2c 20 26 68 61 73 68 29  &content, &hash)
1150: 3b 0a 20 20 69 66 28 20 21 62 6c 6f 62 5f 65 71  ;.  if( !blob_eq
1160: 5f 73 74 72 28 26 70 58 66 65 72 2d 3e 61 54 6f  _str(&pXfer->aTo
1170: 6b 65 6e 5b 31 5d 2c 20 62 6c 6f 62 5f 73 74 72  ken[1], blob_str
1180: 28 26 68 61 73 68 29 2c 20 2d 31 29 20 29 7b 0a  (&hash), -1) ){.
1190: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
11a0: 28 26 70 58 66 65 72 2d 3e 65 72 72 2c 20 22 63  (&pXfer->err, "c
11b0: 6f 6e 74 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  ontent does not 
11c0: 6d 61 74 63 68 20 73 68 61 31 20 68 61 73 68 22  match sha1 hash"
11d0: 29 3b 0a 20 20 7d 0a 20 20 72 69 64 20 3d 20 63  );.  }.  rid = c
11e0: 6f 6e 74 65 6e 74 5f 70 75 74 28 26 63 6f 6e 74  ontent_put(&cont
11f0: 65 6e 74 2c 20 62 6c 6f 62 5f 73 74 72 28 26 68  ent, blob_str(&h
1200: 61 73 68 29 2c 20 30 29 3b 0a 20 20 62 6c 6f 62  ash), 0);.  blob
1210: 5f 72 65 73 65 74 28 26 68 61 73 68 29 3b 0a 20  _reset(&hash);. 
1220: 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20   if( rid==0 ){. 
1230: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
1240: 26 70 58 66 65 72 2d 3e 65 72 72 2c 20 22 25 73  &pXfer->err, "%s
1250: 22 2c 20 67 2e 7a 45 72 72 4d 73 67 29 3b 0a 20  ", g.zErrMsg);. 
1260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 64   }else{.    /* d
1270: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45  b_multi_exec("DE
1280: 4c 45 54 45 20 46 52 4f 4d 20 70 68 61 6e 74 6f  LETE FROM phanto
1290: 6d 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c  m WHERE rid=%d",
12a0: 20 72 69 64 29 3b 20 2a 2f 0a 20 20 20 20 6d 61   rid); */.    ma
12b0: 6e 69 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b  nifest_crosslink
12c0: 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b  (rid, &content);
12d0: 0a 20 20 7d 0a 20 20 72 65 6d 6f 74 65 5f 68 61  .  }.  remote_ha
12e0: 73 28 72 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  s(rid);.}../*.**
12f0: 20 54 72 79 20 74 6f 20 73 65 6e 64 20 61 20 66   Try to send a f
1300: 69 6c 65 20 61 73 20 61 20 64 65 6c 74 61 20 61  ile as a delta a
1310: 67 61 69 6e 73 74 20 69 74 73 20 70 61 72 65 6e  gainst its paren
1320: 74 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  t..** If success
1330: 66 75 6c 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ful, return the 
1340: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1350: 69 6e 20 74 68 65 20 64 65 6c 74 61 2e 0a 2a 2a  in the delta..**
1360: 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 67 65   If we cannot ge
1370: 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f 70  nerate an approp
1380: 72 69 61 74 65 20 64 65 6c 74 61 2c 20 74 68 65  riate delta, the
1390: 6e 20 73 65 6e 64 0a 2a 2a 20 6e 6f 74 68 69 6e  n send.** nothin
13a0: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 7a 65 72  g and return zer
13b0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
13c0: 20 73 65 6e 64 5f 64 65 6c 74 61 5f 70 61 72 65   send_delta_pare
13d0: 6e 74 28 0a 20 20 58 66 65 72 20 2a 70 58 66 65  nt(.  Xfer *pXfe
13e0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
13f0: 20 54 68 65 20 74 72 61 6e 73 66 65 72 20 63 6f   The transfer co
1400: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ntext */.  int r
1410: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
1420: 20 20 20 2f 2a 20 72 65 63 6f 72 64 20 69 64 20     /* record id 
1430: 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 73  of the file to s
1440: 65 6e 64 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70  end */.  Blob *p
1450: 43 6f 6e 74 65 6e 74 2c 20 20 20 20 20 20 20 20  Content,        
1460: 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
1470: 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 73  of the file to s
1480: 65 6e 64 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70  end */.  Blob *p
1490: 55 75 69 64 20 20 20 20 20 20 20 20 20 20 20 20  Uuid            
14a0: 20 2f 2a 20 54 68 65 20 55 55 49 44 20 6f 66 20   /* The UUID of 
14b0: 74 68 65 20 66 69 6c 65 20 74 6f 20 73 65 6e 64  the file to send
14c0: 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20   */.){.  static 
14d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 51 75  const char *azQu
14e0: 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 53  ery[] = {.    "S
14f0: 45 4c 45 43 54 20 70 69 64 20 46 52 4f 4d 20 70  ELECT pid FROM p
1500: 6c 69 6e 6b 20 78 22 0a 20 20 20 20 22 20 57 48  link x".    " WH
1510: 45 52 45 20 63 69 64 3d 25 64 22 0a 20 20 20 20  ERE cid=%d".    
1520: 22 20 20 20 41 4e 44 20 4e 4f 54 20 45 58 49 53  "   AND NOT EXIS
1530: 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  TS(SELECT 1 FROM
1540: 20 70 68 61 6e 74 6f 6d 20 57 48 45 52 45 20 72   phantom WHERE r
1550: 69 64 3d 70 69 64 29 22 0a 20 20 20 20 22 20 20  id=pid)".    "  
1560: 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 28   AND NOT EXISTS(
1570: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 6c  SELECT 1 FROM pl
1580: 69 6e 6b 20 79 22 0a 20 20 20 20 20 20 20 20 20  ink y".         
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
15a0: 48 45 52 45 20 79 2e 70 69 64 3d 78 2e 63 69 64  HERE y.pid=x.cid
15b0: 20 41 4e 44 20 79 2e 63 69 64 3d 78 2e 70 69 64   AND y.cid=x.pid
15c0: 29 22 2c 0a 0a 20 20 20 20 22 53 45 4c 45 43 54  )",..    "SELECT
15d0: 20 70 69 64 20 46 52 4f 4d 20 6d 6c 69 6e 6b 20   pid FROM mlink 
15e0: 78 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 66  x".    " WHERE f
15f0: 69 64 3d 25 64 22 0a 20 20 20 20 22 20 20 20 41  id=%d".    "   A
1600: 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45  ND NOT EXISTS(SE
1610: 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 68 61 6e  LECT 1 FROM phan
1620: 74 6f 6d 20 57 48 45 52 45 20 72 69 64 3d 70 69  tom WHERE rid=pi
1630: 64 29 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20  d)".    "   AND 
1640: 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43  NOT EXISTS(SELEC
1650: 54 20 31 20 46 52 4f 4d 20 6d 6c 69 6e 6b 20 79  T 1 FROM mlink y
1660: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1670: 20 20 20 20 20 20 20 22 20 20 57 48 45 52 45 20         "  WHERE 
1680: 79 2e 70 69 64 3d 78 2e 66 69 64 20 41 4e 44 20  y.pid=x.fid AND 
1690: 79 2e 66 69 64 3d 78 2e 70 69 64 29 22 0a 20 20  y.fid=x.pid)".  
16a0: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 6c  };.  int i;.  Bl
16b0: 6f 62 20 73 72 63 2c 20 64 65 6c 74 61 3b 0a 20  ob src, delta;. 
16c0: 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 20   int size = 0;. 
16d0: 20 69 6e 74 20 73 72 63 49 64 20 3d 20 30 3b 0a   int srcId = 0;.
16e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 73 72 63 49  .  for(i=0; srcI
16f0: 64 3d 3d 30 20 26 26 20 69 3c 63 6f 75 6e 74 28  d==0 && i<count(
1700: 61 7a 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a  azQuery); i++){.
1710: 20 20 20 20 73 72 63 49 64 20 3d 20 64 62 5f 69      srcId = db_i
1720: 6e 74 28 30 2c 20 61 7a 51 75 65 72 79 5b 69 5d  nt(0, azQuery[i]
1730: 2c 20 72 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66  , rid);.  }.  if
1740: 28 20 73 72 63 49 64 3e 30 20 26 26 20 63 6f 6e  ( srcId>0 && con
1750: 74 65 6e 74 5f 67 65 74 28 73 72 63 49 64 2c 20  tent_get(srcId, 
1760: 26 73 72 63 29 20 29 7b 0a 20 20 20 20 63 68 61  &src) ){.    cha
1770: 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 74 65  r *zUuid = db_te
1780: 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 75 75  xt(0, "SELECT uu
1790: 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45  id FROM blob WHE
17a0: 52 45 20 72 69 64 3d 25 64 22 2c 20 73 72 63 49  RE rid=%d", srcI
17b0: 64 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 64 65 6c  d);.    blob_del
17c0: 74 61 5f 63 72 65 61 74 65 28 26 73 72 63 2c 20  ta_create(&src, 
17d0: 70 43 6f 6e 74 65 6e 74 2c 20 26 64 65 6c 74 61  pContent, &delta
17e0: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 62 6c  );.    size = bl
17f0: 6f 62 5f 73 69 7a 65 28 26 64 65 6c 74 61 29 3b  ob_size(&delta);
1800: 0a 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 62  .    if( size>=b
1810: 6c 6f 62 5f 73 69 7a 65 28 70 43 6f 6e 74 65 6e  lob_size(pConten
1820: 74 29 2d 35 30 20 29 7b 0a 20 20 20 20 20 20 73  t)-50 ){.      s
1830: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
1840: 73 65 20 69 66 28 20 75 75 69 64 5f 69 73 5f 73  se if( uuid_is_s
1850: 68 75 6e 6e 65 64 28 7a 55 75 69 64 29 20 29 7b  hunned(zUuid) ){
1860: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 30 3b  .      size = 0;
1870: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1880: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70    blob_appendf(p
1890: 58 66 65 72 2d 3e 70 4f 75 74 2c 20 22 66 69 6c  Xfer->pOut, "fil
18a0: 65 20 25 62 20 25 73 20 25 64 5c 6e 22 2c 20 70  e %b %s %d\n", p
18b0: 55 75 69 64 2c 20 7a 55 75 69 64 2c 20 73 69 7a  Uuid, zUuid, siz
18c0: 65 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61  e);.      blob_a
18d0: 70 70 65 6e 64 28 70 58 66 65 72 2d 3e 70 4f 75  ppend(pXfer->pOu
18e0: 74 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26  t, blob_buffer(&
18f0: 64 65 6c 74 61 29 2c 20 73 69 7a 65 29 3b 0a 20  delta), size);. 
1900: 20 20 20 20 20 2f 2a 20 62 6c 6f 62 5f 61 70 70       /* blob_app
1910: 65 6e 64 66 28 70 58 66 65 72 2d 3e 70 4f 75 74  endf(pXfer->pOut
1920: 2c 20 22 5c 6e 22 2c 20 31 29 3b 20 2a 2f 0a 20  , "\n", 1); */. 
1930: 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 72 65     }.    blob_re
1940: 73 65 74 28 26 64 65 6c 74 61 29 3b 0a 20 20 20  set(&delta);.   
1950: 20 66 72 65 65 28 7a 55 75 69 64 29 3b 0a 20 20   free(zUuid);.  
1960: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 72    blob_reset(&sr
1970: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
1980: 20 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   size;.}../*.** 
1990: 54 72 79 20 74 6f 20 73 65 6e 64 20 61 20 66 69  Try to send a fi
19a0: 6c 65 20 61 73 20 61 20 6e 61 74 69 76 65 20 64  le as a native d
19b0: 65 6c 74 61 2e 20 20 0a 2a 2a 20 49 66 20 73 75  elta.  .** If su
19c0: 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
19d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19e0: 79 74 65 73 20 69 6e 20 74 68 65 20 64 65 6c 74  ytes in the delt
19f0: 61 2e 0a 2a 2a 20 49 66 20 77 65 20 63 61 6e 6e  a..** If we cann
1a00: 6f 74 20 67 65 6e 65 72 61 74 65 20 61 6e 20 61  ot generate an a
1a10: 70 70 72 6f 70 72 69 61 74 65 20 64 65 6c 74 61  ppropriate delta
1a20: 2c 20 74 68 65 6e 20 73 65 6e 64 0a 2a 2a 20 6e  , then send.** n
1a30: 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72  othing and retur
1a40: 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n zero..*/.stati
1a50: 63 20 69 6e 74 20 73 65 6e 64 5f 64 65 6c 74 61  c int send_delta
1a60: 5f 6e 61 74 69 76 65 28 0a 20 20 58 66 65 72 20  _native(.  Xfer 
1a70: 2a 70 58 66 65 72 2c 20 20 20 20 20 20 20 20 20  *pXfer,         
1a80: 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 66     /* The transf
1a90: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
1aa0: 69 6e 74 20 72 69 64 2c 20 20 20 20 20 20 20 20  int rid,        
1ab0: 20 20 20 20 20 20 20 20 2f 2a 20 72 65 63 6f 72          /* recor
1ac0: 64 20 69 64 20 6f 66 20 74 68 65 20 66 69 6c 65  d id of the file
1ad0: 20 74 6f 20 73 65 6e 64 20 2a 2f 0a 20 20 42 6c   to send */.  Bl
1ae0: 6f 62 20 2a 70 55 75 69 64 20 20 20 20 20 20 20  ob *pUuid       
1af0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 55 49        /* The UUI
1b00: 44 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  D of the file to
1b10: 20 73 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 42 6c   send */.){.  Bl
1b20: 6f 62 20 73 72 63 2c 20 64 65 6c 74 61 3b 0a 20  ob src, delta;. 
1b30: 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 20   int size = 0;. 
1b40: 20 69 6e 74 20 73 72 63 49 64 3b 0a 0a 20 20 73   int srcId;..  s
1b50: 72 63 49 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c  rcId = db_int(0,
1b60: 20 22 53 45 4c 45 43 54 20 73 72 63 69 64 20 46   "SELECT srcid F
1b70: 52 4f 4d 20 64 65 6c 74 61 20 57 48 45 52 45 20  ROM delta WHERE 
1b80: 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20  rid=%d", rid);. 
1b90: 20 69 66 28 20 73 72 63 49 64 3e 30 20 29 7b 0a   if( srcId>0 ){.
1ba0: 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73      blob_zero(&s
1bb0: 72 63 29 3b 0a 20 20 20 20 64 62 5f 62 6c 6f 62  rc);.    db_blob
1bc0: 28 26 73 72 63 2c 20 22 53 45 4c 45 43 54 20 75  (&src, "SELECT u
1bd0: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  uid FROM blob WH
1be0: 45 52 45 20 72 69 64 3d 25 64 22 2c 20 73 72 63  ERE rid=%d", src
1bf0: 49 64 29 3b 0a 20 20 20 20 69 66 28 20 75 75 69  Id);.    if( uui
1c00: 64 5f 69 73 5f 73 68 75 6e 6e 65 64 28 62 6c 6f  d_is_shunned(blo
1c10: 62 5f 73 74 72 28 26 73 72 63 29 29 20 29 7b 0a  b_str(&src)) ){.
1c20: 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74        blob_reset
1c30: 28 26 73 72 63 29 3b 0a 20 20 20 20 20 20 72 65  (&src);.      re
1c40: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1c50: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 64 65 6c    blob_zero(&del
1c60: 74 61 29 3b 0a 20 20 20 20 64 62 5f 62 6c 6f 62  ta);.    db_blob
1c70: 28 26 64 65 6c 74 61 2c 20 22 53 45 4c 45 43 54  (&delta, "SELECT
1c80: 20 63 6f 6e 74 65 6e 74 20 46 52 4f 4d 20 62 6c   content FROM bl
1c90: 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22  ob WHERE rid=%d"
1ca0: 2c 20 72 69 64 29 3b 0a 20 20 20 20 62 6c 6f 62  , rid);.    blob
1cb0: 5f 75 6e 63 6f 6d 70 72 65 73 73 28 26 64 65 6c  _uncompress(&del
1cc0: 74 61 2c 20 26 64 65 6c 74 61 29 3b 0a 20 20 20  ta, &delta);.   
1cd0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 58   blob_appendf(pX
1ce0: 66 65 72 2d 3e 70 4f 75 74 2c 20 22 66 69 6c 65  fer->pOut, "file
1cf0: 20 25 62 20 25 62 20 25 64 5c 6e 22 2c 0a 20 20   %b %b %d\n",.  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
1d10: 75 69 64 2c 20 26 73 72 63 2c 20 62 6c 6f 62 5f  uid, &src, blob_
1d20: 73 69 7a 65 28 26 64 65 6c 74 61 29 29 3b 0a 20  size(&delta));. 
1d30: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
1d40: 58 66 65 72 2d 3e 70 4f 75 74 2c 20 62 6c 6f 62  Xfer->pOut, blob
1d50: 5f 62 75 66 66 65 72 28 26 64 65 6c 74 61 29 2c  _buffer(&delta),
1d60: 20 62 6c 6f 62 5f 73 69 7a 65 28 26 64 65 6c 74   blob_size(&delt
1d70: 61 29 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  a));.    size = 
1d80: 62 6c 6f 62 5f 73 69 7a 65 28 26 64 65 6c 74 61  blob_size(&delta
1d90: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
1da0: 74 28 26 64 65 6c 74 61 29 3b 0a 20 20 20 20 62  t(&delta);.    b
1db0: 6c 6f 62 5f 72 65 73 65 74 28 26 73 72 63 29 3b  lob_reset(&src);
1dc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 69  .  }else{.    si
1dd0: 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ze = 0;.  }.  re
1de0: 74 75 72 6e 20 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a  turn size;.}../*
1df0: 0a 2a 2a 20 53 65 6e 64 20 74 68 65 20 66 69 6c  .** Send the fil
1e00: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
1e10: 72 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  rid..**.** The p
1e20: 55 75 69 64 20 63 61 6e 20 62 65 20 4e 55 4c 4c  Uuid can be NULL
1e30: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
1e40: 68 65 20 63 6f 72 72 65 63 74 20 55 55 49 44 20  he correct UUID 
1e50: 69 73 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  is computed.** f
1e60: 72 6f 6d 20 74 68 65 20 72 69 64 2e 0a 2a 2a 0a  rom the rid..**.
1e70: 2a 2a 20 54 72 79 20 74 6f 20 73 65 6e 64 20 74  ** Try to send t
1e80: 68 65 20 66 69 6c 65 20 61 73 20 61 20 6e 61 74  he file as a nat
1e90: 69 76 65 20 64 65 6c 74 61 20 69 66 20 6e 61 74  ive delta if nat
1ea0: 69 76 65 44 65 6c 74 61 20 69 73 20 74 72 75 65  iveDelta is true
1eb0: 2c 20 6f 72 0a 2a 2a 20 61 73 20 61 20 70 61 72  , or.** as a par
1ec0: 65 6e 74 20 64 65 6c 74 61 20 69 66 20 6e 61 74  ent delta if nat
1ed0: 69 76 65 44 65 6c 74 61 20 69 73 20 66 61 6c 73  iveDelta is fals
1ee0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1ef0: 64 20 73 65 6e 64 5f 66 69 6c 65 28 58 66 65 72  d send_file(Xfer
1f00: 20 2a 70 58 66 65 72 2c 20 69 6e 74 20 72 69 64   *pXfer, int rid
1f10: 2c 20 42 6c 6f 62 20 2a 70 55 75 69 64 2c 20 69  , Blob *pUuid, i
1f20: 6e 74 20 6e 61 74 69 76 65 44 65 6c 74 61 29 7b  nt nativeDelta){
1f30: 0a 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 2c  .  Blob content,
1f40: 20 75 75 69 64 3b 0a 20 20 69 6e 74 20 73 69 7a   uuid;.  int siz
1f50: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 64 62  e = 0;..  if( db
1f60: 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20  _exists("SELECT 
1f70: 31 20 46 52 4f 4d 20 6f 6e 72 65 6d 6f 74 65 20  1 FROM onremote 
1f80: 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72  WHERE rid=%d", r
1f90: 69 64 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  id) ){.     retu
1fa0: 72 6e 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a  rn;.  }.  blob_z
1fb0: 65 72 6f 28 26 75 75 69 64 29 3b 0a 20 20 64 62  ero(&uuid);.  db
1fc0: 5f 62 6c 6f 62 28 26 75 75 69 64 2c 20 22 53 45  _blob(&uuid, "SE
1fd0: 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62  LECT uuid FROM b
1fe0: 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64  lob WHERE rid=%d
1ff0: 20 41 4e 44 20 73 69 7a 65 3e 3d 30 22 2c 20 72   AND size>=0", r
2000: 69 64 29 3b 0a 20 20 69 66 28 20 62 6c 6f 62 5f  id);.  if( blob_
2010: 73 69 7a 65 28 26 75 75 69 64 29 3d 3d 30 20 29  size(&uuid)==0 )
2020: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
2030: 7d 0a 20 20 69 66 28 20 70 55 75 69 64 20 29 7b  }.  if( pUuid ){
2040: 0a 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 63 6f  .    if( blob_co
2050: 6d 70 61 72 65 28 70 55 75 69 64 2c 20 26 75 75  mpare(pUuid, &uu
2060: 69 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  id)!=0 ){.      
2070: 62 6c 6f 62 5f 72 65 73 65 74 28 26 75 75 69 64  blob_reset(&uuid
2080: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
2090: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
20a0: 20 20 20 20 70 55 75 69 64 20 3d 20 26 75 75 69      pUuid = &uui
20b0: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 75 69  d;.  }.  if( uui
20c0: 64 5f 69 73 5f 73 68 75 6e 6e 65 64 28 62 6c 6f  d_is_shunned(blo
20d0: 62 5f 73 74 72 28 70 55 75 69 64 29 29 20 29 7b  b_str(pUuid)) ){
20e0: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  .    blob_reset(
20f0: 26 75 75 69 64 29 3b 0a 20 20 20 20 72 65 74 75  &uuid);.    retu
2100: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 58  rn;.  }.  if( pX
2110: 66 65 72 2d 3e 6d 78 53 65 6e 64 3c 3d 62 6c 6f  fer->mxSend<=blo
2120: 62 5f 73 69 7a 65 28 70 58 66 65 72 2d 3e 70 4f  b_size(pXfer->pO
2130: 75 74 29 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f  ut) ){.    blob_
2140: 61 70 70 65 6e 64 66 28 70 58 66 65 72 2d 3e 70  appendf(pXfer->p
2150: 4f 75 74 2c 20 22 69 67 6f 74 20 25 62 5c 6e 22  Out, "igot %b\n"
2160: 2c 20 70 55 75 69 64 29 3b 0a 20 20 20 20 70 58  , pUuid);.    pX
2170: 66 65 72 2d 3e 6e 49 47 6f 74 53 65 6e 74 2b 2b  fer->nIGotSent++
2180: 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74  ;.    blob_reset
2190: 28 26 75 75 69 64 29 3b 0a 20 20 20 20 72 65 74  (&uuid);.    ret
21a0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  urn;.  }.  if( n
21b0: 61 74 69 76 65 44 65 6c 74 61 20 29 7b 0a 20 20  ativeDelta ){.  
21c0: 20 20 73 69 7a 65 20 3d 20 73 65 6e 64 5f 64 65    size = send_de
21d0: 6c 74 61 5f 6e 61 74 69 76 65 28 70 58 66 65 72  lta_native(pXfer
21e0: 2c 20 72 69 64 2c 20 70 55 75 69 64 29 3b 0a 20  , rid, pUuid);. 
21f0: 20 20 20 69 66 28 20 73 69 7a 65 20 29 7b 0a 20     if( size ){. 
2200: 20 20 20 20 20 70 58 66 65 72 2d 3e 6e 44 65 6c       pXfer->nDel
2210: 74 61 53 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  taSent++;.    }.
2220: 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 3d 3d    }.  if( size==
2230: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 74 65 6e 74  0 ){.    content
2240: 5f 67 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65  _get(rid, &conte
2250: 6e 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 6e  nt);..    if( !n
2260: 61 74 69 76 65 44 65 6c 74 61 20 26 26 20 62 6c  ativeDelta && bl
2270: 6f 62 5f 73 69 7a 65 28 26 63 6f 6e 74 65 6e 74  ob_size(&content
2280: 29 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 73  )>100 ){.      s
2290: 69 7a 65 20 3d 20 73 65 6e 64 5f 64 65 6c 74 61  ize = send_delta
22a0: 5f 70 61 72 65 6e 74 28 70 58 66 65 72 2c 20 72  _parent(pXfer, r
22b0: 69 64 2c 20 26 63 6f 6e 74 65 6e 74 2c 20 70 55  id, &content, pU
22c0: 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uid);.    }.    
22d0: 69 66 28 20 73 69 7a 65 3d 3d 30 20 29 7b 0a 20  if( size==0 ){. 
22e0: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
22f0: 62 6c 6f 62 5f 73 69 7a 65 28 26 63 6f 6e 74 65  blob_size(&conte
2300: 6e 74 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f  nt);.      blob_
2310: 61 70 70 65 6e 64 66 28 70 58 66 65 72 2d 3e 70  appendf(pXfer->p
2320: 4f 75 74 2c 20 22 66 69 6c 65 20 25 62 20 25 64  Out, "file %b %d
2330: 5c 6e 22 2c 20 70 55 75 69 64 2c 20 73 69 7a 65  \n", pUuid, size
2340: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  );.      blob_ap
2350: 70 65 6e 64 28 70 58 66 65 72 2d 3e 70 4f 75 74  pend(pXfer->pOut
2360: 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 63  , blob_buffer(&c
2370: 6f 6e 74 65 6e 74 29 2c 20 73 69 7a 65 29 3b 0a  ontent), size);.
2380: 20 20 20 20 20 20 70 58 66 65 72 2d 3e 6e 46 69        pXfer->nFi
2390: 6c 65 53 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  leSent++;.    }e
23a0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 58 66 65 72  lse{.      pXfer
23b0: 2d 3e 6e 44 65 6c 74 61 53 65 6e 74 2b 2b 3b 0a  ->nDeltaSent++;.
23c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6d 6f      }.  }.  remo
23d0: 74 65 5f 68 61 73 28 72 69 64 29 3b 0a 20 20 62  te_has(rid);.  b
23e0: 6c 6f 62 5f 72 65 73 65 74 28 26 75 75 69 64 29  lob_reset(&uuid)
23f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20  ;.}../*.** Send 
2400: 61 20 67 69 6d 6d 65 20 6d 65 73 73 61 67 65 20  a gimme message 
2410: 66 6f 72 20 65 76 65 72 79 20 70 68 61 6e 74 6f  for every phanto
2420: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
2430: 64 20 72 65 71 75 65 73 74 5f 70 68 61 6e 74 6f  d request_phanto
2440: 6d 73 28 58 66 65 72 20 2a 70 58 66 65 72 2c 20  ms(Xfer *pXfer, 
2450: 69 6e 74 20 6d 61 78 52 65 71 29 7b 0a 20 20 53  int maxReq){.  S
2460: 74 6d 74 20 71 3b 0a 20 20 64 62 5f 70 72 65 70  tmt q;.  db_prep
2470: 61 72 65 28 26 71 2c 20 0a 20 20 20 20 22 53 45  are(&q, .    "SE
2480: 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 70  LECT uuid FROM p
2490: 68 61 6e 74 6f 6d 20 4a 4f 49 4e 20 62 6c 6f 62  hantom JOIN blob
24a0: 20 55 53 49 4e 47 28 72 69 64 29 22 0a 20 20 20   USING(rid)".   
24b0: 20 22 20 57 48 45 52 45 20 4e 4f 54 20 45 58 49   " WHERE NOT EXI
24c0: 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f  STS(SELECT 1 FRO
24d0: 4d 20 73 68 75 6e 20 57 48 45 52 45 20 75 75 69  M shun WHERE uui
24e0: 64 3d 62 6c 6f 62 2e 75 75 69 64 29 22 0a 20 20  d=blob.uuid)".  
24f0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73  );.  while( db_s
2500: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f  tep(&q)==SQLITE_
2510: 52 4f 57 20 26 26 20 6d 61 78 52 65 71 2d 2d 20  ROW && maxReq-- 
2520: 3e 20 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  > 0 ){.    const
2530: 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64   char *zUuid = d
2540: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
2550: 2c 20 30 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  , 0);.    blob_a
2560: 70 70 65 6e 64 66 28 70 58 66 65 72 2d 3e 70 4f  ppendf(pXfer->pO
2570: 75 74 2c 20 22 67 69 6d 6d 65 20 25 73 5c 6e 22  ut, "gimme %s\n"
2580: 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 70 58  , zUuid);.    pX
2590: 66 65 72 2d 3e 6e 47 69 6d 6d 65 53 65 6e 74 2b  fer->nGimmeSent+
25a0: 2b 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61  +;.  }.  db_fina
25b0: 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a 2f 2a 0a  lize(&q);.}../*.
25c0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 20 53 48  ** Compute an SH
25d0: 41 31 20 68 61 73 68 20 6f 6e 20 74 68 65 20 74  A1 hash on the t
25e0: 61 69 6c 20 6f 66 20 70 4d 73 67 2e 20 20 56 65  ail of pMsg.  Ve
25f0: 72 69 66 79 20 74 68 61 74 20 69 74 20 6d 61 74  rify that it mat
2600: 63 68 65 73 20 74 68 65 0a 2a 2a 20 74 68 65 20  ches the.** the 
2610: 68 61 73 68 20 67 69 76 65 6e 20 69 6e 20 70 48  hash given in pH
2620: 61 73 68 2e 20 20 52 65 74 75 72 6e 20 31 20 6f  ash.  Return 1 o
2630: 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d  n a successful m
2640: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 30 0a  atch.  Return 0.
2650: 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
2660: 20 6d 69 73 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74   mismatch..*/.st
2670: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 5f 74  atic int check_t
2680: 61 69 6c 5f 68 61 73 68 28 42 6c 6f 62 20 2a 70  ail_hash(Blob *p
2690: 48 61 73 68 2c 20 42 6c 6f 62 20 2a 70 4d 73 67  Hash, Blob *pMsg
26a0: 29 7b 0a 20 20 42 6c 6f 62 20 74 61 69 6c 3b 0a  ){.  Blob tail;.
26b0: 20 20 42 6c 6f 62 20 68 32 3b 0a 20 20 69 6e 74    Blob h2;.  int
26c0: 20 72 63 3b 0a 20 20 62 6c 6f 62 5f 74 61 69 6c   rc;.  blob_tail
26d0: 28 70 4d 73 67 2c 20 26 74 61 69 6c 29 3b 0a 20  (pMsg, &tail);. 
26e0: 20 73 68 61 31 73 75 6d 5f 62 6c 6f 62 28 26 74   sha1sum_blob(&t
26f0: 61 69 6c 2c 20 26 68 32 29 3b 0a 20 20 72 63 20  ail, &h2);.  rc 
2700: 3d 20 62 6c 6f 62 5f 63 6f 6d 70 61 72 65 28 70  = blob_compare(p
2710: 48 61 73 68 2c 20 26 68 32 29 3b 0a 20 20 62 6c  Hash, &h2);.  bl
2720: 6f 62 5f 72 65 73 65 74 28 26 68 32 29 3b 0a 20  ob_reset(&h2);. 
2730: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 74 61 69   blob_reset(&tai
2740: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3d  l);.  return rc=
2750: 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  =0;.}.../*.** Ch
2760: 65 63 6b 20 74 68 65 20 73 69 67 6e 61 74 75 72  eck the signatur
2770: 65 20 6f 6e 20 61 6e 20 61 70 70 6c 69 63 61 74  e on an applicat
2780: 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 20 70 61 79  ion/x-fossil pay
2790: 6c 6f 61 64 20 72 65 63 65 69 76 65 64 20 62 79  load received by
27a0: 0a 2a 2a 20 74 68 65 20 48 54 54 50 20 73 65 72  .** the HTTP ser
27b0: 76 65 72 2e 20 20 54 68 65 20 73 69 67 6e 61 74  ver.  The signat
27c0: 75 72 65 20 69 73 20 61 20 6c 69 6e 65 20 6f 66  ure is a line of
27d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
27e0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
27f0: 20 20 6c 6f 67 69 6e 20 4c 4f 47 49 4e 20 4e 4f    login LOGIN NO
2800: 4e 43 45 20 53 49 47 4e 41 54 55 52 45 0a 2a 2a  NCE SIGNATURE.**
2810: 0a 2a 2a 20 54 68 65 20 4e 4f 4e 43 45 20 69 73  .** The NONCE is
2820: 20 74 68 65 20 53 48 41 31 20 68 61 73 68 20 6f   the SHA1 hash o
2830: 66 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  f the remainder 
2840: 6f 66 20 74 68 65 20 69 6e 70 75 74 2e 20 20 0a  of the input.  .
2850: 2a 2a 20 53 49 47 4e 41 54 55 52 45 20 69 73 20  ** SIGNATURE is 
2860: 74 68 65 20 53 48 41 31 20 63 68 65 63 6b 73 75  the SHA1 checksu
2870: 6d 20 6f 66 20 74 68 65 20 4e 4f 4e 43 45 20 63  m of the NONCE c
2880: 6f 6e 63 61 74 65 6e 61 74 65 64 20 0a 2a 2a 20  oncatenated .** 
2890: 77 69 74 68 20 74 68 65 20 75 73 65 72 73 20 70  with the users p
28a0: 61 73 73 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54  assword..**.** T
28b0: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  he parameters to
28c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72   this routine ar
28d0: 65 20 65 70 68 65 72 6d 65 72 61 6c 20 62 6c 6f  e ephermeral blo
28e0: 62 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a  bs holding the.*
28f0: 2a 20 4c 4f 47 49 4e 2c 20 4e 4f 4e 43 45 20 61  * LOGIN, NONCE a
2900: 6e 64 20 53 49 47 4e 41 54 55 52 45 2e 0a 2a 2a  nd SIGNATURE..**
2910: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2920: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6c 6f 63   attempts to loc
2930: 61 74 65 20 74 68 65 20 75 73 65 72 20 61 6e 64  ate the user and
2940: 20 76 65 72 69 66 79 20 74 68 65 20 73 69 67 6e   verify the sign
2950: 61 74 75 72 65 2e 0a 2a 2a 20 49 66 20 65 76 65  ature..** If eve
2960: 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73 20 6f  rything checks o
2970: 75 74 2c 20 74 68 65 20 55 53 45 52 2e 43 41 50  ut, the USER.CAP
2980: 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 74 68 65 20   column for the 
2990: 55 53 45 52 20 74 61 62 6c 65 0a 2a 2a 20 69 73  USER table.** is
29a0: 20 63 6f 6e 73 75 6c 74 65 64 20 74 6f 20 73 65   consulted to se
29b0: 74 20 70 72 69 76 69 6c 65 67 65 73 20 69 6e 20  t privileges in 
29c0: 74 68 65 20 67 6c 6f 62 61 6c 20 67 20 76 61 72  the global g var
29d0: 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  iable..**.** If 
29e0: 61 6e 79 74 68 69 6e 67 20 66 61 69 6c 73 20 74  anything fails t
29f0: 6f 20 63 68 65 63 6b 20 6f 75 74 2c 20 6e 6f 20  o check out, no 
2a00: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
2a10: 20 74 6f 20 70 72 69 76 69 6c 65 67 65 73 2e 0a   to privileges..
2a20: 2a 2a 0a 2a 2a 20 53 69 67 6e 61 74 75 72 65 20  **.** Signature 
2a30: 67 65 6e 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68  generation on th
2a40: 65 20 63 6c 69 65 6e 74 20 73 69 64 65 20 69 73  e client side is
2a50: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
2a60: 0a 2a 2a 20 68 74 74 70 5f 65 78 63 68 61 6e 67  .** http_exchang
2a70: 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  e() routine..*/.
2a80: 76 6f 69 64 20 63 68 65 63 6b 5f 6c 6f 67 69 6e  void check_login
2a90: 28 42 6c 6f 62 20 2a 70 4c 6f 67 69 6e 2c 20 42  (Blob *pLogin, B
2aa0: 6c 6f 62 20 2a 70 4e 6f 6e 63 65 2c 20 42 6c 6f  lob *pNonce, Blo
2ab0: 62 20 2a 70 53 69 67 29 7b 0a 20 20 53 74 6d 74  b *pSig){.  Stmt
2ac0: 20 71 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   q;.  int rc;.. 
2ad0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20   db_prepare(&q, 
2ae0: 22 53 45 4c 45 43 54 20 70 77 2c 20 63 61 70 2c  "SELECT pw, cap,
2af0: 20 75 69 64 20 46 52 4f 4d 20 75 73 65 72 20 57   uid FROM user W
2b00: 48 45 52 45 20 6c 6f 67 69 6e 3d 25 42 22 2c 20  HERE login=%B", 
2b10: 70 4c 6f 67 69 6e 29 3b 0a 20 20 69 66 28 20 64  pLogin);.  if( d
2b20: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
2b30: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 42 6c  TE_ROW ){.    Bl
2b40: 6f 62 20 70 77 2c 20 63 6f 6d 62 69 6e 65 64 2c  ob pw, combined,
2b50: 20 68 61 73 68 3b 0a 20 20 20 20 62 6c 6f 62 5f   hash;.    blob_
2b60: 7a 65 72 6f 28 26 70 77 29 3b 0a 20 20 20 20 64  zero(&pw);.    d
2b70: 62 5f 65 70 68 65 6d 65 72 61 6c 5f 62 6c 6f 62  b_ephemeral_blob
2b80: 28 26 71 2c 20 30 2c 20 26 70 77 29 3b 0a 20 20  (&q, 0, &pw);.  
2b90: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f 6d    blob_zero(&com
2ba0: 62 69 6e 65 64 29 3b 0a 20 20 20 20 62 6c 6f 62  bined);.    blob
2bb0: 5f 63 6f 70 79 28 26 63 6f 6d 62 69 6e 65 64 2c  _copy(&combined,
2bc0: 20 70 4e 6f 6e 63 65 29 3b 0a 20 20 20 20 62 6c   pNonce);.    bl
2bd0: 6f 62 5f 61 70 70 65 6e 64 28 26 63 6f 6d 62 69  ob_append(&combi
2be0: 6e 65 64 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72  ned, blob_buffer
2bf0: 28 26 70 77 29 2c 20 62 6c 6f 62 5f 73 69 7a 65  (&pw), blob_size
2c00: 28 26 70 77 29 29 3b 0a 20 20 20 20 2f 2a 20 43  (&pw));.    /* C
2c10: 47 49 44 45 42 55 47 28 28 22 70 72 65 73 69 67  GIDEBUG(("presig
2c20: 3d 5b 25 73 5d 5c 6e 22 2c 20 62 6c 6f 62 5f 73  =[%s]\n", blob_s
2c30: 74 72 28 26 63 6f 6d 62 69 6e 65 64 29 29 29 3b  tr(&combined)));
2c40: 20 2a 2f 0a 20 20 20 20 73 68 61 31 73 75 6d 5f   */.    sha1sum_
2c50: 62 6c 6f 62 28 26 63 6f 6d 62 69 6e 65 64 2c 20  blob(&combined, 
2c60: 26 68 61 73 68 29 3b 0a 20 20 20 20 72 63 20 3d  &hash);.    rc =
2c70: 20 62 6c 6f 62 5f 63 6f 6d 70 61 72 65 28 26 68   blob_compare(&h
2c80: 61 73 68 2c 20 70 53 69 67 29 3b 0a 20 20 20 20  ash, pSig);.    
2c90: 62 6c 6f 62 5f 72 65 73 65 74 28 26 68 61 73 68  blob_reset(&hash
2ca0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
2cb0: 74 28 26 63 6f 6d 62 69 6e 65 64 29 3b 0a 20 20  t(&combined);.  
2cc0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
2cd0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2ce0: 2a 7a 43 61 70 3b 0a 20 20 20 20 20 20 7a 43 61  *zCap;.      zCa
2cf0: 70 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  p = db_column_te
2d00: 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 20  xt(&q, 1);.     
2d10: 20 6c 6f 67 69 6e 5f 73 65 74 5f 63 61 70 61 62   login_set_capab
2d20: 69 6c 69 74 69 65 73 28 7a 43 61 70 29 3b 0a 20  ilities(zCap);. 
2d30: 20 20 20 20 20 67 2e 75 73 65 72 55 69 64 20 3d       g.userUid =
2d40: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26   db_column_int(&
2d50: 71 2c 20 32 29 3b 0a 20 20 20 20 20 20 67 2e 7a  q, 2);.      g.z
2d60: 4c 6f 67 69 6e 20 3d 20 6d 70 72 69 6e 74 66 28  Login = mprintf(
2d70: 22 25 62 22 2c 20 70 4c 6f 67 69 6e 29 3b 0a 20  "%b", pLogin);. 
2d80: 20 20 20 20 20 67 2e 7a 4e 6f 6e 63 65 20 3d 20       g.zNonce = 
2d90: 6d 70 72 69 6e 74 66 28 22 25 62 22 2c 20 70 4e  mprintf("%b", pN
2da0: 6f 6e 63 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  once);.    }.  }
2db0: 0a 20 20 64 62 5f 72 65 73 65 74 28 26 71 29 3b  .  db_reset(&q);
2dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20 74  .}../*.** Send t
2dd0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c  he content of al
2de0: 6c 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20 75  l files in the u
2df0: 6e 73 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a  nsent table..**.
2e00: 2a 2a 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c  ** This is reall
2e10: 79 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69  y just an optimi
2e20: 7a 61 74 69 6f 6e 2e 20 20 49 66 20 79 6f 75 20  zation.  If you 
2e30: 63 6c 65 61 72 20 74 68 65 0a 2a 2a 20 75 6e 73  clear the.** uns
2e40: 65 6e 74 20 74 61 62 6c 65 2c 20 61 6c 6c 20 74  ent table, all t
2e50: 68 65 20 72 69 67 68 74 20 66 69 6c 65 73 20 77  he right files w
2e60: 69 6c 6c 20 73 74 69 6c 6c 20 67 65 74 20 74 72  ill still get tr
2e70: 61 6e 73 66 65 72 72 65 64 2e 0a 2a 2a 20 49 74  ansferred..** It
2e80: 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 71 75   just might requ
2e90: 69 72 65 20 61 6e 20 65 78 74 72 61 20 72 6f 75  ire an extra rou
2ea0: 6e 64 20 74 72 69 70 20 6f 72 20 74 77 6f 2e 0a  nd trip or two..
2eb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2ec0: 65 6e 64 5f 75 6e 73 65 6e 74 28 58 66 65 72 20  end_unsent(Xfer 
2ed0: 2a 70 58 66 65 72 29 7b 0a 20 20 53 74 6d 74 20  *pXfer){.  Stmt 
2ee0: 71 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28  q;.  db_prepare(
2ef0: 26 71 2c 20 22 53 45 4c 45 43 54 20 72 69 64 20  &q, "SELECT rid 
2f00: 46 52 4f 4d 20 75 6e 73 65 6e 74 22 29 3b 0a 20  FROM unsent");. 
2f10: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28   while( db_step(
2f20: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
2f30: 29 7b 0a 20 20 20 20 69 6e 74 20 72 69 64 20 3d  ){.    int rid =
2f40: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26   db_column_int(&
2f50: 71 2c 20 30 29 3b 0a 20 20 20 20 73 65 6e 64 5f  q, 0);.    send_
2f60: 66 69 6c 65 28 70 58 66 65 72 2c 20 72 69 64 2c  file(pXfer, rid,
2f70: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62   0, 0);.  }.  db
2f80: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20  _finalize(&q);. 
2f90: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
2fa0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 75 6e 73 65  DELETE FROM unse
2fb0: 6e 74 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nt");.}../*.** C
2fc0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2fd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 63  he number of unc
2fe0: 6c 75 73 74 65 72 65 64 20 65 6e 74 72 69 65 73  lustered entries
2ff0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
3000: 0a 2a 2a 20 31 30 30 20 61 6e 64 20 69 66 20 69  .** 100 and if i
3010: 74 20 69 73 2c 20 66 6f 72 6d 20 61 20 6e 65 77  t is, form a new
3020: 20 63 6c 75 73 74 65 72 2e 20 20 55 6e 63 6c 75   cluster.  Unclu
3030: 73 74 65 72 65 64 20 70 68 61 6e 74 6f 6d 73 20  stered phantoms 
3040: 64 6f 20 6e 6f 74 0a 2a 2a 20 63 6f 75 6e 74 20  do not.** count 
3050: 74 6f 77 61 72 64 20 74 68 65 20 31 30 30 20 74  toward the 100 t
3060: 6f 74 61 6c 2e 20 20 41 6e 64 20 70 68 61 6e 74  otal.  And phant
3070: 6f 6d 73 20 61 72 65 20 6e 65 76 65 72 20 61 64  oms are never ad
3080: 64 65 64 20 74 6f 20 61 20 6e 65 77 0a 2a 2a 20  ded to a new.** 
3090: 63 6c 75 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  cluster..*/.stat
30a0: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 5f 63  ic void create_c
30b0: 6c 75 73 74 65 72 28 76 6f 69 64 29 7b 0a 20 20  luster(void){.  
30c0: 42 6c 6f 62 20 63 6c 75 73 74 65 72 2c 20 63 6b  Blob cluster, ck
30d0: 73 75 6d 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20  sum;.  Stmt q;. 
30e0: 20 69 6e 74 20 6e 55 6e 63 6c 3b 0a 20 20 6e 55   int nUncl;.  nU
30f0: 6e 63 6c 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20  ncl = db_int(0, 
3100: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
3110: 20 46 52 4f 4d 20 75 6e 63 6c 75 73 74 65 72 65   FROM unclustere
3120: 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
3130: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 4e         " WHERE N
3140: 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43 54  OT EXISTS(SELECT
3150: 20 31 20 46 52 4f 4d 20 70 68 61 6e 74 6f 6d 22   1 FROM phantom"
3160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 72         " WHERE r
3190: 69 64 3d 75 6e 63 6c 75 73 74 65 72 65 64 2e 72  id=unclustered.r
31a0: 69 64 29 22 29 3b 0a 20 20 69 66 28 20 6e 55 6e  id)");.  if( nUn
31b0: 63 6c 3c 31 30 30 20 29 7b 0a 20 20 20 20 72 65  cl<100 ){.    re
31c0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62  turn;.  }.  blob
31d0: 5f 7a 65 72 6f 28 26 63 6c 75 73 74 65 72 29 3b  _zero(&cluster);
31e0: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
31f0: 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46  , "SELECT uuid F
3200: 52 4f 4d 20 75 6e 63 6c 75 73 74 65 72 65 64 2c  ROM unclustered,
3210: 20 62 6c 6f 62 22 0a 20 20 20 20 20 20 20 20 20   blob".         
3220: 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
3230: 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43  NOT EXISTS(SELEC
3240: 54 20 31 20 46 52 4f 4d 20 70 68 61 6e 74 6f 6d  T 1 FROM phantom
3250: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
3260: 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20     "            
3270: 20 20 20 20 20 20 20 57 48 45 52 45 20 72 69 64         WHERE rid
3280: 21 3d 75 6e 63 6c 75 73 74 65 72 65 64 2e 72 69  !=unclustered.ri
3290: 64 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  d)".            
32a0: 20 20 20 20 20 22 20 20 20 41 4e 44 20 75 6e 63       "   AND unc
32b0: 6c 75 73 74 65 72 65 64 2e 72 69 64 3d 62 6c 6f  lustered.rid=blo
32c0: 62 2e 72 69 64 22 0a 20 20 20 20 20 20 20 20 20  b.rid".         
32d0: 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20          "   AND 
32e0: 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43  NOT EXISTS(SELEC
32f0: 54 20 31 20 46 52 4f 4d 20 73 68 75 6e 20 57 48  T 1 FROM shun WH
3300: 45 52 45 20 75 75 69 64 3d 62 6c 6f 62 2e 75 75  ERE uuid=blob.uu
3310: 69 64 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  id)".           
3320: 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59        " ORDER BY
3330: 20 31 22 29 3b 0a 20 20 77 68 69 6c 65 28 20 64   1");.  while( d
3340: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
3350: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 62 6c  TE_ROW ){.    bl
3360: 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 6c 75 73  ob_appendf(&clus
3370: 74 65 72 2c 20 22 4d 20 25 73 5c 6e 22 2c 20 64  ter, "M %s\n", d
3380: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
3390: 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  , 0));.  }.  db_
33a0: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
33b0: 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26 63 6c 75  md5sum_blob(&clu
33c0: 73 74 65 72 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  ster, &cksum);. 
33d0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63   blob_appendf(&c
33e0: 6c 75 73 74 65 72 2c 20 22 5a 20 25 62 5c 6e 22  luster, "Z %b\n"
33f0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 62 6c 6f  , &cksum);.  blo
3400: 62 5f 72 65 73 65 74 28 26 63 6b 73 75 6d 29 3b  b_reset(&cksum);
3410: 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63  .  db_multi_exec
3420: 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 75 6e  ("DELETE FROM un
3430: 63 6c 75 73 74 65 72 65 64 22 29 3b 0a 20 20 63  clustered");.  c
3440: 6f 6e 74 65 6e 74 5f 70 75 74 28 26 63 6c 75 73  ontent_put(&clus
3450: 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 62 6c  ter, 0, 0);.  bl
3460: 6f 62 5f 72 65 73 65 74 28 26 63 6c 75 73 74 65  ob_reset(&cluste
3470: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e  r);.}../*.** Sen
3480: 64 20 61 6e 20 69 67 6f 74 20 6d 65 73 73 61 67  d an igot messag
3490: 65 20 66 6f 72 20 65 76 65 72 79 20 65 6e 74 72  e for every entr
34a0: 79 20 69 6e 20 75 6e 63 6c 75 73 74 65 72 65 64  y in unclustered
34b0: 20 74 61 62 6c 65 2e 0a 2a 2a 20 52 65 74 75 72   table..** Retur
34c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
34d0: 63 61 72 64 73 20 73 65 6e 74 2e 0a 2a 2f 0a 73  cards sent..*/.s
34e0: 74 61 74 69 63 20 69 6e 74 20 73 65 6e 64 5f 75  tatic int send_u
34f0: 6e 63 6c 75 73 74 65 72 65 64 28 58 66 65 72 20  nclustered(Xfer 
3500: 2a 70 58 66 65 72 29 7b 0a 20 20 53 74 6d 74 20  *pXfer){.  Stmt 
3510: 71 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  q;.  int cnt = 0
3520: 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  ;.  db_prepare(&
3530: 71 2c 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20  q, .    "SELECT 
3540: 75 75 69 64 20 46 52 4f 4d 20 75 6e 63 6c 75 73  uuid FROM unclus
3550: 74 65 72 65 64 20 4a 4f 49 4e 20 62 6c 6f 62 20  tered JOIN blob 
3560: 55 53 49 4e 47 28 72 69 64 29 22 0a 20 20 20 20  USING(rid)".    
3570: 22 20 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53  " WHERE NOT EXIS
3580: 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  TS(SELECT 1 FROM
3590: 20 73 68 75 6e 20 57 48 45 52 45 20 75 75 69 64   shun WHERE uuid
35a0: 3d 62 6c 6f 62 2e 75 75 69 64 29 22 0a 20 20 29  =blob.uuid)".  )
35b0: 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74  ;.  while( db_st
35c0: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
35d0: 4f 57 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  OW ){.    blob_a
35e0: 70 70 65 6e 64 66 28 70 58 66 65 72 2d 3e 70 4f  ppendf(pXfer->pO
35f0: 75 74 2c 20 22 69 67 6f 74 20 25 73 5c 6e 22 2c  ut, "igot %s\n",
3600: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
3610: 26 71 2c 20 30 29 29 3b 0a 20 20 20 20 63 6e 74  &q, 0));.    cnt
3620: 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e  ++;.  }.  db_fin
3630: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 72 65 74  alize(&q);.  ret
3640: 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn cnt;.}../*.*
3650: 2a 20 53 65 6e 64 20 61 6e 20 69 67 6f 74 20 6d  * Send an igot m
3660: 65 73 73 61 67 65 20 66 6f 72 20 65 76 65 72 79  essage for every
3670: 20 61 72 74 69 66 61 63 74 2e 0a 2a 2f 0a 73 74   artifact..*/.st
3680: 61 74 69 63 20 76 6f 69 64 20 73 65 6e 64 5f 61  atic void send_a
3690: 6c 6c 28 58 66 65 72 20 2a 70 58 66 65 72 29 7b  ll(Xfer *pXfer){
36a0: 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 64 62 5f  .  Stmt q;.  db_
36b0: 70 72 65 70 61 72 65 28 26 71 2c 20 0a 20 20 20  prepare(&q, .   
36c0: 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52   "SELECT uuid FR
36d0: 4f 4d 20 62 6c 6f 62 20 22 0a 20 20 20 20 22 20  OM blob ".    " 
36e0: 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53  WHERE NOT EXISTS
36f0: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 73  (SELECT 1 FROM s
3700: 68 75 6e 20 57 48 45 52 45 20 75 75 69 64 3d 62  hun WHERE uuid=b
3710: 6c 6f 62 2e 75 75 69 64 29 22 0a 20 20 29 3b 0a  lob.uuid)".  );.
3720: 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70    while( db_step
3730: 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)==SQLITE_ROW
3740: 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70   ){.    blob_app
3750: 65 6e 64 66 28 70 58 66 65 72 2d 3e 70 4f 75 74  endf(pXfer->pOut
3760: 2c 20 22 69 67 6f 74 20 25 73 5c 6e 22 2c 20 64  , "igot %s\n", d
3770: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
3780: 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  , 0));.  }.  db_
3790: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a  finalize(&q);.}.
37a0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 76  ./*.** If this v
37b0: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 2c 20  ariable is set, 
37c0: 64 69 73 61 62 6c 65 20 6c 6f 67 69 6e 20 63 68  disable login ch
37d0: 65 63 6b 73 2e 20 20 55 73 65 64 20 66 6f 72 20  ecks.  Used for 
37e0: 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 6f 6e 6c  debugging.** onl
37f0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
3800: 20 64 69 73 61 62 6c 65 4c 6f 67 69 6e 20 3d 20   disableLogin = 
3810: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 47  0;../*.** The CG
3820: 49 2f 48 54 54 50 20 70 72 65 70 72 6f 63 65 73  I/HTTP preproces
3830: 73 6f 72 20 61 6c 77 61 79 73 20 72 65 64 69 72  sor always redir
3840: 65 63 74 73 20 72 65 71 75 65 73 74 73 20 77 69  ects requests wi
3850: 74 68 20 61 20 63 6f 6e 74 65 6e 74 2d 74 79 70  th a content-typ
3860: 65 0a 2a 2a 20 6f 66 20 61 70 70 6c 69 63 61 74  e.** of applicat
3870: 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 20 6f 72 20  ion/x-fossil or 
3880: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f  application/x-fo
3890: 73 73 69 6c 2d 64 65 62 75 67 20 74 6f 20 74 68  ssil-debug to th
38a0: 69 73 20 70 61 67 65 2c 0a 2a 2a 20 72 65 67 61  is page,.** rega
38b0: 72 64 6c 65 73 73 20 6f 66 20 77 68 61 74 20 70  rdless of what p
38c0: 61 74 68 20 77 61 73 20 73 70 65 63 69 66 69 65  ath was specifie
38d0: 64 20 69 6e 20 74 68 65 20 48 54 54 50 20 68 65  d in the HTTP he
38e0: 61 64 65 72 2e 20 20 54 68 69 73 20 61 6c 6c 6f  ader.  This allo
38f0: 77 73 0a 2a 2a 20 63 6c 6f 6e 65 20 63 6c 69 65  ws.** clone clie
3900: 6e 74 73 20 74 6f 20 73 70 65 63 69 66 79 20 61  nts to specify a
3910: 20 55 52 4c 20 74 68 61 74 20 6f 6d 69 74 73 20   URL that omits 
3920: 64 65 66 61 75 6c 74 20 70 61 74 68 6e 61 6d 65  default pathname
3930: 73 2c 20 73 75 63 68 0a 2a 2a 20 61 73 20 22 68  s, such.** as "h
3940: 74 74 70 3a 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d  ttp://fossil-scm
3950: 2e 6d 6f 72 67 2f 22 20 69 6e 73 74 65 61 64 20  .morg/" instead 
3960: 6f 66 20 22 68 74 74 70 3a 2f 2f 66 6f 73 73 69  of "http://fossi
3970: 6c 2d 73 63 6d 2e 6f 72 67 2f 69 6e 64 65 78 2e  l-scm.org/index.
3980: 63 67 69 22 2e 0a 2a 2a 0a 2a 2a 20 57 45 42 50  cgi"..**.** WEBP
3990: 41 47 45 3a 20 78 66 65 72 0a 2a 2a 0a 2a 2a 20  AGE: xfer.**.** 
39a0: 54 68 69 73 20 69 73 20 74 68 65 20 74 72 61 6e  This is the tran
39b0: 73 66 65 72 20 68 61 6e 64 6c 65 72 20 6f 6e 20  sfer handler on 
39c0: 74 68 65 20 73 65 72 76 65 72 20 73 69 64 65 2e  the server side.
39d0: 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
39e0: 2a 20 6d 65 73 73 61 67 65 20 68 61 73 20 62 65  * message has be
39f0: 65 6e 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20  en uncompressed 
3a00: 61 6e 64 20 70 6c 61 63 65 64 20 69 6e 20 74 68  and placed in th
3a10: 65 20 67 2e 63 67 69 49 6e 20 62 6c 6f 62 2e 0a  e g.cgiIn blob..
3a20: 2a 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20  ** Process this 
3a30: 6d 65 73 73 61 67 65 20 61 6e 64 20 66 6f 72 6d  message and form
3a40: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
3a50: 72 65 70 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 70  reply..*/.void p
3a60: 61 67 65 5f 78 66 65 72 28 76 6f 69 64 29 7b 0a  age_xfer(void){.
3a70: 20 20 69 6e 74 20 69 73 50 75 6c 6c 20 3d 20 30    int isPull = 0
3a80: 3b 0a 20 20 69 6e 74 20 69 73 50 75 73 68 20 3d  ;.  int isPush =
3a90: 20 30 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   0;.  int nErr =
3aa0: 20 30 3b 0a 20 20 58 66 65 72 20 78 66 65 72 3b   0;.  Xfer xfer;
3ab0: 0a 20 20 69 6e 74 20 64 65 6c 74 61 46 6c 61 67  .  int deltaFlag
3ac0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 43 6c   = 0;.  int isCl
3ad0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  one = 0;.  int n
3ae0: 47 69 6d 6d 65 20 3d 20 30 3b 0a 0a 20 20 6d 65  Gimme = 0;..  me
3af0: 6d 73 65 74 28 26 78 66 65 72 2c 20 30 2c 20 73  mset(&xfer, 0, s
3b00: 69 7a 65 6f 66 28 78 66 65 72 29 29 3b 0a 20 20  izeof(xfer));.  
3b10: 62 6c 6f 62 61 72 72 61 79 5f 7a 65 72 6f 28 78  blobarray_zero(x
3b20: 66 65 72 2e 61 54 6f 6b 65 6e 2c 20 63 6f 75 6e  fer.aToken, coun
3b30: 74 28 78 66 65 72 2e 61 54 6f 6b 65 6e 29 29 3b  t(xfer.aToken));
3b40: 0a 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65  .  cgi_set_conte
3b50: 6e 74 5f 74 79 70 65 28 67 2e 7a 43 6f 6e 74 65  nt_type(g.zConte
3b60: 6e 74 54 79 70 65 29 3b 0a 20 20 62 6c 6f 62 5f  ntType);.  blob_
3b70: 7a 65 72 6f 28 26 78 66 65 72 2e 65 72 72 29 3b  zero(&xfer.err);
3b80: 0a 20 20 78 66 65 72 2e 70 49 6e 20 3d 20 26 67  .  xfer.pIn = &g
3b90: 2e 63 67 69 49 6e 3b 0a 20 20 78 66 65 72 2e 70  .cgiIn;.  xfer.p
3ba0: 4f 75 74 20 3d 20 63 67 69 5f 6f 75 74 70 75 74  Out = cgi_output
3bb0: 5f 62 6c 6f 62 28 29 3b 0a 20 20 78 66 65 72 2e  _blob();.  xfer.
3bc0: 6d 78 53 65 6e 64 20 3d 20 64 62 5f 67 65 74 5f  mxSend = db_get_
3bd0: 69 6e 74 28 22 6d 61 78 2d 64 6f 77 6e 6c 6f 61  int("max-downloa
3be0: 64 22 2c 20 35 30 30 30 30 30 30 29 3b 0a 0a 20  d", 5000000);.. 
3bf0: 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61   db_begin_transa
3c00: 63 74 69 6f 6e 28 29 3b 0a 20 20 64 62 5f 6d 75  ction();.  db_mu
3c10: 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 22  lti_exec(.     "
3c20: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
3c30: 45 20 6f 6e 72 65 6d 6f 74 65 28 72 69 64 20 49  E onremote(rid I
3c40: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
3c50: 45 59 29 3b 22 0a 20 20 29 3b 0a 20 20 77 68 69  EY);".  );.  whi
3c60: 6c 65 28 20 62 6c 6f 62 5f 6c 69 6e 65 28 78 66  le( blob_line(xf
3c70: 65 72 2e 70 49 6e 2c 20 26 78 66 65 72 2e 6c 69  er.pIn, &xfer.li
3c80: 6e 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 62  ne) ){.    if( b
3c90: 6c 6f 62 5f 62 75 66 66 65 72 28 26 78 66 65 72  lob_buffer(&xfer
3ca0: 2e 6c 69 6e 65 29 5b 30 5d 3d 3d 27 23 27 20 29  .line)[0]=='#' )
3cb0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 78   continue;.    x
3cc0: 66 65 72 2e 6e 54 6f 6b 65 6e 20 3d 20 62 6c 6f  fer.nToken = blo
3cd0: 62 5f 74 6f 6b 65 6e 69 7a 65 28 26 78 66 65 72  b_tokenize(&xfer
3ce0: 2e 6c 69 6e 65 2c 20 78 66 65 72 2e 61 54 6f 6b  .line, xfer.aTok
3cf0: 65 6e 2c 20 63 6f 75 6e 74 28 78 66 65 72 2e 61  en, count(xfer.a
3d00: 54 6f 6b 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a  Token));..    /*
3d10: 20 20 20 66 69 6c 65 20 55 55 49 44 20 53 49 5a     file UUID SIZ
3d20: 45 20 5c 6e 20 43 4f 4e 54 45 4e 54 0a 20 20 20  E \n CONTENT.   
3d30: 20 2a 2a 20 20 20 66 69 6c 65 20 55 55 49 44 20   **   file UUID 
3d40: 44 45 4c 54 41 53 52 43 20 53 49 5a 45 20 5c 6e  DELTASRC SIZE \n
3d50: 20 43 4f 4e 54 45 4e 54 0a 20 20 20 20 2a 2a 0a   CONTENT.    **.
3d60: 20 20 20 20 2a 2a 20 41 63 63 65 70 74 20 61 20      ** Accept a 
3d70: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 63 6c  file from the cl
3d80: 69 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ient..    */.   
3d90: 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 66   if( blob_eq(&xf
3da0: 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 66  er.aToken[0], "f
3db0: 69 6c 65 22 29 20 29 7b 0a 20 20 20 20 20 20 69  ile") ){.      i
3dc0: 66 28 20 21 69 73 50 75 73 68 20 29 7b 0a 20 20  f( !isPush ){.  
3dd0: 20 20 20 20 20 20 63 67 69 5f 72 65 73 65 74 5f        cgi_reset_
3de0: 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 20 20 20  content();.     
3df0: 20 20 20 40 20 65 72 72 6f 72 20 6e 6f 74 5c 73     @ error not\s
3e00: 61 75 74 68 6f 72 69 7a 65 64 5c 73 74 6f 5c 73  authorized\sto\s
3e10: 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 6e 45  write.        nE
3e20: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  rr++;.        br
3e30: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3e40: 20 20 20 78 66 65 72 5f 61 63 63 65 70 74 5f 66     xfer_accept_f
3e50: 69 6c 65 28 26 78 66 65 72 29 3b 0a 20 20 20 20  ile(&xfer);.    
3e60: 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65 28    if( blob_size(
3e70: 26 78 66 65 72 2e 65 72 72 29 20 29 7b 0a 20 20  &xfer.err) ){.  
3e80: 20 20 20 20 20 20 63 67 69 5f 72 65 73 65 74 5f        cgi_reset_
3e90: 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 20 20 20  content();.     
3ea0: 20 20 20 40 20 65 72 72 6f 72 20 25 54 28 62 6c     @ error %T(bl
3eb0: 6f 62 5f 73 74 72 28 26 78 66 65 72 2e 65 72 72  ob_str(&xfer.err
3ec0: 29 29 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  )).        nErr+
3ed0: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
3ee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
3ef0: 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 20 20 67 69  lse..    /*   gi
3f00: 6d 6d 65 20 55 55 49 44 0a 20 20 20 20 2a 2a 0a  mme UUID.    **.
3f10: 20 20 20 20 2a 2a 20 43 6c 69 65 6e 74 20 69 73      ** Client is
3f20: 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 66 69   requesting a fi
3f30: 6c 65 2e 20 20 53 65 6e 64 20 69 74 2e 0a 20 20  le.  Send it..  
3f40: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 6c 6f    */.    if( blo
3f50: 62 5f 65 71 28 26 78 66 65 72 2e 61 54 6f 6b 65  b_eq(&xfer.aToke
3f60: 6e 5b 30 5d 2c 20 22 67 69 6d 6d 65 22 29 0a 20  n[0], "gimme"). 
3f70: 20 20 20 20 26 26 20 78 66 65 72 2e 6e 54 6f 6b      && xfer.nTok
3f80: 65 6e 3d 3d 32 0a 20 20 20 20 20 26 26 20 62 6c  en==2.     && bl
3f90: 6f 62 5f 69 73 5f 75 75 69 64 28 26 78 66 65 72  ob_is_uuid(&xfer
3fa0: 2e 61 54 6f 6b 65 6e 5b 31 5d 29 0a 20 20 20 20  .aToken[1]).    
3fb0: 29 7b 0a 20 20 20 20 20 20 6e 47 69 6d 6d 65 2b  ){.      nGimme+
3fc0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 50  +;.      if( isP
3fd0: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ull ){.        i
3fe0: 6e 74 20 72 69 64 20 3d 20 72 69 64 5f 66 72 6f  nt rid = rid_fro
3ff0: 6d 5f 75 75 69 64 28 26 78 66 65 72 2e 61 54 6f  m_uuid(&xfer.aTo
4000: 6b 65 6e 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  ken[1], 0);.    
4010: 20 20 20 20 69 66 28 20 72 69 64 20 29 7b 0a 20      if( rid ){. 
4020: 20 20 20 20 20 20 20 20 20 73 65 6e 64 5f 66 69           send_fi
4030: 6c 65 28 26 78 66 65 72 2c 20 72 69 64 2c 20 26  le(&xfer, rid, &
4040: 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 2c 20  xfer.aToken[1], 
4050: 64 65 6c 74 61 46 6c 61 67 29 3b 0a 20 20 20 20  deltaFlag);.    
4060: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4070: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
4080: 20 20 69 67 6f 74 20 55 55 49 44 0a 20 20 20 20    igot UUID.    
4090: 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 69 65 6e 74  **.    ** Client
40a0: 20 61 6e 6e 6f 75 6e 63 65 73 20 74 68 61 74 20   announces that 
40b0: 69 74 20 68 61 73 20 61 20 70 61 72 74 69 63 75  it has a particu
40c0: 6c 61 72 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  lar file..    */
40d0: 0a 20 20 20 20 69 66 28 20 78 66 65 72 2e 6e 54  .    if( xfer.nT
40e0: 6f 6b 65 6e 3d 3d 32 0a 20 20 20 20 20 26 26 20  oken==2.     && 
40f0: 62 6c 6f 62 5f 65 71 28 26 78 66 65 72 2e 61 54  blob_eq(&xfer.aT
4100: 6f 6b 65 6e 5b 30 5d 2c 20 22 69 67 6f 74 22 29  oken[0], "igot")
4110: 0a 20 20 20 20 20 26 26 20 62 6c 6f 62 5f 69 73  .     && blob_is
4120: 5f 75 75 69 64 28 26 78 66 65 72 2e 61 54 6f 6b  _uuid(&xfer.aTok
4130: 65 6e 5b 31 5d 29 0a 20 20 20 20 29 7b 0a 20 20  en[1]).    ){.  
4140: 20 20 20 20 69 66 28 20 69 73 50 75 73 68 20 29      if( isPush )
4150: 7b 0a 20 20 20 20 20 20 20 20 72 69 64 5f 66 72  {.        rid_fr
4160: 6f 6d 5f 75 75 69 64 28 26 78 66 65 72 2e 61 54  om_uuid(&xfer.aT
4170: 6f 6b 65 6e 5b 31 5d 2c 20 31 29 3b 0a 20 20 20  oken[1], 1);.   
4180: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 20     }.    }else. 
4190: 20 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 20 20   .    .    /*   
41a0: 20 70 75 6c 6c 20 20 53 45 52 56 45 52 43 4f 44   pull  SERVERCOD
41b0: 45 20 20 50 52 4f 4a 45 43 54 43 4f 44 45 0a 20  E  PROJECTCODE. 
41c0: 20 20 20 2a 2a 20 20 20 20 70 75 73 68 20 20 53     **    push  S
41d0: 45 52 56 45 52 43 4f 44 45 20 20 50 52 4f 4a 45  ERVERCODE  PROJE
41e0: 43 54 43 4f 44 45 0a 20 20 20 20 2a 2a 0a 20 20  CTCODE.    **.  
41f0: 20 20 2a 2a 20 54 68 65 20 63 6c 69 65 6e 74 20    ** The client 
4200: 77 61 6e 74 73 20 65 69 74 68 65 72 20 73 65 6e  wants either sen
4210: 64 20 6f 72 20 72 65 63 65 69 76 65 2e 20 20 54  d or receive.  T
4220: 68 65 20 73 65 72 76 65 72 20 73 68 6f 75 6c 64  he server should
4230: 0a 20 20 20 20 2a 2a 20 76 65 72 69 66 79 20 74  .    ** verify t
4240: 68 61 74 20 74 68 65 20 70 72 6f 6a 65 63 74 20  hat the project 
4250: 63 6f 64 65 20 6d 61 74 63 68 65 73 20 61 6e 64  code matches and
4260: 20 74 68 61 74 20 74 68 65 20 73 65 72 76 65 72   that the server
4270: 20 63 6f 64 65 0a 20 20 20 20 2a 2a 20 64 6f 65   code.    ** doe
4280: 73 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 20 20 20  s not match..   
4290: 20 2a 2f 0a 20 20 20 20 69 66 28 20 78 66 65 72   */.    if( xfer
42a0: 2e 6e 54 6f 6b 65 6e 3d 3d 33 0a 20 20 20 20 20  .nToken==3.     
42b0: 26 26 20 28 62 6c 6f 62 5f 65 71 28 26 78 66 65  && (blob_eq(&xfe
42c0: 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 70 75  r.aToken[0], "pu
42d0: 6c 6c 22 29 20 7c 7c 20 62 6c 6f 62 5f 65 71 28  ll") || blob_eq(
42e0: 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c  &xfer.aToken[0],
42f0: 20 22 70 75 73 68 22 29 29 0a 20 20 20 20 20 26   "push")).     &
4300: 26 20 62 6c 6f 62 5f 69 73 5f 75 75 69 64 28 26  & blob_is_uuid(&
4310: 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 29 0a  xfer.aToken[1]).
4320: 20 20 20 20 20 26 26 20 62 6c 6f 62 5f 69 73 5f       && blob_is_
4330: 75 75 69 64 28 26 78 66 65 72 2e 61 54 6f 6b 65  uuid(&xfer.aToke
4340: 6e 5b 32 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20  n[2]).    ){.   
4350: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
4360: 53 43 6f 64 65 3b 0a 20 20 20 20 20 20 63 6f 6e  SCode;.      con
4370: 73 74 20 63 68 61 72 20 2a 7a 50 43 6f 64 65 3b  st char *zPCode;
4380: 0a 0a 20 20 20 20 20 20 7a 53 43 6f 64 65 20 3d  ..      zSCode =
4390: 20 64 62 5f 67 65 74 28 22 73 65 72 76 65 72 2d   db_get("server-
43a0: 63 6f 64 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  code", 0);.     
43b0: 20 69 66 28 20 7a 53 43 6f 64 65 3d 3d 30 20 29   if( zSCode==0 )
43c0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c  {.        fossil
43d0: 5f 70 61 6e 69 63 28 22 6d 69 73 73 69 6e 67 20  _panic("missing 
43e0: 73 65 72 76 65 72 20 63 6f 64 65 22 29 3b 0a 20  server code");. 
43f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4400: 20 62 6c 6f 62 5f 65 71 5f 73 74 72 28 26 78 66   blob_eq_str(&xf
4410: 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 2c 20 7a 53  er.aToken[1], zS
4420: 43 6f 64 65 2c 20 2d 31 29 20 29 7b 0a 20 20 20  Code, -1) ){.   
4430: 20 20 20 20 20 63 67 69 5f 72 65 73 65 74 5f 63       cgi_reset_c
4440: 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 20 20 20 20  ontent();.      
4450: 20 20 40 20 65 72 72 6f 72 20 73 65 72 76 65 72    @ error server
4460: 5c 73 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 6e  \sloop.        n
4470: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  Err++;.        b
4480: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4490: 20 20 20 20 7a 50 43 6f 64 65 20 3d 20 64 62 5f      zPCode = db_
44a0: 67 65 74 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64  get("project-cod
44b0: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  e", 0);.      if
44c0: 28 20 7a 50 43 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( zPCode==0 ){. 
44d0: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 61         fossil_pa
44e0: 6e 69 63 28 22 6d 69 73 73 69 6e 67 20 70 72 6f  nic("missing pro
44f0: 6a 65 63 74 20 63 6f 64 65 22 29 3b 0a 20 20 20  ject code");.   
4500: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
4510: 62 6c 6f 62 5f 65 71 5f 73 74 72 28 26 78 66 65  blob_eq_str(&xfe
4520: 72 2e 61 54 6f 6b 65 6e 5b 32 5d 2c 20 7a 50 43  r.aToken[2], zPC
4530: 6f 64 65 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  ode, -1) ){.    
4540: 20 20 20 20 63 67 69 5f 72 65 73 65 74 5f 63 6f      cgi_reset_co
4550: 6e 74 65 6e 74 28 29 3b 0a 20 20 20 20 20 20 20  ntent();.       
4560: 20 40 20 65 72 72 6f 72 20 77 72 6f 6e 67 5c 73   @ error wrong\s
4570: 70 72 6f 6a 65 63 74 0a 20 20 20 20 20 20 20 20  project.        
4580: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
4590: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
45a0: 20 20 20 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b       login_check
45b0: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a  _credentials();.
45c0: 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 65        if( blob_e
45d0: 71 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30  q(&xfer.aToken[0
45e0: 5d 2c 20 22 70 75 6c 6c 22 29 20 29 7b 0a 20 20  ], "pull") ){.  
45f0: 20 20 20 20 20 20 69 66 28 20 21 67 2e 6f 6b 52        if( !g.okR
4600: 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ead ){.         
4610: 20 63 67 69 5f 72 65 73 65 74 5f 63 6f 6e 74 65   cgi_reset_conte
4620: 6e 74 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nt();.          
4630: 40 20 65 72 72 6f 72 20 6e 6f 74 5c 73 61 75 74  @ error not\saut
4640: 68 6f 72 69 7a 65 64 5c 73 74 6f 5c 73 72 65 61  horized\sto\srea
4650: 64 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72 72  d.          nErr
4660: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
4670: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
4680: 20 20 20 20 20 20 20 69 73 50 75 6c 6c 20 3d 20         isPull = 
4690: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
46a0: 20 20 20 20 20 20 20 20 69 66 28 20 21 67 2e 6f          if( !g.o
46b0: 6b 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  kWrite ){.      
46c0: 20 20 20 20 69 66 28 20 21 69 73 50 75 6c 6c 20      if( !isPull 
46d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
46e0: 67 69 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74  gi_reset_content
46f0: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
4700: 40 20 65 72 72 6f 72 20 6e 6f 74 5c 73 61 75 74  @ error not\saut
4710: 68 6f 72 69 7a 65 64 5c 73 74 6f 5c 73 77 72 69  horized\sto\swri
4720: 74 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  te.            n
4730: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
4740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4750: 20 20 20 20 40 20 6d 65 73 73 61 67 65 20 70 75      @ message pu
4760: 6c 6c 5c 73 6f 6e 6c 79 5c 73 2d 5c 73 6e 6f 74  ll\sonly\s-\snot
4770: 5c 73 61 75 74 68 6f 72 69 7a 65 64 5c 73 74 6f  \sauthorized\sto
4780: 5c 73 70 75 73 68 0a 20 20 20 20 20 20 20 20 20  \spush.         
4790: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
47a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 50 75  {.          isPu
47b0: 73 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  sh = 1;.        
47c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
47d0: 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 20 20 20 63  lse..    /*    c
47e0: 6c 6f 6e 65 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lone.    **.    
47f0: 2a 2a 20 54 68 65 20 63 6c 69 65 6e 74 20 6b 6e  ** The client kn
4800: 6f 77 73 20 6e 6f 74 68 69 6e 67 2e 20 20 54 65  ows nothing.  Te
4810: 6c 6c 20 61 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ll all..    */. 
4820: 20 20 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26     if( blob_eq(&
4830: 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20  xfer.aToken[0], 
4840: 22 63 6c 6f 6e 65 22 29 20 29 7b 0a 20 20 20 20  "clone") ){.    
4850: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72    login_check_cr
4860: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 20  edentials();.   
4870: 20 20 20 69 66 28 20 21 67 2e 6f 6b 43 6c 6f 6e     if( !g.okClon
4880: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 67 69  e ){.        cgi
4890: 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29  _reset_content()
48a0: 3b 0a 20 20 20 20 20 20 20 20 40 20 65 72 72 6f  ;.        @ erro
48b0: 72 20 6e 6f 74 5c 73 61 75 74 68 6f 72 69 7a 65  r not\sauthorize
48c0: 64 5c 73 74 6f 5c 73 63 6c 6f 6e 65 0a 20 20 20  d\sto\sclone.   
48d0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
48e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
48f0: 20 20 7d 0a 20 20 20 20 20 20 69 73 43 6c 6f 6e    }.      isClon
4900: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 73 50  e = 1;.      isP
4910: 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 64  ull = 1;.      d
4920: 65 6c 74 61 46 6c 61 67 20 3d 20 31 3b 0a 20 20  eltaFlag = 1;.  
4930: 20 20 20 20 40 20 70 75 73 68 20 25 73 28 64 62      @ push %s(db
4940: 5f 67 65 74 28 22 73 65 72 76 65 72 2d 63 6f 64  _get("server-cod
4950: 65 22 2c 20 22 78 22 29 29 20 25 73 28 64 62 5f  e", "x")) %s(db_
4960: 67 65 74 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64  get("project-cod
4970: 65 22 2c 20 22 78 22 29 29 0a 20 20 20 20 7d 65  e", "x")).    }e
4980: 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 20 20 20 6c  lse..    /*    l
4990: 6f 67 69 6e 20 20 55 53 45 52 20 20 4e 4f 4e 43  ogin  USER  NONC
49a0: 45 20 20 53 49 47 4e 41 54 55 52 45 0a 20 20 20  E  SIGNATURE.   
49b0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
49c0: 20 66 6f 72 20 61 20 76 61 6c 69 64 20 6c 6f 67   for a valid log
49d0: 69 6e 2e 20 20 54 68 69 73 20 68 61 73 20 74 6f  in.  This has to
49e0: 20 68 61 70 70 65 6e 20 62 65 66 6f 72 65 20 61   happen before a
49f0: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 0a 20 20  nything else..  
4a00: 20 20 2a 2a 20 54 68 65 20 63 6c 69 65 6e 74 20    ** The client 
4a10: 63 61 6e 20 73 65 6e 64 20 6d 75 6c 74 69 70 6c  can send multipl
4a20: 65 20 6c 6f 67 69 6e 73 2e 20 20 50 65 72 6d 69  e logins.  Permi
4a30: 73 73 69 6f 6e 73 20 61 72 65 20 63 75 6d 75 6c  ssions are cumul
4a40: 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
4a50: 20 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 78    if( blob_eq(&x
4a60: 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22  fer.aToken[0], "
4a70: 6c 6f 67 69 6e 22 29 0a 20 20 20 20 20 26 26 20  login").     && 
4a80: 78 66 65 72 2e 6e 54 6f 6b 65 6e 3d 3d 34 0a 20  xfer.nToken==4. 
4a90: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
4aa0: 64 69 73 61 62 6c 65 4c 6f 67 69 6e 20 29 7b 0a  disableLogin ){.
4ab0: 20 20 20 20 20 20 20 20 67 2e 6f 6b 52 65 61 64          g.okRead
4ac0: 20 3d 20 67 2e 6f 6b 57 72 69 74 65 20 3d 20 31   = g.okWrite = 1
4ad0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4ae0: 28 20 63 68 65 63 6b 5f 74 61 69 6c 5f 68 61 73  ( check_tail_has
4af0: 68 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 32  h(&xfer.aToken[2
4b00: 5d 2c 20 78 66 65 72 2e 70 49 6e 29 20 29 7b 0a  ], xfer.pIn) ){.
4b10: 20 20 20 20 20 20 20 20 63 68 65 63 6b 5f 6c 6f          check_lo
4b20: 67 69 6e 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e  gin(&xfer.aToken
4b30: 5b 31 5d 2c 20 26 78 66 65 72 2e 61 54 6f 6b 65  [1], &xfer.aToke
4b40: 6e 5b 32 5d 2c 20 26 78 66 65 72 2e 61 54 6f 6b  n[2], &xfer.aTok
4b50: 65 6e 5b 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  en[3]);.      }.
4b60: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 0a 20      }else.    . 
4b70: 20 20 20 2f 2a 20 20 20 20 72 65 71 63 6f 6e 66     /*    reqconf
4b80: 69 67 20 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 0a  ig  NAME.    **.
4b90: 20 20 20 20 2a 2a 20 52 65 71 75 65 73 74 20 61      ** Request a
4ba0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76   configuration v
4bb0: 61 6c 75 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  alue.    */.    
4bc0: 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 66 65  if( blob_eq(&xfe
4bd0: 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 72 65  r.aToken[0], "re
4be0: 71 63 6f 6e 66 69 67 22 29 0a 20 20 20 20 20 26  qconfig").     &
4bf0: 26 20 78 66 65 72 2e 6e 54 6f 6b 65 6e 3d 3d 32  & xfer.nToken==2
4c00: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
4c10: 28 20 67 2e 6f 6b 52 65 61 64 20 29 7b 0a 20 20  ( g.okRead ){.  
4c20: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
4c30: 65 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26 78 66  e = blob_str(&xf
4c40: 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 29 3b 0a 20  er.aToken[1]);. 
4c50: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 66 69         if( confi
4c60: 67 75 72 65 5f 69 73 5f 65 78 70 6f 72 74 61 62  gure_is_exportab
4c70: 6c 65 28 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  le(zName) ){.   
4c80: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
4c90: 5b 30 5d 21 3d 27 40 27 20 29 7b 0a 20 20 20 20  [0]!='@' ){.    
4ca0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56          char *zV
4cb0: 61 6c 75 65 20 3d 20 64 62 5f 67 65 74 28 7a 4e  alue = db_get(zN
4cc0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
4cd0: 20 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20       if( zValue 
4ce0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
4cf0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 78 66   blob_appendf(xf
4d00: 65 72 2e 70 4f 75 74 2c 20 22 63 6f 6e 66 69 67  er.pOut, "config
4d10: 20 25 73 20 25 64 5c 6e 25 73 5c 6e 22 2c 20 7a   %s %d\n%s\n", z
4d20: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Name, .         
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 20 20 73 74 72 6c 65 6e 28 7a 56 61 6c 75 65 29    strlen(zValue)
4d50: 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , zValue);.     
4d60: 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 56           free(zV
4d70: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20  alue);.         
4d80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
4d90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4da0: 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a    Blob content;.
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62              blob
4dc0: 5f 7a 65 72 6f 28 26 63 6f 6e 74 65 6e 74 29 3b  _zero(&content);
4dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
4de0: 66 69 67 75 72 65 5f 72 65 6e 64 65 72 5f 73 70  figure_render_sp
4df0: 65 63 69 61 6c 5f 6e 61 6d 65 28 7a 4e 61 6d 65  ecial_name(zName
4e00: 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  , &content);.   
4e10: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70           blob_ap
4e20: 70 65 6e 64 66 28 78 66 65 72 2e 70 4f 75 74 2c  pendf(xfer.pOut,
4e30: 20 22 63 6f 6e 66 69 67 20 25 73 20 25 64 5c 6e   "config %s %d\n
4e40: 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 0a 20 20  %s\n", zName,.  
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
4e60: 62 5f 73 69 7a 65 28 26 63 6f 6e 74 65 6e 74 29  b_size(&content)
4e70: 2c 20 62 6c 6f 62 5f 73 74 72 28 26 63 6f 6e 74  , blob_str(&cont
4e80: 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ent));.         
4e90: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63     blob_reset(&c
4ea0: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
4eb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
4ec0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
4ed0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 20 20 20  .    .    /*    
4ee0: 63 6f 6f 6b 69 65 20 54 45 58 54 0a 20 20 20 20  cookie TEXT.    
4ef0: 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 63 6f 6f 6b  **.    ** A cook
4f00: 69 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 61 72  ie contains a ar
4f10: 62 69 74 72 61 72 79 2d 6c 65 6e 67 74 68 20 61  bitrary-length a
4f20: 72 67 75 6d 65 6e 74 20 74 68 61 74 20 69 73 20  rgument that is 
4f30: 73 65 72 76 65 72 2d 64 65 66 69 6e 65 64 2e 0a  server-defined..
4f40: 20 20 20 20 2a 2a 20 54 68 65 20 61 72 67 75 6d      ** The argum
4f50: 65 6e 74 20 6d 75 73 74 20 62 65 20 65 6e 63 6f  ent must be enco
4f60: 64 65 64 20 73 6f 20 61 73 20 6e 6f 74 20 74 6f  ded so as not to
4f70: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 77 68 69   contain any whi
4f80: 74 65 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  tespace..    ** 
4f90: 54 68 65 20 73 65 72 76 65 72 20 63 61 6e 20 6f  The server can o
4fa0: 70 74 69 6f 6e 61 6c 6c 79 20 73 65 6e 64 20 61  ptionally send a
4fb0: 20 63 6f 6f 6b 69 65 20 74 6f 20 74 68 65 20 63   cookie to the c
4fc0: 6c 69 65 6e 74 2e 20 20 54 68 65 20 63 6c 69 65  lient.  The clie
4fd0: 6e 74 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  nt.    ** might 
4fe0: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
4ff0: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 62 61 63 6b  same cookie back
5000: 20 74 6f 20 74 68 65 20 73 65 72 76 65 72 20 6f   to the server o
5010: 6e 20 69 74 73 20 6e 65 78 74 0a 20 20 20 20 2a  n its next.    *
5020: 2a 20 63 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 2e  * communication.
5030: 20 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 69 67    The cookie mig
5040: 68 74 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d  ht record inform
5050: 61 74 69 6f 6e 20 74 68 61 74 20 68 65 6c 70 73  ation that helps
5060: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 65 72 76  .    ** the serv
5070: 65 72 20 6f 70 74 69 6d 69 7a 65 20 61 20 70 75  er optimize a pu
5080: 73 68 20 6f 72 20 70 75 6c 6c 2e 0a 20 20 20 20  sh or pull..    
5090: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 6c  **.    ** The cl
50a0: 69 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 71 75  ient is not requ
50b0: 69 72 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61  ired to return a
50c0: 20 63 6f 6f 6b 69 65 2e 20 20 53 6f 20 74 68 65   cookie.  So the
50d0: 20 73 65 72 76 65 72 0a 20 20 20 20 2a 2a 20 6d   server.    ** m
50e0: 75 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f  ust not depend o
50f0: 6e 20 74 68 65 20 63 6f 6f 6b 69 65 2e 20 20 54  n the cookie.  T
5100: 68 65 20 63 6f 6f 6b 69 65 20 73 68 6f 75 6c 64  he cookie should
5110: 20 62 65 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   be an optimizat
5120: 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 2e  ion.    ** only.
5130: 20 20 54 68 65 20 63 6c 69 65 6e 74 20 6d 69 67    The client mig
5140: 68 74 20 61 6c 73 6f 20 73 65 6e 64 20 61 20 63  ht also send a c
5150: 6f 6f 6b 69 65 20 74 68 61 74 20 63 61 6d 65 20  ookie that came 
5160: 66 72 6f 6d 20 61 20 64 69 66 66 65 72 65 6e 74  from a different
5170: 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 72 2e 20  .    ** server. 
5180: 20 53 6f 20 74 68 65 20 73 65 72 76 65 72 20 6d   So the server m
5190: 75 73 74 20 62 65 20 70 72 65 70 61 72 65 64 20  ust be prepared 
51a0: 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 69  to distinguish i
51b0: 74 73 20 6f 77 6e 20 63 6f 6f 6b 69 65 0a 20 20  ts own cookie.  
51c0: 20 20 2a 2a 20 66 72 6f 6d 20 63 6f 6f 6b 69 65    ** from cookie
51d0: 73 20 6f 72 69 67 69 6e 61 74 69 6e 67 20 66 72  s originating fr
51e0: 6f 6d 20 6f 74 68 65 72 20 73 65 72 76 65 72 73  om other servers
51f0: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 20 6d 69  .  The client mi
5200: 67 68 74 20 73 65 6e 64 0a 20 20 20 20 2a 2a 20  ght send.    ** 
5210: 62 61 63 6b 20 73 65 76 65 72 61 6c 20 64 69 66  back several dif
5220: 66 65 72 65 6e 74 20 63 6f 6f 6b 69 65 73 20 74  ferent cookies t
5230: 6f 20 74 68 65 20 73 65 72 76 65 72 2e 20 20 54  o the server.  T
5240: 68 65 20 73 65 72 76 65 72 20 73 68 6f 75 6c 64  he server should
5250: 20 62 65 0a 20 20 20 20 2a 2a 20 70 72 65 70 61   be.    ** prepa
5260: 72 65 64 20 74 6f 20 73 69 66 74 20 74 68 72 6f  red to sift thro
5270: 75 67 68 20 74 68 65 20 63 6f 6f 6b 69 65 73 20  ugh the cookies 
5280: 61 6e 64 20 70 69 63 6b 20 74 68 65 20 6f 6e 65  and pick the one
5290: 20 74 68 61 74 20 69 74 20 77 61 6e 74 73 2e 0a   that it wants..
52a0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62      */.    if( b
52b0: 6c 6f 62 5f 65 71 28 26 78 66 65 72 2e 61 54 6f  lob_eq(&xfer.aTo
52c0: 6b 65 6e 5b 30 5d 2c 20 22 63 6f 6f 6b 69 65 22  ken[0], "cookie"
52d0: 29 20 26 26 20 78 66 65 72 2e 6e 54 6f 6b 65 6e  ) && xfer.nToken
52e0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==2 ){.      /* 
52f0: 50 72 6f 63 65 73 73 20 74 68 65 20 63 6f 6f 6b  Process the cook
5300: 69 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  ie */.    }else.
5310: 0a 20 20 20 20 2f 2a 20 55 6e 6b 6e 6f 77 6e 20  .    /* Unknown 
5320: 6d 65 73 73 61 67 65 0a 20 20 20 20 2a 2f 0a 20  message.    */. 
5330: 20 20 20 7b 0a 20 20 20 20 20 20 63 67 69 5f 72     {.      cgi_r
5340: 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 3b 0a  eset_content();.
5350: 20 20 20 20 20 20 40 20 65 72 72 6f 72 20 62 61        @ error ba
5360: 64 5c 73 63 6f 6d 6d 61 6e 64 3a 5c 73 25 46 28  d\scommand:\s%F(
5370: 62 6c 6f 62 5f 73 74 72 28 26 78 66 65 72 2e 6c  blob_str(&xfer.l
5380: 69 6e 65 29 29 0a 20 20 20 20 7d 0a 20 20 20 20  ine)).    }.    
5390: 62 6c 6f 62 61 72 72 61 79 5f 72 65 73 65 74 28  blobarray_reset(
53a0: 78 66 65 72 2e 61 54 6f 6b 65 6e 2c 20 78 66 65  xfer.aToken, xfe
53b0: 72 2e 6e 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20  r.nToken);.  }. 
53c0: 20 69 66 28 20 69 73 50 75 73 68 20 29 7b 0a 20   if( isPush ){. 
53d0: 20 20 20 72 65 71 75 65 73 74 5f 70 68 61 6e 74     request_phant
53e0: 6f 6d 73 28 26 78 66 65 72 2c 20 35 30 30 29 3b  oms(&xfer, 500);
53f0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 43 6c 6f  .  }.  if( isClo
5400: 6e 65 20 26 26 20 6e 47 69 6d 6d 65 3d 3d 30 20  ne && nGimme==0 
5410: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  ){.    /* The in
5420: 69 74 69 61 6c 20 22 63 6c 6f 6e 65 22 20 6d 65  itial "clone" me
5430: 73 73 61 67 65 20 66 72 6f 6d 20 63 6c 69 65 6e  ssage from clien
5440: 74 20 74 6f 20 73 65 72 76 65 72 20 63 6f 6e 74  t to server cont
5450: 61 69 6e 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 22  ains no.    ** "
5460: 67 69 6d 6d 65 22 20 63 61 72 64 73 2e 20 4f 6e  gimme" cards. On
5470: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 20 6d 65   that initial me
5480: 73 73 61 67 65 2c 20 73 65 6e 64 20 74 68 65 20  ssage, send the 
5490: 63 6c 69 65 6e 74 20 61 6e 20 22 69 67 6f 74 22  client an "igot"
54a0: 0a 20 20 20 20 2a 2a 20 63 61 72 64 20 66 6f 72  .    ** card for
54b0: 20 65 76 65 72 79 20 61 72 74 69 66 61 63 74 20   every artifact 
54c0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
54d0: 20 72 65 73 70 6f 73 69 74 6f 72 79 2e 20 20 54   respository.  T
54e0: 68 69 73 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  his will.    ** 
54f0: 63 61 75 73 65 20 74 68 65 20 63 6c 69 65 6e 74  cause the client
5500: 20 74 6f 20 63 72 65 61 74 65 20 70 68 61 6e 74   to create phant
5510: 6f 6d 73 20 66 6f 72 20 61 6c 6c 20 61 72 74 69  oms for all arti
5520: 66 61 63 74 73 2c 20 77 68 69 63 68 20 77 69 6c  facts, which wil
5530: 6c 0a 20 20 20 20 2a 2a 20 69 6e 20 74 75 72 6e  l.    ** in turn
5540: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5550: 74 68 65 20 65 6e 74 69 72 65 20 72 65 70 6f 73  the entire repos
5560: 69 74 6f 72 79 20 69 73 20 73 65 6e 74 20 65 66  itory is sent ef
5570: 66 69 63 69 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  ficiently.    **
5580: 20 61 6e 64 20 65 78 70 65 64 69 74 69 6f 75 73   and expeditious
5590: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ly..    */.    s
55a0: 65 6e 64 5f 61 6c 6c 28 26 78 66 65 72 29 3b 0a  end_all(&xfer);.
55b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 50 75    }else if( isPu
55c0: 6c 6c 20 29 7b 0a 20 20 20 20 63 72 65 61 74 65  ll ){.    create
55d0: 5f 63 6c 75 73 74 65 72 28 29 3b 0a 20 20 20 20  _cluster();.    
55e0: 73 65 6e 64 5f 75 6e 63 6c 75 73 74 65 72 65 64  send_unclustered
55f0: 28 26 78 66 65 72 29 3b 0a 20 20 7d 0a 20 20 64  (&xfer);.  }.  d
5600: 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  b_end_transactio
5610: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n(0);.}../*.** C
5620: 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 78 66 65  OMMAND: test-xfe
5630: 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d  r.**.** This com
5640: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 66 6f 72  mand is used for
5650: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 73   debugging the s
5660: 65 72 76 65 72 2e 20 20 54 68 65 72 65 20 69 73  erver.  There is
5670: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67   a single.** arg
5680: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74  ument which is t
5690: 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20  he uncompressed 
56a0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 22 78  content of an "x
56b0: 66 65 72 22 20 6d 65 73 73 61 67 65 0a 2a 2a 20  fer" message.** 
56c0: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 74 6f 20 73  from client to s
56d0: 65 72 76 65 72 2e 20 20 54 68 69 73 20 63 6f 6d  erver.  This com
56e0: 6d 61 6e 64 20 69 6e 74 65 72 70 72 65 74 73 20  mand interprets 
56f0: 74 68 61 74 20 6d 65 73 73 61 67 65 20 61 73 0a  that message as.
5700: 2a 2a 20 69 66 20 68 61 64 20 62 65 65 6e 20 72  ** if had been r
5710: 65 63 65 69 76 65 64 20 62 79 20 74 68 65 20 73  eceived by the s
5720: 65 72 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  erver..**.** On 
5730: 74 68 65 20 63 6c 69 65 6e 74 20 73 69 64 65 2c  the client side,
5740: 20 72 75 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   run:.**.**     
5750: 20 66 6f 73 73 69 6c 20 70 75 73 68 20 68 74 74   fossil push htt
5760: 70 3a 2f 2f 62 6f 67 75 73 2f 20 2d 2d 68 74 74  p://bogus/ --htt
5770: 70 74 72 61 63 65 0a 2a 2a 0a 2a 2a 20 4f 72 20  ptrace.**.** Or 
5780: 61 20 73 69 6d 69 6c 61 72 20 63 6f 6d 6d 61 6e  a similar comman
5790: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
57a0: 20 6f 75 74 70 75 74 2e 20 20 54 68 65 20 63 6f   output.  The co
57b0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
57c0: 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 61 70 70  message will app
57d0: 65 61 72 20 6f 6e 20 73 74 61 6e 64 61 72 64 20  ear on standard 
57e0: 6f 75 74 70 75 74 2e 20 20 43 61 70 74 75 72 65  output.  Capture
57f0: 20 74 68 69 73 20 6d 65 73 73 61 67 65 0a 2a 2a   this message.**
5800: 20 69 6e 74 6f 20 61 20 66 69 6c 65 20 6e 61 6d   into a file nam
5810: 65 64 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  ed (for example)
5820: 20 6f 75 74 2e 74 78 74 2e 20 20 54 68 65 6e 20   out.txt.  Then 
5830: 72 75 6e 20 74 68 65 0a 2a 2a 20 73 65 72 76 65  run the.** serve
5840: 72 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20  r in gdb:.**.** 
5850: 20 20 20 20 67 64 62 20 66 6f 73 73 69 6c 0a 2a      gdb fossil.*
5860: 2a 20 20 20 20 20 72 20 74 65 73 74 2d 78 66 65  *     r test-xfe
5870: 72 20 6f 75 74 2e 74 78 74 0a 2a 2f 0a 76 6f 69  r out.txt.*/.voi
5880: 64 20 63 6d 64 5f 74 65 73 74 5f 78 66 65 72 28  d cmd_test_xfer(
5890: 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6e 6f 74  void){.  int not
58a0: 55 73 65 64 3b 0a 20 20 69 66 28 20 67 2e 61 72  Used;.  if( g.ar
58b0: 67 63 21 3d 32 20 26 26 20 67 2e 61 72 67 63 21  gc!=2 && g.argc!
58c0: 3d 33 20 29 7b 0a 20 20 20 20 75 73 61 67 65 28  =3 ){.    usage(
58d0: 22 3f 4d 45 53 53 41 47 45 46 49 4c 45 3f 22 29  "?MESSAGEFILE?")
58e0: 3b 0a 20 20 7d 0a 20 20 64 62 5f 6d 75 73 74 5f  ;.  }.  db_must_
58f0: 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 29  be_within_tree()
5900: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 67  ;.  blob_zero(&g
5910: 2e 63 67 69 49 6e 29 3b 0a 20 20 62 6c 6f 62 5f  .cgiIn);.  blob_
5920: 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26  read_from_file(&
5930: 67 2e 63 67 69 49 6e 2c 20 67 2e 61 72 67 63 3d  g.cgiIn, g.argc=
5940: 3d 32 20 3f 20 22 2d 22 20 3a 20 67 2e 61 72 67  =2 ? "-" : g.arg
5950: 76 5b 32 5d 29 3b 0a 20 20 64 69 73 61 62 6c 65  v[2]);.  disable
5960: 4c 6f 67 69 6e 20 3d 20 31 3b 0a 20 20 70 61 67  Login = 1;.  pag
5970: 65 5f 78 66 65 72 28 29 3b 0a 20 20 70 72 69 6e  e_xfer();.  prin
5980: 74 66 28 22 25 73 5c 6e 22 2c 20 63 67 69 5f 65  tf("%s\n", cgi_e
5990: 78 74 72 61 63 74 5f 63 6f 6e 74 65 6e 74 28 26  xtract_content(&
59a0: 6e 6f 74 55 73 65 64 29 29 3b 0a 7d 0a 0a 2f 2a  notUsed));.}../*
59b0: 0a 2a 2a 20 46 6f 72 6d 61 74 20 73 74 72 69 6e  .** Format strin
59c0: 67 73 20 66 6f 72 20 70 72 6f 67 72 65 73 73 20  gs for progress 
59d0: 72 65 70 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74  reporting..*/.st
59e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
59f0: 7a 4c 61 62 65 6c 46 6f 72 6d 61 74 5b 5d 20 3d  zLabelFormat[] =
5a00: 20 22 25 2d 31 30 73 20 25 31 30 73 20 25 31 30   "%-10s %10s %10
5a10: 73 20 25 31 30 73 20 25 31 30 73 5c 6e 22 3b 0a  s %10s %10s\n";.
5a20: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5a30: 72 20 7a 56 61 6c 75 65 46 6f 72 6d 61 74 5b 5d  r zValueFormat[]
5a40: 20 3d 20 22 5c 72 25 2d 31 30 73 20 25 31 30 64   = "\r%-10s %10d
5a50: 20 25 31 30 64 20 25 31 30 64 20 25 31 30 64 5c   %10d %10d %10d\
5a60: 6e 22 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  n";.../*.** Sync
5a70: 20 74 6f 20 74 68 65 20 68 6f 73 74 20 69 64 65   to the host ide
5a80: 6e 74 69 66 69 65 64 20 69 6e 20 67 2e 75 72 6c  ntified in g.url
5a90: 4e 61 6d 65 20 61 6e 64 20 67 2e 75 72 6c 50 61  Name and g.urlPa
5aa0: 74 68 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  th.  This.** rou
5ab0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
5ac0: 79 20 74 68 65 20 63 6c 69 65 6e 74 2e 0a 2a 2a  y the client..**
5ad0: 0a 2a 2a 20 52 65 63 6f 72 64 73 20 61 72 65 20  .** Records are 
5ae0: 70 75 73 68 65 64 20 74 6f 20 74 68 65 20 73 65  pushed to the se
5af0: 72 76 65 72 20 69 66 20 70 75 73 68 46 6c 61 67  rver if pushFlag
5b00: 20 69 73 20 74 72 75 65 2e 20 20 52 65 63 6f 72   is true.  Recor
5b10: 64 73 0a 2a 2a 20 61 72 65 20 70 75 6c 6c 65 64  ds.** are pulled
5b20: 20 69 66 20 70 75 6c 6c 46 6c 61 67 20 69 73 20   if pullFlag is 
5b30: 74 72 75 65 2e 20 20 41 20 66 75 6c 6c 20 73 79  true.  A full sy
5b40: 6e 63 20 6f 63 63 75 72 73 20 69 66 20 62 6f 74  nc occurs if bot
5b50: 68 20 61 72 65 0a 2a 2a 20 74 72 75 65 2e 0a 2a  h are.** true..*
5b60: 2f 0a 76 6f 69 64 20 63 6c 69 65 6e 74 5f 73 79  /.void client_sy
5b70: 6e 63 28 69 6e 74 20 70 75 73 68 46 6c 61 67 2c  nc(int pushFlag,
5b80: 20 69 6e 74 20 70 75 6c 6c 46 6c 61 67 2c 20 69   int pullFlag, i
5b90: 6e 74 20 63 6c 6f 6e 65 46 6c 61 67 2c 20 69 6e  nt cloneFlag, in
5ba0: 74 20 63 6f 6e 66 69 67 4d 61 73 6b 29 7b 0a 20  t configMask){. 
5bb0: 20 69 6e 74 20 67 6f 20 3d 20 31 3b 20 20 20 20   int go = 1;    
5bc0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 75 6e 74 69      /* Loop unti
5bd0: 6c 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73  l zero */.  cons
5be0: 74 20 63 68 61 72 20 2a 7a 53 43 6f 64 65 20 3d  t char *zSCode =
5bf0: 20 64 62 5f 67 65 74 28 22 73 65 72 76 65 72 2d   db_get("server-
5c00: 63 6f 64 65 22 2c 20 22 78 22 29 3b 0a 20 20 63  code", "x");.  c
5c10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 43 6f 64  onst char *zPCod
5c20: 65 20 3d 20 64 62 5f 67 65 74 28 22 70 72 6f 6a  e = db_get("proj
5c30: 65 63 74 2d 63 6f 64 65 22 2c 20 30 29 3b 0a 20  ect-code", 0);. 
5c40: 20 69 6e 74 20 6e 43 61 72 64 20 3d 20 30 3b 20   int nCard = 0; 
5c50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5c60: 72 20 6f 66 20 63 61 72 64 73 20 73 65 6e 74 20  r of cards sent 
5c70: 6f 72 20 72 65 63 65 69 76 65 64 20 2a 2f 0a 20  or received */. 
5c80: 20 69 6e 74 20 6e 43 79 63 6c 65 20 3d 20 30 3b   int nCycle = 0;
5c90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5ca0: 72 20 6f 66 20 72 6f 75 6e 64 20 74 72 69 70 73  r of round trips
5cb0: 20 74 6f 20 74 68 65 20 73 65 72 76 65 72 20 2a   to the server *
5cc0: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5ce0: 69 7a 65 20 6f 66 20 61 20 63 6f 6e 66 69 67 20  ize of a config 
5cf0: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  value */.  int n
5d00: 46 69 6c 65 53 65 6e 64 20 3d 20 30 3b 0a 20 20  FileSend = 0;.  
5d10: 69 6e 74 20 6f 72 69 67 43 6f 6e 66 69 67 4d 61  int origConfigMa
5d20: 73 6b 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  sk;     /* Origi
5d30: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 6f 6e  nal value of con
5d40: 66 69 67 4d 61 73 6b 20 2a 2f 0a 20 20 69 6e 74  figMask */.  int
5d50: 20 6e 46 69 6c 65 52 65 63 76 3b 20 20 20 20 20   nFileRecv;     
5d60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5d70: 66 20 66 69 6c 65 73 20 72 65 63 65 69 76 65 64  f files received
5d80: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 68 61 6e   */.  int mxPhan
5d90: 74 6f 6d 52 65 71 20 3d 20 32 30 30 3b 20 2f 2a  tomReq = 200; /*
5da0: 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 70   Max number of p
5db0: 68 61 6e 74 6f 6d 73 20 74 6f 20 72 65 71 75 65  hantoms to reque
5dc0: 73 74 20 70 65 72 20 63 6f 6d 6d 20 2a 2f 0a 20  st per comm */. 
5dd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
5de0: 6f 6b 69 65 3b 20 20 20 20 2f 2a 20 53 65 72 76  okie;    /* Serv
5df0: 65 72 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 42  er cookie */.  B
5e00: 6c 6f 62 20 73 65 6e 64 3b 20 20 20 20 20 20 20  lob send;       
5e10: 20 2f 2a 20 54 65 78 74 20 77 65 20 61 72 65 20   /* Text we are 
5e20: 73 65 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  sending to the s
5e30: 65 72 76 65 72 20 2a 2f 0a 20 20 42 6c 6f 62 20  erver */.  Blob 
5e40: 72 65 63 76 3b 20 20 20 20 20 20 20 20 2f 2a 20  recv;        /* 
5e50: 52 65 70 6c 79 20 77 65 20 67 6f 74 20 62 61 63  Reply we got bac
5e60: 6b 20 66 72 6f 6d 20 74 68 65 20 73 65 72 76 65  k from the serve
5e70: 72 20 2a 2f 0a 20 20 58 66 65 72 20 78 66 65 72  r */.  Xfer xfer
5e80: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e  ;        /* Tran
5e90: 73 66 65 72 20 64 61 74 61 20 2a 2f 0a 0a 20 20  sfer data */..  
5ea0: 6d 65 6d 73 65 74 28 26 78 66 65 72 2c 20 30 2c  memset(&xfer, 0,
5eb0: 20 73 69 7a 65 6f 66 28 78 66 65 72 29 29 3b 0a   sizeof(xfer));.
5ec0: 20 20 78 66 65 72 2e 70 49 6e 20 3d 20 26 72 65    xfer.pIn = &re
5ed0: 63 76 3b 0a 20 20 78 66 65 72 2e 70 4f 75 74 20  cv;.  xfer.pOut 
5ee0: 3d 20 26 73 65 6e 64 3b 0a 20 20 78 66 65 72 2e  = &send;.  xfer.
5ef0: 6d 78 53 65 6e 64 20 3d 20 64 62 5f 67 65 74 5f  mxSend = db_get_
5f00: 69 6e 74 28 22 6d 61 78 2d 75 70 6c 6f 61 64 22  int("max-upload"
5f10: 2c 20 32 35 30 30 30 30 29 3b 0a 0a 20 20 61 73  , 250000);..  as
5f20: 73 65 72 74 28 20 70 75 73 68 46 6c 61 67 20 7c  sert( pushFlag |
5f30: 7c 20 70 75 6c 6c 46 6c 61 67 20 7c 7c 20 63 6c  | pullFlag || cl
5f40: 6f 6e 65 46 6c 61 67 20 7c 7c 20 63 6f 6e 66 69  oneFlag || confi
5f50: 67 4d 61 73 6b 20 29 3b 0a 20 20 61 73 73 65 72  gMask );.  asser
5f60: 74 28 20 21 67 2e 75 72 6c 49 73 46 69 6c 65 20  t( !g.urlIsFile 
5f70: 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  );          /* T
5f80: 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  his only works f
5f90: 6f 72 20 6e 65 74 77 6f 72 6b 69 6e 67 20 2a 2f  or networking */
5fa0: 0a 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61  ..  db_begin_tra
5fb0: 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 64 62  nsaction();.  db
5fc0: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20  _multi_exec(.   
5fd0: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
5fe0: 42 4c 45 20 6f 6e 72 65 6d 6f 74 65 28 72 69 64  BLE onremote(rid
5ff0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
6000: 20 4b 45 59 29 3b 22 0a 20 20 29 3b 0a 20 20 62   KEY);".  );.  b
6010: 6c 6f 62 61 72 72 61 79 5f 7a 65 72 6f 28 78 66  lobarray_zero(xf
6020: 65 72 2e 61 54 6f 6b 65 6e 2c 20 63 6f 75 6e 74  er.aToken, count
6030: 28 78 66 65 72 2e 61 54 6f 6b 65 6e 29 29 3b 0a  (xfer.aToken));.
6040: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 65 6e    blob_zero(&sen
6050: 64 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  d);.  blob_zero(
6060: 26 72 65 63 76 29 3b 0a 20 20 62 6c 6f 62 5f 7a  &recv);.  blob_z
6070: 65 72 6f 28 26 78 66 65 72 2e 65 72 72 29 3b 0a  ero(&xfer.err);.
6080: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 78 66 65    blob_zero(&xfe
6090: 72 2e 6c 69 6e 65 29 3b 0a 20 20 6f 72 69 67 43  r.line);.  origC
60a0: 6f 6e 66 69 67 4d 61 73 6b 20 3d 20 63 6f 6e 66  onfigMask = conf
60b0: 69 67 4d 61 73 6b 3b 0a 0a 20 20 2f 2a 0a 20 20  igMask;..  /*.  
60c0: 2a 2a 20 41 6c 77 61 79 73 20 62 65 67 69 6e 20  ** Always begin 
60d0: 77 69 74 68 20 61 20 63 6c 6f 6e 65 2c 20 70 75  with a clone, pu
60e0: 6c 6c 2c 20 6f 72 20 70 75 73 68 20 6d 65 73 73  ll, or push mess
60f0: 61 67 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  age.  */.  if( c
6100: 6c 6f 6e 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  loneFlag ){.    
6110: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 65  blob_appendf(&se
6120: 6e 64 2c 20 22 63 6c 6f 6e 65 5c 6e 22 29 3b 0a  nd, "clone\n");.
6130: 20 20 20 20 70 75 73 68 46 6c 61 67 20 3d 20 30      pushFlag = 0
6140: 3b 0a 20 20 20 20 70 75 6c 6c 46 6c 61 67 20 3d  ;.    pullFlag =
6150: 20 30 3b 0a 20 20 20 20 6e 43 61 72 64 2b 2b 3b   0;.    nCard++;
6160: 0a 20 20 20 20 2f 2a 20 54 42 44 3a 20 52 65 71  .    /* TBD: Req
6170: 75 65 73 74 20 61 6c 6c 20 74 72 61 6e 73 66 65  uest all transfe
6180: 72 61 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74  rable configurat
6190: 69 6f 6e 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ion values */.  
61a0: 7d 65 6c 73 65 20 69 66 28 20 70 75 6c 6c 46 6c  }else if( pullFl
61b0: 61 67 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  ag ){.    blob_a
61c0: 70 70 65 6e 64 66 28 26 73 65 6e 64 2c 20 22 70  ppendf(&send, "p
61d0: 75 6c 6c 20 25 73 20 25 73 5c 6e 22 2c 20 7a 53  ull %s %s\n", zS
61e0: 43 6f 64 65 2c 20 7a 50 43 6f 64 65 29 3b 0a 20  Code, zPCode);. 
61f0: 20 20 20 6e 43 61 72 64 2b 2b 3b 0a 20 20 7d 0a     nCard++;.  }.
6200: 20 20 69 66 28 20 70 75 73 68 46 6c 61 67 20 29    if( pushFlag )
6210: 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  {.    blob_appen
6220: 64 66 28 26 73 65 6e 64 2c 20 22 70 75 73 68 20  df(&send, "push 
6230: 25 73 20 25 73 5c 6e 22 2c 20 7a 53 43 6f 64 65  %s %s\n", zSCode
6240: 2c 20 7a 50 43 6f 64 65 29 3b 0a 20 20 20 20 6e  , zPCode);.    n
6250: 43 61 72 64 2b 2b 3b 0a 20 20 7d 0a 20 20 70 72  Card++;.  }.  pr
6260: 69 6e 74 66 28 7a 4c 61 62 65 6c 46 6f 72 6d 61  intf(zLabelForma
6270: 74 2c 20 22 22 2c 20 22 42 79 74 65 73 22 2c 20  t, "", "Bytes", 
6280: 22 43 61 72 64 73 22 2c 20 22 41 72 74 69 66 61  "Cards", "Artifa
6290: 63 74 73 22 2c 20 22 44 65 6c 74 61 73 22 29 3b  cts", "Deltas");
62a0: 0a 0a 20 20 77 68 69 6c 65 28 20 67 6f 20 29 7b  ..  while( go ){
62b0: 0a 20 20 20 20 69 6e 74 20 6e 65 77 50 68 61 6e  .    int newPhan
62c0: 74 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  tom = 0;.    cha
62d0: 72 20 2a 7a 52 61 6e 64 6f 6d 6e 65 73 73 3b 0a  r *zRandomness;.
62e0: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 6d 61 6b  .    /* Send mak
62f0: 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  e the most recen
6300: 74 6c 79 20 72 65 63 65 69 76 65 64 20 63 6f 6f  tly received coo
6310: 6b 69 65 2e 20 20 4c 65 74 20 74 68 65 20 73 65  kie.  Let the se
6320: 72 76 65 72 0a 20 20 20 20 2a 2a 20 66 69 67 75  rver.    ** figu
6330: 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 69  re out if this i
6340: 73 20 61 20 63 6f 6f 6b 69 65 20 74 68 61 74 20  s a cookie that 
6350: 69 74 20 63 61 72 65 73 20 61 62 6f 75 74 2e 0a  it cares about..
6360: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 43 6f 6f 6b      */.    zCook
6370: 69 65 20 3d 20 64 62 5f 67 65 74 28 22 63 6f 6f  ie = db_get("coo
6380: 6b 69 65 22 2c 20 30 29 3b 0a 20 20 20 20 69 66  kie", 0);.    if
6390: 28 20 7a 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  ( zCookie ){.   
63a0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
63b0: 26 73 65 6e 64 2c 20 22 63 6f 6f 6b 69 65 20 25  &send, "cookie %
63c0: 73 5c 6e 22 2c 20 7a 43 6f 6f 6b 69 65 29 3b 0a  s\n", zCookie);.
63d0: 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f      }.    .    /
63e0: 2a 20 47 65 6e 65 72 61 74 65 20 67 69 6d 6d 65  * Generate gimme
63f0: 20 63 61 72 64 73 20 66 6f 72 20 70 68 61 6e 74   cards for phant
6400: 6f 6d 73 20 61 6e 64 20 6c 65 61 66 20 63 61 72  oms and leaf car
6410: 64 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c  ds.    ** for al
6420: 6c 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 2a 2f  l leaves..    */
6430: 0a 20 20 20 20 69 66 28 20 70 75 6c 6c 46 6c 61  .    if( pullFla
6440: 67 20 7c 7c 20 63 6c 6f 6e 65 46 6c 61 67 20 29  g || cloneFlag )
6450: 7b 0a 20 20 20 20 20 20 72 65 71 75 65 73 74 5f  {.      request_
6460: 70 68 61 6e 74 6f 6d 73 28 26 78 66 65 72 2c 20  phantoms(&xfer, 
6470: 6d 78 50 68 61 6e 74 6f 6d 52 65 71 29 3b 0a 20  mxPhantomReq);. 
6480: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 75 73     }.    if( pus
6490: 68 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 73  hFlag ){.      s
64a0: 65 6e 64 5f 75 6e 73 65 6e 74 28 26 78 66 65 72  end_unsent(&xfer
64b0: 29 3b 0a 20 20 20 20 20 20 6e 43 61 72 64 20 2b  );.      nCard +
64c0: 3d 20 73 65 6e 64 5f 75 6e 63 6c 75 73 74 65 72  = send_uncluster
64d0: 65 64 28 26 78 66 65 72 29 3b 0a 20 20 20 20 7d  ed(&xfer);.    }
64e0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 63 6f  ..    /* Send co
64f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61  nfiguration para
6500: 6d 65 74 65 72 20 72 65 71 75 65 73 74 73 20 2a  meter requests *
6510: 2f 0a 20 20 20 20 69 66 28 20 63 6f 6e 66 69 67  /.    if( config
6520: 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 63 6f  Mask ){.      co
6530: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
6540: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 63  .      zName = c
6550: 6f 6e 66 69 67 75 72 65 5f 66 69 72 73 74 5f 6e  onfigure_first_n
6560: 61 6d 65 28 63 6f 6e 66 69 67 4d 61 73 6b 29 3b  ame(configMask);
6570: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e  .      while( zN
6580: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ame ){.        b
6590: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 65 6e  lob_appendf(&sen
65a0: 64 2c 20 22 72 65 71 63 6f 6e 66 69 67 20 25 73  d, "reqconfig %s
65b0: 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  \n", zName);.   
65c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 63 6f 6e       zName = con
65d0: 66 69 67 75 72 65 5f 6e 65 78 74 5f 6e 61 6d 65  figure_next_name
65e0: 28 63 6f 6e 66 69 67 4d 61 73 6b 29 3b 0a 20 20  (configMask);.  
65f0: 20 20 20 20 20 20 6e 43 61 72 64 2b 2b 3b 0a 20        nCard++;. 
6600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6610: 20 63 6f 6e 66 69 67 4d 61 73 6b 20 26 20 28 43   configMask & (C
6620: 4f 4e 46 49 47 53 45 54 5f 55 53 45 52 7c 43 4f  ONFIGSET_USER|CO
6630: 4e 46 49 47 53 45 54 5f 54 4b 54 29 20 29 7b 0a  NFIGSET_TKT) ){.
6640: 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72          configur
6650: 65 5f 70 72 65 70 61 72 65 5f 74 6f 5f 72 65 63  e_prepare_to_rec
6660: 65 69 76 65 28 30 29 3b 0a 20 20 20 20 20 20 7d  eive(0);.      }
6670: 0a 20 20 20 20 20 20 63 6f 6e 66 69 67 4d 61 73  .      configMas
6680: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  k = 0;.    }..  
6690: 20 20 2f 2a 20 41 70 70 65 6e 64 20 72 61 6e 64    /* Append rand
66a0: 6f 6d 6e 65 73 73 20 74 6f 20 74 68 65 20 65 6e  omness to the en
66b0: 64 20 6f 66 20 74 68 65 20 6d 65 73 73 61 67 65  d of the message
66c0: 20 2a 2f 0a 23 69 66 20 30 20 20 20 2f 2a 20 45   */.#if 0   /* E
66d0: 6e 61 62 6c 65 20 74 68 69 73 20 61 66 74 65 72  nable this after
66e0: 20 61 6c 6c 20 73 65 72 76 65 72 73 20 68 61 76   all servers hav
66f0: 65 20 75 70 67 72 61 64 65 64 20 2a 2f 0a 20 20  e upgraded */.  
6700: 20 20 7a 52 61 6e 64 6f 6d 6e 65 73 73 20 3d 20    zRandomness = 
6710: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
6720: 43 54 20 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f  CT hex(randomblo
6730: 62 28 32 30 29 29 22 29 3b 0a 20 20 20 20 62 6c  b(20))");.    bl
6740: 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 65 6e 64  ob_appendf(&send
6750: 2c 20 22 23 20 25 73 5c 6e 22 2c 20 7a 52 61 6e  , "# %s\n", zRan
6760: 64 6f 6d 6e 65 73 73 29 3b 0a 20 20 20 20 66 72  domness);.    fr
6770: 65 65 28 7a 52 61 6e 64 6f 6d 6e 65 73 73 29 3b  ee(zRandomness);
6780: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
6790: 45 78 63 68 61 6e 67 65 20 6d 65 73 73 61 67 65  Exchange message
67a0: 73 20 77 69 74 68 20 74 68 65 20 73 65 72 76 65  s with the serve
67b0: 72 20 2a 2f 0a 20 20 20 20 6e 46 69 6c 65 53 65  r */.    nFileSe
67c0: 6e 64 20 3d 20 78 66 65 72 2e 6e 46 69 6c 65 53  nd = xfer.nFileS
67d0: 65 6e 74 20 2b 20 78 66 65 72 2e 6e 44 65 6c 74  ent + xfer.nDelt
67e0: 61 53 65 6e 74 3b 0a 20 20 20 20 70 72 69 6e 74  aSent;.    print
67f0: 66 28 7a 56 61 6c 75 65 46 6f 72 6d 61 74 2c 20  f(zValueFormat, 
6800: 22 53 65 6e 64 3a 22 2c 0a 20 20 20 20 20 20 20  "Send:",.       
6810: 20 20 20 20 20 62 6c 6f 62 5f 73 69 7a 65 28 26       blob_size(&
6820: 73 65 6e 64 29 2c 20 6e 43 61 72 64 2b 78 66 65  send), nCard+xfe
6830: 72 2e 6e 47 69 6d 6d 65 53 65 6e 74 2b 78 66 65  r.nGimmeSent+xfe
6840: 72 2e 6e 49 47 6f 74 53 65 6e 74 2c 0a 20 20 20  r.nIGotSent,.   
6850: 20 20 20 20 20 20 20 20 20 78 66 65 72 2e 6e 46           xfer.nF
6860: 69 6c 65 53 65 6e 74 2c 20 78 66 65 72 2e 6e 44  ileSent, xfer.nD
6870: 65 6c 74 61 53 65 6e 74 29 3b 0a 20 20 20 20 6e  eltaSent);.    n
6880: 43 61 72 64 20 3d 20 30 3b 0a 20 20 20 20 78 66  Card = 0;.    xf
6890: 65 72 2e 6e 46 69 6c 65 53 65 6e 74 20 3d 20 30  er.nFileSent = 0
68a0: 3b 0a 20 20 20 20 78 66 65 72 2e 6e 44 65 6c 74  ;.    xfer.nDelt
68b0: 61 53 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  aSent = 0;.    x
68c0: 66 65 72 2e 6e 47 69 6d 6d 65 53 65 6e 74 20 3d  fer.nGimmeSent =
68d0: 20 30 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 73   0;.    fflush(s
68e0: 74 64 6f 75 74 29 3b 0a 20 20 20 20 68 74 74 70  tdout);.    http
68f0: 5f 65 78 63 68 61 6e 67 65 28 26 73 65 6e 64 2c  _exchange(&send,
6900: 20 26 72 65 63 76 29 3b 0a 20 20 20 20 62 6c 6f   &recv);.    blo
6910: 62 5f 72 65 73 65 74 28 26 73 65 6e 64 29 3b 0a  b_reset(&send);.
6920: 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f  .    /* Begin co
6930: 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 6e  nstructing the n
6940: 65 78 74 20 6d 65 73 73 61 67 65 20 28 77 68 69  ext message (whi
6950: 63 68 20 6d 69 67 68 74 20 6e 65 76 65 72 20 62  ch might never b
6960: 65 0a 20 20 20 20 2a 2a 20 73 65 6e 74 29 20 62  e.    ** sent) b
6970: 79 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  y beginning with
6980: 20 74 68 65 20 70 75 6c 6c 20 6f 72 20 70 75 73   the pull or pus
6990: 68 20 63 61 72 64 73 0a 20 20 20 20 2a 2f 0a 20  h cards.    */. 
69a0: 20 20 20 69 66 28 20 70 75 6c 6c 46 6c 61 67 20     if( pullFlag 
69b0: 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  ){.      blob_ap
69c0: 70 65 6e 64 66 28 26 73 65 6e 64 2c 20 22 70 75  pendf(&send, "pu
69d0: 6c 6c 20 25 73 20 25 73 5c 6e 22 2c 20 7a 53 43  ll %s %s\n", zSC
69e0: 6f 64 65 2c 20 7a 50 43 6f 64 65 29 3b 0a 20 20  ode, zPCode);.  
69f0: 20 20 20 20 6e 43 61 72 64 2b 2b 3b 0a 20 20 20      nCard++;.   
6a00: 20 7d 0a 20 20 20 20 69 66 28 20 70 75 73 68 46   }.    if( pushF
6a10: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f  lag ){.      blo
6a20: 62 5f 61 70 70 65 6e 64 66 28 26 73 65 6e 64 2c  b_appendf(&send,
6a30: 20 22 70 75 73 68 20 25 73 20 25 73 5c 6e 22 2c   "push %s %s\n",
6a40: 20 7a 53 43 6f 64 65 2c 20 7a 50 43 6f 64 65 29   zSCode, zPCode)
6a50: 3b 0a 20 20 20 20 20 20 6e 43 61 72 64 2b 2b 3b  ;.      nCard++;
6a60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
6a70: 72 6f 63 65 73 73 20 74 68 65 20 72 65 70 6c 79  rocess the reply
6a80: 20 74 68 61 74 20 63 61 6d 65 20 62 61 63 6b 20   that came back 
6a90: 66 72 6f 6d 20 74 68 65 20 73 65 72 76 65 72 20  from the server 
6aa0: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 62 6c  */.    while( bl
6ab0: 6f 62 5f 6c 69 6e 65 28 26 72 65 63 76 2c 20 26  ob_line(&recv, &
6ac0: 78 66 65 72 2e 6c 69 6e 65 29 20 29 7b 0a 20 20  xfer.line) ){.  
6ad0: 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 62 75 66      if( blob_buf
6ae0: 66 65 72 28 26 78 66 65 72 2e 6c 69 6e 65 29 5b  fer(&xfer.line)[
6af0: 30 5d 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20  0]=='#' ){.     
6b00: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6b10: 20 20 20 7d 0a 20 20 20 20 20 20 78 66 65 72 2e     }.      xfer.
6b20: 6e 54 6f 6b 65 6e 20 3d 20 62 6c 6f 62 5f 74 6f  nToken = blob_to
6b30: 6b 65 6e 69 7a 65 28 26 78 66 65 72 2e 6c 69 6e  kenize(&xfer.lin
6b40: 65 2c 20 78 66 65 72 2e 61 54 6f 6b 65 6e 2c 20  e, xfer.aToken, 
6b50: 63 6f 75 6e 74 28 78 66 65 72 2e 61 54 6f 6b 65  count(xfer.aToke
6b60: 6e 29 29 3b 0a 20 20 20 20 20 20 6e 43 61 72 64  n));.      nCard
6b70: 2b 2b 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66  ++;.      printf
6b80: 28 22 5c 72 25 64 22 2c 20 6e 43 61 72 64 29 3b  ("\r%d", nCard);
6b90: 0a 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74  .      fflush(st
6ba0: 64 6f 75 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  dout);..      /*
6bb0: 20 20 20 66 69 6c 65 20 55 55 49 44 20 53 49 5a     file UUID SIZ
6bc0: 45 20 5c 6e 20 43 4f 4e 54 45 4e 54 0a 20 20 20  E \n CONTENT.   
6bd0: 20 20 20 2a 2a 20 20 20 66 69 6c 65 20 55 55 49     **   file UUI
6be0: 44 20 44 45 4c 54 41 53 52 43 20 53 49 5a 45 20  D DELTASRC SIZE 
6bf0: 5c 6e 20 43 4f 4e 54 45 4e 54 0a 20 20 20 20 20  \n CONTENT.     
6c00: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 52 65 63   **.      ** Rec
6c10: 65 69 76 65 20 61 20 66 69 6c 65 20 74 72 61 6e  eive a file tran
6c20: 73 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  smitted from the
6c30: 20 73 65 72 76 65 72 2e 0a 20 20 20 20 20 20 2a   server..      *
6c40: 2f 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62  /.      if( blob
6c50: 5f 65 71 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e  _eq(&xfer.aToken
6c60: 5b 30 5d 2c 22 66 69 6c 65 22 29 20 29 7b 0a 20  [0],"file") ){. 
6c70: 20 20 20 20 20 20 20 78 66 65 72 5f 61 63 63 65         xfer_acce
6c80: 70 74 5f 66 69 6c 65 28 26 78 66 65 72 29 3b 0a  pt_file(&xfer);.
6c90: 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20        }else..   
6ca0: 20 20 20 2f 2a 20 20 20 67 69 6d 6d 65 20 55 55     /*   gimme UU
6cb0: 49 44 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  ID.      **.    
6cc0: 20 20 2a 2a 20 53 65 72 76 65 72 20 69 73 20 72    ** Server is r
6cd0: 65 71 75 65 73 74 69 6e 67 20 61 20 66 69 6c 65  equesting a file
6ce0: 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
6cf0: 73 20 61 20 6d 61 6e 69 66 65 73 74 2c 20 61 73  s a manifest, as
6d00: 73 75 6d 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  sume.      ** th
6d10: 61 74 20 74 68 65 20 73 65 72 76 65 72 20 77 69  at the server wi
6d20: 6c 6c 20 61 6c 73 6f 20 77 61 6e 74 20 74 6f 20  ll also want to 
6d30: 6b 6e 6f 77 20 61 6c 6c 20 6f 66 20 74 68 65 20  know all of the 
6d40: 63 6f 6e 74 65 6e 74 20 66 69 6c 65 73 0a 20 20  content files.  
6d50: 20 20 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65      ** associate
6d60: 64 20 77 69 74 68 20 74 68 65 20 6d 61 6e 69 66  d with the manif
6d70: 65 73 74 20 61 6e 64 20 73 65 6e 64 20 74 68 6f  est and send tho
6d80: 73 65 20 74 6f 6f 2e 0a 20 20 20 20 20 20 2a 2f  se too..      */
6d90: 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f  .      if( blob_
6da0: 65 71 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b  eq(&xfer.aToken[
6db0: 30 5d 2c 20 22 67 69 6d 6d 65 22 29 0a 20 20 20  0], "gimme").   
6dc0: 20 20 20 20 26 26 20 78 66 65 72 2e 6e 54 6f 6b      && xfer.nTok
6dd0: 65 6e 3d 3d 32 0a 20 20 20 20 20 20 20 26 26 20  en==2.       && 
6de0: 62 6c 6f 62 5f 69 73 5f 75 75 69 64 28 26 78 66  blob_is_uuid(&xf
6df0: 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 29 0a 20 20  er.aToken[1]).  
6e00: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
6e10: 66 28 20 70 75 73 68 46 6c 61 67 20 29 7b 0a 20  f( pushFlag ){. 
6e20: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 69 64           int rid
6e30: 20 3d 20 72 69 64 5f 66 72 6f 6d 5f 75 75 69 64   = rid_from_uuid
6e40: 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d  (&xfer.aToken[1]
6e50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
6e60: 69 66 28 20 72 69 64 20 29 20 73 65 6e 64 5f 66  if( rid ) send_f
6e70: 69 6c 65 28 26 78 66 65 72 2c 20 72 69 64 2c 20  ile(&xfer, rid, 
6e80: 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 2c  &xfer.aToken[1],
6e90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
6ea0: 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 0a 20 20       }else.  .  
6eb0: 20 20 20 20 2f 2a 20 20 20 69 67 6f 74 20 55 55      /*   igot UU
6ec0: 49 44 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  ID.      **.    
6ed0: 20 20 2a 2a 20 53 65 72 76 65 72 20 61 6e 6e 6f    ** Server anno
6ee0: 75 6e 63 65 73 20 74 68 61 74 20 69 74 20 68 61  unces that it ha
6ef0: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  s a particular f
6f00: 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  ile.  If this is
6f10: 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 61 20  .      ** not a 
6f20: 66 69 6c 65 20 74 68 61 74 20 77 65 20 68 61 76  file that we hav
6f30: 65 20 61 6e 64 20 77 65 20 61 72 65 20 70 75 6c  e and we are pul
6f40: 6c 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  ling, then creat
6f50: 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 70 68 61  e a.      ** pha
6f60: 6e 74 6f 6d 20 74 6f 20 63 61 75 73 65 20 74 68  ntom to cause th
6f70: 69 73 20 66 69 6c 65 20 74 6f 20 62 65 20 72 65  is file to be re
6f80: 71 75 65 73 74 65 64 20 6f 6e 20 74 68 65 20 6e  quested on the n
6f90: 65 78 74 20 63 79 63 6c 65 2e 0a 20 20 20 20 20  ext cycle..     
6fa0: 20 2a 2a 20 41 6c 77 61 79 73 20 72 65 6d 65 6d   ** Always remem
6fb0: 62 65 72 20 74 68 61 74 20 74 68 65 20 73 65 72  ber that the ser
6fc0: 76 65 72 20 68 61 73 20 74 68 69 73 20 66 69 6c  ver has this fil
6fd0: 65 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 0a  e so that we do.
6fe0: 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 72 61        ** not tra
6ff0: 6e 73 6d 69 74 20 69 74 20 62 79 20 61 63 63 69  nsmit it by acci
7000: 64 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dent..      */. 
7010: 20 20 20 20 20 69 66 28 20 78 66 65 72 2e 6e 54       if( xfer.nT
7020: 6f 6b 65 6e 3d 3d 32 0a 20 20 20 20 20 20 20 26  oken==2.       &
7030: 26 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 72 2e  & blob_eq(&xfer.
7040: 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 69 67 6f 74  aToken[0], "igot
7050: 22 29 0a 20 20 20 20 20 20 20 26 26 20 62 6c 6f  ").       && blo
7060: 62 5f 69 73 5f 75 75 69 64 28 26 78 66 65 72 2e  b_is_uuid(&xfer.
7070: 61 54 6f 6b 65 6e 5b 31 5d 29 0a 20 20 20 20 20  aToken[1]).     
7080: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
7090: 72 69 64 20 3d 20 72 69 64 5f 66 72 6f 6d 5f 75  rid = rid_from_u
70a0: 75 69 64 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e  uid(&xfer.aToken
70b0: 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  [1], 0);.       
70c0: 20 69 66 28 20 72 69 64 3d 3d 30 20 26 26 20 28   if( rid==0 && (
70d0: 70 75 6c 6c 46 6c 61 67 20 7c 7c 20 63 6c 6f 6e  pullFlag || clon
70e0: 65 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20  eFlag) ){.      
70f0: 20 20 20 20 72 69 64 20 3d 20 63 6f 6e 74 65 6e      rid = conten
7100: 74 5f 6e 65 77 28 62 6c 6f 62 5f 73 74 72 28 26  t_new(blob_str(&
7110: 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 29 29  xfer.aToken[1]))
7120: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7130: 72 69 64 20 29 20 6e 65 77 50 68 61 6e 74 6f 6d  rid ) newPhantom
7140: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
7150: 20 20 20 20 20 20 20 20 72 65 6d 6f 74 65 5f 68          remote_h
7160: 61 73 28 72 69 64 29 3b 0a 20 20 20 20 20 20 7d  as(rid);.      }
7170: 65 6c 73 65 0a 20 20 20 20 0a 20 20 20 20 20 20  else.    .      
7180: 0a 20 20 20 20 20 20 2f 2a 20 20 20 70 75 73 68  .      /*   push
7190: 20 20 53 45 52 56 45 52 43 4f 44 45 20 20 50 52    SERVERCODE  PR
71a0: 4f 44 55 43 54 43 4f 44 45 0a 20 20 20 20 20 20  ODUCTCODE.      
71b0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 68 6f 75  **.      ** Shou
71c0: 6c 64 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ld only happen i
71d0: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
71e0: 63 6c 6f 6e 65 2e 20 20 54 68 69 73 20 6d 65 73  clone.  This mes
71f0: 73 61 67 65 20 74 65 6c 6c 73 0a 20 20 20 20 20  sage tells.     
7200: 20 2a 2a 20 74 68 65 20 63 6c 69 65 6e 74 20 77   ** the client w
7210: 68 61 74 20 70 72 6f 64 75 63 74 20 74 6f 20 75  hat product to u
7220: 73 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 64  se for the new d
7230: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
7240: 2f 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62  /.      if( blob
7250: 5f 65 71 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e  _eq(&xfer.aToken
7260: 5b 30 5d 2c 22 70 75 73 68 22 29 0a 20 20 20 20  [0],"push").    
7270: 20 20 20 26 26 20 78 66 65 72 2e 6e 54 6f 6b 65     && xfer.nToke
7280: 6e 3d 3d 33 0a 20 20 20 20 20 20 20 26 26 20 63  n==3.       && c
7290: 6c 6f 6e 65 46 6c 61 67 0a 20 20 20 20 20 20 20  loneFlag.       
72a0: 26 26 20 62 6c 6f 62 5f 69 73 5f 75 75 69 64 28  && blob_is_uuid(
72b0: 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 29  &xfer.aToken[1])
72c0: 0a 20 20 20 20 20 20 20 26 26 20 62 6c 6f 62 5f  .       && blob_
72d0: 69 73 5f 75 75 69 64 28 26 78 66 65 72 2e 61 54  is_uuid(&xfer.aT
72e0: 6f 6b 65 6e 5b 32 5d 29 0a 20 20 20 20 20 20 29  oken[2]).      )
72f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 6c  {.        if( bl
7300: 6f 62 5f 65 71 5f 73 74 72 28 26 78 66 65 72 2e  ob_eq_str(&xfer.
7310: 61 54 6f 6b 65 6e 5b 31 5d 2c 20 7a 53 43 6f 64  aToken[1], zSCod
7320: 65 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  e, -1) ){.      
7330: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
7340: 28 22 73 65 72 76 65 72 20 6c 6f 6f 70 22 29 3b  ("server loop");
7350: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7360: 20 20 20 69 66 28 20 7a 50 43 6f 64 65 3d 3d 30     if( zPCode==0
7370: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 50   ){.          zP
7380: 43 6f 64 65 20 3d 20 6d 70 72 69 6e 74 66 28 22  Code = mprintf("
7390: 25 62 22 2c 20 26 78 66 65 72 2e 61 54 6f 6b 65  %b", &xfer.aToke
73a0: 6e 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  n[2]);.         
73b0: 20 64 62 5f 73 65 74 28 22 70 72 6f 6a 65 63 74   db_set("project
73c0: 2d 63 6f 64 65 22 2c 20 7a 50 43 6f 64 65 2c 20  -code", zPCode, 
73d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
73e0: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
73f0: 64 66 28 26 73 65 6e 64 2c 20 22 63 6c 6f 6e 65  df(&send, "clone
7400: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  \n");.        nC
7410: 61 72 64 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ard++;.      }el
7420: 73 65 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  se.      .      
7430: 2f 2a 20 20 20 63 6f 6e 66 69 67 20 4e 41 4d 45  /*   config NAME
7440: 20 53 49 5a 45 20 5c 6e 20 43 4f 4e 54 45 4e 54   SIZE \n CONTENT
7450: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
7460: 2a 2a 20 52 65 63 65 69 76 65 20 61 20 63 6f 6e  ** Receive a con
7470: 66 69 67 75 72 61 74 69 6f 6e 20 76 61 6c 75 65  figuration value
7480: 20 66 72 6f 6d 20 74 68 65 20 73 65 72 76 65 72   from the server
7490: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
74a0: 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 66   if( blob_eq(&xf
74b0: 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 22 63 6f  er.aToken[0],"co
74c0: 6e 66 69 67 22 29 20 26 26 20 78 66 65 72 2e 6e  nfig") && xfer.n
74d0: 54 6f 6b 65 6e 3d 3d 33 0a 20 20 20 20 20 20 20  Token==3.       
74e0: 20 20 20 26 26 20 62 6c 6f 62 5f 69 73 5f 69 6e     && blob_is_in
74f0: 74 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 32  t(&xfer.aToken[2
7500: 5d 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 20 20  ], &size) ){.   
7510: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
7520: 2a 7a 4e 61 6d 65 20 3d 20 62 6c 6f 62 5f 73 74  *zName = blob_st
7530: 72 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31  r(&xfer.aToken[1
7540: 5d 29 3b 0a 20 20 20 20 20 20 20 20 42 6c 6f 62  ]);.        Blob
7550: 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20   content;.      
7560: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f 6e    blob_zero(&con
7570: 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 62  tent);.        b
7580: 6c 6f 62 5f 65 78 74 72 61 63 74 28 78 66 65 72  lob_extract(xfer
7590: 2e 70 49 6e 2c 20 73 69 7a 65 2c 20 26 63 6f 6e  .pIn, size, &con
75a0: 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69  tent);.        i
75b0: 66 28 20 63 6f 6e 66 69 67 75 72 65 5f 69 73 5f  f( configure_is_
75c0: 65 78 70 6f 72 74 61 62 6c 65 28 7a 4e 61 6d 65  exportable(zName
75d0: 29 20 26 20 6f 72 69 67 43 6f 6e 66 69 67 4d 61  ) & origConfigMa
75e0: 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sk ){.          
75f0: 69 66 28 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 40  if( zName[0]!='@
7600: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
7610: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 63 6f  "REPLACE INTO co
7640: 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75 65 29  nfig(name,value)
7650: 20 56 41 4c 55 45 53 28 25 51 2c 25 51 29 22 2c   VALUES(%Q,%Q)",
7660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7670: 20 7a 4e 61 6d 65 2c 20 62 6c 6f 62 5f 73 74 72   zName, blob_str
7680: 28 26 63 6f 6e 74 65 6e 74 29 0a 20 20 20 20 20  (&content).     
7690: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
76a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
76b0: 20 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f         db_multi_
76c0: 65 78 65 63 28 22 25 73 22 2c 20 62 6c 6f 62 5f  exec("%s", blob_
76d0: 73 74 72 28 26 63 6f 6e 74 65 6e 74 29 29 3b 0a  str(&content));.
76e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
76f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43      }.        nC
7700: 61 72 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  ard++;.        b
7710: 6c 6f 62 5f 72 65 73 65 74 28 26 63 6f 6e 74 65  lob_reset(&conte
7720: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f  nt);.        blo
7730: 62 5f 73 65 65 6b 28 78 66 65 72 2e 70 49 6e 2c  b_seek(xfer.pIn,
7740: 20 31 2c 20 42 4c 4f 42 5f 53 45 45 4b 5f 43 55   1, BLOB_SEEK_CU
7750: 52 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  R);.      }else.
7760: 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
7770: 20 20 20 20 63 6f 6f 6b 69 65 20 54 45 58 54 0a      cookie TEXT.
7780: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
7790: 2a 20 54 68 65 20 73 65 72 76 65 72 20 6d 69 67  * The server mig
77a0: 68 74 20 69 6e 63 6c 75 64 65 20 61 20 63 6f 6f  ht include a coo
77b0: 6b 69 65 20 69 6e 20 69 74 73 20 72 65 70 6c 79  kie in its reply
77c0: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 20 20  .  The client.  
77d0: 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 72 65      ** should re
77e0: 6d 65 6d 62 65 72 20 74 68 69 73 20 63 6f 6f 6b  member this cook
77f0: 69 65 20 61 6e 64 20 73 65 6e 64 20 69 74 20 62  ie and send it b
7800: 61 63 6b 20 74 6f 20 74 68 65 20 73 65 72 76 65  ack to the serve
7810: 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 69 74  r.      ** in it
7820: 73 20 6e 65 78 74 20 71 75 65 72 79 2e 0a 20 20  s next query..  
7830: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
7840: 45 61 63 68 20 63 6f 6f 6b 69 65 20 72 65 63 65  Each cookie rece
7850: 69 76 65 64 20 6f 76 65 72 77 72 69 74 65 73 20  ived overwrites 
7860: 74 68 65 20 70 72 69 6f 72 20 63 6f 6f 6b 69 65  the prior cookie
7870: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
7880: 2a 2a 20 73 61 6d 65 20 73 65 72 76 65 72 2e 0a  ** same server..
7890: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
78a0: 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 72  f( blob_eq(&xfer
78b0: 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 63 6f 6f  .aToken[0], "coo
78c0: 6b 69 65 22 29 20 26 26 20 78 66 65 72 2e 6e 54  kie") && xfer.nT
78d0: 6f 6b 65 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20  oken==2 ){.     
78e0: 20 20 20 64 62 5f 73 65 74 28 22 63 6f 6f 6b 69     db_set("cooki
78f0: 65 22 2c 20 62 6c 6f 62 5f 73 74 72 28 26 78 66  e", blob_str(&xf
7900: 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 29 2c 20 30  er.aToken[1]), 0
7910: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a  );.      }else..
7920: 20 20 20 20 20 20 2f 2a 20 20 20 6d 65 73 73 61        /*   messa
7930: 67 65 20 4d 45 53 53 41 47 45 0a 20 20 20 20 20  ge MESSAGE.     
7940: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 50 72 69   **.      ** Pri
7950: 6e 74 20 61 20 6d 65 73 73 61 67 65 2e 20 20 53  nt a message.  S
7960: 69 6d 69 6c 61 72 20 74 6f 20 22 65 72 72 6f 72  imilar to "error
7970: 22 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 73  " but does not s
7980: 74 6f 70 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  top processing. 
7990: 20 20 20 20 20 2a 2f 20 20 20 20 20 20 20 20 0a       */        .
79a0: 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 65        if( blob_e
79b0: 71 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30  q(&xfer.aToken[0
79c0: 5d 2c 22 6d 65 73 73 61 67 65 22 29 20 26 26 20  ],"message") && 
79d0: 78 66 65 72 2e 6e 54 6f 6b 65 6e 3d 3d 32 20 29  xfer.nToken==2 )
79e0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
79f0: 7a 4d 73 67 20 3d 20 62 6c 6f 62 5f 74 65 72 6d  zMsg = blob_term
7a00: 69 6e 61 74 65 28 26 78 66 65 72 2e 61 54 6f 6b  inate(&xfer.aTok
7a10: 65 6e 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  en[1]);.        
7a20: 64 65 66 6f 73 73 69 6c 69 7a 65 28 7a 4d 73 67  defossilize(zMsg
7a30: 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  );.        print
7a40: 66 28 22 53 65 72 76 65 72 20 73 61 79 73 3a 20  f("Server says: 
7a50: 25 73 5c 6e 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  %s\n", zMsg);.  
7a60: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 20      }else..     
7a70: 20 2f 2a 20 20 20 65 72 72 6f 72 20 4d 45 53 53   /*   error MESS
7a80: 41 47 45 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  AGE.      **.   
7a90: 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20     ** Report an 
7aa0: 65 72 72 6f 72 20 61 6e 64 20 61 62 61 6e 64 6f  error and abando
7ab0: 6e 20 74 68 65 20 73 79 6e 63 20 73 65 73 73 69  n the sync sessi
7ac0: 6f 6e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20  on.      */     
7ad0: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 62 6c     .      if( bl
7ae0: 6f 62 5f 65 71 28 26 78 66 65 72 2e 61 54 6f 6b  ob_eq(&xfer.aTok
7af0: 65 6e 5b 30 5d 2c 22 65 72 72 6f 72 22 29 20 26  en[0],"error") &
7b00: 26 20 78 66 65 72 2e 6e 54 6f 6b 65 6e 3d 3d 32  & xfer.nToken==2
7b10: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
7b20: 20 2a 7a 4d 73 67 20 3d 20 62 6c 6f 62 5f 74 65   *zMsg = blob_te
7b30: 72 6d 69 6e 61 74 65 28 26 78 66 65 72 2e 61 54  rminate(&xfer.aT
7b40: 6f 6b 65 6e 5b 31 5d 29 3b 0a 20 20 20 20 20 20  oken[1]);.      
7b50: 20 20 64 65 66 6f 73 73 69 6c 69 7a 65 28 7a 4d    defossilize(zM
7b60: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f  sg);.        blo
7b70: 62 5f 61 70 70 65 6e 64 66 28 26 78 66 65 72 2e  b_appendf(&xfer.
7b80: 65 72 72 2c 20 22 73 65 72 76 65 72 20 73 61 79  err, "server say
7b90: 73 3a 20 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20  s: %s", zMsg);. 
7ba0: 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20       }else..    
7bb0: 20 20 2f 2a 20 55 6e 6b 6e 6f 77 6e 20 6d 65 73    /* Unknown mes
7bc0: 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  sage */.      {.
7bd0: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
7be0: 65 6e 64 66 28 26 78 66 65 72 2e 65 72 72 2c 20  endf(&xfer.err, 
7bf0: 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64  "unknown command
7c00: 3a 20 25 62 22 2c 20 26 78 66 65 72 2e 61 54 6f  : %b", &xfer.aTo
7c10: 6b 65 6e 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ken[0]);.      }
7c20: 0a 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62  ..      if( blob
7c30: 5f 73 69 7a 65 28 26 78 66 65 72 2e 65 72 72 29  _size(&xfer.err)
7c40: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 73 73   ){.        foss
7c50: 69 6c 5f 66 61 74 61 6c 28 22 25 62 22 2c 20 26  il_fatal("%b", &
7c60: 78 66 65 72 2e 65 72 72 29 3b 0a 20 20 20 20 20  xfer.err);.     
7c70: 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 61 72 72   }.      blobarr
7c80: 61 79 5f 72 65 73 65 74 28 78 66 65 72 2e 61 54  ay_reset(xfer.aT
7c90: 6f 6b 65 6e 2c 20 78 66 65 72 2e 6e 54 6f 6b 65  oken, xfer.nToke
7ca0: 6e 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72  n);.      blob_r
7cb0: 65 73 65 74 28 26 78 66 65 72 2e 6c 69 6e 65 29  eset(&xfer.line)
7cc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7cd0: 6f 72 69 67 43 6f 6e 66 69 67 4d 61 73 6b 20 26  origConfigMask &
7ce0: 20 28 43 4f 4e 46 49 47 53 45 54 5f 54 4b 54 7c   (CONFIGSET_TKT|
7cf0: 43 4f 4e 46 49 47 53 45 54 5f 55 53 45 52 29 20  CONFIGSET_USER) 
7d00: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 66 69 67 75  ){.      configu
7d10: 72 65 5f 66 69 6e 61 6c 69 7a 65 5f 72 65 63 65  re_finalize_rece
7d20: 69 76 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ive();.    }.   
7d30: 20 6f 72 69 67 43 6f 6e 66 69 67 4d 61 73 6b 20   origConfigMask 
7d40: 3d 20 30 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  = 0;.    printf(
7d50: 7a 56 61 6c 75 65 46 6f 72 6d 61 74 2c 20 22 52  zValueFormat, "R
7d60: 65 63 65 69 76 65 64 3a 22 2c 0a 20 20 20 20 20  eceived:",.     
7d70: 20 20 20 20 20 20 20 62 6c 6f 62 5f 73 69 7a 65         blob_size
7d80: 28 26 72 65 63 76 29 2c 20 6e 43 61 72 64 2c 0a  (&recv), nCard,.
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 78 66 65 72              xfer
7da0: 2e 6e 46 69 6c 65 52 63 76 64 2c 20 78 66 65 72  .nFileRcvd, xfer
7db0: 2e 6e 44 65 6c 74 61 52 63 76 64 20 2b 20 78 66  .nDeltaRcvd + xf
7dc0: 65 72 2e 6e 44 61 6e 67 6c 69 6e 67 46 69 6c 65  er.nDanglingFile
7dd0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
7de0: 74 28 26 72 65 63 76 29 3b 0a 20 20 20 20 6e 43  t(&recv);.    nC
7df0: 79 63 6c 65 2b 2b 3b 0a 20 20 20 20 67 6f 20 3d  ycle++;.    go =
7e00: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77   0;..    /* If w
7e10: 65 20 72 65 63 65 69 76 65 64 20 6f 6e 65 20 6f  e received one o
7e20: 72 20 6d 6f 72 65 20 66 69 6c 65 73 20 6f 6e 20  r more files on 
7e30: 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 78 63  the previous exc
7e40: 68 61 6e 67 65 20 62 75 74 0a 20 20 20 20 2a 2a  hange but.    **
7e50: 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
7e60: 20 70 68 61 6e 74 6f 6d 73 2c 20 74 68 65 6e 20   phantoms, then 
7e70: 67 6f 20 61 6e 6f 74 68 65 72 20 72 6f 75 6e 64  go another round
7e80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 46 69  ..    */.    nFi
7e90: 6c 65 52 65 63 76 20 3d 20 78 66 65 72 2e 6e 46  leRecv = xfer.nF
7ea0: 69 6c 65 52 63 76 64 20 2b 20 78 66 65 72 2e 6e  ileRcvd + xfer.n
7eb0: 44 65 6c 74 61 52 63 76 64 20 2b 20 78 66 65 72  DeltaRcvd + xfer
7ec0: 2e 6e 44 61 6e 67 6c 69 6e 67 46 69 6c 65 3b 0a  .nDanglingFile;.
7ed0: 20 20 20 20 69 66 28 20 28 6e 46 69 6c 65 52 65      if( (nFileRe
7ee0: 63 76 3e 30 20 7c 7c 20 6e 65 77 50 68 61 6e 74  cv>0 || newPhant
7ef0: 6f 6d 29 20 26 26 20 64 62 5f 65 78 69 73 74 73  om) && db_exists
7f00: 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ("SELECT 1 FROM 
7f10: 70 68 61 6e 74 6f 6d 22 29 20 29 7b 0a 20 20 20  phantom") ){.   
7f20: 20 20 20 67 6f 20 3d 20 31 3b 0a 20 20 20 20 20     go = 1;.     
7f30: 20 6d 78 50 68 61 6e 74 6f 6d 52 65 71 20 3d 20   mxPhantomReq = 
7f40: 6e 46 69 6c 65 52 65 63 76 2a 32 3b 0a 20 20 20  nFileRecv*2;.   
7f50: 20 20 20 69 66 28 20 6d 78 50 68 61 6e 74 6f 6d     if( mxPhantom
7f60: 52 65 71 3c 32 30 30 20 29 20 6d 78 50 68 61 6e  Req<200 ) mxPhan
7f70: 74 6f 6d 52 65 71 20 3d 20 32 30 30 3b 0a 20 20  tomReq = 200;.  
7f80: 20 20 7d 0a 20 20 20 20 6e 43 61 72 64 20 3d 20    }.    nCard = 
7f90: 30 3b 0a 20 20 20 20 78 66 65 72 2e 6e 46 69 6c  0;.    xfer.nFil
7fa0: 65 52 63 76 64 20 3d 20 30 3b 0a 20 20 20 20 78  eRcvd = 0;.    x
7fb0: 66 65 72 2e 6e 44 65 6c 74 61 52 63 76 64 20 3d  fer.nDeltaRcvd =
7fc0: 20 30 3b 0a 20 20 20 20 78 66 65 72 2e 6e 44 61   0;.    xfer.nDa
7fd0: 6e 67 6c 69 6e 67 46 69 6c 65 20 3d 20 30 3b 0a  nglingFile = 0;.
7fe0: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
7ff0: 76 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 66  ve one or more f
8000: 69 6c 65 73 20 71 75 65 75 65 64 20 74 6f 20 73  iles queued to s
8010: 65 6e 64 2c 20 74 68 65 6e 20 67 6f 0a 20 20 20  end, then go.   
8020: 20 2a 2a 20 61 6e 6f 74 68 65 72 20 72 6f 75 6e   ** another roun
8030: 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d .    */.    if
8040: 28 20 78 66 65 72 2e 6e 46 69 6c 65 53 65 6e 74  ( xfer.nFileSent
8050: 2b 78 66 65 72 2e 6e 44 65 6c 74 61 53 65 6e 74  +xfer.nDeltaSent
8060: 3e 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 20 3d  >0 ){.      go =
8070: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 3b 0a 20   1;.    }.  };. 
8080: 20 68 74 74 70 5f 63 6c 6f 73 65 28 29 3b 0a 20   http_close();. 
8090: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
80a0: 44 52 4f 50 20 54 41 42 4c 45 20 6f 6e 72 65 6d  DROP TABLE onrem
80b0: 6f 74 65 22 29 3b 0a 20 20 64 62 5f 65 6e 64 5f  ote");.  db_end_
80c0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a  transaction(0);.
80d0: 7d 0a                                            }.