/ Hex Artifact Content
Login

Artifact a4c49f855cfd0783d7027a5e20dab6bb10fe4e4b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 20  nix only */../* 
0850: 55 73 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  Use posix_falloc
0860: 61 74 65 28 29 20 69 66 20 69 74 20 69 73 20 61  ate() if it is a
0870: 76 61 69 6c 61 62 6c 65 0a 2a 2f 0a 23 69 66 20  vailable.*/.#if 
0880: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f  !defined(HAVE_PO
0890: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
08a0: 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  & defined(__linu
08b0: 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 48 41  x__).# define HA
08c0: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
08d0: 54 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  TE 1.#endif../*.
08e0: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
08f0: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0900: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0910: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0920: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
0930: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
0940: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
0950: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
0960: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
0970: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
0980: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0990: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
09a0: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
09b0: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
09c0: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
09d0: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
09e0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
09f0: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0a00: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0a10: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0a20: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
0a30: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
0a40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0a50: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
0a60: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
0a70: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
0a80: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a90: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0aa0: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0ab0: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0ac0: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0ad0: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0ae0: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0af0: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0b00: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0b10: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0b20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0b30: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0b40: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0b50: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0b60: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0b70: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0b80: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b90: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0ba0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0bb0: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0bc0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0bd0: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0be0: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0bf0: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0c00: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0c10: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0c20: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0c30: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0c40: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0c50: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0c60: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0c70: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0c80: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c90: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0ca0: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0cb0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0cc0: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0cd0: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0ce0: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0cf0: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0d00: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0d10: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0d20: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0d30: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0d40: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0d50: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0d60: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0d70: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0d80: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d90: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0da0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0db0: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0dc0: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0dd0: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0de0: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0df0: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0e00: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0e10: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0e20: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0e30: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0e40: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0e50: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0e60: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0e70: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0e80: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e90: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0ea0: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0eb0: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0ec0: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0ed0: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0ee0: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0ef0: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0f00: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0f10: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0f20: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0f30: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0f40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0f50: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0f60: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0f70: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0f80: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f90: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0fa0: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0fb0: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0fc0: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0fd0: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0fe0: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0ff0: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
1000: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
1010: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
1020: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
1030: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
1040: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
1050: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
1060: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
1070: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
1080: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1090: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
10a0: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
10b0: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
10c0: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
10d0: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
10e0: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
10f0: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1100: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1110: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1120: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
1130: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
1140: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
1160: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
1170: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
1180: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1190: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
11a0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
11b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
11c0: 6e 6f 2e 68 3e 0a 23 69 66 20 21 64 65 66 69 6e  no.h>.#if !defin
11d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
11e0: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
11f0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 69  X_MMAP_SIZE>0.#i
1200: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1210: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  .h>.#endif...#if
1220: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1230: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1240: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1250: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1260: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
1270: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
1280: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
1290: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
12a0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
12b0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
12c0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
12d0: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
12e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
12f0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1300: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1310: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1320: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1330: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1340: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1350: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45  dif..#ifdef HAVE
1370: 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65  _UTIME.# include
1380: 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69   <utime.h>.#endi
1390: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  f../*.** Allowed
13a0: 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46   values of unixF
13b0: 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23  ile.fsFlags.*/.#
13c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53  define SQLITE_FS
13d0: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20  FLAGS_IS_MSDOS  
13e0: 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66     0x1../*.** If
13f0: 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68   we are to be th
1400: 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75  read-safe, inclu
1410: 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20  de the pthreads 
1420: 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e  header and defin
1430: 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  e.** the SQLITE_
1440: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
1450: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ro..*/.#if SQLIT
1460: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  E_THREADSAFE.# i
1470: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
1480: 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  h>.# define SQLI
1490: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
14a0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
14b0: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
14c0: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
14d0: 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a  g a new file.*/.
14e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
14f0: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
1500: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
1510: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1520: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
1530: 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0644.#endif../*
1540: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d  .** Default perm
1550: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
1560: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
1570: 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   dir.*/.#ifndef 
1580: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1590: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
15a0: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
15b0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
15c0: 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
15d0: 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0755.#endif../*
15e0: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70  .** Maximum supp
15f0: 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74  orted path-lengt
1600: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  h..*/.#define MA
1610: 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a  X_PATHNAME 512..
1620: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1630: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1640: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1650: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1660: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
1670: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
1680: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
1690: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
16a0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
16b0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
16c0: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
16d0: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
16e0: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
16f0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1700: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1710: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1720: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1730: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1740: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1750: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1760: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
1770: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
1780: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1790: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
17a0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
17b0: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
17c0: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
17d0: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
17e0: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
17f0: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1800: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1810: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1820: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1830: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1840: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1850: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1860: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
1870: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
1880: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
1890: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
18a0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
18b0: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
18c0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
18d0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
18e0: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
18f0: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1900: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1910: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1920: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1930: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1940: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1950: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1970: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1980: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
1990: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
19a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
19b0: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
19c0: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
19d0: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
19e0: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
19f0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1a00: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1a10: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1a20: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1a30: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1a40: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1a50: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1a60: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
1a70: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
1a80: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
1a90: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1aa0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
1ab0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
1ac0: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1ad0: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1ae0: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1af0: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1b00: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1b10: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b30: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1b40: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1b50: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1b60: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b80: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1b90: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1ba0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1bd0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1be0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1bf0: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1c00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1c10: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1c20: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1c30: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1c40: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1c50: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1c60: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1c70: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1c80: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1cb0: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1cc0: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1cd0: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1ce0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1cf0: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1d00: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1d10: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1d20: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1d40: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1d50: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1d60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d80: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1d90: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1da0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1dd0: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1de0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1df0: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1e20: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1e30: 2a 2f 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f  */.  int nFetchO
1e40: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
1e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e60: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
1e70: 67 20 78 46 65 74 63 68 20 72 65 66 73 20 2a 2f  g xFetch refs */
1e80: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1e90: 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20   mmapSize;      
1ea0: 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62 6c 65         /* Usable
1eb0: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67   size of mapping
1ec0: 20 61 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a   at pMapRegion *
1ed0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1ee0: 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  4 mmapSizeActual
1ef0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 63 74 75 61  ;       /* Actua
1f00: 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e  l size of mappin
1f10: 67 20 61 74 20 70 4d 61 70 52 65 67 69 6f 6e 20  g at pMapRegion 
1f20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1f30: 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20  64 mmapSizeMax; 
1f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
1f50: 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41  igured FCNTL_MMA
1f60: 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a  P_SIZE value */.
1f70: 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69    void *pMapRegi
1f80: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1f90: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
1fa0: 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f  mapped region */
1fb0: 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
1fc0: 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  __.  int sectorS
1fd0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
1ff0: 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a  ce sector size *
2000: 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65 43 68  /.  int deviceCh
2010: 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 20 20  aracteristics;  
2020: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 6f          /* Preco
2030: 6d 70 75 74 65 64 20 64 65 76 69 63 65 20 63 68  mputed device ch
2040: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
2050: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
2060: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2070: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
2080: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20a0: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
20b0: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
20c0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
20d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
20e0: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
20f0: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
2100: 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67   unsigned fsFlag
2110: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2120: 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64       /* cached d
2130: 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74  etails from stat
2140: 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  fs() */.#endif.#
2150: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2160: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
2170: 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20  leId *pId;      
2180: 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69      /* Unique fi
2190: 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a  le ID */.#endif.
21a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
21b0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  BUG.  /* The nex
21c0: 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61  t group of varia
21d0: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  bles are used to
21e0: 20 74 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f   track whether o
21f0: 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74  r not the.  ** t
2200: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
2210: 65 72 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32  er in bytes 24-2
2220: 37 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  7 of database fi
2230: 6c 65 73 20 61 72 65 20 75 70 64 61 74 65 64 0a  les are updated.
2240: 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e    ** whenever an
2250: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
2260: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
2270: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
2280: 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63  ult will.  ** oc
2290: 63 75 72 20 69 66 20 61 20 66 69 6c 65 20 69 73  cur if a file is
22a0: 20 75 70 64 61 74 65 64 20 77 69 74 68 6f 75 74   updated without
22b0: 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74   also updating t
22c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
22d0: 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68   ** counter.  Th
22e0: 69 73 20 74 65 73 74 20 69 73 20 6d 61 64 65 20  is test is made 
22f0: 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f  to avoid new pro
2300: 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f  blems similar to
2310: 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65   the.  ** one de
2320: 73 63 72 69 62 65 64 20 62 79 20 74 69 63 6b 65  scribed by ticke
2330: 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20  t #3584. .  */. 
2340: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
2350: 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20  ransCntrChng;   
2360: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74  /* True if the t
2370: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
2380: 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  er changed */.  
2390: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 62  unsigned char db
23a0: 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f  Update;        /
23b0: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
23c0: 72 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  rt of database f
23d0: 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ile changed */. 
23e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
23f0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20  nNormalWrite;   
2400: 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61 20  /* True if in a 
2410: 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65  normal write ope
2420: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69  ration */..#endi
2430: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
2440: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2450: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
2460: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2470: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
2480: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
2490: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
24a0: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
24b0: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
24c0: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
24d0: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
24e0: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
24f0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
2500: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e  alues for the un
2510: 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73  ixFile.ctrlFlags
2520: 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65   bitmask:.*/.#de
2530: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58  fine UNIXFILE_EX
2540: 43 4c 20 20 20 20 20 20 20 20 30 78 30 31 20 20  CL        0x01  
2550: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2560: 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65  s from one proce
2570: 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69  ss only */.#defi
2580: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  ne UNIXFILE_RDON
2590: 4c 59 20 20 20 20 20 20 30 78 30 32 20 20 20 20  LY      0x02    
25a0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
25b0: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
25c0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
25d0: 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34  PERSIST_WAL 0x04
25e0: 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65       /* Persiste
25f0: 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23  nt WAL mode */.#
2600: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
2610: 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20  SABLE_DIRSYNC.# 
2620: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2630: 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 38 20  DIRSYNC    0x08 
2640: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
2650: 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a   sync needed */.
2660: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55  #else.# define U
2670: 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
2680: 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23     0x00.#endif.#
2690: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
26a0: 50 53 4f 57 20 20 20 20 20 20 20 20 30 78 31 30  PSOW        0x10
26b0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
26c0: 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
26d0: 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66  VERWRITE */.#def
26e0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  ine UNIXFILE_DEL
26f0: 45 54 45 20 20 20 20 20 20 30 78 32 30 20 20 20  ETE      0x20   
2700: 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
2710: 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lose */.#define 
2720: 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20  UNIXFILE_URI    
2730: 20 20 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a       0x40     /*
2740: 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20   Filename might 
2750: 68 61 76 65 20 71 75 65 72 79 20 70 61 72 61 6d  have query param
2760: 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65  eters */.#define
2770: 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2780: 20 20 20 20 20 20 30 78 38 30 20 20 20 20 20 2f        0x80     /
2790: 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63  * Do no file loc
27a0: 6b 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20  king */.#define 
27b0: 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 20  UNIXFILE_WARNED 
27c0: 20 20 20 30 78 30 31 30 30 20 20 20 20 20 2f 2a     0x0100     /*
27d0: 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 29 20   verifyDbFile() 
27e0: 77 61 72 6e 69 6e 67 73 20 68 61 76 65 20 62 65  warnings have be
27f0: 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a 2f 2a  en issued */../*
2800: 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65  .** Include code
2810: 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20   that is common 
2820: 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69  to all os_*.c fi
2830: 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  les.*/.#include 
2840: 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f  "os_common.h"../
2850: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69  *.** Define vari
2860: 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20  ous macros that 
2870: 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  are missing from
2880: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a   some systems..*
2890: 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47  /.#ifndef O_LARG
28a0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
28b0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
28c0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
28d0: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20  E_DISABLE_LFS.# 
28e0: 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  undef O_LARGEFIL
28f0: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
2900: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
2910: 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c  #ifndef O_NOFOLL
2920: 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f  OW.# define O_NO
2930: 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a  FOLLOW 0.#endif.
2940: 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59  #ifndef O_BINARY
2950: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41  .# define O_BINA
2960: 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RY 0.#endif../*.
2970: 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20  ** The threadid 
2980: 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74  macro resolves t
2990: 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20  o the thread-id 
29a0: 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66  or to 0.  Used f
29b0: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
29c0: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
29d0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
29e0: 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69  THREADSAFE.#defi
29f0: 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72  ne threadid pthr
2a00: 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65  ead_self().#else
2a10: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
2a20: 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  d 0.#endif../*.*
2a30: 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64 65  * HAVE_MREMAP de
2a40: 66 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20 6f  faults to true o
2a50: 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c 73  n Linux and fals
2a60: 65 20 65 76 65 72 79 77 68 65 72 65 20 65 6c 73  e everywhere els
2a70: 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  e..*/.#if !defin
2a80: 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a  ed(HAVE_MREMAP).
2a90: 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c  # if defined(__l
2aa0: 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e  inux__) && defin
2ab0: 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a  ed(_GNU_SOURCE).
2ac0: 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d  #  define HAVE_M
2ad0: 52 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a 23  REMAP 1.# else.#
2ae0: 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52    define HAVE_MR
2af0: 45 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a 23  EMAP 0.# endif.#
2b00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66  endif../*.** Dif
2b10: 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74  ferent Unix syst
2b20: 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e  ems declare open
2b30: 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  () in different 
2b40: 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a  ways.  Same use.
2b50: 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  ** open(const ch
2b60: 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e  ar*,int,mode_t).
2b70: 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65    Others use ope
2b80: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
2b90: 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64  t,...)..** The d
2ba0: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70  ifference is imp
2bb0: 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e  ortant when usin
2bc0: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  g a pointer to t
2bd0: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  he function..**.
2be0: 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61  ** The safest wa
2bf0: 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  y to deal with t
2c00: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f  he problem is to
2c10: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73   always use this
2c20: 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63   wrapper.** whic
2c30: 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65  h always has the
2c40: 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e   same well-defin
2c50: 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ed interface..*/
2c60: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
2c70: 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  xOpen(const char
2c80: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *zFile, int fla
2c90: 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20  gs, int mode){. 
2ca0: 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69   return open(zFi
2cb0: 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29  le, flags, mode)
2cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f  ;.}../*.** On so
2cd0: 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c  me systems, call
2ce0: 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69  s to fchown() wi
2cf0: 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73  ll trigger a mes
2d00: 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69  sage in a securi
2d10: 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65  ty.** log if the
2d20: 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d  y come from non-
2d30: 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20  root processes. 
2d40: 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e   So avoid callin
2d50: 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a  g fchown() if.**
2d60: 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   we are not runn
2d70: 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a  ing as root..*/.
2d80: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
2d90: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
2da0: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
2db0: 67 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  gid){.  return g
2dc0: 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20 66  eteuid() ? 0 : f
2dd0: 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64  chown(fd,uid,gid
2de0: 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  );.}../* Forward
2df0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
2e00: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
2e10: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
2e20: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a  r*, int*);../*.*
2e30: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
2e40: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2e50: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2e60: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2e70: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2e80: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2e90: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2ea0: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2eb0: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2ec0: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2ed0: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2ee0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
2ef0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
2f00: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
2f10: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
2f20: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
2f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
2f40: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2f50: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2f60: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2f70: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2f80: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
2f90: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
2fa0: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
2fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
2fc0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
2fd0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
2fe0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
2ff0: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
3000: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
3010: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20  scall[] = {.  { 
3020: 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  "open",         
3030: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3040: 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20  _ptr)posixOpen, 
3050: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3060: 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74  sOpen      ((int
3070: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
3080: 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  int,int))aSyscal
3090: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[0].pCurrent)..
30a0: 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20    { "close",    
30b0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
30c0: 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20  call_ptr)close, 
30d0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
30e0: 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28  ne osClose     (
30f0: 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79  (int(*)(int))aSy
3100: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
3110: 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22  t)..  { "access"
3120: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3130: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63  _syscall_ptr)acc
3140: 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ess,     0  },.#
3150: 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20  define osAccess 
3160: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3170: 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79  t char*,int))aSy
3180: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e  scall[2].pCurren
3190: 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22  t)..  { "getcwd"
31a0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
31b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74  _syscall_ptr)get
31c0: 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  cwd,     0  },.#
31d0: 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20  define osGetcwd 
31e0: 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68     ((char*(*)(ch
31f0: 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  ar*,size_t))aSys
3200: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
3210: 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20  )..  { "stat",  
3220: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3230: 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74  syscall_ptr)stat
3240: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
3250: 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20  efine osStat    
3260: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3270: 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74   char*,struct st
3280: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d  at*))aSyscall[4]
3290: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a  .pCurrent)../*.*
32a0: 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70  * The DJGPP comp
32b0: 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  iler environment
32c0: 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69   looks mostly li
32d0: 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a  ke Unix, but it.
32e0: 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e  ** lacks the fcn
32f0: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
3300: 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66  .  So redefine f
3310: 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d  cntl() to be som
3320: 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61  ething.** that a
3330: 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
3340: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
3350: 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f   locking does no
3360: 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a  t occur under.**
3370: 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20   DJGPP.  But it 
3380: 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69  is DOS - what di
3390: 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f  d you expect?.*/
33a0: 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f  .#ifdef __DJGPP_
33b0: 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20  _.  { "fstat",  
33c0: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
33d0: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
33e0: 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61  define osFstat(a
33f0: 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65  ,b,c)    0.#else
3400: 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74       .  { "fstat
3410: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
3420: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
3430: 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c  stat,      0  },
3440: 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74  .#define osFstat
3450: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
3460: 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  t,struct stat*))
3470: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
3480: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20  rent).#endif..  
3490: 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20  { "ftruncate",  
34a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
34b0: 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65  ll_ptr)ftruncate
34c0: 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65  ,  0  },.#define
34d0: 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69   osFtruncate ((i
34e0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29  nt(*)(int,off_t)
34f0: 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75  )aSyscall[6].pCu
3500: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e  rrent)..  { "fcn
3510: 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  tl",        (sql
3520: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3530: 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20  )fcntl,      0  
3540: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e  },.#define osFcn
3550: 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  tl     ((int(*)(
3560: 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79  int,int,...))aSy
3570: 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e  scall[7].pCurren
3580: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20  t)..  { "read", 
3590: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
35a0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61  _syscall_ptr)rea
35b0: 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  d,       0  },.#
35c0: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20  define osRead   
35d0: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
35e0: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
35f0: 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43  ))aSyscall[8].pC
3600: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3610: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
3620: 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
3630: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
3640: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3650: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3660: 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20  all_ptr)pread,  
3670: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a      0  },.#else.
3680: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
3690: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
36a0: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
36b0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
36c0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61  f.#define osPrea
36d0: 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28  d     ((ssize_t(
36e0: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
36f0: 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  e_t,off_t))aSysc
3700: 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29  all[9].pCurrent)
3710: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
3720: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
3730: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3740: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3750: 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20  ptr)pread64,    
3760: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3770: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
3780: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3790: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
37a0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
37b0: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20  efine osPread64 
37c0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
37d0: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
37e0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
37f0: 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  10].pCurrent).. 
3800: 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20   { "write",     
3810: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3820: 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20  all_ptr)write,  
3830: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3840: 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28  e osWrite     ((
3850: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3860: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3870: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e  t))aSyscall[11].
3880: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3890: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
38a0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
38b0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
38c0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
38d0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
38e0: 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65  scall_ptr)pwrite
38f0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  ,     0  },.#els
3900: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  e.  { "pwrite", 
3910: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3920: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3930: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3940: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77  dif.#define osPw
3950: 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f  rite    ((ssize_
3960: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3970: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
3980: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
3990: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
39a0: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
39b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
39c0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
39d0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
39e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
39f0: 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30  tr)pwrite64,   0
3a00: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3a10: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
3a20: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3a30: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3a40: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3a50: 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20  fine osPwrite64 
3a60: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3a70: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
3a80: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20  ze_t,off_t))\.  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70    aSyscall[13].p
3ab0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
3ac0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
3ad0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3ae0: 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30  tr)fchmod,     0
3af0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
3b00: 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28 2a  chmod    ((int(*
3b10: 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61 53  )(int,mode_t))aS
3b20: 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72  yscall[14].pCurr
3b30: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3b40: 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  d(HAVE_POSIX_FAL
3b50: 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f  LOCATE) && HAVE_
3b60: 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a  POSIX_FALLOCATE.
3b70: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3b80: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3b90: 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f 66  call_ptr)posix_f
3ba0: 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c 0a  allocate,  0 },.
3bb0: 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c 6f  #else.  { "fallo
3bc0: 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74  cate",    (sqlit
3bd0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3be0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3bf0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
3c00: 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74 65  fine osFallocate
3c10: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66   ((int(*)(int,of
3c20: 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  f_t,off_t))aSysc
3c30: 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74  all[15].pCurrent
3c40: 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c  )..  { "unlink",
3c50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3c60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c 69  syscall_ptr)unli
3c70: 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  nk,           0 
3c80: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c  },.#define osUnl
3c90: 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ink    ((int(*)(
3ca0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79  const char*))aSy
3cb0: 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65  scall[16].pCurre
3cc0: 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44 69  nt)..  { "openDi
3cd0: 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73 71  rectory",    (sq
3ce0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3cf0: 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c  r)openDirectory,
3d00: 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69        0 },.#defi
3d10: 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f  ne osOpenDirecto
3d20: 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73  ry ((int(*)(cons
3d30: 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61 53  t char*,int*))aS
3d40: 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72  yscall[17].pCurr
3d50: 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64 69 72  ent)..  { "mkdir
3d60: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
3d70: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
3d80: 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20  kdir,           
3d90: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d  0 },.#define osM
3da0: 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a  kdir     ((int(*
3db0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 6d 6f  )(const char*,mo
3dc0: 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  de_t))aSyscall[1
3dd0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  8].pCurrent)..  
3de0: 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20 20 20  { "rmdir",      
3df0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3e00: 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20 20 20  ll_ptr)rmdir,   
3e10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3e20: 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20 20 20  fine osRmdir    
3e30: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3e40: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3e50: 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  19].pCurrent).. 
3e60: 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20   { "fchown",    
3e70: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3e80: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 46 63 68  all_ptr)posixFch
3e90: 6f 77 6e 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64  own,     0 },.#d
3ea0: 65 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20  efine osFchown  
3eb0: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75    ((int(*)(int,u
3ec0: 69 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79 73  id_t,gid_t))aSys
3ed0: 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e  call[20].pCurren
3ee0: 74 29 0a 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20  t)..  { "mmap", 
3ef0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3f00: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c  yscall_ptr)mmap,
3f10: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3f20: 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a  e osMmap ((void*
3f30: 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  (*)(void*,size_t
3f40: 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66  ,int,int,int,off
3f50: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d  _t))aSyscall[21]
3f60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3f70: 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20  "munmap",       
3f80: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3f90: 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20  _ptr)munmap,    
3fa0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69        0 },.#defi
3fb0: 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f  ne osMunmap ((vo
3fc0: 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a  id*(*)(void*,siz
3fd0: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  e_t))aSyscall[22
3fe0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3ff0: 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 7b   HAVE_MREMAP.  {
4000: 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20   "mremap",      
4010: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4020: 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20  l_ptr)mremap,   
4030: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4040: 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20  e.  { "mremap", 
4050: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
4060: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
4070: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4080: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4090: 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a  osMremap ((void*
40a0: 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  (*)(void*,size_t
40b0: 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29  ,size_t,int,...)
40c0: 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43  )aSyscall[23].pC
40d0: 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45  urrent)..}; /* E
40e0: 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69  nd of the overri
40f0: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
4100: 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  lls */../*.** Th
4110: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
4120: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
4130: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
4140: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
4150: 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e  ** "unix" VFSes.
4160: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4170: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
4180: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
4190: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
41a0: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
41b0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
41c0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
41d0: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
41e0: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
41f0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
4200: 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d  nt unixSetSystem
4210: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
4220: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
4230: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
4240: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
4250: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
4260: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
4270: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4280: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
4290: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
42a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
42b0: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
42c0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
42d0: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
42e0: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
42f0: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
4300: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
4310: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
4320: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
4330: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
4340: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
4350: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
4360: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
4370: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
4380: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
4390: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
43a0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
43b0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
43c0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
43d0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
43e0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
43f0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
4400: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
4410: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4420: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
4430: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4440: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
4450: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
4460: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
4470: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
4480: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
4490: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
44a0: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
44b0: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
44c0: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
44d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
44e0: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
44f0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4500: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4510: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4520: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4530: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4540: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
4550: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
4560: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
4570: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
4580: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4590: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
45a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
45b0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
45c0: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
45d0: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
45e0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
45f0: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
4600: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
4610: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
4620: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4630: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
4640: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4650: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
4660: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
4670: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4680: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
4690: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
46a0: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
46b0: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
46c0: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
46d0: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
46e0: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
46f0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
4700: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
4710: 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53  all_ptr unixGetS
4720: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4730: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4740: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
4750: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
4760: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
4770: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
4780: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
4790: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
47a0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
47b0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
47c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
47d0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
47e0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
47f0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
4800: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
4810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4820: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4830: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
4840: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
4850: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
4860: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
4870: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
4880: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
4890: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
48a0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
48b0: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
48c0: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
48d0: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
48e0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
48f0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
4900: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
4910: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
4920: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
4930: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
4940: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
4950: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
4960: 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  -1;..  UNUSED_PA
4970: 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66  RAMETER(p);.  if
4980: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ( zName ){.    f
4990: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
49a0: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b  ize(aSyscall)-1;
49b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
49c0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
49d0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
49e0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
49f0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b    }.  }.  for(i+
4a00: 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  +; i<ArraySize(a
4a10: 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a  Syscall); i++){.
4a20: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
4a30: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20  [i].pCurrent!=0 
4a40: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
4a50: 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  l[i].zName;.  }.
4a60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4a70: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e  *.** Invoke open
4a80: 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69  ().  Do so multi
4a90: 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c  ple times, until
4aa0: 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65   it either succe
4ab0: 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20  eds or.** fails 
4ac0: 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20  for some reason 
4ad0: 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52  other than EINTR
4ae0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
4af0: 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64  ile creation mod
4b00: 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20  e "m" is 0 then 
4b10: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65  set it to the de
4b20: 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c  fault for.** SQL
4b30: 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ite.  The defaul
4b40: 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41  t is SQLITE_DEFA
4b50: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
4b60: 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a  IONS (normally.*
4b70: 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66  * 0644) as modif
4b80: 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65  ied by the syste
4b90: 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69  m umask.  If m i
4ba0: 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a  s not 0, then.**
4bb0: 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63   make the file c
4bc0: 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20  reation mode be 
4bd0: 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69  exactly m ignori
4be0: 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  ng the umask..**
4bf0: 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65  .** The m parame
4c00: 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d  ter will be non-
4c10: 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63  zero only when c
4c20: 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a  reating -wal, -j
4c30: 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d  ournal,.** and -
4c40: 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77  shm files.  We w
4c50: 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20  ant those files 
4c60: 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79  to have *exactly
4c70: 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65  * the same.** pe
4c80: 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65  rmissions as the
4c90: 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
4ca0: 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61  base, unadultera
4cb0: 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b  ted by the umask
4cc0: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79  ..** In that way
4cd0: 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  , if a database 
4ce0: 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72  file is -rw-rw-r
4cf0: 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20  w or -rw-rw-r-, 
4d00: 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63  and a.** transac
4d10: 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64  tion crashes and
4d20: 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68   leaves behind h
4d30: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  ot journals, the
4d40: 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73  n any.** process
4d50: 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f   that is able to
4d60: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61   write to the da
4d70: 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f  tabase will also
4d80: 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72   be able to.** r
4d90: 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a  ecover the hot j
4da0: 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74  ournals..*/.stat
4db0: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70  ic int robust_op
4dc0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
4dd0: 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20  , int f, mode_t 
4de0: 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  m){.  int fd;.  
4df0: 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20  mode_t m2 = m ? 
4e00: 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55  m : SQLITE_DEFAU
4e10: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
4e20: 4f 4e 53 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64  ONS;.  do{.#if d
4e30: 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43  efined(O_CLOEXEC
4e40: 29 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  ).    fd = osOpe
4e50: 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45 58 45 43 2c  n(z,f|O_CLOEXEC,
4e60: 6d 32 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 66  m2);.#else.    f
4e70: 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d  d = osOpen(z,f,m
4e80: 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 77 68  2);.#endif.  }wh
4e90: 69 6c 65 28 20 66 64 3c 30 20 26 26 20 65 72 72  ile( fd<0 && err
4ea0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 69  no==EINTR );.  i
4eb0: 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
4ec0: 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20  if( m!=0 ){.    
4ed0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
4ee0: 61 74 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28  atbuf;.      if(
4ef0: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
4f00: 61 74 62 75 66 29 3d 3d 30 20 0a 20 20 20 20 20  atbuf)==0 .     
4f10: 20 20 26 26 20 73 74 61 74 62 75 66 2e 73 74 5f    && statbuf.st_
4f20: 73 69 7a 65 3d 3d 30 0a 20 20 20 20 20 20 20 26  size==0.       &
4f30: 26 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  & (statbuf.st_mo
4f40: 64 65 26 30 37 37 37 29 21 3d 6d 20 0a 20 20 20  de&0777)!=m .   
4f50: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73     ){.        os
4f60: 46 63 68 6d 6f 64 28 66 64 2c 20 6d 29 3b 0a 20  Fchmod(fd, m);. 
4f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
4f80: 20 64 65 66 69 6e 65 64 28 46 44 5f 43 4c 4f 45   defined(FD_CLOE
4f90: 58 45 43 29 20 26 26 20 28 21 64 65 66 69 6e 65  XEC) && (!define
4fa0: 64 28 4f 5f 43 4c 4f 45 58 45 43 29 20 7c 7c 20  d(O_CLOEXEC) || 
4fb0: 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30 29 0a 20 20  O_CLOEXEC==0).  
4fc0: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
4fd0: 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66  SETFD, osFcntl(f
4fe0: 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
4ff0: 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
5000: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
5010: 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  n fd;.}../*.** H
5020: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
5030: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
5040: 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
5050: 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
5060: 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
5070: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
5080: 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  t the unixInodeI
5090: 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72  nfo and.** vxwor
50a0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73  ksFileId objects
50b0: 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66 69   used by this fi
50c0: 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68  le, all of which
50d0: 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72   may be .** shar
50e0: 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74  ed by multiple t
50f0: 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75  hreads..**.** Fu
5100: 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78  nction unixMutex
5110: 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
5120: 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
5130: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
5140: 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65   .** is held whe
5150: 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
5160: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
5170: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
5180: 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  f assert() .** s
5190: 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
51a0: 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  **.**   unixEnte
51b0: 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20  rMutex().**     
51c0: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
51d0: 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
51e0: 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29  unixEnterLeave()
51f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5200: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76  unixEnterMutex(v
5210: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
5220: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
5230: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
5240: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5250: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
5260: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65  atic void unixLe
5270: 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
5280: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5290: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
52a0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
52b0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
52c0: 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  ER));.}.#ifdef S
52d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
52e0: 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78  ic int unixMutex
52f0: 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72  Held(void) {.  r
5300: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
5310: 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33  tex_held(sqlite3
5320: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
5330: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
5340: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69  ASTER));.}.#endi
5350: 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  f...#if defined(
5360: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
5370: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5380: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  EBUG)./*.** Help
5390: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
53a0: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
53b0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
53c0: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
53d0: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
53e0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
53f0: 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e  ng represetation
5400: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
5410: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
5420: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
5430: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46   const char *azF
5440: 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c  ileLock(int eFil
5450: 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68  eLock){.  switch
5460: 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ( eFileLock ){. 
5470: 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a     case NO_LOCK:
5480: 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a   return "NONE";.
5490: 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f      case SHARED_
54a0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48  LOCK: return "SH
54b0: 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  ARED";.    case 
54c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
54d0: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
54e0: 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49  ;.    case PENDI
54f0: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
5500: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63  "PENDING";.    c
5510: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
5520: 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c  CK: return "EXCL
5530: 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65  USIVE";.  }.  re
5540: 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a  turn "ERROR";.}.
5550: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
5560: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5570: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
5580: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
5590: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
55a0: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
55b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
55c0: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
55d0: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
55e0: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
55f0: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
5600: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
5610: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
5620: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5630: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
5640: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
5650: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
5660: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
5670: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
5680: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
5690: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
56a0: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
56b0: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
56c0: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
56d0: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
56e0: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
56f0: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
5700: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
5710: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
5720: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
5730: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
5740: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
5750: 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63  se{.    s = osFc
5760: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
5770: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5780: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e  Printf("fcntl un
5790: 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e  known %d %d %d\n
57a0: 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20  ", fd, op, s);. 
57b0: 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d     return s;.  }
57c0: 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  .  if( p->l_type
57d0: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
57e0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
57f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5800: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
5810: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
5820: 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "WRLCK";.  }else
5830: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
5840: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_UNLCK ){.    z
5850: 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a  Type = "UNLCK";.
5860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5870: 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20  ert( 0 );.  }.  
5880: 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65  assert( p->l_whe
5890: 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b  nce==SEEK_SET );
58a0: 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66  .  s = osFcntl(f
58b0: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
58c0: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
58d0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
58e0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
58f0: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
5900: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
5910: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
5920: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
5930: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
5940: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
5950: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
5960: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
5970: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
5980: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
5990: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
59a0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
59b0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
59c0: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
59d0: 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  *p;.    osFcntl(
59e0: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
59f0: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
5a00: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
5a10: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
5a20: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
5a30: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
5a40: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
5a50: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5a60: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
5a70: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
5a80: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
5a90: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
5aa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
5ab0: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
5ac0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
5ad0: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
5ae0: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
5af0: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
5b00: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
5b10: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
5b20: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
5b30: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
5b40: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
5b50: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
5b60: 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46   s;.}.#undef osF
5b70: 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46  cntl.#define osF
5b80: 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23  cntl lockTrace.#
5b90: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5ba0: 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LOCK_TRACE */../
5bb0: 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e  *.** Retry ftrun
5bc0: 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61  cate() calls tha
5bd0: 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49  t fail due to EI
5be0: 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NTR.*/.static in
5bf0: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
5c00: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
5c10: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
5c20: 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
5c30: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
5c40: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
5c50: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
5c60: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
5c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5c80: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
5c90: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
5ca0: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
5cb0: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
5cc0: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
5cd0: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
5ce0: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
5cf0: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
5d00: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
5d10: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
5d20: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
5d30: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
5d40: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
5d50: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
5d60: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
5d70: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
5d80: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
5d90: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
5da0: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
5db0: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
5dc0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
5dd0: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
5de0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
5df0: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
5e00: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
5e10: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
5e20: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
5e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5e40: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
5e50: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
5e60: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
5e70: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77  iteIOErr) {.  sw
5e80: 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72  itch (posixError
5e90: 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41  ) {.#if 0.  /* A
5ea0: 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
5eb0: 20 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f   code was not co
5ec0: 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20  mmented out. In 
5ed0: 74 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61  theory, this bra
5ee0: 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  nch.  ** should 
5ef0: 6e 65 76 65 72 20 62 65 20 68 69 74 2c 20 61 73  never be hit, as
5f00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
5f10: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
5f20: 6c 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20  lled after.  ** 
5f30: 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65  a locking-relate
5f40: 64 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  d function (i.e.
5f50: 20 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65   fcntl()) has re
5f60: 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20  turned non-zero 
5f70: 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61  with.  ** the va
5f80: 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20  lue of errno as 
5f90: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
5fa0: 6e 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74  nt. Since a syst
5fb0: 65 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c  em call has fail
5fc0: 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73  ed,.  ** errno s
5fd0: 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72  hould be non-zer
5fe0: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73  o..  **.  ** Des
5ff0: 70 69 74 65 20 74 68 69 73 2c 20 69 66 20 65 72  pite this, if er
6000: 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65  rno really is ze
6010: 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e  ro, we still don
6020: 27 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72  't want to retur
6030: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  n.  ** SQLITE_OK
6040: 2e 20 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c  . The system cal
6050: 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73  l failed, and *s
6060: 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  ome* SQLite erro
6070: 72 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a  r should be.  **
6080: 20 70 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b   propagated back
6090: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
60a0: 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  Commenting this 
60b0: 62 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73  branch out means
60c0: 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77   errno==0.  ** w
60d0: 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62  ill be handled b
60e0: 79 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22  y the "default:"
60f0: 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a   case below..  *
6100: 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  /.  case 0: .   
6110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6120: 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73  K;.#endif..  cas
6130: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
6140: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
6150: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
6160: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
6170: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
6180: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
6190: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
61a0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
61b0: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
61c0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
61d0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
61e0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
61f0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
6200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
6210: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
6220: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
6230: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
6240: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
6250: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
6260: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
6270: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
6280: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
6290: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
62a0: 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  OCK) || .       
62b0: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
62c0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
62d0: 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20  LOCK) || .      
62e0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
62f0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
6300: 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20  DLOCK) ||.      
6310: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
6320: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
6330: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
6340: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
6350: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
6360: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65     }.    /* else
6370: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   fall through */
6380: 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a  .  case EPERM: .
6390: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
63a0: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 2f  E_PERM;.    .  /
63b0: 2a 20 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e 6c  * EDEADLK is onl
63c0: 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 61 20  y possible if a 
63d0: 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46 5f  call to fcntl(F_
63e0: 53 45 54 4c 4b 57 29 20 69 73 20 6d 61 64 65 2e  SETLKW) is made.
63f0: 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d   And.  ** this m
6400: 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b 65  odule never make
6410: 73 20 73 75 63 68 20 61 20 63 61 6c 6c 2e 20 41  s such a call. A
6420: 6e 64 20 74 68 65 20 63 6f 64 65 20 69 6e 20 53  nd the code in S
6430: 51 4c 69 74 65 20 69 74 73 65 6c 66 20 0a 20 20  QLite itself .  
6440: 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
6450: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
6460: 43 4b 45 44 20 69 73 20 6e 65 76 65 72 20 72 65  CKED is never re
6470: 74 75 72 6e 65 64 2e 20 46 6f 72 20 74 68 65 73  turned. For thes
6480: 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20 74  e reasons.  ** t
6490: 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
64a0: 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20   commented out. 
64b0: 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 64 6f  If the system do
64c0: 65 73 20 73 65 74 20 65 72 72 6e 6f 20 74 6f 20  es set errno to 
64d0: 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68  EDEADLK,.  ** th
64e0: 65 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45  e default SQLITE
64f0: 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f 64 65 20  _IOERR_XXX code 
6500: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
6510: 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61 73  . */.#if 0.  cas
6520: 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72  e EDEADLK:.    r
6530: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
6540: 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64  RR_BLOCKED;.#end
6550: 69 66 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e  if.    .#if EOPN
6560: 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a  OTSUPP!=ENOTSUP.
6570: 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50    case EOPNOTSUP
6580: 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74  P: .    /* somet
6590: 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62  hing went terrib
65a0: 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20  ly awry, unless 
65b0: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
65c0: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
65d0: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
65e0: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
65f0: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
6600: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
6610: 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53  dif.#ifdef ENOTS
6620: 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55  UP.  case ENOTSU
6630: 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c  P: .    /* inval
6640: 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75  id fd, unless du
6650: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
6660: 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70   support introsp
6670: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
6680: 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75   .     * it actu
6690: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
66a0: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
66b0: 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20  f.  case EIO:.  
66c0: 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61  case EBADF:.  ca
66d0: 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73  se EINVAL:.  cas
66e0: 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61  e ENOTCONN:.  ca
66f0: 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73  se ENODEV:.  cas
6700: 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20  e ENXIO:.  case 
6710: 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20 45  ENOENT:.#ifdef E
6720: 53 54 41 4c 45 20 20 20 20 20 20 20 20 20 20 20  STALE           
6730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54            /* EST
6740: 41 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  ALE is not defin
6750: 65 64 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79  ed on Interix sy
6760: 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20  stems */.  case 
6770: 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20  ESTALE:.#endif. 
6780: 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20   case ENOSYS:.  
6790: 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c    /* these shoul
67a0: 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65  d force the clie
67b0: 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  nt to close the 
67c0: 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65  file and reconne
67d0: 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66  ct */.    .  def
67e0: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
67f0: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
6800: 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   }.}.../********
6810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6850: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
6860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
6870: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
6880: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
6890: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
68a0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ******.**.** On 
68b0: 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66  most versions of
68c0: 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65   unix, we can ge
68d0: 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f  t a unique ID fo
68e0: 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63  r a file by conc
68f0: 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65  atenating.** the
6900: 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61   device number a
6910: 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  nd the inode num
6920: 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64  ber.  But this d
6930: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
6940: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56  VxWorks..** On V
6950: 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65  xWorks, a unique
6960: 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65   file id must be
6970: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61   based on the ca
6980: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
6990: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ..**.** A pointe
69a0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
69b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
69c0: 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  g structure can 
69d0: 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  be used as a.** 
69e0: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69  unique file ID i
69f0: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68  n VxWorks.  Each
6a00: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
6a10: 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  s structure cont
6a20: 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f  ains.** a copy o
6a30: 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  f the canonical 
6a40: 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65  filename.  There
6a50: 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72   is also a refer
6a60: 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a  ence count.  .**
6a70: 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69   The structure i
6a80: 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e  s reclaimed when
6a90: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6aa0: 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72  ointers to it dr
6ab0: 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a  ops to.** zero..
6ac0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
6ad0: 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20  never very many 
6ae0: 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e  files open at on
6af0: 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75  e time and looku
6b00: 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20  ps are not.** a 
6b10: 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74  performance-crit
6b20: 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74  ical path, so it
6b30: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
6b40: 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73  o put these.** s
6b50: 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c  tructures on a l
6b60: 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  inked list..*/.s
6b70: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6b80: 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76  eId {.  struct v
6b90: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
6ba0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
6bb0: 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20   a list of them 
6bc0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  all */.  int nRe
6bd0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
6be0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6bf0: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
6c00: 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  o this one */.  
6c10: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6c30: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
6c40: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20  CanonicalName[] 
6c50: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  string */.  char
6c60: 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65   *zCanonicalName
6c70: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e  ;         /* Can
6c80: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
6c90: 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58  */.};..#if OS_VX
6ca0: 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c  WORKS./* .** All
6cb0: 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65   unique filename
6cc0: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20  s are held on a 
6cd0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64  linked list head
6ce0: 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61  ed by this.** va
6cf0: 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69  riable:.*/.stati
6d00: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
6d10: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
6d20: 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  ileList = 0;../*
6d30: 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66  .** Simplify a f
6d40: 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73  ilename into its
6d50: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a   canonical form.
6d60: 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65  ** by making the
6d70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67   following chang
6d80: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d  es:.**.**  * rem
6d90: 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69  oving any traili
6da0: 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65  ng and duplicate
6db0: 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74   /.**  * convert
6dc0: 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f   /./ into just /
6dd0: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
6de0: 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73  A/../ where A is
6df0: 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65   any simple name
6e00: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a   into just /.**.
6e10: 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d  ** Changes are m
6e20: 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52  ade in-place.  R
6e30: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61  eturn the new na
6e40: 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a  me length..**.**
6e50: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   The original fi
6e60: 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30  lename is in z[0
6e70: 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20  ..n-1].  Return 
6e80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
6e90: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
6ea0: 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61  he simplified na
6eb0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
6ec0: 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  t vxworksSimplif
6ed0: 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69  yName(char *z, i
6ee0: 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nt n){.  int i, 
6ef0: 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20  j;.  while( n>1 
6f00: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
6f10: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69  { n--; }.  for(i
6f20: 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
6f30: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
6f40: 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  /' ){.      if( 
6f50: 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f  z[i+1]=='/' ) co
6f60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
6f70: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
6f80: 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+2<n && z[i+2]
6f90: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
6fa0: 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
6fb0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6fc0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69   }.      if( z[i
6fd0: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c  +1]=='.' && i+3<
6fe0: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27  n && z[i+2]=='.'
6ff0: 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20   && z[i+3]=='/' 
7000: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
7010: 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21  ( j>0 && z[j-1]!
7020: 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
7030: 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29         if( j>0 )
7040: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
7050: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
7060: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7070: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
7080: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a  ++] = z[i];.  }.
7090: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65    z[j] = 0;.  re
70a0: 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn j;.}../*.**
70b0: 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66   Find a unique f
70c0: 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67  ile ID for the g
70d0: 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  iven absolute pa
70e0: 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a  thname.  Return.
70f0: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7100: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
7110: 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  d object.  This 
7120: 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75  pointer is the u
7130: 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44  nique.** file ID
7140: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66  ..**.** The nRef
7150: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78   field of the vx
7160: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7170: 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ct is incremente
7180: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
7190: 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e  object is return
71a0: 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72  ed.  A new vxwor
71b0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
71c0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
71d0: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67  d added to the g
71e0: 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65  lobal list if ne
71f0: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
7200: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
7210: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
7220: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  rs, return NULL.
7230: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
7240: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7250: 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65  *vxworksFindFile
7260: 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Id(const char *z
7270: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20  AbsoluteName){. 
7280: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
7290: 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20  ileId *pNew;    
72a0: 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b       /* search k
72b0: 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20  ey and new file 
72c0: 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ID */.  struct v
72d0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43  xworksFileId *pC
72e0: 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46  andidate;   /* F
72f0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
7300: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
7310: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
7340: 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74  ngth of zAbsolut
7350: 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a  eName string */.
7360: 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f  .  assert( zAbso
7370: 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  luteName[0]=='/'
7380: 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73   );.  n = (int)s
7390: 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e  trlen(zAbsoluteN
73a0: 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ame);.  pNew = s
73b0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
73c0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28  izeof(*pNew) + (
73d0: 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  n+1) );.  if( pN
73e0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
73f0: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ;.  pNew->zCanon
7400: 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72  icalName = (char
7410: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65  *)&pNew[1];.  me
7420: 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  mcpy(pNew->zCano
7430: 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f  nicalName, zAbso
7440: 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a  luteName, n+1);.
7450: 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d    n = vxworksSim
7460: 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e  plifyName(pNew->
7470: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7480: 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68  n);..  /* Search
7490: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
74a0: 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63   entry that matc
74b0: 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63  hing the canonic
74c0: 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66  al name..  ** If
74d0: 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e   found, incremen
74e0: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
74f0: 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  count and return
7500: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20   a pointer to.  
7510: 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ** the existing 
7520: 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20  file ID..  */.  
7530: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
7540: 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61  ;.  for(pCandida
7550: 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  te=vxworksFileLi
7560: 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20  st; pCandidate; 
7570: 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64  pCandidate=pCand
7580: 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  idate->pNext){. 
7590: 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74     if( pCandidat
75a0: 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20  e->nName==n .   
75b0: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e    && memcmp(pCan
75c0: 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63  didate->zCanonic
75d0: 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43  alName, pNew->zC
75e0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
75f0: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
7600: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7610: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61  New);.       pCa
7620: 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b  ndidate->nRef++;
7630: 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  .       unixLeav
7640: 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  eMutex();.      
7650: 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61   return pCandida
7660: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  te;.    }.  }.. 
7670: 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73   /* No match was
7680: 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c   found.  We will
7690: 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65   make a new file
76a0: 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e   ID */.  pNew->n
76b0: 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d  Ref = 1;.  pNew-
76c0: 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e  >nName = n;.  pN
76d0: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f  ew->pNext = vxwo
76e0: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76  rksFileList;.  v
76f0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d  xworksFileList =
7700: 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61   pNew;.  unixLea
7710: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
7720: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
7730: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
7740: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7750: 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c   on a vxworksFil
7760: 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65  eId object.  Fre
7770: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
7780: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
7790: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
77a0: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
77b0: 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c   void vxworksRel
77c0: 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63  easeFileId(struc
77d0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
77e0: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74  *pId){.  unixEnt
77f0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
7800: 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30  ert( pId->nRef>0
7810: 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d   );.  pId->nRef-
7820: 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52  -;.  if( pId->nR
7830: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ef==0 ){.    str
7840: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
7850: 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28  d **pp;.    for(
7860: 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c  pp=&vxworksFileL
7870: 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21  ist; *pp && *pp!
7880: 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70  =pId; pp = &((*p
7890: 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20  p)->pNext)){}.  
78a0: 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70    assert( *pp==p
78b0: 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  Id );.    *pp = 
78c0: 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pId->pNext;.    
78d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
78e0: 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
78f0: 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e  veMutex();.}.#en
7900: 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
7910: 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  S */./**********
7920: 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69  ***** End of Uni
7930: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
7940: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
7950: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
7960: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
7970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79b0: 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
79c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a00: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
7a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a20: 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72  ** Posix Advisor
7a30: 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
7a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a50: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53  ******.**.** POS
7a60: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
7a70: 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20  s are broken by 
7a80: 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54  design.  ANSI ST
7a90: 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a  D 1003.1 (1996).
7aa0: 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32  ** section 6.5.2
7ab0: 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72  .2 lines 483 thr
7ac0: 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79  ough 490 specify
7ad0: 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f   that when a pro
7ae0: 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20  cess.** sets or 
7af0: 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74  clears a lock, t
7b00: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76  hat operation ov
7b10: 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f  errides any prio
7b20: 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62  r locks set.** b
7b30: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
7b40: 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  ss.  It does not
7b50: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20   explicitly say 
7b60: 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70  so, but this imp
7b70: 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20  lies.** that it 
7b80: 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20  overrides locks 
7b90: 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20  set by the same 
7ba0: 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20  process using a 
7bb0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
7bc0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
7bd0: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73  onsider this tes
7be0: 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  t case:.**.**   
7bf0: 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70      int fd1 = op
7c00: 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f  en("./file1", O_
7c10: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
7c20: 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e  44);.**       in
7c30: 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd2 = open("./
7c40: 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f  file2", O_RDWR|O
7c50: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
7c60: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66  *.** Suppose ./f
7c70: 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32  ile1 and ./file2
7c80: 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20   are really the 
7c90: 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75  same file (becau
7ca0: 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68  se.** one is a h
7cb0: 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20  ard or symbolic 
7cc0: 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65  link to the othe
7cd0: 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73  r) then if you s
7ce0: 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69  et.** an exclusi
7cf0: 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20  ve lock on fd1, 
7d00: 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20  then try to get 
7d10: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7d20: 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20  k.** on fd2, it 
7d30: 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20  works.  I would 
7d40: 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68  have expected th
7d50: 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f  e second lock to
7d60: 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74  .** fail since t
7d70: 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79  here was already
7d80: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
7d90: 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a  ile due to fd1..
7da0: 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20  ** But not so.  
7db0: 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73  Since both locks
7dc0: 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73   came from the s
7dd0: 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ame process, the
7de0: 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72  .** second overr
7df0: 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20  ides the first, 
7e00: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79  even though they
7e10: 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65   were on differe
7e20: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
7e30: 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e  iptors opened on
7e40: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
7e50: 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  names..**.** Thi
7e60: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  s means that we 
7e70: 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58  cannot use POSIX
7e80: 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72   locks to synchr
7e90: 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73  onize file acces
7ea0: 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65  s.** among compe
7eb0: 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20  ting threads of 
7ec0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7ed0: 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77  .  POSIX locks w
7ee0: 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a  ill work fine.**
7ef0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
7f00: 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61  access for threa
7f10: 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70  ds in separate p
7f20: 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f  rocesses, but no
7f30: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74  t.** threads wit
7f40: 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f  hin the same pro
7f50: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77  cess..**.** To w
7f60: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ork around the p
7f70: 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68  roblem, SQLite h
7f80: 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c  as to manage fil
7f90: 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c  e locks internal
7fa0: 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e  ly.** on its own
7fb0: 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65  .  Whenever a ne
7fc0: 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  w database is op
7fd0: 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  ened, we have to
7fe0: 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65   find the.** spe
7ff0: 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74  cific inode of t
8000: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8010: 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64   (the inode is d
8020: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
8030: 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73  .** st_dev and s
8040: 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20  t_ino fields of 
8050: 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75  the stat structu
8060: 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20  re that fstat() 
8070: 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64  fills in).** and
8080: 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73   check for locks
8090: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e   already existin
80a0: 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e  g on that inode.
80b0: 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65    When locks are
80c0: 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72  .** created or r
80d0: 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20  emoved, we have 
80e0: 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f  to look at our o
80f0: 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  wn internal reco
8100: 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  rd of the.** loc
8110: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ks to see if ano
8120: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
8130: 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61  previously set a
8140: 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61   lock on that sa
8150: 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  me.** inode..**.
8160: 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75  ** (Aside: The u
8170: 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62  se of inode numb
8180: 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44  ers as unique ID
8190: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
81a0: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46  on VxWorks..** F
81b0: 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68  or VxWorks, we h
81c0: 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61  ave to use the a
81d0: 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75  lternative uniqu
81e0: 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65  e ID system base
81f0: 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61  d on.** canonica
8200: 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  l filename and i
8210: 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68  mplemented in th
8220: 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73  e previous divis
8230: 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ion.).**.** The 
8240: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
8250: 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58  ucture for POSIX
8260: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75   is no longer ju
8270: 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69  st an integer fi
8280: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
8290: 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73  .  It is now a s
82a0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f  tructure that ho
82b0: 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  lds the integer 
82c0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
82d0: 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  or and a pointer
82e0: 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20   to a structure 
82f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
8300: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c  he internal.** l
8310: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72  ocks on the corr
8320: 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e  esponding inode.
8330: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c    There is one l
8340: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
8350: 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73  .** per inode, s
8360: 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e  o if the same in
8370: 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77  ode is opened tw
8380: 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69  ice, both unixFi
8390: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
83a0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
83b0: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
83c0: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
83d0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
83e0: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
83f0: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
8400: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
8410: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
8420: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
8430: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
8440: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
8450: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
8460: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
8470: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
8480: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
8490: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
84a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
84b0: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
84c0: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
84d0: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
84e0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
84f0: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
8500: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
8510: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
8520: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
8530: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
8540: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
8550: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
8560: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
8570: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
8580: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
8590: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
85a0: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
85b0: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
85c0: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
85d0: 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20  *.** But wait:  
85e0: 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f  there are yet mo
85f0: 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  re problems with
8600: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
8610: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  locks..**.** If 
8620: 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65  you close a file
8630: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
8640: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c   points to a fil
8650: 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73  e that has locks
8660: 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f  ,.** all locks o
8670: 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
8680: 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68   are owned by th
8690: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
86a0: 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65  s are.** release
86b0: 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  d.  To work arou
86c0: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c  nd this problem,
86d0: 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49   each unixInodeI
86e0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61  nfo object.** ma
86f0: 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20  intains a count 
8700: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
8710: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f   pending locks o
8720: 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20  n tha inode..** 
8730: 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  When an attempt 
8740: 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65  is made to close
8750: 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66   an unixFile, if
8760: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74   there are.** ot
8770: 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65  her unixFile ope
8780: 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e  n on the same in
8790: 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c  ode that are hol
87a0: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20  ding locks, the 
87b0: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65  call.** to close
87c0: 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  () the file desc
87d0: 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72 72  riptor is deferr
87e0: 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20  ed until all of 
87f0: 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e  the locks clear.
8800: 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64  .** The unixInod
8810: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
8820: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
8830: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8840: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
8850: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
8860: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
8870: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
8880: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
8890: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
88a0: 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72  *.** Yet another
88b0: 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78   problem:  Linux
88c0: 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70  Threads do not p
88d0: 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f  lay well with po
88e0: 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  six locks..**.**
88f0: 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73   Many older vers
8900: 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73  ions of linux us
8910: 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61  e the LinuxThrea
8920: 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68  ds library which
8930: 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78   is.** not posix
8940: 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64   compliant.  Und
8950: 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  er LinuxThreads,
8960: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
8970: 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63  by thread.** A c
8980: 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  annot be modifie
8990: 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20  d or overridden 
89a0: 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  by a different t
89b0: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79  hread B..** Only
89c0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f   thread A can mo
89d0: 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20  dify the lock.  
89e0: 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  Locking behavior
89f0: 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69   is correct.** i
8a00: 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e  f the appliation
8a10: 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20   uses the newer 
8a20: 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72  Native Posix Thr
8a30: 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54  ead Library (NPT
8a40: 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d  L).** on linux -
8a50: 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63   with NPTL a loc
8a60: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
8a70: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
8a80: 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74  de locks.** in t
8a90: 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68  hread B.  But th
8aa0: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
8ab0: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
8ac0: 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74  -time which.** t
8ad0: 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79  hreading library
8ae0: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
8af0: 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   So there is no 
8b00: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a  way to know at.*
8b10: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  * compile-time w
8b20: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
8b30: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
8b40: 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72  ide locks on thr
8b50: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61  ead B..** One ha
8b60: 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69  s to do a run-ti
8b70: 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63  me check to disc
8b80: 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f  over the behavio
8b90: 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  r of the.** curr
8ba0: 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  ent process..**.
8bb0: 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74  ** SQLite used t
8bc0: 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54  o support LinuxT
8bd0: 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75 70  hreads.  But sup
8be0: 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68  port for LinuxTh
8bf0: 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f  reads.** was dro
8c00: 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77  pped beginning w
8c10: 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e  ith version 3.7.
8c20: 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  0.  SQLite will 
8c30: 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a  still work with.
8c40: 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  ** LinuxThreads 
8c50: 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28 31  provided that (1
8c60: 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f  ) there is no mo
8c70: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e  re than one conn
8c80: 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64  ection .** per d
8c90: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
8ca0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
8cb0: 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61 73   and (2) databas
8cc0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
8cd0: 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72   do not move acr
8ce0: 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a  oss threads..*/.
8cf0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
8d00: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
8d10: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65  ing structure se
8d20: 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20  rves as the key 
8d30: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  used.** to locat
8d40: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75  e a particular u
8d50: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
8d60: 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ect..*/.struct u
8d70: 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65  nixFileId {.  de
8d80: 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20  v_t dev;        
8d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
8da0: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69  ice number */.#i
8db0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
8dc0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
8dd0: 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e  eId *pId;  /* Un
8de0: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
8df0: 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c   vxworks. */.#el
8e00: 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  se.  ino_t ino; 
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
8e30: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
8e40: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
8e50: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8e60: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
8e70: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
8e80: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
8e90: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
8ea0: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
8eb0: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
8ec0: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
8ed0: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
8ee0: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
8ef0: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
8f00: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
8f10: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
8f20: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
8f30: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
8f40: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
8f50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
8f60: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
8f70: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
8f80: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
8f90: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
8fa0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
8fb0: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
8fc0: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
8fd0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
8fe0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
8ff0: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
9000: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
9010: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
9020: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
9030: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9040: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
9050: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
9060: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
9070: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
9080: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
9090: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
90a0: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
90b0: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
90c0: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
90d0: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
90e0: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
90f0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9120: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
9130: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
9140: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
9150: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
9160: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
9170: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
9180: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
9190: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
91c0: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
91d0: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
91e0: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
91f0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
9200: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
9210: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
9220: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
9230: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
9240: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
9250: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
9260: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
9270: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
9280: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
9290: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
92a0: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
92b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
92c0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
92d0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
92e0: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
92f0: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
9300: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
9310: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
9320: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
9330: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
9340: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
9350: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
9360: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
9370: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
9380: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
9390: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
93a0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
93b0: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
93c0: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
93d0: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
93e0: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
93f0: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
9400: 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ;../*.**.** This
9410: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78   function - unix
9420: 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20 69 73  LogError_x(), is
9430: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
9440: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
9450: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
9460: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
9470: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
9480: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
9490: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
94a0: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
94b0: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
94c0: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
94d0: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
94e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
94f0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
9500: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
9510: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
9520: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
9530: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
9540: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
9550: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
9560: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
9570: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
9580: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
9590: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
95a0: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
95b0: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
95c0: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
95d0: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
95e0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
95f0: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
9600: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
9610: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
9620: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
9630: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
9640: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
9650: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
9660: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
9670: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
9680: 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  path,.** if any.
9690: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78  .*/.#define unix
96a0: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20  LogError(a,b,c) 
96b0: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
96c0: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
96d0: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
96e0: 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  t unixLogErrorAt
96f0: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
9700: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
9710: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
9720: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
9730: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
9740: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
9750: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
9760: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
9770: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
9780: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
9790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
97a0: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
97b0: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
97c0: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
97f0: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
9800: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
9810: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20       /* Message 
9840: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
9850: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f  or equivalent */
9860: 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20  .  int iErrno = 
9870: 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  errno;          
9880: 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63     /* Saved sysc
9890: 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  all error number
98a0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
98b0: 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61  s is not a threa
98c0: 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c  dsafe build (SQL
98d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
98e0: 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a  0), then use.  *
98f0: 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29  * the strerror()
9900: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74   function to obt
9910: 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  ain the human-re
9920: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73  adable error mes
9930: 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61  sage.  ** equiva
9940: 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f  lent to errno. O
9950: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74  therwise, use st
9960: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f  rerror_r()..  */
9970: 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52   .#if SQLITE_THR
9980: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
9990: 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52  ed(HAVE_STRERROR
99a0: 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b  _R).  char aErr[
99b0: 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  80];.  memset(aE
99c0: 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45  rr, 0, sizeof(aE
99d0: 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61  rr));.  zErr = a
99e0: 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54  Err;..  /* If ST
99f0: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20  RERROR_R_CHAR_P 
9a00: 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66  (set by autoconf
9a10: 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55   scripts) or __U
9a20: 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65  SE_GNU is define
9a30: 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  d,.  ** assume t
9a40: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
9a50: 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20  rovides the GNU 
9a60: 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72  version of strer
9a70: 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a  ror_r() that.  *
9a80: 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
9a90: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
9aa0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
9ab0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68  rror message. Th
9ac0: 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a  at pointer .  **
9ad0: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45   may point to aE
9ae0: 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20  rr[], or it may 
9af0: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74  point to some st
9b00: 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d  atic storage som
9b10: 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74  ewhere. .  ** Ot
9b20: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
9b30: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
9b40: 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53  provides the POS
9b50: 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  IX version of . 
9b60: 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29   ** strerror_r()
9b70: 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77  , which always w
9b80: 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rites an error m
9b90: 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72  essage into aErr
9ba0: 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  []..  **.  ** If
9bb0: 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72   the code incorr
9bc0: 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68  ectly assumes th
9bd0: 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53  at it is the POS
9be0: 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20  IX version that 
9bf0: 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  is.  ** availabl
9c00: 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  e, the error mes
9c10: 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20  sage will often 
9c20: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
9c30: 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68  ng. Not a.  ** h
9c40: 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63  uge problem. Inc
9c50: 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64  orrectly conclud
9c60: 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55  ing that the GNU
9c70: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
9c80: 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c  lable .  ** coul
9c90: 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66  d lead to a segf
9ca0: 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a  ault though..  *
9cb0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54  /.#if defined(ST
9cc0: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29  RERROR_R_CHAR_P)
9cd0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53   || defined(__US
9ce0: 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20  E_GNU).  zErr = 
9cf0: 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72  .# endif.  strer
9d00: 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45  ror_r(iErrno, aE
9d10: 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29  rr, sizeof(aErr)
9d20: 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49  -1);..#elif SQLI
9d30: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
9d40: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72  /* This is a thr
9d50: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62  eadsafe build, b
9d60: 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ut strerror_r() 
9d70: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
9d80: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22  . */.  zErr = ""
9d90: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e  ;.#else.  /* Non
9da0: 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c  -threadsafe buil
9db0: 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28  d, use strerror(
9dc0: 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73  ). */.  zErr = s
9dd0: 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b  trerror(iErrno);
9de0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a  .#endif..  if( z
9df0: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
9e00: 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = "";.  sqlite3_
9e10: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
9e20: 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64     "os_unix.c:%d
9e30: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
9e40: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
9e50: 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c  , iErrno, zFunc,
9e60: 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29   zPath, zErr.  )
9e70: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63  ;..  return errc
9e80: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ode;.}../*.** Cl
9e90: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
9ea0: 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  iptor..**.** We 
9eb0: 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73  assume that clos
9ec0: 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  e() almost alway
9ed0: 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69  s works, since i
9ee0: 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a  t is only in a.*
9ef0: 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c  * very sick appl
9f00: 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20  ication or on a 
9f10: 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f  very sick platfo
9f20: 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  rm that it might
9f30: 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20   fail..** If it 
9f40: 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c  does fail, simpl
9f50: 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  y leak the file 
9f60: 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20  descriptor, but 
9f70: 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72  do log the.** er
9f80: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ror..**.** Note 
9f90: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73  that it is not s
9fa0: 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f  afe to retry clo
9fb0: 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52  se() after EINTR
9fc0: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69   since the.** fi
9fd0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69  le descriptor mi
9fe0: 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ght have already
9ff0: 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20   been reused by 
a000: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a  another thread..
a010: 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65  ** So we don't e
a020: 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76  ven try to recov
a030: 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52  er from an EINTR
a040: 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20  .  Just log the 
a050: 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76  error.** and mov
a060: 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e on..*/.static 
a070: 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73  void robust_clos
a080: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
a090: 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69  e, int h, int li
a0a0: 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43  neno){.  if( osC
a0b0: 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75  lose(h) ){.    u
a0c0: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
a0d0: 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e(SQLITE_IOERR_C
a0e0: 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20  LOSE, "close",. 
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a100: 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46        pFile ? pF
a110: 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20  ile->zPath : 0, 
a120: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  lineno);.  }.}..
a130: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
a140: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
a150: 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74   accumuated in t
a160: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
a170: 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a  ->pUnused list..
a180: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
a190: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
a1a0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
a1b0: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
a1c0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
a1d0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
a1e0: 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20  xUnusedFd *p;.  
a1f0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e  UnixUnusedFd *pN
a200: 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e  ext;.  for(p=pIn
a210: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b  ode->pUnused; p;
a220: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
a230: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
a240: 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
a250: 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20  e(pFile, p->fd, 
a260: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73  __LINE__);.    s
a270: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
a280: 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55    }.  pInode->pU
a290: 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
a2a0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
a2b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
a2c0: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
a2d0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
a2e0: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a  ndInodeInfo()..*
a2f0: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
a300: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
a310: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
a320: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
a330: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
a340: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
a350: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
a360: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49  ic void releaseI
a370: 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c  nodeInfo(unixFil
a380: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
a390: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
a3a0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
a3b0: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
a3c0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
a3d0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49  .  if( ALWAYS(pI
a3e0: 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e  node) ){.    pIn
a3f0: 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ode->nRef--;.   
a400: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65   if( pInode->nRe
a410: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
a420: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53  sert( pInode->pS
a430: 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20  hmNode==0 );.   
a440: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
a450: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ds(pFile);.     
a460: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72   if( pInode->pPr
a470: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ev ){.        as
a480: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50  sert( pInode->pP
a490: 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f  rev->pNext==pIno
a4a0: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
a4b0: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
a4c0: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  xt = pInode->pNe
a4d0: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
a4e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a4f0: 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f   inodeList==pIno
a500: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  de );.        in
a510: 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65  odeList = pInode
a520: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
a530: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
a540: 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  e->pNext ){.    
a550: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
a560: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
a570: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
a580: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
a590: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
a5a0: 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  e->pPrev;.      
a5b0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
a5c0: 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20  free(pInode);.  
a5d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
a5e0: 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65   Given a file de
a5f0: 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65  scriptor, locate
a600: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
a610: 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  fo object that.*
a620: 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74  * describes that
a630: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a640: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
a650: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
a660: 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  .  The.** return
a670: 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20   value might be 
a680: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66  uninitialized if
a690: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a6a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
a6b0: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
a6c0: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
a6d0: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
a6e0: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
a6f0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
a700: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
a710: 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72  * Return an appr
a720: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
a730: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
a740: 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  t findInodeInfo(
a750: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
a760: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
a770: 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77    /* Unix file w
a780: 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73  ith file desc us
a790: 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f  ed in the key */
a7a0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
a7b0: 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20   **ppInode      
a7c0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
a7d0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
a7e0: 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ject here */.){.
a7f0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a810: 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20   /* System call 
a820: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
a830: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a850: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
a860: 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65  riptor for pFile
a870: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
a880: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
a890: 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b       /* Lookup k
a8a0: 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49  ey for the unixI
a8b0: 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74  nodeInfo */.  st
a8c0: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
a8d0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f;           /* 
a8e0: 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69  Low-level file i
a8f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
a900: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
a910: 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f  Inode = 0;     /
a920: 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78  * Candidate unix
a930: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
a940: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75   */..  assert( u
a950: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
a960: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d  ;..  /* Get low-
a970: 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  level informatio
a980: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  n about the file
a990: 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65   that we can use
a9a0: 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65  d to.  ** create
a9b0: 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66   a unique name f
a9c0: 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  or the file..  *
a9d0: 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e  /.  fd = pFile->
a9e0: 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  h;.  rc = osFsta
a9f0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
aa00: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
aa10: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
aa20: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69  rrno = errno;.#i
aa30: 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20  fdef EOVERFLOW. 
aa40: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61     if( pFile->la
aa50: 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c  stErrno==EOVERFL
aa60: 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  OW ) return SQLI
aa70: 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66  TE_NOLFS;.#endif
aa80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
aa90: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23  TE_IOERR;.  }..#
aaa0: 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
aab0: 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20    /* On OS X on 
aac0: 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73  an msdos filesys
aad0: 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e  tem, the inode n
aae0: 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65  umber is reporte
aaf0: 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74  d.  ** incorrect
ab00: 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65  ly for zero-size
ab10: 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63   files.  See tic
ab20: 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77  ket #3260.  To w
ab30: 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20  ork.  ** around 
ab40: 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65  this problem (we
ab50: 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62   consider it a b
ab60: 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20  ug in OS X, not 
ab70: 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20  SQLite).  ** we 
ab80: 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20  always increase 
ab90: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f  the file size to
aba0: 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20   1 by writing a 
abb0: 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a  single byte.  **
abc0: 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73   prior to access
abd0: 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  ing the inode nu
abe0: 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62  mber.  The one b
abf0: 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20  yte written is. 
ac00: 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27   ** an ASCII 'S'
ac10: 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68   character which
ac20: 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f   also happens to
ac30: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79   be the first by
ac40: 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68  te.  ** in the h
ac50: 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53  eader of every S
ac60: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
ac70: 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66   In this way, if
ac80: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61   there.  ** is a
ac90: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
aca0: 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65  such that anothe
acb0: 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72  r thread has alr
acc0: 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20  eady populated. 
acd0: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61   ** the first pa
ace0: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
acf0: 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73  se, no damage is
ad00: 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   done..  */.  if
ad10: 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  ( statbuf.st_siz
ad20: 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e  e==0 && (pFile->
ad30: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
ad40: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
ad50: 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b  S)!=0 ){.    do{
ad60: 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
ad70: 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c  , "S", 1); }whil
ad80: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
ad90: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69  ==EINTR );.    i
ada0: 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  f( rc!=1 ){.    
adb0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
adc0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
add0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ade0: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20  IOERR;.    }.   
adf0: 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64   rc = osFstat(fd
ae00: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20  , &statbuf);.   
ae10: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
ae20: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
ae30: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
ae40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ae50: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
ae60: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d   }.#endif..  mem
ae70: 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20  set(&fileId, 0, 
ae80: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b  sizeof(fileId));
ae90: 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20  .  fileId.dev = 
aea0: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
aeb0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
aec0: 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46   fileId.pId = pF
aed0: 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a  ile->pId;.#else.
aee0: 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73    fileId.ino = s
aef0: 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23  tatbuf.st_ino;.#
af00: 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d  endif.  pInode =
af10: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68   inodeList;.  wh
af20: 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d  ile( pInode && m
af30: 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26  emcmp(&fileId, &
af40: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
af50: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20  sizeof(fileId)) 
af60: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
af70: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
af80: 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d   }.  if( pInode=
af90: 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  =0 ){.    pInode
afa0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
afb0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  c( sizeof(*pInod
afc0: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  e) );.    if( pI
afd0: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  node==0 ){.     
afe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
aff0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
b000: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
b010: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
b020: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
b030: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
b040: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
b050: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49  fileId));.    pI
b060: 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  node->nRef = 1;.
b070: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
b080: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
b090: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
b0a0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
b0b0: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
b0c0: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
b0d0: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
b0e0: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
b0f0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
b100: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
b110: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
b120: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
b130: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
b140: 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69 6c   Check a unixFil
b150: 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74 61  e that is a data
b160: 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74 68  base.  Verify th
b170: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
b180: 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73 20  ** (1) There is 
b190: 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72 64  exactly one hard
b1a0: 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c   link on the fil
b1b0: 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69 6c  e.** (2) The fil
b1c0: 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f  e is not a symbo
b1d0: 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20  lic link.** (3) 
b1e0: 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  The file has not
b1f0: 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72   been renamed or
b200: 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20   unlinked.**.** 
b210: 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f  Issue sqlite3_lo
b220: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
b230: 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20 69  ,...) messages i
b240: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f  f anything is no
b250: 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  t right..*/.stat
b260: 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44 62  ic void verifyDb
b270: 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
b280: 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20  File){.  struct 
b290: 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74 20  stat buf;.  int 
b2a0: 72 63 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  rc;.  if( pFile-
b2b0: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
b2c0: 58 46 49 4c 45 5f 57 41 52 4e 45 44 20 29 7b 0a  XFILE_WARNED ){.
b2d0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f      /* One or mo
b2e0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
b2f0: 69 6e 67 20 77 61 72 6e 69 6e 67 73 20 68 61 76  ing warnings hav
b300: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  e already been i
b310: 73 73 75 65 64 2e 20 20 44 6f 20 6e 6f 74 0a 20  ssued.  Do not. 
b320: 20 20 20 2a 2a 20 72 65 70 65 61 74 20 74 68 65     ** repeat the
b330: 6d 20 73 6f 20 61 73 20 6e 6f 74 20 74 6f 20 63  m so as not to c
b340: 6c 75 74 74 65 72 20 74 68 65 20 65 72 72 6f 72  lutter the error
b350: 20 6c 6f 67 20 2a 2f 0a 20 20 20 20 72 65 74 75   log */.    retu
b360: 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6f  rn;.  }.  rc = o
b370: 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
b380: 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63   &buf);.  if( rc
b390: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
b3a0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b3b0: 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66  RNING, "cannot f
b3c0: 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73 22  stat db file %s"
b3d0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b3e0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
b3f0: 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
b400: 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65  E_WARNED;.    re
b410: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
b420: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20  buf.st_nlink==0 
b430: 26 26 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46  && (pFile->ctrlF
b440: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b450: 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
b460: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b470: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
b480: 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69  ile unlinked whi
b490: 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46  le open: %s", pF
b4a0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
b4b0: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
b4c0: 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41  s |= UNIXFILE_WA
b4d0: 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  RNED;.    return
b4e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e  ;.  }.  if( buf.
b4f0: 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20  st_nlink>1 ){.  
b500: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b510: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d  LITE_WARNING, "m
b520: 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f  ultiple links to
b530: 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c   file: %s", pFil
b540: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
b550: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b560: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
b570: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
b580: 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d    }.  if( pFile-
b590: 3e 70 49 6e 6f 64 65 21 3d 30 0a 20 20 20 26 26  >pInode!=0.   &&
b5a0: 20 28 28 72 63 20 3d 20 6f 73 53 74 61 74 28 70   ((rc = osStat(p
b5b0: 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75  File->zPath, &bu
b5c0: 66 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  f))!=0.       ||
b5d0: 20 62 75 66 2e 73 74 5f 69 6e 6f 21 3d 70 46 69   buf.st_ino!=pFi
b5e0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  le->pInode->file
b5f0: 49 64 2e 69 6e 6f 29 0a 20 20 29 7b 0a 20 20 20  Id.ino).  ){.   
b600: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b610: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
b620: 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65  le renamed while
b630: 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c   open: %s", pFil
b640: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
b650: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b660: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
b670: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
b680: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68    }.}.../*.** Th
b690: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
b6a0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
b6b0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
b6c0: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
b6d0: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
b6e0: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
b6f0: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
b700: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
b710: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
b720: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
b730: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
b740: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
b750: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
b760: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
b770: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
b780: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
b790: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
b7a0: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
b7b0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
b7c0: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
b7d0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
b7e0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
b7f0: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
b800: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b810: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
b820: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
b830: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
b840: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
b850: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
b860: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
b870: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
b880: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
b890: 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  ile );.  unixEnt
b8a0: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
b8b0: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
b8c0: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
b8d0: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
b8e0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
b8f0: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
b900: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
b910: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
b920: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
b930: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
b940: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
b950: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
b960: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
b970: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
b980: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
b990: 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65   it..  */.#ifnde
b9a0: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66  f __DJGPP__.  if
b9b0: 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21  ( !reserved && !
b9c0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
b9d0: 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20  ProcessLock ){. 
b9e0: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
b9f0: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
ba00: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ba10: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
ba20: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
ba30: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
ba40: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
ba50: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
ba60: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46  LCK;.    if( osF
ba70: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
ba80: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29  _GETLK, &lock) )
ba90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
baa0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
bab0: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20  ESERVEDLOCK;.   
bac0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
bad0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
bae0: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
baf0: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
bb00: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
bb10: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
bb20: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e  }.#endif.  .  un
bb30: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
bb40: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
bb50: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
bb60: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
bb70: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
bb80: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
bb90: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
bba0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bbb0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
bbc0: 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63  set a system-loc
bbd0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46  k on the file pF
bbe0: 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ile.  The lock i
bbf0: 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  s .** described 
bc00: 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  by pLock..**.** 
bc10: 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73  If the pFile was
bc20: 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
bc30: 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63  te from unix-exc
bc40: 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79  l, then the only
bc50: 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62   lock.** ever ob
bc60: 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63  tained is an exc
bc70: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64  lusive lock, and
bc80: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
bc90: 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20  exactly once.** 
bca0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
bcb0: 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d  ny lock is attem
bcc0: 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65  pted.  All subse
bcd0: 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63  quent system loc
bce0: 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  king.** operatio
bcf0: 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73  ns become no-ops
bd00: 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  .  Locking opera
bd10: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70  tions still happ
bd20: 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a  en internally,.*
bd30: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
bd40: 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20  ordinate access 
bd50: 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65  between separate
bd60: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
bd70: 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20  tions.** within 
bd80: 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75  this process, bu
bd90: 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73  t all of that is
bda0: 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f   handled in memo
bdb0: 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70  ry and the.** op
bdc0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64  erating system d
bdd0: 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70  oes not particip
bde0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
bdf0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61  function is a pa
be00: 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63  ss-through to fc
be10: 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20  ntl(F_SETLK) if 
be20: 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a  pFile is using.*
be30: 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20  * any VFS other 
be40: 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  than "unix-excl"
be50: 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20   or if pFile is 
be60: 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d  opened on "unix-
be70: 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20  excl".** and is 
be80: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  read-only..**.**
be90: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
bea0: 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f  d if the call co
beb0: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
bec0: 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61  ully, or -1 if a
bed0: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74   call.** to fcnt
bee0: 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68  l() fails. In th
bef0: 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69  is case, errno i
bf00: 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74  s set appropriat
bf10: 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29  ely (by fcntl())
bf20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bf30: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69  unixFileLock(uni
bf40: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74  xFile *pFile, st
bf50: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63  ruct flock *pLoc
bf60: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  k){.  int rc;.  
bf70: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
bf80: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
bf90: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
bfa0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
bfb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
bfc0: 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  node!=0 );.  if(
bfd0: 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c   ((pFile->ctrlFl
bfe0: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45  ags & UNIXFILE_E
bff0: 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64  XCL)!=0 || pInod
c000: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29  e->bProcessLock)
c010: 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e  .   && ((pFile->
c020: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
c030: 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29  FILE_RDONLY)==0)
c040: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  .  ){.    if( pI
c050: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
c060: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ck==0 ){.      s
c070: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
c080: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c090: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
c0a0: 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   );.      lock.l
c0b0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
c0c0: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
c0d0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
c0e0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
c0f0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
c100: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _SIZE;.      loc
c110: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
c120: 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  CK;.      rc = o
c130: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
c140: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
c150: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30  ;.      if( rc<0
c160: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c170: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f      pInode->bPro
c180: 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  cessLock = 1;.  
c190: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
c1a0: 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  k++;.    }else{.
c1b0: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
c1c0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
c1d0: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
c1e0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
c1f0: 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72   pLock);.  }.  r
c200: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c210: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
c220: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
c230: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
c240: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
c250: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
c260: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
c270: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
c280: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
c290: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
c2a0: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
c2b0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
c2c0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
c2d0: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
c2e0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
c2f0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
c300: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
c310: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
c320: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
c330: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
c340: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
c350: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
c360: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
c370: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
c380: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
c390: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
c3a0: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
c3b0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
c3c0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
c3d0: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
c3e0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
c3f0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
c400: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
c410: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
c420: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
c430: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
c440: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
c450: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
c460: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
c470: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
c480: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
c490: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
c4a0: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
c4b0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
c4c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
c4d0: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
c4e0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
c4f0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
c500: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
c510: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
c520: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
c530: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
c540: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
c550: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
c560: 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Lock){.  /* The 
c570: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
c580: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
c590: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
c5a0: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
c5b0: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
c5c0: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
c5d0: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
c5e0: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
c5f0: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
c600: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
c610: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
c620: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
c630: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
c640: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
c650: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
c660: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
c670: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
c680: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
c690: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
c6a0: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
c6b0: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
c6c0: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
c6d0: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
c6e0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
c6f0: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
c700: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
c710: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
c720: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
c730: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
c740: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
c750: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
c760: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
c770: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
c780: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
c790: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
c7a0: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
c7b0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
c7c0: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
c7d0: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
c7e0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
c7f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
c800: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
c810: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
c820: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
c830: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
c840: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
c850: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
c860: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
c870: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
c880: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
c890: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
c8a0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
c8b0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
c8c0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
c8d0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
c8e0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
c8f0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
c900: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
c910: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
c920: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
c930: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
c940: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
c950: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
c960: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
c970: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
c980: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
c990: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
c9a0: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
c9b0: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
c9c0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
c9d0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
c9e0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
c9f0: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
ca00: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
ca10: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
ca20: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
ca30: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
ca40: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
ca50: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
ca60: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
ca70: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
ca80: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
ca90: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
caa0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
cab0: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
cac0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
cad0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
cae0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
caf0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
cb00: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
cb10: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
cb20: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
cb30: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
cb40: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
cb50: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
cb60: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
cb70: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
cb80: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
cb90: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
cba0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
cbb0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
cbc0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
cbd0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
cbe0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
cbf0: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
cc00: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
cc10: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
cc20: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
cc30: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
cc40: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
cc50: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
cc60: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
cc70: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
cc80: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
cc90: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
cca0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
ccb0: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
ccc0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
ccd0: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
cce0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
ccf0: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
cd00: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
cd10: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
cd20: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
cd30: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
cd40: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
cd50: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
cd60: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
cd70: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
cd80: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
cd90: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
cda0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
cdb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
cdc0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
cdd0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
cde0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
cdf0: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
ce00: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
ce10: 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20   tErrno = 0;..  
ce20: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ce30: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
ce40: 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
ce50: 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
ce60: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
ce70: 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ->h,.      azFil
ce80: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
ce90: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
cea0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
ceb0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
cec0: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  (pFile->pInode->
ced0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c  eFileLock), pFil
cee0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
cef0: 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ed , getpid()));
cf00: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
cf10: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
cf20: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
cf30: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
cf40: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
cf50: 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
cf60: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
cf70: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
cf80: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
cf90: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
cfa0: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
cfb0: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
cfc0: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
cfd0: 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
cfe0: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
cff0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
d000: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
d010: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
d020: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
d030: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
d040: 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
d050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d060: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
d070: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
d080: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
d090: 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20  rect..  **  (1) 
d0a0: 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
d0b0: 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
d0c0: 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
d0d0: 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
d0e0: 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
d0f0: 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
d100: 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
d110: 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
d120: 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
d130: 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
d140: 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
d150: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
d160: 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
d170: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
d180: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
d190: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d1a0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
d1b0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
d1c0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
d1d0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d1e0: 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
d1f0: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
d200: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d210: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
d220: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
d230: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
d240: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
d250: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
d260: 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
d270: 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
d280: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
d290: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
d2a0: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
d2b0: 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
d2c0: 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
d2d0: 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
d2e0: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
d2f0: 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
d300: 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
d310: 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
d320: 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
d330: 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
d340: 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
d350: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
d360: 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
d370: 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
d380: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
d390: 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
d3a0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
d3b0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
d3c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53    }..  /* If a S
d3d0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
d3e0: 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
d3f0: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
d400: 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
d410: 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
d420: 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
d430: 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
d440: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
d450: 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
d460: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
d470: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
d480: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d490: 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f   && .      (pIno
d4a0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
d4b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
d4c0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d4d0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
d4e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
d4f0: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d500: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
d510: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
d520: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
d530: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
d540: 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
d550: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d560: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
d570: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
d580: 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
d590: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
d5a0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
d5b0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e    }...  /* A PEN
d5c0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
d5d0: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
d5e0: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
d5f0: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
d600: 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
d610: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
d620: 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
d630: 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
d640: 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
d650: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
d660: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
d670: 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65  .  lock.l_whence
d680: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69   = SEEK_SET;.  i
d690: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
d6a0: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
d6b0: 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
d6c0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
d6d0: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
d6e0: 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
d6f0: 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  .  ){.    lock.l
d700: 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f  _type = (eFileLo
d710: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f  ck==SHARED_LOCK?
d720: 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29  F_RDLCK:F_WRLCK)
d730: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
d740: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
d750: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
d760: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d770: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
d780: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d790: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d7a0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d7b0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d7c0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
d7d0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d7e0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
d7f0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d800: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d810: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
d820: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
d830: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
d840: 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
d850: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
d860: 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
d870: 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
d880: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
d890: 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
d8a0: 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
d8b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
d8c0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d8d0: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
d8e0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d8f0: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
d900: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
d910: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
d920: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
d930: 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
d940: 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
d950: 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
d960: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
d970: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
d980: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
d990: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28  ED_SIZE;.    if(
d9a0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
d9b0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
d9c0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d9d0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
d9e0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d9f0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
da00: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
da10: 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OCK);.    }..   
da20: 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
da30: 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
da40: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
da50: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
da60: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
da70: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
da80: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
da90: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _UNLCK;.    if( 
daa0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
dab0: 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63  le, &lock) && rc
dac0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
dad0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75       /* This cou
dae0: 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  ld happen with a
daf0: 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a   network mount *
db00: 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  /.      tErrno =
db10: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
db20: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
db30: 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a  UNLOCK; .    }..
db40: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
db50: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
db60: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
db70: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
db80: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
db90: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
dba0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
dbb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
dbc0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
dbd0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
dbe0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
dbf0: 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
dc00: 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
dc10: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
dc20: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
dc30: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
dc40: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
dc50: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
dc60: 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
dc70: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
dc80: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
dc90: 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73  in this.    ** s
dca0: 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
dcb0: 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
dcc0: 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
dcd0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
dce0: 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
dcf0: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
dd00: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
dd10: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
dd20: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
dd30: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
dd40: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
dd50: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
dd60: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
dd70: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
dd80: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
dd90: 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69  t( 0!=pFile->eFi
dda0: 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f  leLock );.    lo
ddb0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
ddc0: 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  LCK;..    assert
ddd0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ( eFileLock==RES
dde0: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46  ERVED_LOCK || eF
ddf0: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
de00: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69  VE_LOCK );.    i
de10: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  f( eFileLock==RE
de20: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
de30: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
de40: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
de50: 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  E;.      lock.l_
de60: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65  len = 1L;.    }e
de70: 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  lse{.      lock.
de80: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
de90: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f  _FIRST;.      lo
dea0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
deb0: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20  D_SIZE;.    }.. 
dec0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
ded0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
dee0: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
def0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
df00: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
df10: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
df20: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
df30: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
df40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
df50: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
df60: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
df70: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
df80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
df90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
dfa0: 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75  DEBUG.  /* Set u
dfb0: 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
dfc0: 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65  n-counter change
dfd0: 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20   checking flags 
dfe0: 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69  when.  ** transi
dff0: 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53  tioning from a S
e000: 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52  HARED to a RESER
e010: 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63  VED lock.  The c
e020: 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  hange.  ** from 
e030: 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
e040: 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67  ED marks the beg
e050: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d  inning of a norm
e060: 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70  al.  ** write op
e070: 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68  eration (not a h
e080: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
e090: 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ack)..  */.  if(
e0a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
e0b0: 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c    && pFile->eFil
e0c0: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
e0d0: 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f  CK.   && eFileLo
e0e0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
e0f0: 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  K.  ){.    pFile
e100: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
e110: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
e120: 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
e130: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
e140: 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a  lWrite = 1;.  }.
e150: 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72  #endif...  if( r
e160: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e170: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
e180: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
e190: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
e1a0: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
e1b0: 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ock;.  }else if(
e1c0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
e1d0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
e1e0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
e1f0: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
e200: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  K;.    pInode->e
e210: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
e220: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e  NG_LOCK;.  }..en
e230: 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
e240: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
e250: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
e260: 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c  %d %s %s (unix)\
e270: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
e280: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
e290: 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d  ck), .      rc==
e2a0: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
e2b0: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
e2c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e2d0: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c  *.** Add the fil
e2e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65  e descriptor use
e2f0: 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65  d by file handle
e300: 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f   pFile to the co
e310: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70  rresponding.** p
e320: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  Unused list..*/.
e330: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50  static void setP
e340: 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c  endingFd(unixFil
e350: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
e360: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
e370: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
e380: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
e390: 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70  Fd *p = pFile->p
e3a0: 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65  Unused;.  p->pNe
e3b0: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  xt = pInode->pUn
e3c0: 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e  used;.  pInode->
e3d0: 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70  pUnused = p;.  p
e3e0: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
e3f0: 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d  pFile->pUnused =
e400: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77   0;.}../*.** Low
e410: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
e420: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
e430: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
e440: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
e450: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
e460: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
e470: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
e480: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
e490: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
e4a0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e4b0: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
e4c0: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
e4d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
e4e0: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
e4f0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
e500: 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e  p..** .** If han
e510: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20  dleNFSUnlock is 
e520: 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f  true, then on do
e530: 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43  wngrading an EXC
e540: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53  LUSIVE_LOCK to S
e550: 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74  HARED.** the byt
e560: 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64  e range is divid
e570: 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20  ed into 2 parts 
e580: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61  and the first pa
e590: 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74  rt is unlocked t
e5a0: 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20  hen.** set to a 
e5b0: 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  read lock, then 
e5c0: 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69  the other part i
e5d0: 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65  s simply unlocke
e5e0: 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a  d.  This works .
e5f0: 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20  ** around a bug 
e600: 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64  in BSD NFS lockd
e610: 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d   (also seen on M
e620: 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61  acOSX 10.3+) tha
e630: 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72  t fails to .** r
e640: 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20  emove the write 
e650: 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e  lock on a region
e660: 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
e670: 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  k is set..*/.sta
e680: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c  tic int posixUnl
e690: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e6a0: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
e6b0: 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e  ock, int handleN
e6c0: 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69  FSUnlock){.  uni
e6d0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
e6e0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
e6f0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
e700: 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  Inode;.  struct 
e710: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
e720: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e730: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
e740: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
e750: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
e760: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
e770: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
e780: 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
e790: 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65  ock,.      pFile
e7a0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
e7b0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
e7c0: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
e7d0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
e7e0: 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
e7f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
e800: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
e810: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
e820: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
e830: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
e840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e850: 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
e860: 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
e870: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
e880: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
e890: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
e8a0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
e8b0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
e8c0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
e8d0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
e8e0: 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
e8f0: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66  FileLock );..#if
e900: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
e910: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
e920: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
e930: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
e940: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
e950: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
e960: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e970: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
e980: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
e990: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
e9a0: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
e9b0: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
e9c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
e9d0: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
e9e0: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
e9f0: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
ea00: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
ea10: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
ea20: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
ea30: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
ea40: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
ea50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
ea60: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
ea70: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
ea80: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
ea90: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
eaa0: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
eab0: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
eac0: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
ead0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
eae0: 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e    */.    pFile->
eaf0: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
eb00: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
eb10: 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f  * downgrading to
eb20: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
eb30: 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63  n NFS involves c
eb40: 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74  learing the writ
eb50: 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65  e lock.    ** be
eb60: 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e  fore establishin
eb70: 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d  g the readlock -
eb80: 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65   to avoid a race
eb90: 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f   condition we do
eba0: 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74  wngrade.    ** t
ebb0: 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f  he lock in 2 blo
ebc0: 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72  cks, so that par
ebd0: 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77  t of the range w
ebe0: 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62  ill be covered b
ebf0: 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74  y a .    ** writ
ec00: 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65  e lock until the
ec10: 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64   rest is covered
ec20: 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a   by a read lock:
ec30: 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57  .    **  1:   [W
ec40: 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a  WWWW].    **  2:
ec50: 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a     [....W].    *
ec60: 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a  *  3:   [RRRRW].
ec70: 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52      **  4:   [RR
ec80: 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RR.].    */.    
ec90: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
eca0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23  HARED_LOCK ){..#
ecb0: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50  if !defined(__AP
ecc0: 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54  PLE__) || !SQLIT
ecd0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
ece0: 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f  _STYLE.      (vo
ecf0: 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  id)handleNFSUnlo
ed00: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
ed10: 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
ed20: 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23  k==0 );.#endif.#
ed30: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
ed40: 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
ed50: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
ed60: 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68  TYLE.      if( h
ed70: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29  andleNFSUnlock )
ed80: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
ed90: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
eda0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
edb0: 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61  e from system ca
edc0: 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  ll errors */.   
edd0: 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69       off_t divSi
ede0: 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ze = SHARED_SIZE
edf0: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   - 1;.        . 
ee00: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
ee10: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
ee20: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
ee30: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
ee40: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
ee50: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
ee60: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
ee70: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
ee80: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
ee90: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
eea0: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
eeb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
eec0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
eed0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
eee0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
eef0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
ef00: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
ef10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ef20: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
ef30: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
ef40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ef50: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
ef60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ef70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
ef80: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
ef90: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
efa0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
efb0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
efc0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
efd0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
efe0: 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
eff0: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
f000: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
f010: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
f020: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
f030: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
f040: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
f050: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
f060: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
f070: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
f080: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
f090: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
f0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f0b0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f0c0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
f0d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f0e0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
f0f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f100: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
f110: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
f120: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
f130: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
f140: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
f150: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
f160: 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  +divSize;.      
f170: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f180: 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69  HARED_SIZE-divSi
f190: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
f1a0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f1b0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
f1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
f1d0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f1e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f1f0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
f200: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f210: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
f220: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
f230: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f240: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
f250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f260: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
f270: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
f280: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
f290: 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
f2a0: 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
f2b0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
f2c0: 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  TYLE */.      {.
f2d0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
f2e0: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
f2f0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
f300: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
f310: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f320: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
f330: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
f340: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
f350: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  D_SIZE;.        
f360: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f370: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
f380: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
f390: 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61  n theory, the ca
f3a0: 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f  ll to unixFileLo
f3b0: 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ck() cannot fail
f3c0: 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72   because another
f3d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
f3e0: 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
f3f0: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
f400: 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65   lock. If it doe
f410: 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  s, this .       
f420: 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20     ** indicates 
f430: 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70  that the other p
f440: 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
f450: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b  llowing the lock
f460: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
f470: 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68   protocol. If th
f480: 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75  is happens, retu
f490: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
f4a0: 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e  RDLOCK. Returnin
f4b0: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53  g.          ** S
f4c0: 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64  QLITE_BUSY would
f4d0: 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70   confuse the upp
f4e0: 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61  er layer (in pra
f4f0: 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20  ctice it causes 
f500: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
f510: 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29   assert to fail)
f520: 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20  . */ .          
f530: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
f540: 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_RDLOCK;.      
f550: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f560: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f570: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
f580: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
f590: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f5a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
f5b0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
f5c0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
f5d0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
f5e0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
f5f0: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
f600: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20  ock.l_len = 2L; 
f610: 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47   assert( PENDING
f620: 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45  _BYTE+1==RESERVE
f630: 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66  D_BYTE );.    if
f640: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f650: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20  File, &lock)==0 
f660: 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
f670: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
f680: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
f690: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
f6a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
f6b0: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
f6c0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
f6d0: 72 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rno;.      goto 
f6e0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
f6f0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69 6c  }.  }.  if( eFil
f700: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
f710: 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  {.    /* Decreme
f720: 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
f730: 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
f740: 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
f750: 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
f760: 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
f770: 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
f780: 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
f790: 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
f7a0: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
f7b0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64      */.    pInod
f7c0: 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20  e->nShared--;.  
f7d0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53    if( pInode->nS
f7e0: 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  hared==0 ){.    
f7f0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f800: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_UNLCK;.      l
f810: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f820: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
f830: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
f840: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
f850: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
f860: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f870: 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)==0 ){.      
f880: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
f890: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
f8a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f8b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f8c0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
f8d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
f8e0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
f8f0: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
f900: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
f910: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
f920: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
f930: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
f940: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
f950: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
f960: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
f970: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
f980: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
f990: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
f9a0: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
f9b0: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
f9c0: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
f9d0: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
f9e0: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
f9f0: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
fa00: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
fa10: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
fa20: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
fa30: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
fa40: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
fa50: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
fa60: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
fa70: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
fa80: 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c    }.  }..end_unl
fa90: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
faa0: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
fab0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
fac0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
fad0: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
fae0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
faf0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
fb00: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
fb10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
fb20: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
fb30: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
fb40: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
fb50: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
fb60: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
fb70: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fb80: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
fb90: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
fba0: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
fbb0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
fbc0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
fbd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
fbe0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
fbf0: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
fc00: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
fc10: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
fc20: 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 46  k){.  assert( eF
fc30: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
fc40: 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46 69  LOCK || ((unixFi
fc50: 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63 68  le *)id)->nFetch
fc60: 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  Out==0 );.  retu
fc70: 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
fc80: 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29  d, eFileLock, 0)
fc90: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
fca0: 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78  unixMapfile(unix
fcb0: 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e  File *pFd, i64 n
fcc0: 42 79 74 65 29 3b 0a 73 74 61 74 69 63 20 76 6f  Byte);.static vo
fcd0: 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
fce0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 3b  (unixFile *pFd);
fcf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
fd00: 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74  ction performs t
fd10: 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  he parts of the 
fd20: 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65  "close file" ope
fd30: 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f  ration .** commo
fd40: 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
fd50: 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f   schemes. It clo
fd60: 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  ses the director
fd70: 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61  y and file.** ha
fd80: 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61  ndles, if they a
fd90: 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65  re valid, and se
fda0: 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66  ts all fields of
fdb0: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a   the unixFile.**
fdc0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e   structure to 0.
fdd0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f  .**.** It is *no
fde0: 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  t* necessary to 
fdf0: 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77  hold the mutex w
fe00: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
fe10: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65   is called,.** e
fe20: 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20  ven on VxWorks. 
fe30: 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65   A mutex will be
fe40: 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57   acquired on VxW
fe50: 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76  orks by the.** v
fe60: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
fe70: 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  eId() routine..*
fe80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f  /.static int clo
fe90: 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74  seUnixFile(sqlit
fea0: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
feb0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
fec0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
fed0: 0a 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  .  unixUnmapfile
fee0: 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70  (pFile);.  if( p
fef0: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
ff00: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
ff10: 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
ff20: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
ff30: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
ff40: 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
ff50: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
ff60: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  d ){.    if( pFi
ff70: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
ff80: 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
ff90: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
ffa0: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
ffb0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
ffc0: 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
ffd0: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
ffe0: 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
fff0: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
10000 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
10010 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
10020 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
10030 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
10040 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
10050 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
10060 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
10070 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
10080 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
10090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
100a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
100b0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
100c0 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
100d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
100e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
100f0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
10100 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10110 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65  xFile *)id;.  ve
10120 72 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c 65  rifyDbFile(pFile
10130 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28  );.  unixUnlock(
10140 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
10150 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
10160 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65  ;..  /* unixFile
10170 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  .pInode is alway
10180 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74  s valid here. Ot
10190 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65  herwise, a diffe
101a0 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20  rent close.  ** 
101b0 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f  routine (e.g. no
101c0 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75  lockClose()) wou
101d0 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  ld be called ins
101e0 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tead..  */.  ass
101f0 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
10200 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70  de->nLock>0 || p
10210 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
10220 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
10230 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46  .  if( ALWAYS(pF
10240 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20  ile->pInode) && 
10250 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
10260 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Lock ){.    /* I
10270 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
10280 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
10290 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
102a0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
102b0 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65  st.    ** yet be
102c0 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
102d0 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
102e0 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
102f0 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  d the file.    *
10300 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
10310 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
10320 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62  list.  It will b
10330 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
10340 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77  closed .    ** w
10350 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
10360 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
10370 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64    */.    setPend
10380 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
10390 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  }.  releaseInode
103a0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72  Info(pFile);.  r
103b0 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
103c0 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
103d0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
103e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
103f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
10400 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
10410 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
10420 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
10430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
10440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
10490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
104e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
10500 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
10510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
10530 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
10540 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
10550 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
10560 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
10570 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
10580 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
10590 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
105a0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
105b0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
105c0 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
105d0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
105e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
105f0 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
10600 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
10610 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
10620 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
10630 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
10640 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
10650 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
10660 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
10670 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
10680 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
10690 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
106a0 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
106b0 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
106c0 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
106d0 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
106e0 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
106f0 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
10700 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
10710 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
10720 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
10730 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
10740 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
10750 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
10760 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
10770 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
10780 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
10790 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
107a0 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
107b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
107c0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
107d0 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
107e0 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
107f0 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
10800 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
10810 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
10820 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
10830 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
10840 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
10850 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10860 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
10870 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
10880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10890 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
108a0 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
108b0 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
108c0 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
108d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
108e0 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
108f0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
10900 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
10910 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
10920 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
10930 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
10940 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
10950 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
10960 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
10970 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10980 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10990 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
109a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
109b0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
109c0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
109d0 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
109e0 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a  File(id);.}../**
109f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a00 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d  * End of the no-
10a10 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  op lock implemen
10a20 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
10a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
10a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10af0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f  ******* Begin do
10b00 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a  t-file Locking *
10b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10b30 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20  .** The dotfile 
10b40 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
10b50 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  tation uses the 
10b60 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65 70  existence of sep
10b70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69  arate lock.** fi
10b80 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69  les (really a di
10b90 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74  rectory) to cont
10ba0 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
10bb0 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
10bc0 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75  s works.** on ju
10bd0 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20 66  st about every f
10be0 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e  ilesystem imagin
10bf0 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65  able.  But there
10c00 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77   are serious dow
10c10 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  nsides:.**.**   
10c20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a   (1)  There is z
10c30 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e  ero concurrency.
10c40 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65    A single reade
10c50 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68  r blocks all oth
10c60 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  er.**         co
10c70 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72  nnections from r
10c80 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
10c90 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
10ca0 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e  **.**    (2)  An
10cb0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61   application cra
10cc0 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
10cd0 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65   can leave stale
10ce0 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20   lock files.**  
10cf0 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61         sitting a
10d00 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20  round that need 
10d10 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61  to be cleared ma
10d20 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65  nually..**.** Ne
10d30 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f  vertheless, a do
10d40 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72  tlock is an appr
10d50 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
10d60 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20  mode for use if 
10d70 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  no.** other lock
10d80 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20  ing strategy is 
10d90 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
10da0 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
10db0 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
10dc0 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f 72  ng a subdirector
10dd0 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  y in the same di
10de0 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
10df0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77  e database and w
10e00 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
10e10 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c  e but with a ".l
10e20 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61  ock" extension a
10e30 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69  dded..** The exi
10e40 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b  stence of a lock
10e50 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69   directory impli
10e60 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
10e70 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
10e80 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28  .** lock types (
10e90 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
10ea0 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
10eb0 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
10ec0 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
10ed0 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
10ee0 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
10ef0 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
10f00 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
10f10 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64  te the.** lock d
10f20 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65  irectory..*/.#de
10f30 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  fine DOTLOCK_SUF
10f40 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a  FIX ".lock"../*.
10f50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10f60 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
10f70 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
10f80 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
10f90 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
10fa0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
10fb0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
10fc0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
10fd0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
10fe0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
10ff0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
11000 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
11010 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
11020 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
11030 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
11040 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
11050 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
11060 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
11070 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ecking..**.** In
11080 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
11090 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20  , either a lock 
110a0 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65  exists or it doe
110b0 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68  s not.  So in th
110c0 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20  is.** variation 
110d0 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64  of CheckReserved
110e0 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74  Lock(), *pResOut
110f0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
11100 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69  if any lock.** i
11110 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  s held on the fi
11120 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  le and false if 
11130 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
11140 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cked..*/.static 
11150 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  int dotlockCheck
11160 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
11170 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11180 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
11190 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
111a0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
111b0 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
111c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
111d0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
111e0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
111f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11200 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
11210 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
11220 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
11230 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
11240 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
11250 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
11260 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
11270 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
11280 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
11290 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
112a0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
112b0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   or some other c
112c0 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  onnection in the
112d0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20   same process.  
112e0 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63    ** holds a loc
112f0 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  k on the file.  
11300 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  No need to check
11310 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
11320 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
11330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
11340 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  he lock is held 
11350 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74  if and only if t
11360 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73  he lockfile exis
11370 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ts */.    const 
11380 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
11390 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
113a0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
113b0 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76  text;.    reserv
113c0 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c  ed = osAccess(zL
113d0 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a  ockFile, 0)==0;.
113e0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
113f0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11400 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
11410 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
11420 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
11430 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
11440 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
11450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
11460 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
11470 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
11480 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
11490 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
114a0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
114b0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
114c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
114d0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
114e0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
114f0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
11500 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
11510 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
11520 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
11530 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
11540 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
11550 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
11560 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
11570 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
11580 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
11590 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
115a0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
115b0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
115c0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
115d0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
115e0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
115f0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
11600 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
11610 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
11620 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
11630 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
11640 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
11650 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
11660 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
11670 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
11680 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
11690 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
116a0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
116b0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
116c0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
116d0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
116e0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
116f0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
11700 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
11710 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
11720 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
11730 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
11740 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
11750 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
11760 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
11770 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
11780 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
11790 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
117a0 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
117b0 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
117c0 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
117d0 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
117e0 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
117f0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
11800 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
11810 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11820 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
11830 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11840 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11850 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
11860 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
11870 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11880 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20  ntext;.  int rc 
11890 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
118a0 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61   /* If we have a
118b0 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ny lock, then th
118c0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  e lock file alre
118d0 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c  ady exists.  All
118e0 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
118f0 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75   do is adjust ou
11900 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  r internal recor
11910 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65  d of the lock le
11920 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  vel..  */.  if( 
11930 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11940 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20   > NO_LOCK ){.  
11950 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11960 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
11970 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
11980 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
11990 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
119a0 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56  le */.#ifdef HAV
119b0 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d  E_UTIME.    utim
119c0 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  e(zLockFile, NUL
119d0 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74  L);.#else.    ut
119e0 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
119f0 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
11a00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11a10 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
11a20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
11a30 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d  e lock */.  rc =
11a40 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69   osMkdir(zLockFi
11a50 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28  le, 0777);.  if(
11a60 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   rc<0 ){.    /* 
11a70 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
11a80 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64  reate the lock d
11a90 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
11aa0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
11ab0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
11ac0 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
11ad0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11ae0 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
11af0 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
11b00 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
11b10 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
11b20 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
11b30 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
11b40 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
11b50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
11b60 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11b70 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
11b80 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
11b90 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f   rc;.  } .  .  /
11ba0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
11bb0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
11bc0 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
11bd0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
11be0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
11bf0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
11c00 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
11c10 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
11c20 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
11c30 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
11c40 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
11c50 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
11c60 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
11c70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
11c80 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
11c90 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
11ca0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
11cb0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
11cc0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
11cd0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
11ce0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
11cf0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
11d00 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
11d10 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
11d20 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
11d30 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
11d40 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
11d50 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11d60 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
11d70 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
11d80 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
11d90 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
11da0 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
11db0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
11dc0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
11dd0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
11de0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
11df0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
11e00 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
11e10 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
11e20 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
11e30 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
11e40 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11e50 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
11e60 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
11e70 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
11e80 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
11e90 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
11ea0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
11eb0 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
11ec0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
11ed0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
11ee0 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64    /* To downgrad
11ef0 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d  e to shared, sim
11f00 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69  ply update our i
11f10 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f  nternal notion o
11f20 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  f the.  ** lock 
11f30 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20  state.  No need 
11f40 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65  to mess with the
11f50 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
11f60 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
11f70 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
11f80 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
11f90 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
11fa0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  D_LOCK;.    retu
11fb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11fc0 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c  }.  .  /* To ful
11fd0 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ly unlock the da
11fe0 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74  tabase, delete t
11ff0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  he lock file */.
12000 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
12010 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ock==NO_LOCK );.
12020 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a    rc = osRmdir(z
12030 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
12040 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
12050 45 4e 4f 54 44 49 52 20 29 20 72 63 20 3d 20 6f  ENOTDIR ) rc = o
12060 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c  sUnlink(zLockFil
12070 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29  e);.  if( rc<0 )
12080 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  {.    int tErrno
12090 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
120a0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 45 4e   = 0;.    if( EN
120b0 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29  OENT != tErrno )
120c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
120d0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
120e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
120f0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
12100 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
12110 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
12120 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
12130 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
12140 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12150 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
12160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
12180 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
12190 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
121a0 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
121b0 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
121c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
121d0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
121e0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
121f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12200 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  OK;.  if( id ){.
12210 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
12220 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12230 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b  )id;.    dotlock
12240 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
12250 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  CK);.    sqlite3
12260 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
12270 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
12280 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
12290 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
122a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a  return rc;.}./**
122b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122c0 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d   End of the dot-
122d0 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  file lock implem
122e0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
122f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
12300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
12350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
123a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123b0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66  ******** Begin f
123c0 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  lock Locking ***
123d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
123f0 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63  .** Use the floc
12400 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  k() system call 
12410 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  to do file locki
12420 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  ng..**.** flock(
12430 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  ) locking is lik
12440 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69  e dot-file locki
12450 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76  ng in that the v
12460 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67  arious.** fine-g
12470 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  rain locking lev
12480 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  els supported by
12490 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c   SQLite are coll
124a0 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20  apsed into.** a 
124b0 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65  single exclusive
124c0 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72   lock.  In other
124d0 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20   words, SHARED, 
124e0 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a  RESERVED, and.**
124f0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61   PENDING locks a
12500 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  re the same thin
12510 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56  g as an EXCLUSIV
12520 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a  E lock.  SQLite.
12530 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77  ** still works w
12540 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c  hen you do this,
12550 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79   but concurrency
12560 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63   is reduced sinc
12570 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e.** only a sing
12580 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62  le process can b
12590 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  e reading the da
125a0 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65  tabase at a time
125b0 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69  ..**.** Omit thi
125c0 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c  s section if SQL
125d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
125e0 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e  NG_STYLE is turn
125f0 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20  ed off or if.** 
12600 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58  compiling for VX
12610 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51  WORKS..*/.#if SQ
12620 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
12630 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
12640 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
12650 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
12660 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
12670 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
12680 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
12690 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
126a0 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
126b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
126c0 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
126d0 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
126e0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
126f0 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
12700 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
12710 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
12720 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
12730 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
12740 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12750 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
12760 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
12770 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
12780 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
12790 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
127a0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
127b0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
127c0 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
127d0 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
127e0 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
127f0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
12800 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
12810 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
12820 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
12830 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
12840 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
12850 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
12860 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
12870 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
12880 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12890 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
128a0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
128b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
128c0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
128d0 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
128e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
128f0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
12900 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12910 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
12920 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
12930 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
12940 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12950 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
12960 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
12970 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
12980 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
12990 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
129a0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
129b0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
129c0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
129d0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
129e0 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
129f0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
12a00 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
12a10 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
12a20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
12a30 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
12a40 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
12a50 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
12a60 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
12a70 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
12a80 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
12a90 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
12aa0 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
12ab0 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
12ac0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
12ad0 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
12ae0 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
12af0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12b00 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
12b10 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
12b20 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
12b30 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
12b40 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
12b50 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
12b60 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
12b70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
12b80 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12b90 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
12ba0 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
12bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12bc0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
12bd0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
12be0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
12bf0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
12c00 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
12c10 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
12c20 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
12c30 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
12c40 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12c50 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12c60 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
12c70 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12c80 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
12c90 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
12ca0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
12cb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
12cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12cd0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
12ce0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
12cf0 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  %d %d (flock)\n"
12d00 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
12d10 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66  reserved));..#if
12d20 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
12d30 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
12d40 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
12d50 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
12d60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
12d70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12d80 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
12d90 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
12da0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
12db0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
12dc0 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
12dd0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
12de0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12df0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
12e00 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
12e10 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
12e20 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
12e30 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
12e40 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
12e50 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
12e60 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
12e70 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
12e80 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
12e90 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
12ea0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
12eb0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
12ec0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
12ed0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
12ee0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
12ef0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
12f00 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
12f10 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
12f20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
12f30 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
12f40 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
12f50 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
12f60 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
12f70 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
12f80 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
12f90 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
12fa0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
12fb0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
12fc0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
12fd0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
12fe0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
12ff0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
13000 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
13010 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
13020 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
13030 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
13040 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
13050 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
13060 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
13070 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
13080 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
13090 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
130a0 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
130b0 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
130c0 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
130d0 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
130e0 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
130f0 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
13100 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
13110 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
13120 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
13130 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
13140 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
13150 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
13160 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
13170 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
13180 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
13190 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
131a0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
131b0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
131c0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
131d0 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
131e0 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
131f0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
13200 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
13210 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
13220 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
13230 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
13240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
13250 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13260 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
13270 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13280 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
13290 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
132a0 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
132b0 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
132c0 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
132d0 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
132e0 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
132f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13300 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
13310 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13320 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
13330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13340 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
13350 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
13360 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
13370 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if (robust_flock
13380 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
13390 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
133a0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
133b0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
133c0 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
133d0 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
133e0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
133f0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
13400 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
13410 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
13420 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
13430 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
13440 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
13450 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
13460 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
13470 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
13480 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
13490 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
134a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
134b0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
134c0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
134d0 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
134e0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
134f0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
13500 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
13510 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
13520 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
13530 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
13540 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
13550 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
13560 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
13570 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
13580 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
13590 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
135a0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
135b0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
135c0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
135d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
135e0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
135f0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13600 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
13610 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
13620 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
13630 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
13640 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
13650 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
13660 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
13670 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
13680 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
13690 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
136a0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
136b0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
136c0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
136d0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
136e0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
136f0 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
13700 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
13710 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
13720 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13730 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
13740 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13750 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
13760 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
13770 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f  s %d pid=%d (flo
13780 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
13790 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
137a0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
137b0 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
137c0 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
137d0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
137e0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
137f0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
13800 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
13810 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
13820 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
13830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13840 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
13850 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
13860 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
13870 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
13880 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
13890 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
138a0 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
138b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
138c0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
138d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
138e0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
138f0 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
13900 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
13910 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
13920 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
13930 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
13940 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13950 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
13960 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
13970 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
13980 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13990 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
139a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
139b0 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
139c0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
139d0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
139e0 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
139f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
13a00 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
13a10 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
13a20 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
13a30 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
13a40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13a50 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
13a60 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f  ){.    flockUnlo
13a70 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
13a80 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
13a90 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
13aa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13ab0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13ac0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
13ad0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
13ae0 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  WORK */../******
13af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
13b00 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c  d of the flock l
13b10 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
13b20 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
13b30 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b80 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
13b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bf0 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53  ** Begin Named S
13c00 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67  emaphore Locking
13c10 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
13c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
13c30 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
13c40 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
13c50 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57  supported on VxW
13c60 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  orks..**.** Sema
13c70 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
13c80 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61   like dot-lock a
13c90 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74  nd flock in that
13ca0 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a   it really only.
13cb0 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c  ** supports EXCL
13cc0 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20  USIVE locking.  
13cd0 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  Only a single pr
13ce0 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f  ocess can read o
13cf0 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64  r write.** the d
13d00 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
13d10 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65  a time.  This re
13d20 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20  duces potential 
13d30 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74  concurrency, but
13d40 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f  .** makes the lo
13d50 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
13d60 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a  n much easier..*
13d70 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
13d80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
13d90 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
13da0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
13db0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
13dc0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
13dd0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
13de0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
13df0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
13e00 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
13e10 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
13e20 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
13e30 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
13e40 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
13e50 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
13e60 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
13e70 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
13e80 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
13e90 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
13ea0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
13eb0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68  static int semCh
13ec0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
13ed0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13ee0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
13ef0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13f00 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
13f10 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
13f20 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13f30 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
13f40 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
13f50 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
13f60 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
13f70 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
13f80 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13f90 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
13fa0 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
13fb0 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
13fc0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
13fd0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
13fe0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
13ff0 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
14000 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
14010 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
14020 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
14030 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
14040 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
14050 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f  rved ){.    sem_
14060 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
14070 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
14080 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
14090 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28  tatBuf;..    if(
140a0 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
140b0 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
140c0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
140d0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
140e0 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
140f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14100 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
14110 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
14120 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
14130 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
14140 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
14150 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
14160 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  rno;.      } els
14170 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  e {.        /* s
14180 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
14190 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65  the lock when we
141a0 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20   are in NO_LOCK 
141b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72  */.        reser
141c0 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46  ved = (pFile->eF
141d0 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44  ileLock < SHARED
141e0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
141f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14200 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76   /* we could hav
14210 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20  e it if we want 
14220 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f  it */.      sem_
14230 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20  post(pSem);.    
14240 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
14250 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
14260 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22  d %d %d (sem)\n"
14270 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
14280 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
14290 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
142a0 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
142b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
142c0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
142d0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
142e0 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
142f0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
14300 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14310 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
14320 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
14330 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
14340 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
14350 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
14360 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
14370 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
14380 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
14390 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
143a0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
143b0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
143c0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
143d0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
143e0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
143f0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
14400 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
14410 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
14420 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
14430 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
14440 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
14450 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
14460 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
14470 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
14480 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
14490 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
144a0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
144b0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
144c0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
144d0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
144e0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
144f0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
14500 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
14510 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14520 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
14530 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14540 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14550 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
14560 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d  LUSIVE.**.** Sem
14570 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c  aphore locks onl
14580 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
14590 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
145a0 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
145b0 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
145c0 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
145d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
145e0 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
145f0 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
14600 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
14610 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
14620 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
14630 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
14640 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
14650 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
14660 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
14670 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
14680 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
14690 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
146a0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
146b0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
146c0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
146d0 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28  tic int semLock(
146e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
146f0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14700 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
14710 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14720 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a  *)id;.  int fd;.
14730 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
14740 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
14750 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Sem;.  int rc = 
14760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
14770 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
14780 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
14790 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
147a0 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
147b0 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
147c0 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
147d0 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
147e0 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
147f0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
14800 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
14810 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20  eLock;.    rc = 
14820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
14830 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
14840 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f  ;.  }.  .  /* lo
14850 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77  ck semaphore now
14860 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68   but bail out wh
14870 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65  en already locke
14880 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f  d. */.  if( sem_
14890 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
148a0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
148b0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
148c0 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
148d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20  ;.  }..  /* got 
148e0 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
148f0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
14900 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
14910 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
14920 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
14930 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
14940 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
14950 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14960 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
14970 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
14980 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
14990 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
149a0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
149b0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
149c0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
149d0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
149e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
149f0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
14a00 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
14a10 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
14a20 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
14a30 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
14a40 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55  .static int semU
14a50 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
14a60 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
14a70 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
14a80 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14a90 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
14aa0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
14ab0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
14ac0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
14ad0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
14ae0 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  Sem );.  OSTRACE
14af0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
14b00 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
14b10 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
14b20 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
14b30 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
14b40 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
14b50 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
14b60 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
14b70 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
14b80 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
14b90 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
14ba0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
14bb0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
14bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14bd0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
14be0 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
14bf0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
14c00 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
14c10 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
14c20 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
14c30 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
14c40 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14c50 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
14c60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14c70 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
14c80 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
14c90 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
14ca0 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
14cb0 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
14cc0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
14cd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14ce0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
14cf0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
14d00 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
14d10 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
14d20 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
14d30 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
14d40 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
14d50 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14d60 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
14d70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
14d80 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
14d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14da0 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
14db0 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  le.. */.static i
14dc0 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69  nt semClose(sqli
14dd0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
14de0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
14df0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14e00 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14e10 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69  .    semUnlock(i
14e20 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
14e30 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
14e40 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
14e50 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65  utex();.    rele
14e60 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
14e70 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  le);.    unixLea
14e80 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63  veMutex();.    c
14e90 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
14ea0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
14eb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
14ec0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
14ed0 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64  S */./*.** Named
14ee0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
14ef0 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
14f00 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  able on VxWorks.
14f10 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
14f20 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
14f30 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
14f40 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
14f50 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
14f60 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
14f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fb0 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
14fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15000 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
15010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15020 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b  * Begin AFP Lock
15030 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
15040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15050 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20  *****.**.** AFP 
15060 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c  is the Apple Fil
15070 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41  ing Protocol.  A
15080 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20  FP is a network 
15090 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64  filesystem found
150a0 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63  .** on Apple Mac
150b0 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73  intosh computers
150c0 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20   - both OS9 and 
150d0 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64  OSX..**.** Third
150e0 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74  -party implement
150f0 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72  ations of AFP ar
15100 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  e available.  Bu
15110 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65  t this code here
15120 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  .** only works o
15130 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64  n OSX..*/..#if d
15140 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
15150 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
15160 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
15170 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f  ./*.** The afpLo
15180 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
15190 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
151a0 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
151b0 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74  cific state.*/.t
151c0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
151d0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
151e0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
151f0 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
15200 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
15210 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20  int reserved;.  
15220 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
15230 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
15240 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
15250 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  pen file */.};..
15260 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
15270 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
15280 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
15290 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
152a0 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
152b0 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
152c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
152d0 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
152e0 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
152f0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
15300 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
15310 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
15320 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
15330 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
15340 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
15350 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
15360 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
15370 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
15380 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
15390 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
153a0 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
153b0 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
153c0 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
153d0 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
153e0 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
15410 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
15420 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
15430 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
15440 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20  ngeLock2FSCTL   
15450 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20       _IOWR('z', 
15460 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
15470 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a  angeLockPB2)../*
15480 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
15490 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e  ility for settin
154a0 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20  g or clearing a 
154b0 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f  bit-range lock o
154c0 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65  n an.** AFP file
154d0 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52  system..** .** R
154e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
154f0 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
15500 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75  TE_BUSY on failu
15510 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
15520 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20  t afpSetLock(.  
15530 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
15540 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
15550 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
15560 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
15570 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  or unlocked */. 
15580 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
15590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
155a0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
155b0 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20  criptor on path 
155c0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
155d0 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20  ng long offset, 
155e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
155f0 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
15600 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
15610 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20  g long length,  
15620 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15630 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
15640 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c  .  int setLockFl
15650 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
15660 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74    /* True to set
15670 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f   lock.  False to
15680 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29   clear lock */.)
15690 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
156a0 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a  angeLockPB2 pb;.
156b0 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
156c0 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20  pb.unLockFlag = 
156d0 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20  setLockFlag ? 0 
156e0 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45  : 1;.  pb.startE
156f0 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62  ndFlag = 0;.  pb
15700 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .offset = offset
15710 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20  ;.  pb.length = 
15720 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64  length; .  pb.fd
15730 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a   = pFile->h;.  .
15740 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
15750 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20  ETLOCK [%s] for 
15760 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c  %d%s in range %l
15770 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20  lx:%llx\n", .   
15780 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f   (setLockFlag?"O
15790 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65  N":"OFF"), pFile
157a0 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f  ->h, (pb.fd==-1?
157b0 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22  "[testval-1]":""
157c0 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c  ),.    offset, l
157d0 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d  ength));.  err =
157e0 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
157f0 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
15800 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
15810 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
15820 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
15830 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
15840 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
15850 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
15860 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
15870 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
15880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
15890 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
158a0 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a  rror(tErrno)));.
158b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
158c0 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
158d0 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51  RORS.    rc = SQ
158e0 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65  LITE_BUSY;.#else
158f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15900 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
15910 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20  ror(tErrno,.    
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51  setLockFlag ? SQ
15940 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20  LITE_IOERR_LOCK 
15950 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  : SQLITE_IOERR_U
15960 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f  NLOCK);.#endif /
15970 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
15980 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  AFP_LOCK_ERRORS 
15990 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  */.    if( IS_LO
159a0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
159b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
159c0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
159d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
159e0 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  n rc;.  } else {
159f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15a00 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
15a10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15a20 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
15a30 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
15a40 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
15a50 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
15a60 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
15a70 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
15a80 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
15a90 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
15aa0 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
15ab0 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
15ac0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
15ad0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
15ae0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
15af0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
15b00 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
15b10 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
15b20 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
15b30 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
15b40 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52  ic int afpCheckR
15b50 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
15b60 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
15b70 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
15b80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15b90 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
15ba0 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
15bb0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15bc0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c  File*)id;.  afpL
15bd0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
15be0 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d  ontext;.  .  Sim
15bf0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
15c00 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15c10 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
15c20 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
15c30 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
15c40 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
15c50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
15c60 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
15c70 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e  ntext;.  if( con
15c80 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
15c90 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d  {.    *pResOut =
15ca0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
15cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
15cc0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
15cd0 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
15ce0 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
15cf0 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
15d00 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43  ads */.  .  /* C
15d10 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
15d20 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
15d30 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
15d40 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
15d50 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
15d60 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
15d70 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
15d80 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
15d90 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
15da0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
15db0 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
15dc0 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73     */.  if( !res
15dd0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
15de0 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45  lock the RESERVE
15df0 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  D byte */.    in
15e00 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f  t lrc = afpSetLo
15e10 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15e20 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
15e30 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20  VED_BYTE, 1,1); 
15e40 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45   .    if( SQLITE
15e50 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20  _OK==lrc ){.    
15e60 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65    /* if we succe
15e70 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74  eded in taking t
15e80 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
15e90 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72  , unlock it to r
15ea0 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  estore.      ** 
15eb0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  the original sta
15ec0 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  te */.      lrc 
15ed0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
15ee0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
15ef0 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
15f00 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
15f10 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
15f20 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f   if we failed to
15f30 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68   get the lock th
15f40 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  en someone else 
15f50 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a  must have it */.
15f60 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
15f70 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
15f80 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
15f90 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63  lrc) ){.      rc
15fa0 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =lrc;.    }.  }.
15fb0 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
15fc0 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
15fd0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
15fe0 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e  %d %d %d (afp)\n
15ff0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
16000 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a   reserved));.  .
16010 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
16020 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
16030 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
16040 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
16050 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
16060 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
16070 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
16080 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
16090 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
160a0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
160b0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
160c0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
160d0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
160e0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
160f0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
16100 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
16110 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
16120 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
16130 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
16140 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
16150 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
16160 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
16170 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
16180 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
16190 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
161a0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
161b0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
161c0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
161d0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
161e0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
161f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
16200 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
16210 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
16220 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
16230 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
16240 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
16250 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
16260 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
16270 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
16280 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
16290 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
162a0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
162b0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
162c0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
162d0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
162e0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
162f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
16300 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
16310 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
16320 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
16330 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
16340 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
16350 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
16360 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71  c int afpLock(sq
16370 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
16380 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
16390 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
163a0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
163b0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
163c0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
163d0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
163e0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
163f0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
16400 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
16410 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
16420 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
16430 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
16440 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
16450 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16460 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
16470 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
16480 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
16490 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
164a0 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
164b0 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
164c0 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
164d0 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
164e0 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e    azFileLock(pIn
164f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ode->eFileLock),
16500 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16510 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a   , getpid()));..
16520 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
16530 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
16540 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
16550 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
16560 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
16570 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
16580 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
16590 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
165a0 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
165b0 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
165c0 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
165d0 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
165e0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
165f0 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
16600 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
16610 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
16620 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
16630 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  d) (afp)\n", pFi
16640 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
16650 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
16660 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
16670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16680 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
16690 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
166a0 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
166b0 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57  rect.  **  (1) W
166c0 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
166d0 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
166e0 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
166f0 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
16700 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
16710 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
16720 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
16730 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
16740 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
16750 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
16760 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
16770 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
16780 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
16790 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
167a0 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
167b0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
167c0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
167d0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
167e0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
167f0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
16800 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
16810 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
16820 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16830 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  K );.  .  /* Thi
16840 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
16850 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
16860 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
16870 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
16880 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
16890 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
168a0 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
168b0 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
168c0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
168d0 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
168e0 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
168f0 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
16900 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
16910 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
16920 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
16930 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
16940 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
16950 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
16960 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
16970 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
16980 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
16990 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
169a0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  k>SHARED_LOCK)).
169b0 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d       ){.    rc =
169c0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
169d0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
169e0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
169f0 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
16a00 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
16a10 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
16a20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
16a30 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
16a40 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
16a50 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
16a60 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
16a70 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
16a80 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
16a90 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
16aa0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
16ab0 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
16ac0 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
16ad0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16ae0 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
16af0 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
16b00 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
16b10 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
16b20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16b30 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
16b40 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
16b50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
16b60 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
16b70 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
16b80 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
16b90 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
16ba0 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
16bb0 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
16bc0 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  +;.    goto afp_
16bd0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
16be0 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e    .  /* A PENDIN
16bf0 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
16c00 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
16c10 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
16c20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
16c30 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
16c40 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
16c50 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
16c60 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
16c70 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
16c80 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
16c90 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
16ca0 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
16cb0 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  | (eFileLock==EX
16cc0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
16cd0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16ce0 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
16cf0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
16d00 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d  ed;.    failed =
16d10 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16d20 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16d30 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
16d40 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20  , 1, 1);.    if 
16d50 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
16d60 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
16d70 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
16d80 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
16d90 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  .  .  /* If cont
16da0 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
16db0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
16dc0 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
16dd0 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
16de0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
16df0 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
16e00 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
16e10 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
16e20 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
16e30 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c  .    int lrc1, l
16e40 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d  rc2, lrc1Errno =
16e50 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c   0;.    long lk,
16e60 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20   mask;.    .    
16e70 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
16e80 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
16e90 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
16ea0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
16eb0 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d  ;.        .    m
16ec0 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f  ask = (sizeof(lo
16ed0 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53  ng)==8) ? LARGES
16ee0 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66  T_INT64 : 0x7fff
16ef0 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77  ffff;.    /* Now
16f00 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
16f10 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  ck SHARED_LOCK *
16f20 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
16f30 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
16f40 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
16f50 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
16f60 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
16f70 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
16f80 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61  .    pInode->sha
16f90 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20  redByte = (lk & 
16fa0 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49  mask)%(SHARED_SI
16fb0 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63  ZE - 1);.    lrc
16fc0 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  1 = afpSetLock(c
16fd0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16fe0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
16ff0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
17000 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
17010 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  e, 1, 1);.    if
17020 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17030 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c  lrc1) ){.      l
17040 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65  rc1Errno = pFile
17050 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
17060 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74   }.    /* Drop t
17070 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
17080 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
17090 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f   lrc2 = afpSetLo
170a0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
170b0 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
170c0 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
170d0 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f      .    if( IS_
170e0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
170f0 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
17100 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72  ->lastErrno = lr
17110 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  c1Errno;.      r
17120 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20  c = lrc1;.      
17130 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
17140 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
17150 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17160 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72  lrc2) ){.      r
17170 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20  c = lrc2;.      
17180 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
17190 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
171a0 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45  ( lrc1 != SQLITE
171b0 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63  _OK ) {.      rc
171c0 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65   = lrc1;.    } e
171d0 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
171e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
171f0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
17200 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
17210 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
17220 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
17230 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17240 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
17250 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
17260 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
17270 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
17280 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
17290 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
172a0 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
172b0 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20  in this.     ** 
172c0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
172d0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
172e0 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
172f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17300 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
17310 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
17320 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
17330 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
17340 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
17350 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
17360 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
17370 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
17380 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
17390 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
173a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
173b0 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
173c0 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
173d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
173e0 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b     if (eFileLock
173f0 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
17400 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
17410 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44  eLock < RESERVED
17420 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
17430 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
17440 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
17450 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
17460 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17470 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17480 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
17490 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66  , 1,1);.      if
174a0 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  ( !failed ){.   
174b0 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
174c0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
174d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
174e0 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69   (!failed && eFi
174f0 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53  leLock == EXCLUS
17500 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
17510 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
17520 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
17530 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
17540 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
17550 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
17560 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
17570 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
17580 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
17590 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
175a0 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
175b0 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
175c0 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
175d0 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
175e0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
175f0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17600 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
17610 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
17640 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20  yte, 1, 0)) ){. 
17650 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65         int faile
17660 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  d2 = SQLITE_OK;.
17670 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61          /* now a
17680 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74  ttemmpt to get t
17690 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
176a0 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  k range */.     
176b0 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
176c0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
176d0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
176e0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
176f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
17710 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20  RED_SIZE, 1);.  
17720 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64        if( failed
17730 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61   && (failed2 = a
17740 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17750 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17760 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17770 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
17780 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d  _FIRST + pInode-
17790 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
177a0 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  1)) ){.         
177b0 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61   /* Can't reesta
177c0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
177d0 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63   lock.  Sqlite c
177e0 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20  an't deal, this 
177f0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
17800 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65  a critical I/O e
17810 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
17820 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
17830 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49   ((failed & SQLI
17840 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
17850 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69  ITE_IOERR) ? fai
17860 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20  led2 : .        
17870 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
17880 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
17890 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
178a0 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  _lock;.        }
178b0 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
178c0 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
178d0 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
178e0 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
178f0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
17900 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
17910 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
17920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17930 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17940 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
17950 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
17960 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
17970 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
17980 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
17990 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
179a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
179b0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
179c0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
179d0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
179e0 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
179f0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
17a00 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
17a10 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
17a20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29    %d %s %s (afp)
17a30 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
17a40 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
17a50 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
17a60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
17a70 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
17a80 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17a90 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
17aa0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17ab0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
17ac0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
17ad0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
17ae0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
17af0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
17b00 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
17b10 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
17b20 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
17b30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
17b40 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
17b50 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
17b60 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
17b70 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
17b80 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
17b90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
17ba0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
17bb0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
17bc0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
17bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17be0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
17bf0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
17c00 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
17c10 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66  fo *pInode;.  af
17c20 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
17c30 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
17c40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
17c50 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
17c60 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b  ontext;.  int sk
17c70 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69  ipShared = 0;.#i
17c80 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
17c90 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65  .  int h = pFile
17ca0 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ->h;.#endif..  a
17cb0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
17cc0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
17cd0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
17ce0 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
17cf0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
17d00 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
17d10 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
17d20 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
17d30 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
17d40 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
17d50 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
17d60 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29          getpid()
17d70 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
17d80 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
17d90 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
17da0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
17db0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
17dc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17dd0 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
17de0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
17df0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
17e00 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
17e10 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
17e20 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
17e30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
17e40 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
17e50 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17e60 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
17e70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
17e80 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
17e90 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
17ea0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17eb0 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
17ec0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
17ed0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
17ee0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
17ef0 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
17f00 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
17f10 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
17f20 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
17f30 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
17f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17f50 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
17f60 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
17f70 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
17f80 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
17f90 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
17fa0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
17fb0 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
17fc0 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
17fd0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
17fe0 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
17ff0 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
18000 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
18010 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
18020 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
18030 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
18040 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
18050 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
18060 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
18070 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
18080 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
18090 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
180a0 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
180b0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
180c0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
180d0 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
180e0 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
180f0 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
18100 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
18110 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
18120 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31  transCntrChng==1
18130 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   );.    pFile->i
18140 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
18150 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
18160 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
18170 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
18180 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
18190 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
181a0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
181b0 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
181c0 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
181d0 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
181e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
181f0 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
18200 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
18210 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20  ode->nShared>1) 
18220 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e  ){.        /* on
18230 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  ly re-establish 
18240 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
18250 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
18260 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72          int shar
18270 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
18280 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
18290 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
182a0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
182b0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
182c0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
182d0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
182e0 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73   1);.      } els
182f0 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70  e {.        skip
18300 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
18310 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18320 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18330 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
18340 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
18350 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18360 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18370 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18380 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
18390 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20   1, 0);.    } . 
183a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
183b0 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
183c0 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  FileLock>=RESERV
183d0 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65  ED_LOCK && conte
183e0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
183f0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18400 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18410 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
18420 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
18430 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  0);.      if( !r
18440 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f  c ){ .        co
18450 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
18460 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  = 0; .      }.  
18470 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
18480 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
18490 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
184a0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
184b0 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20  nShared>1)){.   
184c0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
184d0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
184e0 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  CK;.    }.  }.  
184f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18500 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K && eFileLock==
18510 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20  NO_LOCK ){..    
18520 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
18530 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
18540 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
18550 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
18560 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
18570 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
18580 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
18590 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
185a0 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
185b0 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
185c0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
185d0 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f  ng long sharedLo
185e0 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
185f0 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
18600 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49  aredByte;.    pI
18610 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
18620 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
18630 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
18640 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18650 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
18660 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18670 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
18680 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18690 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
186a0 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68       if( !skipSh
186b0 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ared ){.        
186c0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
186d0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
186e0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
186f0 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
18700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18710 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
18720 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
18730 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
18740 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
18750 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
18760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18770 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49  E_OK ){.      pI
18790 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
187a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
187b0 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
187c0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
187d0 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
187e0 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64         closePend
187f0 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
18800 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18810 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
18820 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
18830 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
18840 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
18850 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
18860 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18870 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
18880 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
18890 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
188a0 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
188b0 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71   int afpClose(sq
188c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
188d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
188e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
188f0 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
18900 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
18910 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70  ile*)id;.    afp
18920 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
18930 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  CK);.    unixEnt
18940 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69  erMutex();.    i
18950 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
18960 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   && pFile->pInod
18970 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
18980 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
18990 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
189a0 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
189b0 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
189c0 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
189d0 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
189e0 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
189f0 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
18a00 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
18a10 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
18a20 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
18a30 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
18a40 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
18a50 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
18a60 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  n.      ** the l
18a70 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
18a80 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
18a90 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64      setPendingFd
18aa0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
18ab0 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49     releaseInodeI
18ac0 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nfo(pFile);.    
18ad0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
18ae0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
18af0 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  xt);.    rc = cl
18b00 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
18b10 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
18b20 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tex();.  }.  ret
18b30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
18b40 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
18b50 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
18b60 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18b70 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
18b80 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
18b90 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  s the AFP lock i
18ba0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
18bb0 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
18bc0 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
18bd0 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
18be0 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
18bf0 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
18c00 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
18c10 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49  is available.  I
18c20 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70  f you don't comp
18c30 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74  ile for a mac, t
18c40 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66  hen the "unix-af
18c50 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74  p".** VFS is not
18c60 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
18c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c80 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
18c90 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
18ca0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
18cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
18d10 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
18d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
18d80 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n NFS Locking **
18d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
18db0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
18dc0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
18dd0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18de0 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f  _STYLE./*. ** Lo
18df0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
18e00 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
18e10 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
18e20 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
18e30 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74  ileLock. ** must
18e40 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
18e50 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
18e60 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68  K.. **. ** If th
18e70 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
18e80 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
18e90 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
18ea0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a  y at or below. *
18eb0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
18ec0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
18ed0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18ee0 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74   no-op.. */.stat
18ef0 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b  ic int nfsUnlock
18f00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
18f10 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
18f20 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  ){.  return posi
18f30 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
18f40 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65  eLock, 1);.}..#e
18f50 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
18f60 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
18f70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
18f80 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
18f90 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
18fa0 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63  e is the NFS loc
18fb0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
18fc0 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
18fd0 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
18fe0 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
18ff0 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
19000 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
19010 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
19020 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
19030 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    .**.**********
19040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
19050 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  of the NFS lock 
19060 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
19070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19080 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
19090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190d0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
190e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19120 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
19130 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b  ******* Non-lock
19140 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ing sqlite3_file
19150 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
19160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19170 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
19180 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63   next division c
19190 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e  ontains implemen
191a0 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  tations for all 
191b0 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a  methods of the .
191c0 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
191d0 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61  object other tha
191e0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  n the locking me
191f0 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b  thods.  The lock
19200 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77  ing.** methods w
19210 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64  ere defined in d
19220 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28  ivisions above (
19230 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  one locking meth
19240 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69  od per.** divisi
19250 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68  on).  Those meth
19260 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ods that are com
19270 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
19280 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20  ng modes.** are 
19290 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20  gather together 
192a0 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69  into this divisi
192b0 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  on..*/../*.** Se
192c0 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
192d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
192e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
192f0 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a  then read cnt .*
19300 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  * bytes into pBu
19310 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  f. Return the nu
19320 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
19330 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a  tually read..**.
19340 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64  ** NB:  If you d
19350 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20  efine USE_PREAD 
19360 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20  or USE_PREAD64, 
19370 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c  then it might al
19380 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  so.** be necessa
19390 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  ry to define _XO
193a0 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65  PEN_SOURCE to be
193b0 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69   500.  This vari
193c0 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73  es from.** one s
193d0 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72  ystem to another
193e0 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20  .  Since SQLite 
193f0 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20  does not define 
19400 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79  USE_PREAD.** any
19410 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66   any form by def
19420 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f  ault, we will no
19430 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66  t attempt to def
19440 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
19450 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74  E..** See ticket
19460 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38  s #2741 and #268
19470 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  1..**.** To avoi
19480 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
19490 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
194a0 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20  failed read the 
194b0 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
194c0 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
194d0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
194e0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
194f0 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a  dRead(unixFile *
19500 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
19510 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a  4 offset, void *
19520 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
19530 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74    int got;.  int
19540 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20   prior = 0;.#if 
19550 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
19560 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
19570 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
19580 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
19590 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
195a0 54 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20  TART;.  assert( 
195b0 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66  cnt==(cnt&0x1fff
195c0 66 29 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30  f) );.  cnt &= 0
195d0 78 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69  x1ffff;.  do{.#i
195e0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
195f0 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  EAD).    got = o
19600 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  sPread(id->h, pB
19610 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
19620 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
19630 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
19640 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
19650 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
19660 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36    got = osPread6
19670 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
19680 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
19690 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
196a0 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
196b0 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  lse.    newOffse
196c0 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
196d0 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
196e0 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
196f0 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
19700 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20  et-- );.    if( 
19710 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
19720 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  t ){.      if( n
19730 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29  ewOffset == -1 )
19740 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78  {.        ((unix
19750 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
19760 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
19770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19780 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
19790 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
197a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
197b0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
197c0 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65  }.    got = osRe
197d0 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
197e0 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  cnt);.#endif.   
197f0 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20   if( got==cnt ) 
19800 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67  break;.    if( g
19810 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ot<0 ){.      if
19820 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  ( errno==EINTR )
19830 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69  { got = 1; conti
19840 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69  nue; }.      pri
19850 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 28  or = 0;.      ((
19860 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
19870 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
19880 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19890 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74     }else if( got
198a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20  >0 ){.      cnt 
198b0 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66  -= got;.      of
198c0 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20  fset += got;.   
198d0 20 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b     prior += got;
198e0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76  .      pBuf = (v
198f0 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61  oid*)(got + (cha
19900 72 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a  r*)pBuf);.    }.
19910 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20    }while( got>0 
19920 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  );.  TIMER_END;.
19930 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
19940 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c      %-3d %5d %7l
19950 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20  ld %llu\n",.    
19960 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67          id->h, g
19970 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74  ot+prior, offset
19980 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c  -prior, TIMER_EL
19990 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72  APSED));.  retur
199a0 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a  n got+prior;.}..
199b0 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
199c0 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f  from a file into
199d0 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75   a buffer.  Retu
199e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
199f0 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72  all.** bytes wer
19a00 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  e read successfu
19a10 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  lly and SQLITE_I
19a20 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67  OERR if anything
19a30 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a   goes.** wrong..
19a40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
19a50 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  ixRead(.  sqlite
19a60 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76  3_file *id, .  v
19a70 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
19a80 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
19a90 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b  _int64 offset.){
19aa0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
19ab0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
19ac0 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  )id;.  int got;.
19ad0 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
19ae0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
19af0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
19b00 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20   amt>0 );..  /* 
19b10 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
19b20 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
19b30 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
19b40 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
19b50 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
19b60 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
19b70 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
19b80 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
19b90 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
19ba0 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
19bb0 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d   pFile->pUnused=
19bc0 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
19bd0 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
19be0 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
19bf0 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
19c00 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
19c10 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
19c20 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
19c30 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
19c40 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
19c50 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
19c60 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
19c70 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
19c80 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
19c90 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
19ca0 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
19cb0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
19cc0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
19cd0 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
19ce0 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
19cf0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
19d00 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
19d10 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
19d20 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
19d30 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
19d40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19d60 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c  int nCopy = pFil
19d70 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
19d80 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fset;.      memc
19d90 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
19da0 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
19db0 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e  ion))[offset], n
19dc0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
19dd0 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
19de0 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
19df0 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
19e00 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
19e10 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
19e20 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73  endif..  got = s
19e30 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
19e40 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
19e50 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
19e60 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
19e70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19e80 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
19e90 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
19ea0 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
19eb0 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
19ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
19ed0 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
19ee0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
19ef0 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
19f00 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
19f10 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
19f20 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
19f30 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
19f40 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
19f50 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
19f60 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
19f70 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
19f80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
19f90 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
19fa0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
19fb0 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66  pt to seek the f
19fc0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
19fd0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
19fe0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a  st argument to.*
19ff0 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65  * absolute offse
1a000 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74  t iOff, then att
1a010 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42  empt to write nB
1a020 75 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  uf bytes of data
1a030 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f   from.** pBuf to
1a040 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72   it. If an error
1a050 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1a060 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72  -1 and set *piEr
1a070 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rno. Otherwise, 
1a080 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61  .** return the a
1a090 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ctual number of 
1a0a0 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77  bytes written (w
1a0b0 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73  hich may be less
1a0c0 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a   than.** nBuf)..
1a0d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1a0e0 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20  ekAndWriteFd(.  
1a0f0 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20  int fd,         
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1a120 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  or to write to *
1a130 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20  /.  i64 iOff,   
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a150 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73      /* File offs
1a160 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  et to begin writ
1a170 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73  ing at */.  cons
1a180 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
1a190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1a1a0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
1a1b0 69 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65  is buffer to the
1a1c0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
1a1d0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1a1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1a1f0 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75  ze of buffer pBu
1a200 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  f in bytes */.  
1a210 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20  int *piErrno    
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75  /* OUT: Error nu
1a240 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63  mber if error oc
1a250 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  curs */.){.  int
1a260 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a280 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1a290 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  y system call */
1a2a0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66  ..  assert( nBuf
1a2b0 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29  ==(nBuf&0x1ffff)
1a2c0 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78   );.  nBuf &= 0x
1a2d0 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53  1ffff;.  TIMER_S
1a2e0 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e  TART;..#if defin
1a2f0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
1a300 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72 69 74  do{ rc = osPwrit
1a310 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1a320 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28  , iOff); }while(
1a330 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1a340 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64  EINTR );.#elif d
1a350 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1a360 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f  64).  do{ rc = o
1a370 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42  sPwrite64(fd, pB
1a380 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1a390 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1a3a0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23  errno==EINTR);.#
1a3b0 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69  else.  do{.    i
1a3c0 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b  64 iSeek = lseek
1a3d0 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f  (fd, iOff, SEEK_
1a3e0 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
1a3f0 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b  teIOError( iSeek
1a400 2d 2d 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  -- );..    if( i
1a410 53 65 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20 20  Seek!=iOff ){.  
1a420 20 20 20 20 69 66 28 20 70 69 45 72 72 6e 6f 20      if( piErrno 
1a430 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69 53  ) *piErrno = (iS
1a440 65 65 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f 20  eek==-1 ? errno 
1a450 3a 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  : 0);.      retu
1a460 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1a470 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
1a480 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , pBuf, nBuf);. 
1a490 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1a4a0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1a4b0 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52  .#endif..  TIMER
1a4c0 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1a4d0 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
1a4e0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1a4f0 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20  , fd, rc, iOff, 
1a500 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
1a510 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20  ..  if( rc<0 && 
1a520 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72  piErrno ) *piErr
1a530 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65  no = errno;.  re
1a540 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1a550 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
1a560 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
1a570 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
1a580 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
1a590 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
1a5a0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1a5b0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
1a5c0 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
1a5d0 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
1a5e0 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
1a5f0 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
1a600 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
1a610 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
1a620 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
1a630 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1a640 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1a650 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
1a660 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
1a670 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
1a680 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
1a690 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57   return seekAndW
1a6a0 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66  riteFd(id->h, of
1a6b0 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c  fset, pBuf, cnt,
1a6c0 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29   &id->lastErrno)
1a6d0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
1a6e0 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
1a6f0 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
1a700 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1a710 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
1a720 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
1a730 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
1a740 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1a750 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
1a760 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1a770 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
1a780 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1a790 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1a7a0 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
1a7b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1a7c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1a7d0 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  d;.  int wrote =
1a7e0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
1a7f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1a800 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1a810 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1a820 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1a830 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1a840 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1a850 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1a860 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1a870 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1a880 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1a890 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1a8a0 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1a8b0 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
1a8c0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1a8d0 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1a8e0 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1a8f0 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1a900 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1a910 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1a920 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20  E_DEBUG.  /* If 
1a930 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
1a940 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
1a950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1a960 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
1a970 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1a980 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1a990 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1a9a0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1a9b0 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
1a9c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1a9d0 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
1a9e0 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
1a9f0 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
1aa00 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
1aa10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1aa20 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
1aa30 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
1aa40 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
1aa50 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
1aa60 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
1aa70 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
1aa80 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
1aa90 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1aaa0 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
1aab0 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
1aac0 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
1aad0 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
1aae0 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
1aaf0 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
1ab00 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1ab10 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1ab20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
1ab30 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
1ab40 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
1ab50 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1ab60 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1ab70 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
1ab80 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
1ab90 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
1aba0 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
1abb0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1abc0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1abd0 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
1abe0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1abf0 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
1ac00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ac10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1ac20 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1ac30 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1ac40 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1ac50 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
1ac60 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1ac70 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1ac80 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1ac90 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1aca0 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1acb0 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1acc0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1acd0 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1ace0 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1acf0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1ad00 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1ad10 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1ad20 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1ad30 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
1ad40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ad50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ad60 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1ad70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1ad80 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1ad90 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1ada0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1adb0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1adc0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1add0 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1ade0 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1adf0 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1ae00 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1ae10 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1ae20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c  }.#endif..  whil
1ae30 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f  e( amt>0 && (wro
1ae40 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1ae50 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1ae60 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
1ae70 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
1ae80 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b  te;.    offset +
1ae90 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
1aea0 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
1aeb0 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
1aec0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1aed0 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
1aee0 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
1aef0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1af00 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
1af10 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74  1 ));..  if( amt
1af20 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  >0 ){.    if( wr
1af30 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e  ote<0 && pFile->
1af40 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50  lastErrno!=ENOSP
1af50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  C ){.      /* la
1af60 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1af70 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1af80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1af90 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1afa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1afb0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1afc0 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20  o = 0; /* not a 
1afd0 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1afe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1aff0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1b000 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1b010 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
1b020 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
1b030 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1b040 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
1b050 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
1b060 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
1b070 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
1b080 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
1b090 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
1b0a0 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
1b0b0 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
1b0c0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1b0d0 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
1b0e0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
1b0f0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
1b100 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20  /*.** We do not 
1b110 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f  trust systems to
1b120 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69   provide a worki
1b130 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20  ng fdatasync(). 
1b140 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68   Some do..** Oth
1b150 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62  ers do no.  To b
1b160 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20  e safe, we will 
1b170 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28  stick with the (
1b180 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29  slightly slower)
1b190 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20  .** fsync(). If 
1b1a0 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f  you know that yo
1b1b0 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  ur system does s
1b1c0 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63  upport fdatasync
1b1d0 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a  () correctly,.**
1b1e0 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d   then simply com
1b1f0 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74  pile with -Dfdat
1b200 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a  async=fdatasync.
1b210 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1b220 66 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66  fdatasync).# def
1b230 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73  ine fdatasync fs
1b240 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ync.#endif../*.*
1b250 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55  * Define HAVE_FU
1b260 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20  LLFSYNC to 0 or 
1b270 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  1 depending on w
1b280 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
1b290 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   the F_FULLFSYNC
1b2a0 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
1b2b0 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  d.  F_FULLFSYNC 
1b2c0 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
1b2d0 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
1b2e0 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74  n Mac OS X.  But
1b2f0 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e   that could chan
1b300 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f  ge..*/.#ifdef F_
1b310 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69  FULLFSYNC.# defi
1b320 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1b330 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  C 1.#else.# defi
1b340 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1b350 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  C 0.#endif.../*.
1b360 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73  ** The fsync() s
1b370 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20  ystem call does 
1b380 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65  not work as adve
1b390 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a  rtised on many.*
1b3a0 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20  * unix systems. 
1b3b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
1b3c0 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61  rocedure is an a
1b3d0 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a  ttempt to make.*
1b3e0 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72  * it work better
1b3f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1b400 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f  TE_NO_SYNC macro
1b410 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73   disables all fs
1b420 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73  ync()s.  This is
1b430 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74   useful.** for t
1b440 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77  esting when we w
1b450 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75  ant to run throu
1b460 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74  gh the test suit
1b470 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f  e quickly..** Yo
1b480 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61  u are strongly a
1b490 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20  dvised *not* to 
1b4a0 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49  deploy with SQLI
1b4b0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e  TE_NO_SYNC.** en
1b4c0 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20  abled, however, 
1b4d0 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54  since with SQLIT
1b4e0 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65  E_NO_SYNC enable
1b4f0 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a  d, an OS crash.*
1b500 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
1b510 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63  re will likely c
1b520 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62  orrupt the datab
1b530 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1b540 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20  SQLite sets the 
1b550 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66  dataOnly flag if
1b560 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b570 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67   file is unchang
1b580 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20  ed..** The idea 
1b590 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20  behind dataOnly 
1b5a0 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  is that it shoul
1b5b0 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65  d only write the
1b5c0 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a   file content.**
1b5d0 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68   to disk, not th
1b5e0 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c  e inode.  We onl
1b5f0 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69  y set dataOnly i
1b600 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  f the file size 
1b610 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  is .** unchanged
1b620 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20   since the file 
1b630 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20  size is part of 
1b640 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65  the inode.  Howe
1b650 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27  ver, .** Ted Ts'
1b660 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20  o tells us that 
1b670 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
1b680 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20   also write the 
1b690 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20  inode if the.** 
1b6a0 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68  file size has ch
1b6b0 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79  anged.  The only
1b6c0 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65   real difference
1b6d0 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79   between fdatasy
1b6e0 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e  nc().** and fsyn
1b6f0 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75  c(), Ted tells u
1b700 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61  s, is that fdata
1b710 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20  sync() will not 
1b720 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f  flush the.** ino
1b730 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20  de if the mtime 
1b740 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65  or owner or othe
1b750 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74  r inode attribut
1b760 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e  es have changed.
1b770 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65  .** We only care
1b780 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
1b790 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74  size, not the ot
1b7a0 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75  her file attribu
1b7b0 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61  tes, so.** as fa
1b7c0 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63  r as SQLite is c
1b7d0 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61  oncerned, an fda
1b7e0 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61  tasync() is alwa
1b7f0 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20  ys adequate..** 
1b800 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  So, we always us
1b810 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66  e fdatasync() if
1b820 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
1b830 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a  , regardless of.
1b840 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1b850 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
1b860 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1b870 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20   full_fsync(int 
1b880 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  fd, int fullSync
1b890 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
1b8a0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1b8b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22   The following "
1b8c0 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f  ifdef/elif/else/
1b8d0 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20  " block has the 
1b8e0 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61  same structure a
1b8f0 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62  s.  ** the one b
1b900 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c  elow. It is repl
1b910 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65  icated here sole
1b920 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74  ly to avoid clut
1b930 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20  tering .  ** up 
1b940 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69  the real code wi
1b950 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41  th the UNUSED_PA
1b960 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73  RAMETER() macros
1b970 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1b980 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55  LITE_NO_SYNC.  U
1b990 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b9a0 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
1b9b0 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
1b9c0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1b9d0 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1b9e0 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
1b9f0 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  FSYNC.  UNUSED_P
1ba00 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1ba10 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  y);.#else.  UNUS
1ba20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
1ba30 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
1ba40 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1ba50 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nly);.#endif..  
1ba60 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75  /* Record the nu
1ba70 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
1ba80 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61  at we do a norma
1ba90 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20  l fsync() and . 
1baa0 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54   ** FULLSYNC.  T
1bab0 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69  his is used duri
1bac0 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65  ng testing to ve
1bad0 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70  rify that this p
1bae0 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65  rocedure.  ** ge
1baf0 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  ts called with t
1bb00 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d  he correct argum
1bb10 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ents..  */.#ifde
1bb20 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1bb30 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73  if( fullSync ) s
1bb40 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
1bb50 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74  count++;.  sqlit
1bb60 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
1bb70 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1bb80 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
1bb90 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
1bba0 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
1bbb0 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
1bbc0 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
1bbd0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1bbe0 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  NC.  rc = SQLITE
1bbf0 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  _OK;.#elif HAVE_
1bc00 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20  FULLFSYNC.  if( 
1bc10 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
1bc20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c  rc = osFcntl(fd,
1bc30 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
1bc40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1bc50 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
1bc60 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
1bc70 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
1bc80 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
1bc90 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a   an fsync()..  *
1bca0 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
1bcb0 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
1bcc0 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
1bcd0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
1bce0 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20   ** file system 
1bcf0 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
1bd00 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
1bd10 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
1bd20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74  ** isn't support
1bd30 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
1bd40 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
1bd50 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
1bd60 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77   ** and (for now
1bd70 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
1bd80 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
1bd90 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
1bda0 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62  l.  .  ** It'd b
1bdb0 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
1bdc0 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
1bdd0 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
1bde0 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63  oid .  ** the fc
1bdf0 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
1be00 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
1be10 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ed..  */.  if( r
1be20 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66  c ) rc = fsync(f
1be30 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e  d);..#elif defin
1be40 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1be50 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f  /* fdatasync() o
1be60 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79  n HFS+ doesn't y
1be70 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c  et flush the fil
1be80 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61  e size if it cha
1be90 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  nged correctly. 
1bea0 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79   ** so currently
1beb0 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74   we default to t
1bec0 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65  he macro that re
1bed0 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e  defines fdatasyn
1bee0 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a  c to fsync.  */.
1bef0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1bf00 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20  ;.#else .  rc = 
1bf10 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23  fdatasync(fd);.#
1bf20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1bf30 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72  if( rc==-1 && er
1bf40 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a  rno==ENOTSUP ){.
1bf50 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
1bf60 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
1bf70 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1bf80 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
1bf90 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1bfa0 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1bfb0 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f  NC */..  if( OS_
1bfc0 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20  VXWORKS && rc!= 
1bfd0 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  -1 ){.    rc = 0
1bfe0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1bff0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
1c000 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
1c010 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
1c020 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
1c030 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
1c040 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1c050 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1c060 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
1c070 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
1c080 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1c090 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
1c0a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
1c0b0 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
1c0c0 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
1c0d0 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
1c0e0 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
1c0f0 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
1c100 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
1c110 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  ** The directory
1c120 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c130 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c   is used for onl
1c140 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f  y one thing - to
1c150 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69  .** fsync() a di
1c160 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20  rectory to make 
1c170 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69  sure file creati
1c180 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20  on and deletion 
1c190 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c  events.** are fl
1c1a0 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ushed to disk.  
1c1b0 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20  Such fsyncs are 
1c1c0 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65  not needed on ne
1c1d0 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e  wer.** journalin
1c1e0 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62  g filesystems, b
1c1f0 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ut are required 
1c200 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73  on older filesys
1c210 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tems..**.** This
1c220 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1c230 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67  overridden using
1c240 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c   the xSetSysCall
1c250 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54   interface..** T
1c260 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76  he ability to ov
1c270 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74  erride this rout
1c280 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e  ine was added in
1c290 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a   support of the.
1c2a0 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  ** chromium sand
1c2b0 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20  box.  Opening a 
1c2c0 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73  directory is a s
1c2d0 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65  ecurity risk (we
1c2e0 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f   are.** told) so
1c2f0 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72   making it overr
1c300 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74  ideable allows t
1c310 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  he chromium sand
1c320 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63  box to.** replac
1c330 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1c340 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e  ith a harmless n
1c350 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74  o-op.  To make t
1c360 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
1c370 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20   no-op, replace 
1c380 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74  it with a stub t
1c390 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49  hat returns SQLI
1c3a0 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73  TE_OK but leaves
1c3b0 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20  .** *pFd set to 
1c3c0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1c3d0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  r..**.** If SQLI
1c3e0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1c3f0 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  d, the caller is
1c400 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1c410 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20   closing.** the 
1c420 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1c430 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65  *pFd using close
1c440 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1c450 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
1c460 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1c470 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29  ename, int *pFd)
1c480 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
1c490 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61  t fd = -1;.  cha
1c4a0 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50  r zDirname[MAX_P
1c4b0 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73  ATHNAME+1];..  s
1c4c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1c4d0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44  MAX_PATHNAME, zD
1c4e0 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46  irname, "%s", zF
1c4f0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ilename);.  for(
1c500 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  ii=(int)strlen(z
1c510 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26  Dirname); ii>1 &
1c520 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d  & zDirname[ii]!=
1c530 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66  '/'; ii--);.  if
1c540 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44  ( ii>0 ){.    zD
1c550 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30  irname[ii] = '\0
1c560 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ';.    fd = robu
1c570 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65  st_open(zDirname
1c580 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
1c590 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ARY, 0);.    if(
1c5a0 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
1c5b0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49  OSTRACE(("OPENDI
1c5c0 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
1c5d0 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20  , zDirname));.  
1c5e0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d    }.  }.  *pFd =
1c5f0 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
1c600 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75  d>=0?SQLITE_OK:u
1c610 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1c620 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1c630 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61  , "open", zDirna
1c640 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  me));.}../*.** M
1c650 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
1c660 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
1c670 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
1c680 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
1c690 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
1c6a0 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
1c6b0 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
1c6c0 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
1c6d0 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
1c6e0 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
1c6f0 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
1c700 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
1c710 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
1c720 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
1c730 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
1c740 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
1c750 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
1c760 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1c770 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
1c780 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
1c790 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
1c7a0 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1c7b0 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
1c7c0 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
1c7d0 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
1c7e0 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
1c7f0 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
1c800 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
1c810 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1c820 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
1c830 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
1c840 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
1c850 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
1c860 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
1c870 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
1c880 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1c890 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1c8a0 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1c8b0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1c8c0 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
1c8d0 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
1c8e0 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
1c8f0 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
1c900 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
1c910 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1c920 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
1c930 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
1c940 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1c950 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
1c960 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
1c970 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1c980 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
1c990 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
1c9a0 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
1c9b0 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
1c9c0 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
1c9d0 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1c9e0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
1c9f0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1ca00 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
1ca10 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
1ca20 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
1ca30 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
1ca40 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1ca50 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
1ca60 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
1ca70 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1ca80 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
1ca90 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
1caa0 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
1cab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1cac0 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
1cad0 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
1cae0 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
1caf0 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
1cb00 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
1cb10 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1cb20 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1cb30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1cb40 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
1cb50 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1cb60 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE(("SYNC    %-
1cb70 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
1cb80 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
1cb90 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
1cba0 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
1cbb0 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
1cbc0 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1cbd0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1cbe0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1cbf0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1cc00 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1cc10 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1cc20 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1cc30 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1cc40 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ath);.  }..  /* 
1cc50 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64  Also fsync the d
1cc60 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1cc70 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20  ing the file if 
1cc80 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67  the DIRSYNC flag
1cc90 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54  .  ** is set.  T
1cca0 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d  his is a one-tim
1ccb0 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d  e occurrence.  M
1ccc0 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61  any systems (exa
1ccd0 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a  mples: AIX).  **
1cce0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66   are unable to f
1ccf0 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79  sync a directory
1cd00 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f  , so ignore erro
1cd10 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e  rs on the fsync.
1cd20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1cd30 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1cd40 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
1cd50 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64  ){.    int dirfd
1cd60 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
1cd70 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65  DIRSYNC %s (have
1cd80 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
1cd90 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
1cda0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20  File->zPath,.   
1cdb0 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
1cdc0 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
1cdd0 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync));.    rc = 
1cde0 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
1cdf0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64  pFile->zPath, &d
1ce00 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
1ce10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ce20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
1ce30 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72    full_fsync(dir
1ce40 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
1ce50 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1ce60 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49  ile, dirfd, __LI
1ce70 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
1ce80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ce90 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
1cea0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ceb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1cec0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1ced0 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e  ~UNIXFILE_DIRSYN
1cee0 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
1cef0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
1cf00 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
1cf10 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
1cf20 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
1cf30 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1cf40 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1cf50 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
1cf60 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1cf70 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1cf80 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  id;.  int rc;.  
1cf90 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1cfa0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1cfb0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1cfc0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1cfd0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1cfe0 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
1cff0 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
1d000 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
1d010 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1d020 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
1d030 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
1d040 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
1d050 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
1d060 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
1d070 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
1d080 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
1d090 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
1d0a0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
1d0b0 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
1d0c0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
1d0d0 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
1d0e0 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
1d0f0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1d100 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
1d110 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1d120 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63  Chunk;.  }..  rc
1d130 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63   = robust_ftrunc
1d140 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f  ate(pFile->h, (o
1d150 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69  ff_t)nByte);.  i
1d160 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
1d170 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1d180 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1d190 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1d1a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1d1b0 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1d1c0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1d1d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
1d1e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d1f0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1d200 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
1d210 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
1d220 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
1d230 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  sed to.    ** do
1d240 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1d250 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1d260 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1d270 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1d280 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61      ** normal da
1d290 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64  tabase file) and
1d2a0 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65   we truncate the
1d2b0 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1d2c0 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61  ngth,.    ** tha
1d2d0 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70  t effectively up
1d2e0 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1d2f0 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
1d300 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20  might happen.   
1d310 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69   ** when restori
1d320 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73  ng a database us
1d330 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41  ing the backup A
1d340 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c  PI from a zero-l
1d350 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75  ength.    ** sou
1d360 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rce..    */.    
1d370 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1d380 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74  malWrite && nByt
1d390 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  e==0 ){.      pF
1d3a0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1d3b0 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  ng = 1;.    }.#e
1d3c0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
1d3d0 74 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73  the file was jus
1d3e0 74 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61  t truncated to a
1d3f0 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68   size smaller th
1d400 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  an the currently
1d410 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72  .    ** mapped r
1d420 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68  egion, reduce th
1d430 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70  e effective mapp
1d440 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c  ing size as well
1d450 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20  . SQLite will.  
1d460 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20    ** use read() 
1d470 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61  and write() to a
1d480 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e  ccess data beyon
1d490 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f  d this point fro
1d4a0 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20  m now on.  .    
1d4b0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  */.    if( nByte
1d4c0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
1d4d0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1d4e0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74  >mmapSize = nByt
1d4f0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  e;.    }..    re
1d500 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d510 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74    }.}../*.** Det
1d520 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
1d530 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
1d540 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
1d550 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1d560 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
1d570 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69  le *id, i64 *pSi
1d580 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ze){.  int rc;. 
1d590 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1d5a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
1d5b0 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
1d5c0 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
1d5d0 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69  ->h, &buf);.  Si
1d5e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1d5f0 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21  c=1 );.  if( rc!
1d600 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  =0 ){.    ((unix
1d610 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
1d620 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1d630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d640 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
1d650 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
1d660 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57  st_size;..  /* W
1d670 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65  hen opening a ze
1d680 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65  ro-size database
1d690 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49  , the findInodeI
1d6a0 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
1d6b0 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
1d6c0 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
1d6d0 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
1d6e0 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
1d6f0 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
1d700 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
1d710 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
1d720 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
1d730 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
1d740 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
1d750 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
1d760 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
1d770 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
1d780 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
1d790 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
1d7a0 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
1d7b0 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
1d7c0 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
1d7d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d7e0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
1d7f0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1d800 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1d810 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
1d820 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
1d830 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
1d840 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
1d850 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
1d860 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
1d870 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
1d880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d890 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1d8a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
1d8b0 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
1d8c0 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  f../* .** This f
1d8d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1d8e0 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
1d8f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1d900 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d  E_HINT .** file-
1d910 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f  control operatio
1d920 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20  n.  Enlarge the 
1d930 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74  database to nByt
1d940 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72  es in size.** (r
1d950 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
1d960 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65   next chunk-size
1d970 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  ).  If the datab
1d980 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  ase is already.*
1d990 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67  * nBytes or larg
1d9a0 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  er, this routine
1d9b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1d9c0 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c  static int fcntl
1d9d0 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c  SizeHint(unixFil
1d9e0 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42  e *pFile, i64 nB
1d9f0 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c  yte){.  if( pFil
1da00 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1da10 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20      i64 nSize;  
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da30 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69    /* Required fi
1da40 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
1da50 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20  truct stat buf; 
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da70 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74  Used to hold ret
1da80 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73  urn values of fs
1da90 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20  tat() */.   .   
1daa0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69   if( osFstat(pFi
1dab0 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20 72  le->h, &buf) ) r
1dac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1dad0 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20 6e  RR_FSTAT;..    n
1dae0 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70  Size = ((nByte+p
1daf0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29  File->szChunk-1)
1db00 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   / pFile->szChun
1db10 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
1db20 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  unk;.    if( nSi
1db30 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73  ze>(i64)buf.st_s
1db40 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69  ize ){..#if defi
1db50 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
1db60 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
1db70 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
1db80 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  E.      /* The c
1db90 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e  ode below is han
1dba0 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  dling the return
1dbb0 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c   value of osFall
1dbc0 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a  ocate() .      *
1dbd0 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73  * correctly. pos
1dbe0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69  ix_fallocate() i
1dbf0 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65  s defined to "re
1dc00 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75  turns zero on su
1dc10 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a  ccess, .      **
1dc20 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d   or an error num
1dc30 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22  ber on  failure"
1dc40 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67  . See the manpag
1dc50 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  e for details. *
1dc60 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b  /.      int err;
1dc70 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
1dc80 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f     err = osFallo
1dc90 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62  cate(pFile->h, b
1dca0 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a  uf.st_size, nSiz
1dcb0 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a  e-buf.st_size);.
1dcc0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72        }while( er
1dcd0 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  r==EINTR );.    
1dce0 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74 75    if( err ) retu
1dcf0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1dd00 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20  WRITE;.#else.   
1dd10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20     /* If the OS 
1dd20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f  does not have po
1dd30 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c  six_fallocate(),
1dd40 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74 20   fake it. First 
1dd50 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74 72  use.      ** ftr
1dd60 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74 20  uncate() to set 
1dd70 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 74  the file size, t
1dd80 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e 67  hen write a sing
1dd90 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20 20  le byte to.     
1dda0 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79 74   ** the last byt
1ddb0 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20  e in each block 
1ddc0 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e  within the exten
1ddd0 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69 73  ded region. This
1dde0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
1ddf0 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20   same technique 
1de00 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74 6f  used by glibc to
1de10 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78   implement posix
1de20 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20  _fallocate().   
1de30 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73     ** on systems
1de40 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76   that do not hav
1de50 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61  e a real falloca
1de60 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  te() system call
1de70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1de80 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1de90 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1dea0 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1deb0 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1dec0 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1dee0 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1def0 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1df00 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1df10 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1df20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  nSize) ){.      
1df30 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1df40 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1df50 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1df60 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1df70 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1df80 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1df90 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1dfa0 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65 20   }.      iWrite 
1dfb0 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20  = ((buf.st_size 
1dfc0 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42  + 2*nBlk - 1)/nB
1dfd0 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20  lk)*nBlk-1;.    
1dfe0 20 20 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c    while( iWrite<
1dff0 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  nSize ){.       
1e000 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65   int nWrite = se
1e010 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1e020 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29  , iWrite, "", 1)
1e030 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57  ;.        if( nW
1e040 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e  rite!=1 ) return
1e050 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1e060 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72  ITE;.        iWr
1e070 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20  ite += nBlk;.   
1e080 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1e090 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 46 69  }.  }..  if( pFi
1e0a0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  le->mmapSizeMax>
1e0b0 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65  0 && nByte>pFile
1e0c0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1e0d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
1e0e0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1e0f0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  <=0 ){.      if(
1e100 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1e110 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  e(pFile->h, nByt
1e120 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  e) ){.        pF
1e130 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1e140 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
1e150 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1e160 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1e170 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1e180 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1e190 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
1e1a0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75     }..    rc = u
1e1b0 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
1e1c0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65  , nByte);.    re
1e1d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1e1e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e1f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
1e200 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c  Arg is inititial
1e210 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
1e220 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
1e230 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
1e240 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
1e250 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1e260 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
1e270 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
1e280 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
1e290 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
1e2a0 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
1e2b0 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
1e2c0 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
1e2d0 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
1e2e0 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65  ic void unixMode
1e2f0 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Bit(unixFile *pF
1e300 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
1e310 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
1e320 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
1e330 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
1e340 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
1e350 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
1e360 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
1e370 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
1e380 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1e390 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
1e3a0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1e3b0 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
1e3c0 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
1e3d0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
1e3e0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e3f0 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
1e400 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1e410 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  );../*.** Inform
1e420 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
1e430 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
1e440 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
1e450 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1e460 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1e470 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
1e480 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1e490 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1e4a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1e4b0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
1e4c0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1e4d0 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
1e4e0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
1e4f0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1e500 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
1e510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e520 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1e530 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
1e540 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
1e550 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
1e560 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
1e570 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e580 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e590 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e5a0 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
1e5b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
1e5c0 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
1e5d0 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
1e5e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e5f0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e600 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1e610 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  T: {.      int r
1e620 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  c;.      Simulat
1e630 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1e640 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63  );.      rc = fc
1e650 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c  ntlSizeHint(pFil
1e660 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29  e, *(i64 *)pArg)
1e670 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1e680 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1e690 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1e6a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  c;.    }.    cas
1e6b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1e6c0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
1e6d0 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28      unixModeBit(
1e6e0 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f  pFile, UNIXFILE_
1e6f0 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
1e700 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e730 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
1e740 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1e750 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  E: {.      unixM
1e760 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
1e770 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  IXFILE_PSOW, (in
1e780 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e7a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e7b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
1e7c0 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
1e7d0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
1e7e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1e7f0 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
1e800 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1e810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e830 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
1e840 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
1e850 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
1e860 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1e870 63 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  c( pFile->pVfs->
1e880 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
1e890 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29      if( zTFile )
1e8a0 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65  {.        unixGe
1e8b0 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d  tTempname(pFile-
1e8c0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1e8d0 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  e, zTFile);.    
1e8e0 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
1e8f0 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20  g = zTFile;.    
1e900 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1e910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e920 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e930 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
1e940 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e  E: {.      i64 n
1e950 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a  ewLimit = *(i64*
1e960 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74  )pArg;.      int
1e970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e980 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
1e990 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61  mit>sqlite3Globa
1e9a0 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29  lConfig.mxMmap )
1e9b0 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d  {.        newLim
1e9c0 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  it = sqlite3Glob
1e9d0 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b  alConfig.mxMmap;
1e9e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1e9f0 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69  (i64*)pArg = pFi
1ea00 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  le->mmapSizeMax;
1ea10 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
1ea20 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d  mit>=0 && newLim
1ea30 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  it!=pFile->mmapS
1ea40 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d  izeMax && pFile-
1ea50 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b  >nFetchOut==0 ){
1ea60 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1ea70 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65  mmapSizeMax = ne
1ea80 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  wLimit;.        
1ea90 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  if( pFile->mmapS
1eaa0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
1eab0 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65     unixUnmapfile
1eac0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
1ead0 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66     rc = unixMapf
1eae0 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a  ile(pFile, -1);.
1eaf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eb00 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
1eb10 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  c;.    }.#ifdef 
1eb20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1eb30 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
1eb40 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
1eb50 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
1eb60 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
1eb70 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
1eb80 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1eb90 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
1eba0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
1ebb0 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
1ebc0 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
1ebd0 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
1ebe0 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
1ebf0 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
1ec00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1ec10 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
1ec20 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
1ec30 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1ec40 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
1ec50 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1ec60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ec70 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
1ec80 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1ec90 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1eca0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1ecb0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
1ecc0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
1ecd0 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
1ece0 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
1ecf0 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ILE: {.      ret
1ed00 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  urn proxyFileCon
1ed10 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29  trol(id,op,pArg)
1ed20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1ed30 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1ed40 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1ed50 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1ed60 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  __) */.  }.  ret
1ed70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
1ed80 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  UND;.}../*.** Re
1ed90 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
1eda0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
1edb0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1edc0 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
1edd0 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
1ede0 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
1edf0 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
1ee00 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
1ee10 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
1ee20 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
1ee30 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
1ee40 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
1ee50 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
1ee60 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
1ee70 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
1ee80 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
1ee90 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
1eea0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
1eeb0 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
1eec0 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
1eed0 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
1eee0 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
1eef0 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
1ef00 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
1ef10 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  oth..*/.#ifndef 
1ef20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61 74  __QNXNTO__ .stat
1ef30 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f  ic int unixSecto
1ef40 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1ef50 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  le *NotUsed){.  
1ef60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ef70 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
1ef80 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
1ef90 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1efa0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1efb0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65  The following ve
1efc0 72 73 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65 63  rsion of unixSec
1efd0 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6f 70 74  torSize() is opt
1efe0 69 6d 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e 0a  imized for QNX..
1eff0 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  */.#ifdef __QNXN
1f000 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  TO__.#include <s
1f010 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23  ys/dcmd_blk.h>.#
1f020 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61  include <sys/sta
1f030 74 76 66 73 2e 68 3e 0a 73 74 61 74 69 63 20 69  tvfs.h>.static i
1f040 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1f050 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1f060 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
1f070 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1f080 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46  le*)id;.  if( pF
1f090 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f0a0 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75  == 0 ){.    stru
1f0b0 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e 66  ct statvfs fsInf
1f0c0 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f  o;.       .    /
1f0d0 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20 66  * Set defaults f
1f0e0 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64  or non-supported
1f0f0 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a   filesystems */.
1f100 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f110 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
1f120 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1f130 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64  ZE;.    pFile->d
1f140 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f150 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  tics = 0;.    if
1f160 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c 65  ( fstatvfs(pFile
1f170 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ->h, &fsInfo) ==
1f180 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65   -1 ) {.      re
1f190 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74  turn pFile->sect
1f1a0 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20  orSize;.    }.. 
1f1b0 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 66     if( !strcmp(f
1f1c0 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1f1d0 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20  , "tmp") ) {.   
1f1e0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
1f1f0 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
1f200 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
1f210 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1f220 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1f230 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f240 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20  _ATOMIC4K |     
1f250 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c    /* All ram fil
1f260 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61  esystem writes a
1f270 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
1f280 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1f290 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
1f2a0 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
1f2b0 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
1f2c0 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2f0 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
1f300 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
1f310 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1f320 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1f330 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1f340 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1f350 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1f390 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1f3a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1f3b0 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
1f3c0 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66 73  _basetype, "etfs
1f3d0 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
1f3e0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1f3f0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
1f400 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1f410 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1f420 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
1f430 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a  etfs cluster siz
1f440 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  e writes are ato
1f450 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  mic */.        (
1f460 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1f470 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
1f480 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
1f490 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  ) |.        SQLI
1f4a0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1f4b0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
1f4c0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
1f4d0 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1f4e0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f500 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1f510 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
1f520 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1f530 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f540 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f550 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f560 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f570 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f5a0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f5b0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f5c0 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
1f5d0 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1f5e0 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20  e, "qnx6") ){.  
1f5f0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f600 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1f610 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1f620 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f630 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1f640 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1f650 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20  P_ATOMIC |      
1f660 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79     /* All filesy
1f670 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
1f680 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1f690 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1f6a0 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1f6b0 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1f6c0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1f6d0 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f700 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1f710 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1f720 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1f730 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1f740 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1f750 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1f760 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f790 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1f7a0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
1f7b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73      }else if( !s
1f7c0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
1f7d0 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29  asetype, "qnx4")
1f7e0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1f7f0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
1f800 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
1f810 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1f820 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f830 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75   =.        /* fu
1f840 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f  ll bitset of ato
1f850 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65  mics from max se
1f860 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d  ctor size and sm
1f870 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
1f880 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72   ((pFile->sector
1f890 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
1f8a0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1f8b0 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c  512) << 1) - 2 |
1f8c0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1f8d0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1f8e0 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
1f8f0 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
1f900 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
1f910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
1f940 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
1f950 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
1f960 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73  se if( strstr(fs
1f970 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
1f980 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20   "dos") ){.     
1f990 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f9a0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1f9b0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1f9c0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1f9d0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1f9e0 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74    /* full bitset
1f9f0 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d   of atomics from
1fa00 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65   max sector size
1fa10 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a   and smaller */.
1fa20 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d          ((pFile-
1fa30 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
1fa40 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
1fa50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31  _ATOMIC512) << 1
1fa60 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20  ) - 2 |.        
1fa70 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1fa80 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1fa90 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1faa0 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1fab0 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1fae0 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1faf0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
1fb00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fb10 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1fb20 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
1fb30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1fb40 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c  OCAP_ATOMIC512 |
1fb50 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20        /* blocks 
1fb60 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
1fb70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1fb80 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1fb90 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1fba0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1fbb0 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1fbf0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1fc00 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d      0;.    }.  }
1fc10 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63  .  /* Last chanc
1fc20 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20  e verification. 
1fc30 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20 73   If the sector s
1fc40 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74  ize isn't a mult
1fc50 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a  iple of 512.  **
1fc60 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76   then it isn't v
1fc70 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46  alid.*/.  if( pF
1fc80 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1fc90 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20  % 512 != 0 ){.  
1fca0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1fcb0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1fcc0 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   0;.    pFile->s
1fcd0 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49  ectorSize = SQLI
1fce0 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1fcf0 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65  R_SIZE;.  }.  re
1fd00 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74  turn pFile->sect
1fd10 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66  orSize;.}.#endif
1fd20 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a   /* __QNXNTO__ *
1fd30 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
1fd40 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
1fd50 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74  cteristics for t
1fd60 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
1fd70 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20 75  his VFS is set u
1fd80 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  p to return SQLI
1fd90 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1fda0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20  FE_OVERWRITE by 
1fdb0 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65  default..** Howe
1fdc0 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65  ver, that choice
1fdd0 20 69 73 20 63 6f 6e 74 72 61 76 65 72 73 69 61   is contraversia
1fde0 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61  l since technica
1fdf0 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69  lly the underlyi
1fe00 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  ng.** file syste
1fe10 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79  m does not alway
1fe20 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73  s provide powers
1fe30 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20  afe overwrites. 
1fe40 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f   (In other.** wo
1fe50 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77  rds, after a pow
1fe60 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70  er-loss event, p
1fe70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65  arts of the file
1fe80 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 72   that were never
1fe90 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68  .** written migh
1fea0 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61  t end up being a
1feb0 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65  ltered.)  Howeve
1fec0 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61  r, non-PSOW beha
1fed0 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a  vior is very,.**
1fee0 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64   very rare.  And
1fef0 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20   asserting PSOW 
1ff00 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65  makes a large re
1ff10 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61  duction in the a
1ff20 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75  mount.** of requ
1ff30 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75  ired I/O for jou
1ff40 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61  rnaling, since a
1ff50 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20   lot of padding 
1ff60 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a  is eliminated..*
1ff70 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20  *  Hence, while 
1ff80 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1ff90 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ITE is on by def
1ffa0 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61  ault, there is a
1ffb0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a   file-control.**
1ffc0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75   available to tu
1ffd0 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52  rn it off and UR
1ffe0 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  I query paramete
1fff0 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  r available to t
20000 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73  urn it off..*/.s
20010 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
20020 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20030 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
20040 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
20050 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
20060 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
20070 20 30 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58   0;.#ifdef __QNX
20080 4e 54 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e 73  NTO__.  if( p->s
20090 65 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20 75  ectorSize==0 ) u
200a0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 69 64  nixSectorSize(id
200b0 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65 76  );.  rc = p->dev
200c0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
200d0 63 73 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  cs;.#endif.  if(
200e0 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20   p->ctrlFlags & 
200f0 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b  UNIXFILE_PSOW ){
20100 0a 20 20 20 20 72 63 20 7c 3d 20 53 51 4c 49 54  .    rc |= SQLIT
20110 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
20120 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 7d  E_OVERWRITE;.  }
20130 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20140 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20150 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a  OMIT_WAL.../*.**
20160 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
20170 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61  represent an sha
20180 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65  red memory buffe
20190 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  r.  .**.** When 
201a0 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
201b0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74   all reference t
201c0 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65  he same wal-inde
201d0 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a  x, each thread.*
201e0 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e  * has its own un
201f0 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75  ixShm object, bu
20200 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74  t they all point
20210 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
20220 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73  tance.** of this
20230 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20240 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
20250 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69  ords, each wal-i
20260 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a  ndex is opened.*
20270 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20  * only once per 
20280 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45  process..**.** E
20290 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ach unixShmNode 
202a0 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63  object is connec
202b0 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ted to a single 
202c0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
202d0 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c  ject..** We coul
202e0 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20  d coalesce this 
202f0 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78  object into unix
20300 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74  InodeInfo, but t
20310 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a  hat would mean.*
20320 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c  * every open fil
20330 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
20340 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  use shared memor
20350 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  y (in other word
20360 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20  s, most.** open 
20370 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76  files) would hav
20380 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e  e to carry aroun
20390 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66  d this extra inf
203a0 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a  ormation.  So.**
203b0 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
203c0 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69  fo object contai
203d0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
203e0 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65  this unixShmNode
203f0 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74   object.** and t
20400 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
20410 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
20420 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65   only when neede
20430 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74  d..**.** unixMut
20440 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
20450 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74   true when creat
20460 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e  ing or destroyin
20470 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74  g.** this object
20480 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e   or while readin
20490 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
204a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
204b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52  s:.**.**      nR
204c0 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ef.**.** The fol
204d0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
204e0 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
204f0 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
20500 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20  created:.** .** 
20510 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
20520 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
20530 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e   Either unixShmN
20540 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ode.mutex must b
20550 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68  e held or unixSh
20560 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
20570 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  d.** unixMutexHe
20580 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
20590 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
205a0 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
205b0 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
205c0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
205d0 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
205e0 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e   {.  unixInodeIn
205f0 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
20600 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  /* unixInodeInfo
20610 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20   that owns this 
20620 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71  SHM node */.  sq
20630 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
20640 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65  ex;      /* Mute
20650 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73  x to access this
20660 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
20670 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
20680 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
20690 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66  of the mmapped f
206a0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ile */.  int h; 
206b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206c0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
206d0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
206e0 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
206f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20700 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
20710 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
20720 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20    u16 nRegion;  
20730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20740 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
20750 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69  Region */.  u8 i
20760 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20  sReadonly;      
20770 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20780 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  f read-only */. 
20790 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e   char **apRegion
207a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
207b0 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73  rray of mapped s
207c0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
207d0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
207e0 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
207f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20800 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  f unixShm object
20810 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
20820 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  is */.  unixShm 
20830 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
20840 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68     /* All unixSh
20850 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
20860 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69  ng to this */.#i
20870 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
20880 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b  G.  u8 exclMask;
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
208a0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
208b0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
208c0 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73  /.  u8 sharedMas
208d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
208e0 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
208f0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
20900 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
20910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20920 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e  ext available un
20930 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a  ixShm.id value *
20940 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
20950 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
20960 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
20970 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f  this VFS to reco
20980 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  rd the state of 
20990 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65  an.** open share
209a0 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74  d memory connect
209b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
209c0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
209d0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
209e0 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74  when this object
209f0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a   is created and.
20a00 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ** are read-only
20a10 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a   thereafter:.**.
20a20 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46  **    unixShm.pF
20a30 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68  ile.**    unixSh
20a40 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  m.id.**.** All o
20a50 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
20a60 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65  read/write.  The
20a70 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e   unixShm.pFile->
20a80 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
20a90 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
20aa0 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
20ab0 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
20ac0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b  struct unixShm {
20ad0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
20ae0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a  pShmNode;     /*
20af0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
20b00 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
20b10 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ct */.  unixShm 
20b20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
20b30 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53     /* Next unixS
20b40 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
20b50 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
20b60 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b80 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
20b90 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
20ba0 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64  mutex */.  u8 id
20bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20bc0 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
20bd0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
20be0 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68  ithin its unixSh
20bf0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73  mNode */.  u16 s
20c00 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
20c10 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20c20 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
20c30 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
20c40 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
20c50 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
20c60 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
20c70 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ld */.};../*.** 
20c80 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
20c90 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
20ca0 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42  efine UNIX_SHM_B
20cb0 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
20cc0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
20cd0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
20ce0 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
20cf0 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44  efine UNIX_SHM_D
20d00 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f  MS    (UNIX_SHM_
20d10 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
20d20 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
20d30 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
20d40 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20  .** Apply posix 
20d50 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66  advisory locks f
20d60 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f  or all bytes fro
20d70 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f  m ofst through o
20d80 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c  fst+n-1..**.** L
20d90 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68  ocks block if th
20da0 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c  e mask is exactl
20db0 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64  y UNIX_SHM_C and
20dc0 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e   are non-blockin
20dd0 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  g.** otherwise..
20de0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
20df0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
20e00 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
20e10 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70  pShmNode, /* App
20e20 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
20e30 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
20e40 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
20e50 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
20e60 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c          /* F_UNL
20e70 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20  CK, F_RDLCK, or 
20e80 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  F_WRLCK */.  int
20e90 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
20ea0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
20eb0 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e of the locking
20ec0 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20   range */.  int 
20ed0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
20ee0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20ef0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
20f00 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  .){.  struct flo
20f10 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54  ck f;       /* T
20f20 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
20f30 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  y locking struct
20f40 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ure */.  int rc 
20f50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
20f60 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
20f70 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20  rm fcntl() */.. 
20f80 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
20f90 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
20fa0 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
20fb0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
20fc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
20fd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
20fe0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
20ff0 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ) || pShmNode->n
21000 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
21010 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76  Shared locks nev
21020 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61  er span more tha
21030 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20  n one byte */.  
21040 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
21050 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43  lockType!=F_RDLC
21060 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73  K );..  /* Locks
21070 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
21080 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
21090 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f  >=1 && n<SQLITE_
210a0 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SHM_NLOCK );..  
210b0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
210c0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  =0 ){.    /* Ini
210d0 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
210e0 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
210f0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c  /.    memset(&f,
21100 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a   0, sizeof(f));.
21110 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c      f.l_type = l
21120 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c  ockType;.    f.l
21130 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
21140 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72  ET;.    f.l_star
21150 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e  t = ofst;.    f.
21160 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20  l_len = n;..    
21170 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68  rc = osFcntl(pSh
21180 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  mNode->h, F_SETL
21190 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d  K, &f);.    rc =
211a0 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51   (rc!=(-1)) ? SQ
211b0 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
211c0 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BUSY;.  }..  /*
211d0 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62   Update the glob
211e0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e  al lock state an
211f0 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69  d do debug traci
21200 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
21210 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31  ITE_DEBUG.  { u1
21220 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43  6 mask;.  OSTRAC
21230 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29  E(("SHM-LOCK "))
21240 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28  ;.  mask = (1<<(
21250 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
21260 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  fst);.  if( rc==
21270 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21280 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
21290 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
212a0 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
212b0 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
212c0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
212d0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
212e0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
212f0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
21300 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  = ~mask;.    }el
21310 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  se if( lockType=
21320 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
21330 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64    OSTRACE(("read
21340 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  -lock %d ok", of
21350 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
21360 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  Node->exclMask &
21370 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
21380 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
21390 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
213a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
213b0 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
213c0 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
213d0 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
213e0 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  -lock %d ok", of
213f0 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
21400 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c  Node->exclMask |
21410 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53  = mask;.      pS
21420 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
21430 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
21440 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
21450 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
21460 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
21470 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
21480 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74  %d failed", ofst
21490 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ));.    }else if
214a0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44  ( lockType==F_RD
214b0 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
214c0 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b  RACE(("read-lock
214d0 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20   failed"));.    
214e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
214f0 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
21500 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
21510 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
21520 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c  lock %d failed",
21530 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20   ofst));.    }. 
21540 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20   }.  OSTRACE((" 
21550 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33  - afterwards %03
21560 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20  x,%03x\n",.     
21570 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21580 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d  sharedMask, pShm
21590 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29  Node->exclMask))
215a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
215b0 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20  return rc;      
215c0 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72    .}.../*.** Pur
215d0 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  ge the unixShmNo
215e0 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61  deList list of a
215f0 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
21600 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66  unixShmNode.nRef
21610 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ==0..**.** This 
21620 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61  is not a VFS sha
21630 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
21640 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69  d; it is a utili
21650 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ty function call
21660 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61  ed.** by VFS sha
21670 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
21680 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
21690 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  id unixShmPurge(
216a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a  unixFile *pFd){.
216b0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
216c0 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   = pFd->pInode->
216d0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65  pShmNode;.  asse
216e0 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
216f0 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26  d() );.  if( p &
21700 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  & p->nRef==0 ){.
21710 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61      int i;.    a
21720 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65  ssert( p->pInode
21730 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  ==pFd->pInode );
21740 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
21750 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
21760 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
21770 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b  i<p->nRegion; i+
21780 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
21790 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
217a0 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52   osMunmap(p->apR
217b0 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52  egion[i], p->szR
217c0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65  egion);.      }e
217d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
217e0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
217f0 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  egion[i]);.     
21800 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
21810 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
21820 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20  egion);.    if( 
21830 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  p->h>=0 ){.     
21840 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
21850 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  d, p->h, __LINE_
21860 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d  _);.      p->h =
21870 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
21880 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
21890 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  de = 0;.    sqli
218a0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
218b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
218c0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
218d0 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  rea associated w
218e0 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73  ith open databas
218f0 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a  e file pDbFd.  .
21900 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  ** This particul
21910 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ar implementatio
21920 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66  n uses mmapped f
21930 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
21940 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70  file used to imp
21950 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65  lement shared-me
21960 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73  mory is in the s
21970 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ame directory.**
21980 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
21990 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68  abase file and h
219a0 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  as the same name
219b0 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
219c0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69  abase.** file wi
219d0 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75  th the "-shm" su
219e0 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72  ffix added.  For
219f0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
21a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
21a10 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72  * is "/home/user
21a20 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65  1/config.db" the
21a30 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  n the file that 
21a40 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d  is created and m
21a50 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68  mapped.** for sh
21a60 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  ared memory will
21a70 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d   be called "/hom
21a80 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
21a90 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20  b-shm".  .**.** 
21aa0 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68  Another approach
21ab0 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69   to is to use fi
21ac0 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20  les in /dev/shm 
21ad0 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61  or /dev/tmp or a
21ae0 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20  n.** some other 
21af0 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74  tmpfs mount. But
21b00 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20   if a file in a 
21b10 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74  different direct
21b20 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ory.** from the 
21b30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
21b40 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66   used, then diff
21b50 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72  ering access per
21b60 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61  missions.** or a
21b70 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20   chroot() might 
21b80 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72  cause two differ
21b90 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e  ent processes on
21ba0 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74   the same.** dat
21bb0 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20  abase to end up 
21bc0 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20  using different 
21bd0 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64  files for shared
21be0 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65   memory - .** me
21bf0 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72  aning that their
21c00 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f   memory would no
21c10 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72  t really be shar
21c20 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a  ed - resulting.*
21c30 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  * in database co
21c40 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72  rruption.  Never
21c50 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d  theless, this tm
21c60 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a  pfs file usage.*
21c70 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64  * can be enabled
21c80 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
21c90 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
21ca0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f  SHM_DIRECTORY="/
21cb0 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74  dev/shm".** or t
21cc0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  he equivalent.  
21cd0 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53  The use of the S
21ce0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
21cf0 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
21d00 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c  .** option resul
21d10 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  ts in an incompa
21d20 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53  tible build of S
21d30 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f  QLite;  builds o
21d40 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74  f SQLite.** that
21d50 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20   with differing 
21d60 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
21d70 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74  TORY settings at
21d80 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65  tempt to use the
21d90 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73  .** same databas
21da0 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
21db0 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73  me time, databas
21dc0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c  e corruption wil
21dd0 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
21de0 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53  lt. The SQLITE_S
21df0 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
21e00 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
21e10 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a   is considered.*
21e20 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20  * "unsupported" 
21e30 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20  and may go away 
21e40 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69  in a future SQLi
21e50 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a  te release..**.*
21e60 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
21e70 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
21e80 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
21e90 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
21ea0 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
21eb0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
21ec0 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
21ed0 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
21ee0 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
21ef0 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
21f00 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
21f10 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
21f20 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
21f30 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leared..**.** If
21f40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
21f50 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62  tabase file (pDb
21f60 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65  Fd) is using the
21f70 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53   "unix-excl" VFS
21f80 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74  .** that means t
21f90 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  hat an exclusive
21fa0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
21fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21fc0 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e  le and.** that n
21fd0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
21fe0 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65  s are able to re
21ff0 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
22000 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a  database.  In.**
22010 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64   that case, we d
22020 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65  o not really nee
22030 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  d shared memory.
22040 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f    No shared memo
22050 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72  ry.** file is cr
22060 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72  eated.  The shar
22070 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ed memory will b
22080 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68  e simulated with
22090 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f   heap memory..*/
220a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
220b0 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
220c0 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64  (unixFile *pDbFd
220d0 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  ){.  struct unix
220e0 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  Shm *p = 0;     
220f0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
22100 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
22110 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
22120 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
22130 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20  mNode;   /* The 
22140 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
22150 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
22160 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22180 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
22190 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
221a0 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  pInode;         
221b0 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66   /* The inode of
221c0 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
221d0 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
221e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
221f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65   of the file use
22200 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69  d for SHM */.  i
22210 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  nt nShmFilename;
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22230 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48  * Size of the SH
22240 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79  M filename in by
22250 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  tes */..  /* All
22260 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
22270 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20  the new unixShm 
22280 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d  object. */.  p =
22290 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
222a0 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
222b0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
222c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
222d0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
222e0 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61  sizeof(*p));.  a
222f0 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53  ssert( pDbFd->pS
22300 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  hm==0 );..  /* C
22310 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
22320 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
22330 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  ect already exis
22340 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69  ts. Reuse an exi
22350 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69  sting.  ** one i
22360 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74  f present. Creat
22370 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
22380 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
22390 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
223a0 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44  );.  pInode = pD
223b0 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70  bFd->pInode;.  p
223c0 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ShmNode = pInode
223d0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66  ->pShmNode;.  if
223e0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
223f0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
22400 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
22410 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74          /* fstat
22420 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61  () info for data
22430 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
22440 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28    /* Call fstat(
22450 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
22460 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
22470 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22480 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20  file. If.    ** 
22490 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65  a new *-shm file
224a0 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20   is created, an 
224b0 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20  attempt will be 
224c0 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69  made to create i
224d0 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  t.    ** with th
224e0 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
224f0 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ns..    */.    i
22500 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64  f( osFstat(pDbFd
22510 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26 20  ->h, &sStat) && 
22520 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
22530 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
22540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
22550 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20  RR_FSTAT;.      
22560 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
22570 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  r;.    }..#ifdef
22580 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
22590 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69  CTORY.    nShmFi
225a0 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28  lename = sizeof(
225b0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
225c0 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73  TORY) + 31;.#els
225d0 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  e.    nShmFilena
225e0 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74  me = 6 + (int)st
225f0 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74  rlen(pDbFd->zPat
22600 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  h);.#endif.    p
22610 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ShmNode = sqlite
22620 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
22630 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
22640 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
22650 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
22660 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
22670 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22680 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
22690 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
226a0 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
226b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
226c0 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e  mNode)+nShmFilen
226d0 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69  ame);.    zShmFi
226e0 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64  lename = pShmNod
226f0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  e->zFilename = (
22700 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b  char*)&pShmNode[
22710 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1];.#ifdef SQLIT
22720 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
22730 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
22740 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
22750 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  e, zShmFilename,
22760 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
22770 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48         SQLITE_SH
22780 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71  M_DIRECTORY "/sq
22790 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c  lite-shm-%x-%x",
227a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
227b0 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74        (u32)sStat
227c0 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53  .st_ino, (u32)sS
227d0 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c  tat.st_dev);.#el
227e0 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  se.    sqlite3_s
227f0 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
22800 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
22810 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44  me, "%s-shm", pD
22820 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
22830 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
22840 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
22850 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
22860 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
22870 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  Node->h = -1;.  
22880 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
22890 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
228a0 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
228b0 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
228c0 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
228d0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
228e0 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
228f0 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
22900 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
22910 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
22920 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
22930 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22940 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
22950 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
22960 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
22970 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
22980 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
22990 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
229a0 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20   | O_CREAT;.    
229b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
229c0 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d  i_boolean(pDbFd-
229d0 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c  >zPath, "readonl
229e0 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20  y_shm", 0) ){.  
229f0 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
22a00 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
22a10 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
22a20 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
22a30 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
22a40 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74  Node->h = robust
22a50 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61  _open(zShmFilena
22a60 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28  me, openFlags, (
22a70 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37  sStat.st_mode&07
22a80 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  77));.      if( 
22a90 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b  pShmNode->h<0 ){
22aa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
22ab0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
22ac0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
22ad0 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c   "open", zShmFil
22ae0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
22af0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
22b00 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
22b10 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f    /* If this pro
22b20 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  cess is running 
22b30 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75  as root, make su
22b40 72 65 20 74 68 61 74 20 74 68 65 20 53 48 4d 20  re that the SHM 
22b50 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  file.      ** is
22b60 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73 61   owned by the sa
22b70 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f 77 6e  me user that own
22b80 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
22b90 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72 77  atabase.  Otherw
22ba0 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ise,.      ** th
22bb0 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72  e original owner
22bc0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
22bd0 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20  e to connect..  
22be0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6f 73 46      */.      osF
22bf0 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e  chown(pShmNode->
22c00 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c  h, sStat.st_uid,
22c10 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a   sStat.st_gid);.
22c20 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63    .      /* Chec
22c30 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  k to see if anot
22c40 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
22c50 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d  olding the dead-
22c60 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20  man switch..    
22c70 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75    ** If not, tru
22c80 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
22c90 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a  o zero length. .
22ca0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
22cb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22cc0 20 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d       if( unixShm
22cd0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
22ce0 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e  ode, F_WRLCK, UN
22cf0 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d  IX_SHM_DMS, 1)==
22d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22d10 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
22d20 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f  ftruncate(pShmNo
22d30 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20  de->h, 0) ){.   
22d40 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
22d50 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
22d60 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22  IOERR_SHMOPEN, "
22d70 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d  ftruncate", zShm
22d80 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
22d90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22da0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22db0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22dc0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
22dd0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
22de0 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_RDLCK, UNIX_S
22df0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
22e00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
22e10 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e   ) goto shm_open
22e20 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _err;.    }.  }.
22e30 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
22e40 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
22e50 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69  child of the uni
22e60 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  xShmNode */.  p-
22e70 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
22e80 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
22e90 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
22ea0 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
22eb0 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
22ec0 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
22ed0 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
22ee0 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c  Shm = p;.  unixL
22ef0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
22f00 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65  /* The reference
22f10 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f   count on pShmNo
22f20 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  de has already b
22f30 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  een incremented 
22f40 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  under.  ** the c
22f50 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78  over of the unix
22f60 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
22f70 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
22f80 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
22f90 20 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e 69   new (struct uni
22fa0 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20  xShm) object to 
22fb0 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73  the pShmNode has
22fc0 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74   been set. All t
22fd0 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74  hat is.  ** left
22fe0 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e   to do is to lin
22ff0 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  k the new object
23000 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
23010 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20   list starting. 
23020 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d   ** at pShmNode-
23030 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75  >pFirst. This mu
23040 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65  st be done while
23050 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68   holding the pSh
23060 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20  mNode->mutex .  
23070 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20  ** mutex..  */. 
23080 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
23090 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
230a0 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  utex);.  p->pNex
230b0 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  t = pShmNode->pF
230c0 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  irst;.  pShmNode
230d0 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20  ->pFirst = p;.  
230e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
230f0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
23100 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
23110 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
23120 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79  Jump here on any
23130 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70   error */.shm_op
23140 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68  en_err:.  unixSh
23150 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 20 20  mPurge(pDbFd);  
23160 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
23170 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65  l frees pShmNode
23180 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
23190 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
231a0 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
231b0 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
231c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
231d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
231e0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
231f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69   pointer to regi
23200 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68  on iRegion of th
23210 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  e .** shared-mem
23220 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
23230 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
23240 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64   file fd. Shared
23250 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
23260 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
23270 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
23280 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
23290 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
232a0 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62  s szRegion .** b
232b0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
232c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
232d0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
232e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
232f0 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74  d and *pp is set
23300 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
23310 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
23320 65 20 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65  e bExtend parame
23330 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
23340 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
23350 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  d-memory.** regi
23360 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  on has not been 
23370 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e  allocated (by an
23380 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64  y client, includ
23390 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20  ing one running 
233a0 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  in a.** separate
233b0 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20   process), then 
233c0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
233d0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
233e0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a   returned. If .*
233f0 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e  * bExtend is non
23400 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65  -zero and the re
23410 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
23420 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
23430 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65   not yet .** bee
23440 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
23450 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  is allocated by 
23460 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
23470 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
23480 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
23490 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
234a0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69  n allocated or i
234b0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
234c0 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64  * this call as d
234d0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20  escribed above, 
234e0 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65  then it is mappe
234f0 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
23500 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73  esses .** addres
23510 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69  s space (if it i
23520 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20  s not already), 
23530 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f  *pp is set to po
23540 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65  int to the mappe
23550 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  d .** memory and
23560 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
23570 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
23580 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20  nt unixShmMap(. 
23590 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
235a0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
235b0 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20   /* Handle open 
235c0 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
235d0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f   */.  int iRegio
235e0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
235f0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20        /* Region 
23600 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
23610 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20   int szRegion,  
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23630 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69   /* Size of regi
23640 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78  ons */.  int bEx
23650 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  tend,           
23660 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23670 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20   to extend file 
23680 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
23690 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
236a0 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20  **pp            
236b0 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64    /* OUT: Mapped
236c0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
236d0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
236e0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
236f0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20  .  unixShm *p;. 
23700 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
23710 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
23720 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
23730 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65   /* If the share
23740 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61  d-memory file ha
23750 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
23760 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
23770 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  ow. */.  if( pDb
23780 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20  Fd->pShm==0 ){. 
23790 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
237a0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
237b0 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
237c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
237d0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
237e0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
237f0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
23800 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69  pShmNode;.  sqli
23810 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
23820 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
23830 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
23840 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
23850 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
23860 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
23870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23880 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
23890 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
238a0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
238b0 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62  ode->h>=0 || pDb
238c0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
238d0 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
238e0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
238f0 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d  e->h<0 || pDbFd-
23900 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
23910 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69  sLock==0 );..  i
23920 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
23930 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
23940 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
23950 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
23960 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
23970 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
23980 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
23990 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73   = (iRegion+1)*s
239a0 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e  zRegion;  /* Min
239b0 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
239c0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
239d0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
239e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
239f0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
23a00 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
23a10 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
23a20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
23a30 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
23a40 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
23a50 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
23a60 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
23a70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
23a80 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
23a90 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
23aa0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
23ab0 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
23ac0 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
23ad0 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
23ae0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
23af0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
23b00 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
23b10 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
23b20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
23b30 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
23b40 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
23b50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23b60 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
23b70 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
23b80 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
23b90 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
23ba0 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
23bb0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
23bc0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
23bd0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
23be0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
23bf0 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
23c00 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
23c10 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
23c20 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
23c30 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
23c40 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
23c50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
23c60 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
23c70 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
23c80 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
23c90 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
23ca0 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
23cb0 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
23cc0 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
23cd0 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
23ce0 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
23cf0 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
23d00 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
23d10 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
23d20 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
23d30 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
23d40 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
23d50 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
23d60 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
23d70 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
23d80 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
23d90 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
23da0 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
23db0 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
23dc0 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
23dd0 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
23de0 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
23df0 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
23e00 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
23e10 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
23e20 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
23e30 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
23e40 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
23e50 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
23e60 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
23e70 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
23e80 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
23e90 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
23ea0 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
23eb0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
23ec0 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
23ed0 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
23ee0 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
23ef0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
23f00 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
23f10 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
23f20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
23f30 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
23f40 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
23f50 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
23f60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
23f70 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  ( seekAndWriteFd
23f80 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50  (pShmNode->h, iP
23f90 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c  g*pgsz + pgsz-1,
23fa0 20 22 22 2c 20 31 2c 20 30 29 21 3d 31 20 29 7b   "", 1, 0)!=1 ){
23fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
23fc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
23fd0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
23fe0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  lename;.        
23ff0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
24000 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
24010 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77  OERR_SHMSIZE, "w
24020 72 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  rite", zFile);. 
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
24040 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
24050 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24070 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24080 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
24090 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
240a0 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
240b0 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
240c0 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
240d0 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72     apNew = (char
240e0 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c   **)sqlite3_real
240f0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68  loc(.        pSh
24100 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c  mNode->apRegion,
24110 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a   (iRegion+1)*siz
24120 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20  eof(char *).    
24130 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
24140 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
24150 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
24160 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
24170 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
24180 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  }.    pShmNode->
24190 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77  apRegion = apNew
241a0 3b 0a 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d  ;.    while(pShm
241b0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
241c0 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76  Region){.      v
241d0 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  oid *pMem;.     
241e0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
241f0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  >=0 ){.        p
24200 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  Mem = osMmap(0, 
24210 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20  szRegion,.      
24220 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
24230 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f  isReadonly ? PRO
24240 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45  T_READ : PROT_RE
24250 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a  AD|PROT_WRITE, .
24260 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f              MAP_
24270 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65  SHARED, pShmNode
24280 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69  ->h, szRegion*(i
24290 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  64)pShmNode->nRe
242a0 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a  gion.        );.
242b0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
242c0 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
242d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
242e0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
242f0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
24300 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64   "mmap", pShmNod
24310 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
24320 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
24330 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
24340 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
24350 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  {.        pMem =
24360 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
24370 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
24380 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29     if( pMem==0 )
24390 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
243a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
243b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
243c0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
243d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
243e0 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52  set(pMem, 0, szR
243f0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  egion);.      }.
24400 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
24410 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  apRegion[pShmNod
24420 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d  e->nRegion] = pM
24430 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  em;.      pShmNo
24440 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20  de->nRegion++;. 
24450 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
24460 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
24470 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
24480 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70  Region ){.    *p
24490 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70  p = pShmNode->ap
244a0 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b  Region[iRegion];
244b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
244c0 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
244d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
244e0 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c  donly && rc==SQL
244f0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
24500 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
24510 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
24520 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
24530 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
24540 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
24550 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
24560 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
24570 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
24580 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
24590 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
245a0 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20   between SHAREd 
245b0 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  and EXCLUSIVE lo
245c0 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a  cks is a little.
245d0 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72  ** different her
245e0 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e  e than in posix.
245f0 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c    In xShmLock(),
24600 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d   one can go from
24610 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20   unlocked.** to 
24620 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20  shared and back 
24630 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  or from unlocked
24640 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e   to exclusive an
24650 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65  d back.  But one
24660 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66   may.** not go f
24670 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78  rom shared to ex
24680 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20  clusive or from 
24690 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61  exclusive to sha
246a0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
246b0 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a  nt unixShmLock(.
246c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
246d0 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
246e0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
246f0 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
24700 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
24710 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
24720 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24730 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
24740 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
24750 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
24760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24770 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
24780 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
24790 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
247a0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
247b0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
247c0 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
247d0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
247e0 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
247f0 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f  File*)fd;      /
24800 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
24810 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
24820 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ry */.  unixShm 
24830 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
24840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24850 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
24860 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
24870 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58  */.  unixShm *pX
24880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
248a0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
248b0 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
248c0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
248d0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
248e0 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e  Node;  /* The un
248f0 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e  derlying file iN
24900 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ode */.  int rc 
24910 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24930 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
24940 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
24950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24960 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
24970 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
24980 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
24990 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
249a0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
249b0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
249c0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
249d0 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
249e0 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
249f0 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
24a00 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
24a10 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
24a20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
24a30 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
24a40 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
24a50 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
24a60 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
24a70 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
24a80 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
24a90 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
24aa0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
24ab0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
24ac0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
24ad0 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
24ae0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
24af0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
24b00 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
24b10 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
24b20 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
24b30 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
24b40 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
24b50 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
24b60 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
24b70 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
24b80 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
24b90 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
24ba0 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
24bb0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
24bc0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61  Lock==0 );..  ma
24bd0 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  sk = (1<<(ofst+n
24be0 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
24bf0 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
24c00 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
24c10 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
24c20 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
24c30 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
24c40 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
24c50 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
24c60 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
24c70 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
24c80 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
24c90 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
24ca0 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
24cb0 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
24cc0 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
24cd0 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
24ce0 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
24cf0 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
24d00 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
24d10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
24d20 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
24d30 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
24d40 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
24d50 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
24d60 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
24d70 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
24d80 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
24d90 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
24da0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
24db0 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
24dc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
24dd0 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
24de0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
24df0 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _UNLCK, ofst+UNI
24e00 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
24e10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24e20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24e30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
24e40 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ndo the local lo
24e50 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
24e60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24e70 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
24e80 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
24e90 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
24ea0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20  &= ~mask;.    } 
24eb0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
24ec0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
24ed0 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
24ee0 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
24ef0 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
24f00 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
24f10 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
24f20 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
24f30 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
24f40 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
24f50 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
24f60 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
24f70 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
24f80 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
24f90 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
24fa0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
24fb0 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
24fc0 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
24fd0 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
24fe0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
24ff0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
25000 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
25010 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
25020 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
25030 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
25040 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
25050 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25060 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
25070 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
25080 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
25090 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
250a0 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
250b0 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
250c0 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
250d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
250e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
250f0 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
25100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
25110 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
25120 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
25130 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_RDLCK, ofst+UN
25140 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
25150 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25160 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25170 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
25180 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
25190 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
251a0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
251b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
251c0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
251d0 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
251e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
251f0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
25200 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
25210 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
25220 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
25230 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
25240 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
25250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
25260 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
25270 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
25280 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
25290 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
252a0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
252b0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
252c0 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
252d0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
252e0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
252f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
25300 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
25310 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
25320 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  .  .    /* Get t
25330 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
25340 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
25350 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
25360 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
25370 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
25380 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
25390 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
253a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
253b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
253c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
253d0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
253e0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43  pShmNode, F_WRLC
253f0 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
25400 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
25410 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25420 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
25430 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
25440 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
25450 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
25460 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
25470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25480 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
25490 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
254a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
254b0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73  ACE(("SHM-LOCK s
254c0 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20  hmid-%d, pid-%d 
254d0 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  got %03x,%03x\n"
254e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
254f0 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d  id, getpid(), p-
25500 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
25510 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65  exclMask));.  re
25520 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25530 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
25540 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
25550 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
25560 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
25570 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
25580 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
25590 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
255a0 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
255b0 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
255c0 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
255d0 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
255e0 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
255f0 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61  c void unixShmBa
25600 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
25610 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
25620 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
25630 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
25640 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
25650 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
25660 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
25670 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
25680 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  ex();.  unixLeav
25690 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
256a0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65  ** Close a conne
256b0 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
256c0 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20  memory.  Delete 
256d0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a  the underlying .
256e0 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
256f0 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
25700 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
25710 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65   is no shared me
25720 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
25730 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74  with the connect
25740 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ion then this.**
25750 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61   routine is a ha
25760 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f  rmless no-op..*/
25770 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
25780 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
25790 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
257a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
257b0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
257c0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
257d0 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20   int deleteFlag 
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257f0 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65   /* Delete share
25800 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65  d-memory if true
25810 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d   */.){.  unixShm
25820 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
25830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25840 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
25850 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69   closed */.  uni
25860 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
25870 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
25880 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
25890 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
258a0 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  e */.  unixShm *
258b0 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pp;            
258c0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
258d0 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
258e0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
258f0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  /.  unixFile *pD
25900 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  bFd;            
25910 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
25920 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
25930 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20  ile */..  pDbFd 
25940 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
25950 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
25960 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
25970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25980 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
25990 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
259a0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
259b0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
259c0 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
259d0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
259e0 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
259f0 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20  pInode );..  /* 
25a00 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
25a10 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
25a20 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
25a30 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
25a40 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
25a50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
25a60 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
25a70 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
25a80 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
25a90 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
25aa0 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
25ab0 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
25ac0 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
25ad0 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
25ae0 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
25af0 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
25b00 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
25b10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
25b20 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
25b30 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
25b40 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
25b50 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
25b60 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
25b70 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
25b80 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
25b90 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72  o */.  unixEnter
25ba0 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
25bb0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
25bc0 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
25bd0 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
25be0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
25bf0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  =0 ){.    if( de
25c00 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d  leteFlag && pShm
25c10 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f 73 55  Node->h>=0 ) osU
25c20 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e  nlink(pShmNode->
25c30 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
25c40 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
25c50 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Fd);.  }.  unixL
25c60 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
25c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25c80 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65  ;.}...#else.# de
25c90 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20  fine unixShmMap 
25ca0 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
25cb0 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  nixShmLock    0.
25cc0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
25cd0 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
25ce0 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20  ne unixShmUnmap 
25cf0 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
25d00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25d10 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
25d20 49 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  If it is current
25d30 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ly memory mapped
25d40 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64  , unmap file pFd
25d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25d60 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75   unixUnmapfile(u
25d70 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20  nixFile *pFd){. 
25d80 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
25d90 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 69  etchOut==0 );.#i
25da0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
25db0 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
25dc0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29  Fd->pMapRegion )
25dd0 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70  {.    osMunmap(p
25de0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20  Fd->pMapRegion, 
25df0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
25e00 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70  ual);.    pFd->p
25e10 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
25e20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
25e30 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
25e40 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
25e50 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
25e60 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
25e70 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
25e80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 79 73  * Return the sys
25e90 74 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  tem page size..*
25ea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
25eb0 78 47 65 74 50 61 67 65 73 69 7a 65 28 76 6f 69  xGetPagesize(voi
25ec0 64 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45  d){.#if HAVE_MRE
25ed0 4d 41 50 0a 20 20 72 65 74 75 72 6e 20 35 31 32  MAP.  return 512
25ee0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
25ef0 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72  _BSD_SOURCE).  r
25f00 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a  eturn getpagesiz
25f10 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  e();.#else.  ret
25f20 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66  urn (int)sysconf
25f30 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a  (_SC_PAGESIZE);.
25f40 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 20  #endif.}.#endif 
25f50 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
25f60 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69  AP_SIZE>0 */..#i
25f70 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
25f80 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 41  P_SIZE>0./*.** A
25f90 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
25fa0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65  e size of the me
25fb0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69  mory mapping mai
25fc0 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20  ntained by file 
25fd0 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
25fe0 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73  Fd to nNew bytes
25ff0 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  . Any existing m
26000 61 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72  apping is discar
26010 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ded..**.** If su
26020 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66  ccessful, this f
26030 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
26040 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
26050 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  bles:.**.**     
26060 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52    unixFile.pMapR
26070 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75  egion.**       u
26080 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
26090 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
260a0 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  le.mmapSizeActua
260b0 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63  l.**.** If unsuc
260c0 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f  cessful, an erro
260d0 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67  r message is log
260e0 67 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f  ged via sqlite3_
260f0 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65  log() and.** the
26100 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73   three variables
26110 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65   above are zeroe
26120 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
26130 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a  SQLite should.**
26140 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73   continue access
26150 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
26160 20 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64   using the xRead
26170 28 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a  () and xWrite().
26180 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ** methods..*/.s
26190 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52  tatic void unixR
261a0 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78  emapfile(.  unix
261b0 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20  File *pFd,      
261c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
261d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
261e0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e  bject */.  i64 n
261f0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20  New             
26200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26210 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73  quired mapping s
26220 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ize */.){.  cons
26230 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22  t char *zErr = "
26240 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d  mmap";.  int h =
26250 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20   pFd->h;        
26260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26270 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
26280 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65   open on db file
26290 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20   */.  u8 *pOrig 
262a0 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  = (u8 *)pFd->pMa
262b0 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f  pRegion;   /* Po
262c0 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
262d0 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f   file mapping */
262e0 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70  .  i64 nOrig = p
262f0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
26300 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  al;     /* Size 
26310 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20  of pOrig region 
26320 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38  in bytes */.  u8
26330 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f     /* Location o
26360 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f  f new mapping */
26370 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50  .  int flags = P
26380 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20  ROT_READ;       
26390 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
263a0 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70   to pass to mmap
263b0 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  () */..  assert(
263c0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
263d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
263e0 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nNew>pFd->mmapSi
263f0 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
26400 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53  nNew<=pFd->mmapS
26410 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65  izeMax );.  asse
26420 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
26430 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61  assert( pFd->mma
26440 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64  pSizeActual>=pFd
26450 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
26460 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c  assert( MAP_FAIL
26470 45 44 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ED!=0 );..  if( 
26480 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
26490 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
264a0 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d  Y)==0 ) flags |=
264b0 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 0a 20 20   PROT_WRITE;..  
264c0 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 20 20 20  if( pOrig ){.   
264d0 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73   const int szSys
264e0 70 61 67 65 20 3d 20 75 6e 69 78 47 65 74 50 61  page = unixGetPa
264f0 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36  gesize();.    i6
26500 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d  4 nReuse = (pFd-
26510 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a  >mmapSize & ~(sz
26520 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 20 20 20  Syspage-1));.   
26530 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72   u8 *pReq = &pOr
26540 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20  ig[nReuse];..   
26550 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61   /* Unmap any pa
26560 67 65 73 20 6f 66 20 74 68 65 20 65 78 69 73 74  ges of the exist
26570 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74  ing mapping that
26580 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65   cannot be reuse
26590 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52  d. */.    if( nR
265a0 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20  euse!=nOrig ){. 
265b0 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52       osMunmap(pR
265c0 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65  eq, nOrig-nReuse
265d0 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41  );.    }..#if HA
265e0 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e  VE_MREMAP.    pN
265f0 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f  ew = osMremap(pO
26600 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65  rig, nReuse, nNe
26610 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56  w, MREMAP_MAYMOV
26620 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22  E);.    zErr = "
26630 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20  mremap";.#else. 
26640 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70     pNew = osMmap
26650 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75  (pReq, nNew-nReu
26660 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  se, flags, MAP_S
26670 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65  HARED, h, nReuse
26680 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21  );.    if( pNew!
26690 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
266a0 20 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70       if( pNew!=p
266b0 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  Req ){.        o
266c0 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e  sMunmap(pNew, nN
266d0 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20  ew - nReuse);.  
266e0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a        pNew = 0;.
266f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26700 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69       pNew = pOri
26710 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
26720 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
26730 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65  The attempt to e
26740 78 74 65 6e 64 20 74 68 65 20 65 78 69 73 74 69  xtend the existi
26750 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  ng mapping faile
26760 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20  d. Free it. */. 
26770 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50     if( pNew==MAP
26780 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d  _FAILED || pNew=
26790 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  =0 ){.      osMu
267a0 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  nmap(pOrig, nReu
267b0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
267c0 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73 20    /* If pNew is 
267d0 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20  still NULL, try 
267e0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74  to create an ent
267f0 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e  irely new mappin
26800 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77  g. */.  if( pNew
26810 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  ==0 ){.    pNew 
26820 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77  = osMmap(0, nNew
26830 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41  , flags, MAP_SHA
26840 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a  RED, h, 0);.  }.
26850 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50  .  if( pNew==MAP
26860 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 70  _FAILED ){.    p
26870 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65  New = 0;.    nNe
26880 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c  w = 0;.    unixL
26890 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f  ogError(SQLITE_O
268a0 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50  K, zErr, pFd->zP
268b0 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ath);..    /* If
268c0 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f 76   the mmap() abov
268d0 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 65  e failed, assume
268e0 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71   that all subseq
268f0 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c  uent mmap() call
26900 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72  s.    ** will pr
26910 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e  obably fail too.
26920 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73   Fall back to us
26930 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
26940 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20 20   exclusively.   
26950 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65   ** in this case
26960 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d  .  */.    pFd->m
26970 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a  mapSizeMax = 0;.
26980 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52    }.  pFd->pMapR
26990 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29  egion = (void *)
269a0 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61  pNew;.  pFd->mma
269b0 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61  pSize = pFd->mma
269c0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e  pSizeActual = nN
269d0 65 77 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ew;.}.#endif../*
269e0 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
269f0 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
26a00 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
26a10 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
26a20 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
26a30 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
26a40 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
26a50 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
26a60 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
26a70 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
26a80 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
26a90 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
26aa0 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
26ab0 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
26ac0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
26ad0 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
26ae0 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
26af0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
26b00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
26b10 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
26b20 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
26b30 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
26b40 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
26b50 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
26b60 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
26b70 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
26b80 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
26b90 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
26ba0 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
26bb0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
26bc0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
26bd0 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
26be0 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
26bf0 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
26c00 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
26c10 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
26c20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
26c30 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
26c40 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68  L_MMAP_LIMIT, wh
26c50 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
26c60 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
26c70 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
26c80 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
26c90 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20  rs (even if the 
26ca0 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a  mapping is not.*
26cb0 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61  * recreated as a
26cc0 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74   result of outst
26cd0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
26ce0 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s) or an SQLite 
26cf0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
26d00 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
26d10 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
26d20 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
26d30 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 23 69  , i64 nByte){.#i
26d40 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
26d50 50 5f 53 49 5a 45 3e 30 0a 20 20 69 36 34 20 6e  P_SIZE>0.  i64 n
26d60 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69  Map = nByte;.  i
26d70 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
26d80 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64  ( nMap>=0 || pFd
26d90 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
26da0 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65  ;.  if( pFd->nFe
26db0 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72  tchOut>0 ) retur
26dc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
26dd0 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20  if( nMap<0 ){.  
26de0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
26df0 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
26e00 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
26e10 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
26e20 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
26e30 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62  t(pFd->h, &statb
26e40 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
26e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26e60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26e70 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
26e80 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20     }.    nMap = 
26e90 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b  statbuf.st_size;
26ea0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e  .  }.  if( nMap>
26eb0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
26ec0 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70   ){.    nMap = p
26ed0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  Fd->mmapSizeMax;
26ee0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61 70  .  }..  if( nMap
26ef0 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  !=pFd->mmapSize 
26f00 29 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61 70 3e  ){.    if( nMap>
26f10 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 52  0 ){.      unixR
26f20 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d  emapfile(pFd, nM
26f30 61 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ap);.    }else{.
26f40 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66        unixUnmapf
26f50 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a  ile(pFd);.    }.
26f60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
26f70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26f80 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  }../*.** If poss
26f90 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
26fa0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
26fb0 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
26fc0 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
26fd0 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
26fe0 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
26ff0 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
27000 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
27010 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
27020 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
27030 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
27040 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
27050 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
27060 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
27070 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
27080 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
27090 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
270a0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
270b0 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
270c0 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
270d0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
270e0 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
270f0 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
27100 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
27110 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
27120 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
27130 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
27140 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
27150 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
27160 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c  entually .** rel
27170 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
27180 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e  ce by calling un
27190 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  ixUnfetch()..*/.
271a0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
271b0 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
271c0 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
271d0 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20   int nAmt, void 
271e0 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  **pp){.#if SQLIT
271f0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
27200 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  0.  unixFile *pF
27210 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  d = (unixFile *)
27220 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
27230 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
27240 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a   file */.#endif.
27250 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20    *pp = 0;..#if 
27260 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
27270 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64  SIZE>0.  if( pFd
27280 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
27290 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  ){.    if( pFd->
272a0 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b  pMapRegion==0 ){
272b0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
272c0 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64 2c  unixMapfile(pFd,
272d0 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   -1);.      if( 
272e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
272f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
27300 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
27310 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
27320 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
27330 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
27340 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
27350 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
27360 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
27370 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
27380 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27390 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
273a0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
273b0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
273c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
273d0 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65  eleases a .** re
273e0 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
273f0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
27400 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63 68  all to unixFetch
27410 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a  (). The second.*
27420 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  * argument passe
27430 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
27440 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  on must be the s
27450 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65  ame as the corre
27460 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75  sponding.** argu
27470 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61  ment that was pa
27480 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69 78  ssed to the unix
27490 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69  Fetch() invocati
274a0 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  on. .**.** Or, i
274b0 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
274c0 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
274d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
274e0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
274f0 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74   .** to inform t
27500 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61  he VFS layer tha
27510 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  t, according to 
27520 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74  POSIX, any exist
27530 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20  ing mapping .** 
27540 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
27550 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
27560 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
27570 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 66  atic int unixUnf
27580 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
27590 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
275a0 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 75 6e 69   void *p){.  uni
275b0 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e  xFile *pFd = (un
275c0 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f  ixFile *)fd;   /
275d0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
275e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
275f0 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
27600 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f  ETER(iOff);..  /
27610 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70  * If p==0 (unmap
27620 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65   the entire file
27630 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  ) then there mus
27640 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64  t be no outstand
27650 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68  ing .  ** xFetch
27660 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c   references. Or,
27670 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e   if p!=0 (meanin
27680 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63  g it is an xFetc
27690 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20  h reference),.  
276a0 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  ** then there mu
276b0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
276c0 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20  ne outstanding. 
276d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
276e0 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74  ==0)==(pFd->nFet
276f0 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20  chOut==0) );..  
27700 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d  /* If p!=0, it m
27710 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f  ust match the iO
27720 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61  ff value. */.  a
27730 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
27740 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  ==&((u8 *)pFd->p
27750 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
27760 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a   );..  if( p ){.
27770 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
27780 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ut--;.  }else{. 
27790 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65     unixUnmapfile
277a0 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (pFd);.  }..  as
277b0 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
277c0 68 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 72 65 74  hOut>=0 );.  ret
277d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
277e0 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
277f0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
27800 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
27810 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
27820 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
27830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
27840 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
27850 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
27860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27870 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
27880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
278a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
278b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
278c0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
278d0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
278e0 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
278f0 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
27900 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
27910 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
27920 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
27930 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
27940 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
27950 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
27960 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
27970 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
27980 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
27990 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
279a0 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
279b0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
279c0 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
279d0 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
279e0 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
279f0 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
27a00 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
27a10 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
27a20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
27a30 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
27a40 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
27a50 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
27a60 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
27a70 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
27a80 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
27a90 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
27aa0 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
27ab0 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
27ac0 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
27ad0 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
27ae0 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
27af0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
27b00 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
27b10 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
27b20 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
27b30 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
27b40 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
27b50 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
27b60 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
27b70 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f  r-funtion F, two
27b80 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
27b90 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ated:.**.**    (
27ba0 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64  1) The real find
27bb0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er-function name
27bc0 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a  d "FImpt()"..**.
27bd0 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73  **    (2) A cons
27be0 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tant pointer to 
27bf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61  this function na
27c00 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a  med just "F"..**
27c10 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
27c20 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65   to the F pointe
27c30 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  r is used as the
27c40 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20   pAppData value 
27c50 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63  for VFS.** objec
27c60 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ts.  We have to 
27c70 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20  do this instead 
27c80 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44  of letting pAppD
27c90 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72  ata point.** dir
27ca0 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e  ectly at the fin
27cb0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e  der-function sin
27cc0 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65  ce C90 rules pre
27cd0 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20  vent a void*.** 
27ce0 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74  from be cast int
27cf0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
27d00 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45  nter..**.**.** E
27d10 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
27d20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72  this macro gener
27d30 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73  ates two objects
27d40 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63  :.**.**   *  A c
27d50 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f  onstant sqlite3_
27d60 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
27d70 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68  t call METHOD th
27d80 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a  at has locking.*
27d90 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43  *      methods C
27da0 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
27db0 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a  CK, CKRESLOCK..*
27dc0 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f  *.**   *  An I/O
27dd0 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
27de0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46  unction called F
27df0 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72  INDER that retur
27e00 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
27e10 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48       to the METH
27e20 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  OD object in the
27e30 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74   previous bullet
27e40 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d  ..*/.#define IOM
27e50 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d  ETHODS(FINDER, M
27e60 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20  ETHOD, VERSION, 
27e70 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
27e80 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20  OCK, CKLOCK)    
27e90 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
27ea0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
27eb0 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20  ods METHOD = {  
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ee0 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20   \.   VERSION,  
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f00 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f30 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20  \.   CLOSE,     
27f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f50 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20   /* xClose */   
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
27f80 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20  .   unixRead,   
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fa0 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20  /* xRead */     
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27fd0 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20     unixWrite,   
27fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27ff0 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20  * xWrite */     
28000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28010 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28020 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20    unixTruncate, 
28030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28040 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20   xTruncate */   
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28070 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20   unixSync,      
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28090 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20  xSync */        
280a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
280c0 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20  unixFileSize,   
280d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
280e0 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20  FileSize */     
280f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28100 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c            \.   L
28110 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
28120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
28130 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
28140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28150 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e           \.   UN
28160 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
28170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
28180 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  lock */         
28190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281a0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c          \.   CKL
281b0 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
281c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
281d0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
281e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
281f0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28200 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
28210 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
28220 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20  Control */      
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28240 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
28250 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
28260 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
28270 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  rSize */        
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28290 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65       \.   unixDe
282a0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
282b0 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65  ics,  /* xDevice
282c0 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20  Capabilities */ 
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282e0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
282f0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
28300 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
28310 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28330 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c     \.   unixShmL
28340 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
28350 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
28360 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28380 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61    \.   unixShmBa
28390 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
283a0 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
283b0 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283d0 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d   \.   unixShmUnm
283e0 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
283f0 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
28400 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28420 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68 2c 20  \.   unixFetch, 
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20 20 20   /* xFetch */   
28450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28470 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63 68 2c  .   unixUnfetch,
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 20 20  /* xUnfetch */  
284a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
284c0 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
28510 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
28520 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
28530 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e  FINDER##Impl(con
28540 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78  st char *z, unix
28550 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20  File *p){   \.  
28560 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28570 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41  (z); UNUSED_PARA
28580 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72             \.  r
285b0 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20  eturn &METHOD;  
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285f0 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20            \.}   
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28640 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
28650 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
28660 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f  io_methods *(*co
28670 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73  nst FINDER)(cons
28680 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
28690 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20   *p)    \.    = 
286a0 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f  FINDER##Impl;../
286b0 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c  *.** Here are al
286c0 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  l of the sqlite3
286d0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
286e0 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20  cts for each of 
286f0 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73  the.** locking s
28700 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63  trategies.  Func
28710 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72  tions that retur
28720 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  n pointers to th
28730 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61  ese methods.** a
28740 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e  re also created.
28750 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  .*/.IOMETHODS(. 
28760 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20   posixIoFinder, 
28770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
28780 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
28790 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d  me */.  posixIoM
287a0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
287b0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
287c0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
287d0 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20  ame */.  3,     
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
28800 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65  ory and mmap are
28810 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e   enabled */.  un
28820 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
28830 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
28840 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
28850 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
28860 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
28870 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
28880 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  xUnlock,        
28890 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
288a0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
288b0 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
288c0 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ock     /* xChec
288d0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
288e0 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
288f0 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ODS(.  nolockIoF
28900 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
28910 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
28920 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f  ion name */.  no
28930 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
28940 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
28950 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
28960 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
28970 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28980 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
28990 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
289a0 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  abled */.  noloc
289b0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
289c0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
289d0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
289e0 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
289f0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
28a00 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
28a10 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
28a20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
28a30 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
28a40 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
28a50 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck   /* xCheckRe
28a60 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
28a70 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
28a80 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e  (.  dotlockIoFin
28a90 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  der,          /*
28aa0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
28ab0 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
28ac0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
28ad0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
28ae0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
28af0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
28b20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
28b30 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  ed */.  dotlockC
28b40 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
28b50 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
28b60 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c  od */.  dotlockL
28b70 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
28b80 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
28b90 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  d */.  dotlockUn
28ba0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
28bb0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
28bc0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  od */.  dotlockC
28bd0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
28be0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
28bf0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
28c00 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
28c10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
28c20 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
28c30 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
28c40 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
28c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
28c60 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
28c70 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
28c80 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
28c90 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
28ca0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
28cb0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cd0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
28ce0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
28cf0 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c  */.  flockClose,
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d10 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
28d20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20  */.  flockLock, 
28d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d40 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
28d50 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  /.  flockUnlock,
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28d70 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
28d80 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52  */.  flockCheckR
28d90 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f  eservedLock    /
28da0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
28db0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
28dc0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f  .#endif..#if OS_
28dd0 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44  VXWORKS.IOMETHOD
28de0 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72  S(.  semIoFinder
28df0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
28e00 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
28e10 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49  n name */.  semI
28e20 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
28e30 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
28e40 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
28e50 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
28e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e70 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
28e80 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
28e90 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73  led */.  semClos
28ea0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
28eb0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
28ec0 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b  hod */.  semLock
28ed0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28ee0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
28ef0 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63  od */.  semUnloc
28f00 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
28f10 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
28f20 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63  hod */.  semChec
28f30 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
28f40 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
28f50 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
28f60 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
28f70 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
28f80 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
28f90 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
28fa0 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
28fb0 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  afpIoFinder,    
28fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
28fd0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
28fe0 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68  e */.  afpIoMeth
28ff0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
29000 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
29010 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29020 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
29030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29040 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
29050 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
29060 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29080 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
29090 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
290b0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
290c0 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
290d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
290e0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
290f0 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
29100 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
29110 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29120 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
29130 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
29140 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
29150 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
29160 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
29170 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
29180 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
29190 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
291a0 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
291b0 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
291c0 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
291d0 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
291e0 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
291f0 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
29200 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
29210 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
29220 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
29230 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
29240 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
29250 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
29260 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
29270 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
29280 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
29290 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
292a0 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
292b0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
292c0 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
292d0 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
292e0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
292f0 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
29300 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
29310 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
29320 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
29330 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
29340 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
29350 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
29360 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
29370 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
29380 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
29390 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
293a0 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
293b0 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
293c0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
293d0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
293e0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
293f0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
29400 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
29410 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
29420 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29430 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
29440 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
29450 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
29460 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
29470 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29480 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
29490 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
294a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
294b0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
294c0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78  sabled */.  prox
294d0 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
294e0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
294f0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
29500 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
29510 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29520 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
29530 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29540 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29550 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
29560 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
29570 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
29580 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
29590 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
295a0 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
295b0 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
295c0 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
295d0 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
295e0 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
295f0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
29600 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
29610 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29620 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
29630 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
29640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29650 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
29660 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
29670 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
29680 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
29690 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
296a0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
296b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296c0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
296d0 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
296e0 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
296f0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
29700 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
29710 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
29720 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29730 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29740 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
29750 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29760 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29770 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
29780 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29790 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
297a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
297b0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
297c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
297d0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
297e0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
297f0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
29800 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
29810 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
29820 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
29830 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
29840 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
29850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
29860 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
29870 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
29880 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29890 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
298a0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
298b0 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
298c0 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
298d0 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
298e0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
298f0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
29900 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
29910 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
29920 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
29930 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
29940 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
29950 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
29960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
29970 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
29980 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
29990 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
299a0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
299b0 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
299c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
299d0 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
299e0 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
299f0 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
29a00 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
29a10 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
29a20 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
29a30 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
29a40 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
29a50 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
29a60 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
29a70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
29a80 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
29a90 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
29aa0 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
29ab0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
29ac0 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
29ad0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
29ae0 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
29af0 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
29b00 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
29b10 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
29b20 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
29b30 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
29b40 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
29b50 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
29b60 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
29b70 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
29b80 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
29b90 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
29ba0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
29bb0 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
29bc0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
29bd0 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
29be0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
29bf0 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
29c00 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
29c10 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
29c20 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
29c30 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
29c40 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
29c50 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
29c60 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
29c70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
29c80 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
29c90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
29ca0 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
29cb0 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
29cc0 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
29cd0 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
29ce0 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
29cf0 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
29d00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
29d10 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
29d20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
29d30 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
29d40 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
29d50 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
29d60 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
29d70 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
29d80 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
29d90 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
29da0 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
29db0 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
29dc0 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
29dd0 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
29de0 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
29df0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
29e00 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
29e10 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
29e20 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
29e30 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
29e40 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
29e50 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
29e60 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
29e70 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
29e80 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
29e90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
29ea0 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
29eb0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
29ec0 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
29ed0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
29ee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
29ef0 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
29f00 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
29f10 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
29f20 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
29f30 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
29f40 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
29f50 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
29f60 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
29f70 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
29f80 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
29f90 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
29fa0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
29fb0 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
29fc0 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
29fd0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29fe0 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
29ff0 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
2a000 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
2a010 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
2a020 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
2a030 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
2a040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a050 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
2a060 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
2a070 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a080 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
2a090 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
2a0a0 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
2a0b0 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56  ** This is for V
2a0c0 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  XWorks only..*/.
2a0d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2a0e0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a0f0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
2a100 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
2a110 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
2a120 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
2a130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2a140 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
2a150 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
2a160 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62  the open file ob
2a170 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ject */.){.  str
2a180 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
2a190 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
2a1a0 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
2a1b0 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
2a1c0 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
2a1d0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2a1e0 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
2a1f0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
2a200 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2a210 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
2a220 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2a230 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20  Methods;.  }..  
2a240 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c  /* Test if fcntl
2a250 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  () is supported 
2a260 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74  and use POSIX st
2a270 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20  yle locks..  ** 
2a280 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62  Otherwise fall b
2a290 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64  ack to the named
2a2a0 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f   semaphore metho
2a2b0 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  d..  */.  lockIn
2a2c0 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
2a2d0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
2a2e0 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
2a2f0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
2a300 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
2a310 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
2a320 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
2a330 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
2a340 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
2a350 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  1 ) {.    return
2a360 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2a370 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2a380 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68  eturn &semIoMeth
2a390 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
2a3a0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2a3b0 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
2a3c0 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
2a3d0 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
2a3e0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
2a3f0 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
2a400 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
2a410 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  /* OS_VXWORKS &&
2a420 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2a430 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
2a440 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
2a450 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
2a460 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65  inter to a IO me
2a470 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
2a480 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66  tion:.*/.typedef
2a490 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a4a0 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e  o_methods *(*fin
2a4b0 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20  der_type)(const 
2a4c0 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
2a4d0 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.../***********
2a4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a520 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2a530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
2a540 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
2a550 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
2a560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2a570 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
2a580 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
2a590 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2a5a0 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
2a5b0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
2a5c0 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
2a5d0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
2a5e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2a5f0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
2a600 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
2a610 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69  by pId..*/.stati
2a620 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78  c int fillInUnix
2a630 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  File(.  sqlite3_
2a640 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
2a650 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
2a660 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  s object */.  in
2a670 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
2a680 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
2a690 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66  le descriptor of
2a6a0 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
2a6b0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
2a6c0 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
2a6d0 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
2a6e0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
2a6f0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2a700 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2a710 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
2a720 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
2a730 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  pened */.  int c
2a740 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
2a750 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
2a760 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61  re UNIXFILE_* va
2a770 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  lues */.){.  con
2a780 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2a790 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53  thods *pLockingS
2a7a0 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65  tyle;.  unixFile
2a7b0 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69   *pNew = (unixFi
2a7c0 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20  le *)pId;.  int 
2a7d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a7e0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
2a7f0 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b  >pInode==NULL );
2a800 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74  ..  /* Usually t
2a810 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d  he path zFilenam
2a820 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
2a830 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
2a840 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78  ame. The.  ** ex
2a850 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20  ception is when 
2a860 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78  opening the prox
2a870 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69  y "conch" file i
2a880 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20  n builds that.  
2a890 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73  ** include the s
2a8a0 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63  pecial Apple loc
2a8b0 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a  king styles..  *
2a8c0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
2a8d0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2a8e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2a8f0 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74  G_STYLE.  assert
2a900 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
2a910 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
2a920 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73  '/' .    || pVfs
2a930 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69  ->pAppData==(voi
2a940 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
2a950 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20  nder );.#else.  
2a960 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
2a970 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
2a980 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e  e[0]=='/' );.#en
2a990 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63  dif..  /* No loc
2a9a0 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74  king occurs in t
2a9b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
2a9c0 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  /.  assert( zFil
2a9d0 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72  ename!=0 || (ctr
2a9e0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2a9f0 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a  E_NOLOCK)!=0 );.
2aa00 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
2aa10 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
2aa20 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b   h, zFilename));
2aa30 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
2aa40 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70    pNew->pVfs = p
2aa50 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61  Vfs;.  pNew->zPa
2aa60 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2aa70 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2aa80 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67  s = (u8)ctrlFlag
2aa90 73 3b 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53  s;.  pNew->mmapS
2aaa0 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  izeMax = sqlite3
2aab0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
2aac0 6d 61 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  map;.  if( sqlit
2aad0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
2aae0 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2aaf0 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
2ab00 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
2ab30 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
2ab40 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
2ab50 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2ab60 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
2ab70 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  SOW;.  }.  if( s
2ab80 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  trcmp(pVfs->zNam
2ab90 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d  e,"unix-excl")==
2aba0 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
2abb0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2abc0 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a  FILE_EXCL;.  }..
2abd0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2abe0 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
2abf0 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
2ac00 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
2ac10 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
2ac20 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c  .    ctrlFlags |
2ac30 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
2ac40 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
2ac50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
2ac60 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c  ndif..  if( ctrl
2ac70 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2ac80 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _NOLOCK ){.    p
2ac90 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26  LockingStyle = &
2aca0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2acb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
2acc0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a  ockingStyle = (*
2acd0 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70  *(finder_type*)p
2ace0 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a  Vfs->pAppData)(z
2acf0 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b  Filename, pNew);
2ad00 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2ad10 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2ad20 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46  .    /* Cache zF
2ad30 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c  ilename in the l
2ad40 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28  ocking context (
2ad50 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20  AFP and dotlock 
2ad60 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20  override) for.  
2ad70 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61    ** proxyLock a
2ad80 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73  ctivation is pos
2ad90 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72  sible (remote pr
2ada0 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20  oxy is based on 
2adb0 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20  db name).    ** 
2adc0 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e  zFilename remain
2add0 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69  s valid until fi
2ade0 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f  le is closed, to
2adf0 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20   support */.    
2ae00 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2ae10 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46  text = (void*)zF
2ae20 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ilename;.#endif.
2ae30 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b    }..  if( pLock
2ae40 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73  ingStyle == &pos
2ae50 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20  ixIoMethods.#if 
2ae60 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2ae70 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2ae80 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2ae90 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e  E.    || pLockin
2aea0 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f  gStyle == &nfsIo
2aeb0 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20  Methods.#endif. 
2aec0 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   ){.    unixEnte
2aed0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
2aee0 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2aef0 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2af00 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  node);.    if( r
2af10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2af20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65        /* If an e
2af30 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
2af40 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2af50 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
2af60 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
2af70 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
2af80 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
2af90 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
2afa0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61  ndInodeInfo() ma
2afb0 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20  y fail.      ** 
2afc0 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
2afd0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
2afe0 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c   **   (a) A call
2aff0 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c   to fstat() fail
2b000 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  ed..      **   (
2b010 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  b) A malloc fail
2b020 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2b030 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28     ** Scenario (
2b040 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  b) may only occu
2b050 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  r if the process
2b060 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f   is holding no o
2b070 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69  ther.      ** fi
2b080 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
2b090 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2b0a0 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77  file. If there w
2b0b0 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20  ere other file. 
2b0c0 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
2b0d0 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ors on this file
2b0e0 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63  , then no malloc
2b0f0 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72   would be requir
2b100 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66  ed by.      ** f
2b110 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20  indInodeInfo(). 
2b120 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
2b130 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
2b140 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
2b150 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
2b160 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
2b170 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
2b180 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
2b190 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
2b1a0 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
2b1b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2b1c0 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
2b1d0 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
2b1e0 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
2b1f0 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
2b200 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
2b210 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
2b220 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
2b230 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
2b240 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
2b250 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
2b260 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
2b270 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
2b280 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
2b290 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
2b2a0 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  /.      robust_c
2b2b0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2b2c0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68  LINE__);.      h
2b2d0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2b2e0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2b2f0 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
2b300 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b310 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2b320 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
2b330 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2b340 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
2b350 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2b360 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
2b370 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2b380 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2b390 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
2b3a0 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
2b3b0 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
2b3c0 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
2b3d0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
2b3e0 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2b3f0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
2b400 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2b410 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
2b420 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
2b430 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2b440 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2b450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b460 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
2b470 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
2b480 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
2b490 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
2b4a0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
2b4b0 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
2b4c0 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
2b4d0 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
2b4e0 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
2b4f0 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
2b500 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
2b510 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
2b520 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
2b530 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65     pCtx->reserve
2b540 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61  d = 0;.      sra
2b550 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
2b560 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2b570 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
2b580 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2b590 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2b5a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2b5b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b5c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2b5d0 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  e(pNew->lockingC
2b5e0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
2b5f0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2b600 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2b610 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
2b620 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b630 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2b640 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
2b650 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
2b660 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2b670 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
2b680 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2b690 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
2b6a0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2b6b0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2b6c0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2b6d0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2b6e0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
2b6f0 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
2b700 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
2b710 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
2b720 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74  name;.    assert
2b730 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29  ( zFilename!=0 )
2b740 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20  ;.    nFilename 
2b750 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  = (int)strlen(zF
2b760 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20  ilename) + 6;.  
2b770 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63    zLockFile = (c
2b780 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
2b790 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b  lloc(nFilename);
2b7a0 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69  .    if( zLockFi
2b7b0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  le==0 ){.      r
2b7c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2b7d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b7e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2b7f0 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a  ntf(nFilename, z
2b800 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44  LockFile, "%s" D
2b810 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a  OTLOCK_SUFFIX, z
2b820 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
2b830 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2b840 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63  ngContext = zLoc
2b850 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20  kFile;.  }..#if 
2b860 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73  OS_VXWORKS.  els
2b870 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
2b880 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74  yle == &semIoMet
2b890 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  hods ){.    /* N
2b8a0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
2b8b0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2b8c0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2b8d0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
2b8e0 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ** included in t
2b8f0 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e  he semLockingCon
2b900 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  text.    */.    
2b910 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2b920 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
2b930 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2b940 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2b950 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
2b960 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
2b970 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e  >pInode->pSem==N
2b980 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ULL) ){.      ch
2b990 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70  ar *zSemName = p
2b9a0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2b9b0 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  mName;.      int
2b9c0 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   n;.      sqlite
2b9d0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
2b9e0 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d  ATHNAME, zSemNam
2b9f0 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20  e, "/%s.sem",.  
2ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba10 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e       pNew->pId->
2ba20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
2ba30 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b  .      for( n=1;
2ba40 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b   zSemName[n]; n+
2ba50 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20  + ).        if( 
2ba60 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27  zSemName[n]=='/'
2ba70 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d   ) zSemName[n] =
2ba80 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77   '_';.      pNew
2ba90 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
2baa0 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61   sem_open(zSemNa
2bab0 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36  me, O_CREAT, 066
2bac0 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  6, 1);.      if(
2bad0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2bae0 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45  Sem == SEM_FAILE
2baf0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  D ){.        rc 
2bb00 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2bb10 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
2bb20 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30  node->aSemName[0
2bb30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
2bb40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
2bb50 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2bb60 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e  }.#endif.  .  pN
2bb70 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ew->lastErrno = 
2bb80 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  0;.#if OS_VXWORK
2bb90 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  S.  if( rc!=SQLI
2bba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2bbb0 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
2bbc0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2bbd0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d  LINE__);.    h =
2bbe0 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e   -1;.    osUnlin
2bbf0 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
2bc00 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2bc10 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
2bc20 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  LETE;.  }.#endif
2bc30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2bc40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2bc50 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  h>=0 ) robust_cl
2bc60 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
2bc70 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b  INE__);.  }else{
2bc80 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68  .    pNew->pMeth
2bc90 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79  od = pLockingSty
2bca0 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  le;.    OpenCoun
2bcb0 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72  ter(+1);.    ver
2bcc0 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b  ifyDbFile(pNew);
2bcd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2bce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2bcf0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
2bd00 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69  directory in whi
2bd10 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72  ch to put tempor
2bd20 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66  ary files..** If
2bd30 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d   no suitable tem
2bd40 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72 65  porary file dire
2bd50 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75  ctory can be fou
2bd60 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  nd, return NULL.
2bd70 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2bd80 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46   char *unixTempF
2bd90 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20  ileDir(void){.  
2bda0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2bdb0 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a  r *azDirs[] = {.
2bdc0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a       0,.     0,.
2bdd0 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c       "/var/tmp",
2bde0 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22  .     "/usr/tmp"
2bdf0 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20  ,.     "/tmp",. 
2be00 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20      0        /* 
2be10 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20  List terminator 
2be20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e  */.  };.  unsign
2be30 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  ed int i;.  stru
2be40 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63  ct stat buf;.  c
2be50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
2be60 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30  = 0;..  azDirs[0
2be70 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  ] = sqlite3_temp
2be80 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66  _directory;.  if
2be90 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61  ( !azDirs[1] ) a
2bea0 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e  zDirs[1] = geten
2beb0 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 66  v("TMPDIR");.  f
2bec0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
2bed0 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
2bee0 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72  azDirs[0]); zDir
2bef0 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20  =azDirs[i++]){. 
2bf00 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29     if( zDir==0 )
2bf10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2bf20 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20  f( osStat(zDir, 
2bf30 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  &buf) ) continue
2bf40 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44  ;.    if( !S_ISD
2bf50 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  IR(buf.st_mode) 
2bf60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2bf70 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a 44 69  if( osAccess(zDi
2bf80 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  r, 07) ) continu
2bf90 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;.    break;.  
2bfa0 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b  }.  return zDir;
2bfb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2bfc0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2bfd0 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
2bfe0 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c   zBuf must be al
2bff0 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  located.** by th
2c000 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73  e calling proces
2c010 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69  s and must be bi
2c020 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
2c030 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66   at least.** pVf
2c040 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  s->mxPathname by
2c050 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
2c060 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
2c070 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
2c080 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  r *zBuf){.  stat
2c090 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
2c0a0 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  d char zChars[] 
2c0b0 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
2c0c0 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
2c0d0 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
2c0e0 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
2c0f0 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
2c100 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64  789";.  unsigned
2c110 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e   int i, j;.  con
2c120 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 0a  st char *zDir;..
2c130 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
2c140 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
2c150 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
2c160 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
2c170 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
2c180 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
2c190 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
2c1a0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
2c1b0 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
2c1c0 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
2c1d0 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  g. .  */.  Simul
2c1e0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2c1f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
2c200 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69  );..  zDir = uni
2c210 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a  xTempFileDir();.
2c220 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
2c230 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f  zDir = ".";..  /
2c240 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2c250 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
2c260 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
2c270 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
2c280 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65   file .  ** name
2c290 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
2c2a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2c2b0 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ROR..  */.  if( 
2c2c0 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20  (strlen(zDir) + 
2c2d0 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45  strlen(SQLITE_TE
2c2e0 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20  MP_FILE_PREFIX) 
2c2f0 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a 65 5f 74  + 18) >= (size_t
2c300 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74  )nBuf ){.    ret
2c310 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2c320 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  ;.  }..  do{.   
2c330 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c340 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c  f(nBuf-18, zBuf,
2c350 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d   "%s/"SQLITE_TEM
2c360 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
2c370 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69  Dir);.    j = (i
2c380 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b  nt)strlen(zBuf);
2c390 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
2c3a0 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
2c3b0 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  f[j]);.    for(i
2c3c0 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
2c3d0 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  ++){.      zBuf[
2c3e0 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
2c3f0 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
2c400 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
2c410 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
2c420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
2c430 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 42 75  [j] = 0;.    zBu
2c440 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 7d 77  f[j+1] = 0;.  }w
2c450 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a  hile( osAccess(z
2c460 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72  Buf,0)==0 );.  r
2c470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c480 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
2c490 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2c4a0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
2c4b0 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
2c4c0 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73  Routine to trans
2c4d0 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20  form a unixFile 
2c4e0 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63  into a proxy-loc
2c4f0 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a  king unixFile..*
2c500 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2c510 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f   in the proxy-lo
2c520 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74  ck division, but
2c530 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65   used by unixOpe
2c540 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45  n().** if SQLITE
2c550 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2c560 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64  CKING is defined
2c570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c580 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
2c590 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a  ixFile(unixFile*
2c5a0 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
2c5b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
2c5c0 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
2c5d0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2c5e0 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
2c5f0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
2c600 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74  se .** file (not
2c610 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61   a journal or ma
2c620 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
2c630 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  e) identified by
2c640 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61   pathname.** zPa
2c650 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  th with SQLITE_O
2c660 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61  PEN_XXX flags ma
2c670 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73  tching those pas
2c680 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2c690 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  d.** argument to
2c6a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2c6b0 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c  **.** Such a fil
2c6c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79  e descriptor may
2c6d0 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61   exist if a data
2c6e0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2c6f0 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75  was closed.** bu
2c700 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
2c710 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c720 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c   could not be cl
2c730 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d  osed because som
2c740 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20  e.** other file 
2c750 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
2c760 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
2c770 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69   is holding a fi
2c780 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65  le-lock..** Refe
2c790 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  r to comments in
2c7a0 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29   the unixClose()
2c7b0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68   function and th
2c7c0 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e  e lengthy commen
2c7d0 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  t.** describing 
2c7e0 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20  "Posix Advisory 
2c7f0 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20  Locking" at the 
2c800 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69  start of this fi
2c810 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68  le for .** furth
2c820 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f  er details. Also
2c830 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a  , ticket #4018..
2c840 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61  **.** If a suita
2c850 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
2c860 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  tor is found, th
2c870 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  en it is returne
2c880 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68  d. If no.** such
2c890 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c8a0 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20   is located, -1 
2c8b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2c8c0 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65  static UnixUnuse
2c8d0 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c  dFd *findReusabl
2c8e0 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eFd(const char *
2c8f0 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
2c900 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  ){.  UnixUnusedF
2c910 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  d *pUnused = 0;.
2c920 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61  .  /* Do not sea
2c930 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
2c940 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
2c950 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f  r on vxworks. No
2c960 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76  t because.  ** v
2c970 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74  xworks would not
2c980 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68   benefit from th
2c990 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67  e change (it mig
2c9a0 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75  ht, we're not su
2c9b0 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65  re),.  ** but be
2c9c0 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20  cause no way to 
2c9d0 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65  test it is curre
2c9e0 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20  ntly available. 
2c9f0 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20  It is better .  
2ca00 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62  ** not to risk b
2ca10 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20  reaking vxworks 
2ca20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20  support for the 
2ca30 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20  sake of such an 
2ca40 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65  obscure .  ** fe
2ca50 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21  ature.  */.#if !
2ca60 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
2ca70 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca90 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20    /* Results of 
2caa0 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a  stat() call */..
2cab0 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61    /* A stat() ca
2cac0 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20  ll may fail for 
2cad0 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e  various reasons.
2cae0 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
2caf0 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d  , it is.  ** alm
2cb00 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74  ost certain that
2cb10 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20   an open() call 
2cb20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
2cb30 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e   will also fail.
2cb40 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72  .  ** For this r
2cb50 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72  eason, if an err
2cb60 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
2cb70 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72   stat() call her
2cb80 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67  e, it is.  ** ig
2cb90 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20  nored and -1 is 
2cba0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
2cbb0 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f  ller will try to
2cbc0 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
2cbd0 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
2cbe0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
2cbf0 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74  h, fail, and ret
2cc00 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  urn an error to 
2cc10 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a  SQLite..  **.  *
2cc20 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73  * Even if a subs
2cc30 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61  equent open() ca
2cc40 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c  ll does succeed,
2cc50 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65   the consequence
2cc60 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65  s of.  ** not se
2cc70 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65  arching for a re
2cc80 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73  susable file des
2cc90 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20  criptor are not 
2cca0 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  dire.  */.  if( 
2ccb0 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
2ccc0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2ccd0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
2cce0 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78  Inode;..    unix
2ccf0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2cd00 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
2cd10 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
2cd20 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f   pInode && (pIno
2cd30 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d  de->fileId.dev!=
2cd40 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20  sStat.st_dev.   
2cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd60 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c    || pInode->fil
2cd70 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73  eId.ino!=sStat.s
2cd80 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
2cd90 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
2cda0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
2cdb0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
2cdc0 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
2cdd0 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
2cde0 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
2cdf0 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
2ce00 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
2ce10 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
2ce20 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
2ce30 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
2ce40 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
2ce50 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
2ce60 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
2ce70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ce80 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2ce90 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
2cea0 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
2ceb0 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
2cec0 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
2ced0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2cee0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75  n is called by u
2cef0 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74  nixOpen() to det
2cf00 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20  ermine the unix 
2cf10 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74  permissions.** t
2cf20 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c  o create new fil
2cf30 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65  es with. If no e
2cf40 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
2cf50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
2cf60 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
2cf70 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20   value suitable 
2cf80 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74  for passing as t
2cf90 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2cfa0 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a  t to open(2) is.
2cfb0 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
2cfc0 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65  Mode. If an IO e
2cfd0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
2cfe0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2cff0 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
2d000 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2d010 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74  of *pMode is not
2d020 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
2d030 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 63   In most cases c
2d040 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ases, this routi
2d050 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  ne sets *pMode t
2d060 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  o 0, which will 
2d070 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64  become.** an ind
2d080 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73  ication to robus
2d090 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61  t_open() to crea
2d0a0 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e  te the file usin
2d0b0 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41  g.** SQLITE_DEFA
2d0c0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2d0d0 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79  IONS adjusted by
2d0e0 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42   the umask..** B
2d0f0 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62  ut if the file b
2d100 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
2d110 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20   WAL or regular 
2d120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2d130 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
2d140 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65  tion queries the
2d150 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2d160 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
2d170 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72   on the .** corr
2d180 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
2d190 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  se file and sets
2d1a0 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20   *pMode to this 
2d1b0 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20  value. Whenever 
2d1c0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41  .** possible, WA
2d1d0 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  L and journal fi
2d1e0 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
2d1f0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
2d200 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61  ermissions .** a
2d210 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
2d220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2d230 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
2d240 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
2d250 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65  AMES option is e
2d260 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
2d270 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  .** original fil
2d280 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c  ename is unavail
2d290 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e  able.  But 8_3_N
2d2a0 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65  AMES is only use
2d2b0 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c  d for.** FAT fil
2d2c0 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72  esystems and per
2d2d0 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  missions do not 
2d2e0 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f  matter there, so
2d2f0 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65   just use.** the
2d300 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   default permiss
2d310 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
2d320 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
2d330 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
2d340 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2d350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2d360 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
2d370 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
2d380 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
2d390 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2d3a0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2d3b0 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
2d3c0 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
2d3d0 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
2d3e0 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
2d3f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2d400 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
2d410 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
2d420 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
2d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d440 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74     /* OUT: uid t
2d450 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2d460 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  e */.  gid_t *pG
2d470 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
2d480 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
2d490 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2d4a0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
2d4b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d4c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d4d0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2d4e0 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20    *pMode = 0;.  
2d4f0 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47  *pUid = 0;.  *pG
2d500 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c  id = 0;.  if( fl
2d510 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2d520 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2d530 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2d540 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
2d550 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
2d560 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
2d570 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
2d580 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
2d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2d5b0 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
2d5c0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
2d5d0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
2d5e0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2d5f0 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
2d600 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2d610 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
2d620 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
2d630 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
2d640 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2d650 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
2d660 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
2d670 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
2d680 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
2d690 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
2d6a0 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
2d6b0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
2d6c0 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
2d6d0 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
2d6e0 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2d6f0 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
2d700 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2d710 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
2d720 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2d730 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20  urnalNN".    ** 
2d740 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2d750 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20  walNN".    **.  
2d760 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73    ** where NN is
2d770 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65   a decimal numbe
2d780 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67  r. The NN naming
2d790 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
2d7a0 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
2d7b0 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
2d7c0 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
2d7d0 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
2d7e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2d7f0 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53  ) - 1; .#ifdef S
2d800 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
2d810 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65  _NAMES.    while
2d820 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69 74  ( nDb>0 && sqlit
2d830 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b  e3Isalnum(zPath[
2d840 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20  nDb]) ) nDb--;. 
2d850 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c     if( nDb==0 ||
2d860 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27   zPath[nDb]!='-'
2d870 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2d880 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77  _OK;.#else.    w
2d890 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d  hile( zPath[nDb]
2d8a0 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61  !='-' ){.      a
2d8b0 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a  ssert( nDb>0 );.
2d8c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50        assert( zP
2d8d0 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29  ath[nDb]!='\n' )
2d8e0 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20  ;.      nDb--;. 
2d8f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2d900 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74  memcpy(zDb, zPat
2d910 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62  h, nDb);.    zDb
2d920 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [nDb] = '\0';.. 
2d930 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74     if( 0==osStat
2d940 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b  (zDb, &sStat) ){
2d950 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  .      *pMode = 
2d960 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
2d970 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55 69  0777;.      *pUi
2d980 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64  d = sStat.st_uid
2d990 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d 20  ;.      *pGid = 
2d9a0 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20  sStat.st_gid;.  
2d9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2d9c0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2d9d0 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
2d9e0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
2d9f0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
2da00 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20  LETEONCLOSE ){. 
2da10 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30     *pMode = 0600
2da20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2da30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
2da40 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e   the file zPath.
2da50 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73  .** .** Previous
2da60 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f  ly, the SQLite O
2da70 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72  S layer used thr
2da80 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ee functions in 
2da90 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  place of this.**
2daa0 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   one:.**.**     
2dab0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
2dac0 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20  dWrite();.**    
2dad0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
2dae0 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20  adOnly();.**    
2daf0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
2db00 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a  clusive();.**.**
2db10 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72   These calls cor
2db20 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
2db30 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
2db40 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a  tions of flags:.
2db50 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72  **.**     ReadWr
2db60 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45  ite() ->     (RE
2db70 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
2db80 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c  ).**     ReadOnl
2db90 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41  y()  ->     (REA
2dba0 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f  DONLY) .**     O
2dbb0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d  penExclusive() -
2dbc0 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43  > (READWRITE | C
2dbd0 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56  REATE | EXCLUSIV
2dbe0 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64  E).**.** The old
2dbf0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2dc00 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c   accepted a bool
2dc10 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22  ean argument - "
2dc20 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20  delFlag". If.** 
2dc30 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77  true, the file w
2dc40 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  as configured to
2dc50 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
2dc60 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  y deleted when t
2dc70 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c  he.** file handl
2dc80 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68  e closed. To ach
2dc90 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66  ieve the same ef
2dca0 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20  fect using this 
2dcb0 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63  new .** interfac
2dcc0 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54  e, add the DELET
2dcd0 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f  EONCLOSE flag to
2dce0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
2dcf0 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f   above for .** O
2dd00 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a  penExclusive()..
2dd10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2dd20 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ixOpen(.  sqlite
2dd30 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2dd40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
2dd50 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  S for which this
2dd60 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65   is the xOpen me
2dd70 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
2dd80 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2dd90 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61         /* Pathna
2dda0 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
2ddb0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
2ddc0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2ddd0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2dde0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ddf0 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e   to be filled in
2de00 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67     /* Input flag
2de30 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  s to control the
2de40 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   opening */.  in
2de50 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
2de60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2de70 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72  tput flags retur
2de80 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f  ned to SQLite co
2de90 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  re */.){.  unixF
2dea0 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69  ile *p = (unixFi
2deb0 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  le *)pFile;.  in
2dec0 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  t fd = -1;      
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dee0 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2def0 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
2df00 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e  () */.  int open
2df10 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
2df20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
2df30 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28  to pass to open(
2df40 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  ) */.  int eType
2df50 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
2df60 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
2df70 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2df80 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20  .  int noLock;  
2df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfa0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
2dfb0 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  t locking primit
2dfc0 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ives */.  int rc
2dfd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2dfe0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
2dff0 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
2e000 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c   */.  int ctrlFl
2e010 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
2e020 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45       /* UNIXFILE
2e030 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69  _* flags */..  i
2e040 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
2e050 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e060 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
2e070 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
2e080 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
2e090 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
2e0a0 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
2e0b0 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
2e0c0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e0d0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
2e0e0 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
2e0f0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
2e100 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e110 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
2e120 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
2e130 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
2e140 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53  EADWRITE);.#if S
2e150 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2e160 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
2e170 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20   isAutoProxy  = 
2e180 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2e190 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b  OPEN_AUTOPROXY);
2e1a0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
2e1b0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
2e1c0 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2e1d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2e1e0 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
2e1f0 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Info;.#endif..  
2e200 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
2e210 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d   master or main-
2e220 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  file journal, th
2e230 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
2e240 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c   open.  ** a fil
2e250 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e-descriptor on 
2e260 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
2e270 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  o. The first tim
2e280 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a  e unixSync().  *
2e290 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  * is called the 
2e2a0 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
2e2b0 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
2e2c0 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20  e fsync()ed and 
2e2d0 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20  close()d..  */. 
2e2e0 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28   int syncDir = (
2e2f0 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
2e300 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
2e310 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
2e320 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
2e330 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2e340 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2e350 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
2e360 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2e370 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  .  ));..  /* If 
2e380 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
2e390 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
2e3a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2e3b0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
2e3c0 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
2e3d0 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
2e3e0 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
2e3f0 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
2e400 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
2e410 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
2e420 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f  ATHNAME+2];.  co
2e430 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
2e440 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43  = zPath;..  /* C
2e450 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
2e460 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
2e470 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
2e480 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
2e490 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
2e4a0 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
2e4b0 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
2e4c0 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
2e4d0 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
2e4e0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
2e4f0 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
2e500 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
2e510 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
2e520 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
2e530 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
2e540 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
2e550 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
2e560 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
2e570 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
2e580 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
2e590 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
2e5a0 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
2e5b0 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
2e5c0 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
2e5d0 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
2e5e0 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
2e5f0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
2e600 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
2e610 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
2e620 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
2e630 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
2e640 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
2e650 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
2e660 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
2e670 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
2e680 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
2e690 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
2e6a0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
2e6b0 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
2e6c0 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
2e6d0 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
2e6e0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2e6f0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2e700 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2e710 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
2e720 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2e730 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2e740 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2e750 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
2e760 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2e770 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2e780 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2e790 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
2e7a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
2e7b0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2e7c0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2e7d0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
2e7e0 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
2e7f0 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
2e800 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
2e810 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
2e820 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
2e830 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
2e840 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2e850 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2e860 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
2e870 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
2e880 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2e890 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
2e8a0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2e8b0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
2e8c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
2e8d0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
2e8e0 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
2e8f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2e900 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
2e910 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
2e920 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2e930 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
2e940 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2e950 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65  N_WAL.  );..  me
2e960 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
2e970 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20  f(unixFile));.. 
2e980 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
2e990 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2e9a0 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65  ){.    UnixUnuse
2e9b0 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20  dFd *pUnused;.  
2e9c0 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
2e9d0 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65  ReusableFd(zName
2e9e0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
2e9f0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
2ea00 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
2ea10 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >fd;.    }else{.
2ea20 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
2ea30 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
2ea40 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
2ea50 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e  ;.      if( !pUn
2ea60 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
2ea70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ea80 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
2ea90 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65   }.    p->pUnuse
2eaa0 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20  d = pUnused;..  
2eab0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
2eac0 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62  lenames are doub
2ead0 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
2eae0 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ed if they are n
2eaf0 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20 77  ot.    ** URIs w
2eb00 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20  ith parameters. 
2eb10 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e   Hence, they can
2eb20 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73 65   always be passe
2eb30 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71  d into.    ** sq
2eb40 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
2eb50 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73  ter(). */.    as
2eb60 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 53  sert( (flags & S
2eb70 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
2eb80 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  || zName[strlen(
2eb90 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  zName)+1]==0 );.
2eba0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e  .  }else if( !zN
2ebb0 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ame ){.    /* If
2ebc0 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20   zName is NULL, 
2ebd0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
2ebe0 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  is requesting a 
2ebf0 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  temp file. */.  
2ec00 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
2ec10 65 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a  e && !syncDir);.
2ec20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74      rc = unixGet
2ec30 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54  Tempname(MAX_PAT
2ec40 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d 70 6e 61 6d  HNAME+2, zTmpnam
2ec50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2ec60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ec70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ec80 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
2ec90 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f  zTmpname;..    /
2eca0 2a 20 47 65 6e 65 72 61 74 65 64 20 74 65 6d 70  * Generated temp
2ecb0 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20  orary filenames 
2ecc0 61 72 65 20 61 6c 77 61 79 73 20 64 6f 75 62 6c  are always doubl
2ecd0 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65  e-zero terminate
2ece0 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75 73 65  d.    ** for use
2ecf0 20 62 79 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   by sqlite3_uri_
2ed00 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a  parameter(). */.
2ed10 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d      assert( zNam
2ed20 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  e[strlen(zName)+
2ed30 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  1]==0 );.  }..  
2ed40 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
2ed50 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c   value of the fl
2ed60 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61  ags parameter pa
2ed70 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75  ssed to POSIX fu
2ed80 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e  nction.  ** open
2ed90 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62  (). These must b
2eda0 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65  e calculated eve
2edb0 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e  n if open() is n
2edc0 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20  ot called, as.  
2edd0 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73  ** they may be s
2ede0 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
2edf0 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
2ee00 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65   and used by the
2ee10 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69   .  ** 'conch fi
2ee20 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63  le' locking func
2ee30 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20  tions later on. 
2ee40 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64   */.  if( isRead
2ee50 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67  only )  openFlag
2ee60 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
2ee70 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
2ee80 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
2ee90 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73  O_RDWR;.  if( is
2eea0 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e  Create )    open
2eeb0 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54  Flags |= O_CREAT
2eec0 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  ;.  if( isExclus
2eed0 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ive ) openFlags 
2eee0 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46  |= (O_EXCL|O_NOF
2eef0 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c  OLLOW);.  openFl
2ef00 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46  ags |= (O_LARGEF
2ef10 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a  ILE|O_BINARY);..
2ef20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2ef30 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64    mode_t openMod
2ef40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ef50 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  /* Permissions t
2ef60 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69  o create file wi
2ef70 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20  th */.    uid_t 
2ef80 75 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  uid;            
2ef90 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69          /* Useri
2efa0 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  d for the file *
2efb0 2f 0a 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b  /.    gid_t gid;
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efd0 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66      /* Groupid f
2efe0 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  or the file */. 
2eff0 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61     rc = findCrea
2f000 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65  teFileMode(zName
2f010 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f  , flags, &openMo
2f020 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b  de, &uid, &gid);
2f030 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2f040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f050 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75  assert( !p->pUnu
2f060 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  sed );.      ass
2f070 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
2f080 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65  TE_OPEN_WAL || e
2f090 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2f0a0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
2f0b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2f0c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20  c;.    }.    fd 
2f0d0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
2f0e0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
2f0f0 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f  openMode);.    O
2f100 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20  STRACE(("OPENX  
2f110 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c   %-3d %s 0%o\n",
2f120 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e   fd, zName, open
2f130 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28  Flags));.    if(
2f140 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d   fd<0 && errno!=
2f150 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64  EISDIR && isRead
2f160 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c  Write && !isExcl
2f170 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f  usive ){.      /
2f180 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
2f190 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
2f1a0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
2f1b0 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
2f1c0 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26  */.      flags &
2f1d0 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
2f1e0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
2f1f0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
2f200 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26       openFlags &
2f210 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  = ~(O_RDWR|O_CRE
2f220 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  AT);.      flags
2f230 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
2f240 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
2f250 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
2f260 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52  DONLY;.      isR
2f270 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadonly = 1;.   
2f280 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2f290 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
2f2a0 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
2f2b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
2f2c0 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  d<0 ){.      rc 
2f2d0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
2f2e0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2f2f0 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61  KPT, "open", zNa
2f300 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
2f310 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
2f320 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2f330 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
2f340 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20  running as root 
2f350 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67 20  and if creating 
2f360 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20  a new rollback. 
2f370 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72     ** journal or
2f380 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20 74   WAL file, set t
2f390 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  he ownership of 
2f3a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57  the journal or W
2f3b0 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  AL to be.    ** 
2f3c0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2f3d0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
2f3e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2f3f0 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
2f400 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
2f410 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2f420 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 6f 73  NAL) ){.      os
2f430 46 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20  Fchown(fd, uid, 
2f440 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gid);.    }.  }.
2f450 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20    assert( fd>=0 
2f460 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  );.  if( pOutFla
2f470 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46  gs ){.    *pOutF
2f480 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
2f490 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75  }..  if( p->pUnu
2f4a0 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55  sed ){.    p->pU
2f4b0 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
2f4c0 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
2f4d0 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
2f4e0 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65   }..  if( isDele
2f4f0 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  te ){.#if OS_VXW
2f500 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d  ORKS.    zPath =
2f510 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20   zName;.#else.  
2f520 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65    osUnlink(zName
2f530 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
2f540 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2f550 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2f560 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65  else{.    p->ope
2f570 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
2f580 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  gs;.  }.#endif..
2f590 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65    noLock = eType
2f5a0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2f5b0 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64  IN_DB;..  .#if d
2f5c0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2f5d0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
2f5e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2f5f0 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66  .  if( fstatfs(f
2f600 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  d, &fsInfo) == -
2f610 31 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  1 ){.    ((unixF
2f620 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73  ile*)pFile)->las
2f630 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
2f640 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2f650 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
2f660 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2f670 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
2f680 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
2f690 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73  = strncmp("msdos
2f6a0 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
2f6b0 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
2f6c0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
2f6d0 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
2f6e0 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
2f6f0 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65  IS_MSDOS;.  }.#e
2f700 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75  ndif..  /* Set u
2f710 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 74  p appropriate ct
2f720 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28  rlFlags */.  if(
2f730 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20 20   isDelete )     
2f740 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
2f750 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2f760 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69  _DELETE;.  if( i
2f770 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20  sReadonly )     
2f780 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
2f790 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52  gs |= UNIXFILE_R
2f7a0 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c  DONLY;.  if( noL
2f7b0 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20 20 20  ock )           
2f7c0 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
2f7d0 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c   |= UNIXFILE_NOL
2f7e0 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44  OCK;.  if( syncD
2f7f0 69 72 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ir )            
2f800 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
2f810 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  = UNIXFILE_DIRSY
2f820 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  NC;.  if( flags 
2f830 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
2f840 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d  I ) ctrlFlags |=
2f850 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a   UNIXFILE_URI;..
2f860 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2f870 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2f880 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45  #if SQLITE_PREFE
2f890 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
2f8a0 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20    isAutoProxy = 
2f8b0 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  1;.#endif.  if( 
2f8c0 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28  isAutoProxy && (
2f8d0 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20  zPath!=NULL) && 
2f8e0 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66  (!noLock) && pVf
2f8f0 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  s->xOpen ){.    
2f900 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d  char *envforce =
2f910 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
2f920 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
2f930 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75  ING");.    int u
2f940 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20  seProxy = 0;..  
2f950 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43    /* SQLITE_FORC
2f960 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d  E_PROXY_LOCKING=
2f970 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61  =1 means force a
2f980 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c  lways use proxy,
2f990 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a   0 means .    **
2f9a0 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79   never use proxy
2f9b0 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65  , NULL means use
2f9c0 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c   proxy for non-l
2f9d0 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e  ocal files only.
2f9e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76    */.    if( env
2f9f0 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20  force!=NULL ){. 
2fa00 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
2fa10 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30  atoi(envforce)>0
2fa20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2fa30 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50     if( statfs(zP
2fa40 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
2fa50 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   -1 ){.        /
2fa60 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65  * In theory, the
2fa70 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20   close(fd) call 
2fa80 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20  is sub-optimal. 
2fa90 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
2faa0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  ed.        ** wi
2fab0 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61 62  th fd is a datab
2fac0 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  ase file, and th
2fad0 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f  ere are other co
2fae0 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20  nnections open. 
2faf0 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61         ** on tha
2fb00 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
2fb10 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e  currently holdin
2fb20 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  g advisory locks
2fb30 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20   on it,.        
2fb40 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  ** then the call
2fb50 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c   to close() will
2fb60 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f   cancel those lo
2fb70 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65  cks. In practice
2fb80 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27  ,.        ** we'
2fb90 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  re assuming that
2fba0 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27   statfs() doesn'
2fbb0 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65  t fail very ofte
2fbc0 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20  n. At least.    
2fbd0 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65      ** not while
2fbe0 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
2fbf0 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62  riptors opened b
2fc00 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
2fc10 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ss on.        **
2fc20 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61   the same file a
2fc30 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a  re working.  */.
2fc40 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45          p->lastE
2fc50 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2fc60 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2fc70 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
2fc80 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  __);.        rc 
2fc90 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  = SQLITE_IOERR_A
2fca0 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20 20 67  CCESS;.        g
2fcb0 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
2fcc0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
2fcd0 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73   useProxy = !(fs
2fce0 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
2fcf0 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  _LOCAL);.    }. 
2fd00 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20     if( useProxy 
2fd10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  ){.      rc = fi
2fd20 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
2fd30 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  s, fd, pFile, zP
2fd40 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b  ath, ctrlFlags);
2fd50 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2fd60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fd70 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
2fd80 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
2fd90 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
2fda0 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
2fdb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2fdc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fdd0 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
2fde0 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
2fdf0 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
2fe00 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
2fe10 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
2fe20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
2fe30 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
2fe40 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
2fe50 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
2fe60 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
2fe70 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
2fe80 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
2fe90 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
2fea0 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
2feb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2fec0 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
2fed0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
2fee0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2fef0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2ff00 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
2ff10 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
2ff20 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
2ff30 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
2ff40 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c  pVfs, fd, pFile,
2ff50 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67   zPath, ctrlFlag
2ff60 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68  s);..open_finish
2ff70 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
2ff80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2ff90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70  qlite3_free(p->p
2ffa0 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
2ffb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2ffc0 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
2ffd0 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
2ffe0 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
2fff0 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
30000 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
30010 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
30020 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
30030 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
30040 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
30050 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
30060 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
30070 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
30080 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
30090 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
300a0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
300b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
300c0 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
300d0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
300e0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
300f0 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
30100 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
30110 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
30120 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
30130 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30140 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
30150 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
30160 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
30170 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
30180 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
30190 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d  osUnlink(zPath)=
301a0 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28  =(-1) ){.    if(
301b0 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29   errno==ENOENT )
301c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
301d0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
301e0 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73  _NOENT;.    }els
301f0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  e{.      rc = un
30200 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
30210 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
30220 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29  "unlink", zPath)
30230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
30240 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64  rn rc;.  }.#ifnd
30250 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
30260 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20  E_DIRSYNC.  if( 
30270 28 64 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30  (dirSync & 1)!=0
30280 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
30290 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
302a0 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
302b0 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &fd);.    if( rc
302c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
302d0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
302e0 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
302f0 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20  )==-1 ).#else.  
30300 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
30310 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ) ).#endif.     
30320 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
30330 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
30340 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
30350 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50  YNC, "fsync", zP
30360 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
30370 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
30380 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
30390 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
303a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
303b0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63  OPEN ){.      rc
303c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
303d0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
303e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
303f0 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78  *.** Test the ex
30400 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63  istence of or ac
30410 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
30420 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20   of file zPath. 
30430 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66  The.** test perf
30440 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  ormed depends on
30450 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c   the value of fl
30460 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ags:.**.**     S
30470 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
30480 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66  STS: Return 1 if
30490 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
304a0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
304b0 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
304c0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
304d0 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e   file is read an
304e0 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20  d writable..**  
304f0 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
30500 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72  _READONLY: Retur
30510 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
30520 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a  is readable..**.
30530 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  ** Otherwise ret
30540 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
30550 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28   int unixAccess(
30560 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
30570 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68  NotUsed,   /* Th
30580 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  e VFS containing
30590 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65   this xAccess me
305a0 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
305b0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
305c0 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65    /* Path of the
305d0 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65   file to examine
305e0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
305f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30600 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74   What do we want
30610 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20   to learn about 
30620 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20  the zPath file? 
30630 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
30640 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
30650 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f  Write result boo
30660 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  lean here */.){.
30670 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b    int amode = 0;
30680 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30690 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
306a0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
306b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
306c0 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
306d0 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
306e0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
306f0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
30700 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
30710 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  F_OK;.      brea
30720 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
30730 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
30740 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  ITE:.      amode
30750 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20   = W_OK|R_OK;.  
30760 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
30770 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
30780 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d  S_READ:.      am
30790 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20  ode = R_OK;.    
307a0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
307b0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
307c0 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
307d0 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
307e0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
307f0 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68   (osAccess(zPath
30800 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20  , amode)==0);.  
30810 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54  if( flags==SQLIT
30820 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
30830 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20  && *pResOut ){. 
30840 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
30850 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f  uf;.    if( 0==o
30860 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75  sStat(zPath, &bu
30870 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a  f) && buf.st_siz
30880 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==0 ){.      *p
30890 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  ResOut = 0;.    
308a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
308b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
308c0 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
308d0 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
308e0 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
308f0 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20  e. The relative 
30900 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65  path.** is store
30910 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69  d as a nul-termi
30920 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20  nated string in 
30930 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
30940 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74  ed to by.** zPat
30950 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70  h. .**.** zOut p
30960 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
30970 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71  r of at least sq
30980 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
30990 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28  name bytes .** (
309a0 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41  in this case, MA
309b0 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73  X_PATHNAME bytes
309c0 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68  ). The full-path
309d0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a   is written to.*
309e0 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65  * this buffer be
309f0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
30a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
30a10 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  ixFullPathname(.
30a20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
30a30 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
30a40 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
30a50 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
30a60 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
30a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30a80 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
30a90 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
30aa0 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20   int nOut,      
30ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30ac0 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
30ad0 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
30ae0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
30af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b00 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
30b10 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a  ffer */.){..  /*
30b20 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
30b30 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
30b40 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
30b50 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
30b60 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
30b70 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
30b80 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
30b90 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
30ba0 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
30bb0 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
30bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
30bd0 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
30be0 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
30bf0 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
30c00 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  g directory has 
30c10 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20  been unlinked.. 
30c20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
30c30 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
30c40 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
30c50 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d   assert( pVfs->m
30c60 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50  xPathname==MAX_P
30c70 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55  ATHNAME );.  UNU
30c80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
30c90 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75  fs);..  zOut[nOu
30ca0 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69  t-1] = '\0';.  i
30cb0 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27  f( zPath[0]=='/'
30cc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
30cd0 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a  snprintf(nOut, z
30ce0 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68  Out, "%s", zPath
30cf0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30d00 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66  int nCwd;.    if
30d10 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c  ( osGetcwd(zOut,
30d20 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20   nOut-1)==0 ){. 
30d30 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
30d40 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
30d50 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
30d60 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b  getcwd", zPath);
30d70 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20  .    }.    nCwd 
30d80 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f  = (int)strlen(zO
30d90 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
30da0 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e  _snprintf(nOut-n
30db0 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d  Cwd, &zOut[nCwd]
30dc0 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b  , "/%s", zPath);
30dd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
30de0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66  LITE_OK;.}...#if
30df0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30e00 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
30e10 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
30e20 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
30e30 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
30e40 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
30e50 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
30e60 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
30e70 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
30e80 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
30e90 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64  ..*/.#include <d
30ea0 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76  lfcn.h>.static v
30eb0 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28  oid *unixDlOpen(
30ec0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
30ed0 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72  Used, const char
30ee0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
30ef0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
30f00 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
30f10 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65  urn dlopen(zFile
30f20 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c  name, RTLD_NOW |
30f30 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d   RTLD_GLOBAL);.}
30f40 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ../*.** SQLite c
30f50 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
30f60 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  on immediately a
30f70 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75  fter a call to u
30f80 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a  nixDlSym() or.**
30f90 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61   unixDlOpen() fa
30fa0 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e  ils (returns a n
30fb0 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66  ull pointer). If
30fc0 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64   a more detailed
30fd0 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
30fe0 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
30ff0 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  it is written to
31000 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20   zBufOut. If no 
31010 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
31020 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a   is available, z
31030 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75  BufOut is left u
31040 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51  nmodified and SQ
31050 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61  Lite uses a defa
31060 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73  ult.** error mes
31070 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sage..*/.static 
31080 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72  void unixDlError
31090 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
310a0 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
310b0 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
310c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
310d0 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  Err;.  UNUSED_PA
310e0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
310f0 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
31100 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64  ex();.  zErr = d
31110 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  lerror();.  if( 
31120 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  zErr ){.    sqli
31130 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
31140 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22  f, zBufOut, "%s"
31150 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75  , zErr);.  }.  u
31160 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
31170 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
31180 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74  *unixDlSym(sqlit
31190 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
311a0 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20   void *p, const 
311b0 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64  char*zSym))(void
311c0 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43  ){.  /* .  ** GC
311d0 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  C with -pedantic
311e0 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61  -errors says tha
311f0 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61  t C90 does not a
31200 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20  llow a void* to 
31210 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74  be.  ** cast int
31220 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  o a pointer to a
31230 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20   function.  And 
31240 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20  yet the library 
31250 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a  dlsym() routine.
31260 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76    ** returns a v
31270 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65  oid* which is re
31280 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
31290 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  o a function.  S
312a0 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a  o how do we.  **
312b0 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74   use dlsym() wit
312c0 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
312d0 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  rs?.  **.  ** Va
312e0 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69  riable x below i
312f0 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
31300 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
31310 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20  unction taking. 
31320 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76   ** parameters v
31330 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63  oid* and const c
31340 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69  har* and returni
31350 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
31360 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  a function..  **
31370 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78   We initialize x
31380 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74   by assigning it
31390 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
313a0 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69  e dlsym() functi
313b0 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61  on..  ** (That a
313c0 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  ssignment requir
313d0 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65  es a cast.)  The
313e0 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75  n we call the fu
313f0 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a  nction that.  **
31400 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a   x points to.  .
31410 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77    **.  ** This w
31420 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e  ork-around is un
31430 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63  likely to work c
31440 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20  orrectly on any 
31450 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a  system where.  *
31460 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e  * you really can
31470 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74  not cast a funct
31480 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ion pointer into
31490 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65   void*.  But the
314a0 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f  n, on the.  ** o
314b0 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d  ther hand, dlsym
314c0 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  () will not work
314d0 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65   on such a syste
314e0 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20  m either, so we 
314f0 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65  have.  ** not re
31500 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69  ally lost anythi
31510 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20  ng..  */.  void 
31520 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e  (*(*x)(void*,con
31530 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
31540 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
31550 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
31560 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28   x = (void(*(*)(
31570 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
31580 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b  *))(void))dlsym;
31590 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70  .  return (*x)(p
315a0 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69  , zSym);.}.stati
315b0 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f  c void unixDlClo
315c0 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
315d0 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
315e0 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
315f0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
31600 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28  sed);.  dlclose(
31610 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
31620 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
31630 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
31640 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
31650 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  /.  #define unix
31660 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
31670 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20  ine unixDlError 
31680 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
31690 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
316a0 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20  ine unixDlClose 
316b0 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
316c0 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  Write nBuf bytes
316d0 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20   of random data 
316e0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
316f0 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a  buffer zBuf..*/.
31700 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
31710 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
31720 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
31730 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
31740 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
31750 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
31760 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69  d);.  assert((si
31770 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65  ze_t)nBuf>=(size
31780 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f  of(time_t)+sizeo
31790 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20  f(int)));..  /* 
317a0 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69  We have to initi
317b0 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72  alize zBuf to pr
317c0 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66  event valgrind f
317d0 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20  rom reporting.  
317e0 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20  ** errors.  The 
317f0 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62  reports issued b
31800 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69  y valgrind are i
31810 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f  ncorrect - we wo
31820 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20  uld.  ** prefer 
31830 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e  that the randomn
31840 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64  ess be increased
31850 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f   by making use o
31860 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69  f the.  ** unini
31870 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69  tialized space i
31880 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c  n zBuf - but val
31890 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e  grind errors ten
318a0 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20  d to worry.  ** 
318b0 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74  some users.  Rat
318c0 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20  her than argue, 
318d0 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20  it seems easier 
318e0 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  just to initiali
318f0 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c  ze.  ** the whol
31900 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65  e array and sile
31910 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76  nce valgrind, ev
31920 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
31930 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73   less randomness
31940 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e  .  ** in the ran
31950 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20  dom seed..  **. 
31960 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67   ** When testing
31970 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a  , initializing z
31980 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73  Buf[] to zero is
31990 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61   all we do.  Tha
319a0 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  t means.  ** tha
319b0 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  t we always use 
319c0 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20  the same random 
319d0 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e  number sequence.
319e0 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65    This makes the
319f0 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65  .  ** tests repe
31a00 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d  atable..  */.  m
31a10 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
31a20 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e  Buf);.#if !defin
31a30 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
31a40 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c    {.    int pid,
31a50 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64   fd, got;.    fd
31a60 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22   = robust_open("
31a70 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
31a80 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  _RDONLY, 0);.   
31a90 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
31aa0 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
31ab0 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20     time(&t);.   
31ac0 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
31ad0 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
31ae0 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70        pid = getp
31af0 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  id();.      memc
31b00 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
31b10 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  t)], &pid, sizeo
31b20 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61  f(pid));.      a
31b30 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29  ssert( sizeof(t)
31b40 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73  +sizeof(pid)<=(s
31b50 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20  ize_t)nBuf );.  
31b60 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f      nBuf = sizeo
31b70 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69  f(t) + sizeof(pi
31b80 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
31b90 20 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f       do{ got = o
31ba0 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20  sRead(fd, zBuf, 
31bb0 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 67  nBuf); }while( g
31bc0 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
31bd0 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f  INTR );.      ro
31be0 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
31bf0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
31c00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
31c10 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a  return nBuf;.}..
31c20 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
31c30 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
31c40 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
31c50 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
31c60 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  t..** The argume
31c70 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  nt is the number
31c80 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
31c90 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65   we want to slee
31ca0 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  p..** The return
31cb0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
31cc0 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
31cd0 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63  onds of sleep ac
31ce0 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73  tually.** reques
31cf0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64  ted from the und
31d00 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e  erlying operatin
31d10 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62  g system, a numb
31d20 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68  er which.** migh
31d30 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
31d40 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
31d50 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20  e argument, but 
31d60 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e  not less.** than
31d70 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
31d80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
31d90 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  xSleep(sqlite3_v
31da0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
31db0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a   microseconds){.
31dc0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
31dd0 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
31de0 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65   sp;..  sp.tv_se
31df0 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  c = microseconds
31e00 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70   / 1000000;.  sp
31e10 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72  .tv_nsec = (micr
31e20 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30  oseconds % 10000
31e30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61  00) * 1000;.  na
31e40 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c  nosleep(&sp, NUL
31e50 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  L);.  UNUSED_PAR
31e60 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
31e70 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73  .  return micros
31e80 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65  econds;.#elif de
31e90 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45  fined(HAVE_USLEE
31ea0 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45  P) && HAVE_USLEE
31eb0 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f  P.  usleep(micro
31ec0 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
31ed0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
31ee0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
31ef0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
31f00 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64  lse.  int second
31f10 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  s = (microsecond
31f20 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30  s+999999)/100000
31f30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e  0;.  sleep(secon
31f40 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
31f50 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
31f60 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e  ;.  return secon
31f70 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64  ds*1000000;.#end
31f80 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  if.}../*.** The 
31f90 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
31fa0 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
31fb0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
31fc0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
31fd0 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
31fe0 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
31ff0 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
32000 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
32010 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
32020 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
32030 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
32040 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
32050 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
32060 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
32070 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
32080 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
32090 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
320a0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
320b0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
320c0 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
320d0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
320e0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
320f0 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74  into *piNow.** t
32100 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
32110 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
32120 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
32130 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30  times 86_400_000
32140 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77  .  In.** other w
32150 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f  ords, write into
32160 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62   *piNow the numb
32170 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
32180 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c  ds since the Jul
32190 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20  ian.** epoch of 
321a0 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63  noon in Greenwic
321b0 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
321c0 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72  , 4714 B.C accor
321d0 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70  ding to the.** p
321e0 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69  roleptic Gregori
321f0 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a  an calendar..**.
32200 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
32210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
32220 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
32230 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d  ERROR if the tim
32240 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63  e and date .** c
32250 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
32260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
32270 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
32280 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
32290 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33  NotUsed, sqlite3
322a0 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
322b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
322c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
322d0 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
322e0 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
322f0 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20  )8640000;.  int 
32300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32310 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47  #if defined(NO_G
32320 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20  ETTOD).  time_t 
32330 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20  t;.  time(&t);. 
32340 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69   *piNow = ((sqli
32350 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30  te3_int64)t)*100
32360 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23  0 + unixEpoch;.#
32370 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  elif OS_VXWORKS.
32380 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
32390 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f  c sNow;.  clock_
323a0 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45  gettime(CLOCK_RE
323b0 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a  ALTIME, &sNow);.
323c0 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
323d0 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
323e0 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
323f0 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
32400 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23  _nsec/1000000;.#
32410 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69  else.  struct ti
32420 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 69 66  meval sNow;.  if
32430 28 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26  ( gettimeofday(&
32440 73 4e 6f 77 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  sNow, 0)==0 ){. 
32450 20 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78     *piNow = unix
32460 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71  Epoch + 1000*(sq
32470 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77  lite3_int64)sNow
32480 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74  .tv_sec + sNow.t
32490 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 20 20 7d  v_usec/1000;.  }
324a0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
324b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
324c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
324d0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
324e0 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
324f0 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
32500 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
32510 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
32520 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
32530 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
32540 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
32550 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32560 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ed);.  return rc
32570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
32580 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
32590 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
325a0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
325b0 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
325c0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
325d0 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
325e0 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
325f0 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
32600 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
32610 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
32620 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
32630 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
32640 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72  tic int unixCurr
32650 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
32660 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f  vfs *NotUsed, do
32670 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
32680 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20  sqlite3_int64 i 
32690 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
326a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
326b0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 63  R(NotUsed);.  rc
326c0 20 3d 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69   = unixCurrentTi
326d0 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a  meInt64(0, &i);.
326e0 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
326f0 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72  00000.0;.  retur
32700 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
32710 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65 74  e added the xGet
32720 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68  LastError() meth
32730 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74 65  od with the inte
32740 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69  ntion of providi
32750 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77  ng.** better low
32760 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73  -level error mes
32770 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61  sages when opera
32780 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62  ting-system prob
32790 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20  lems come up.** 
327a0 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70  during SQLite op
327b0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f  eration.  But so
327c0 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68   far, none of th
327d0 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c  at has been impl
327e0 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68  emented.** in th
327f0 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73  e core.  So this
32800 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
32810 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e  r called.  For n
32820 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79  ow, it is merely
32830 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  .** a place-hold
32840 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
32850 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72  t unixGetLastErr
32860 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
32870 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
32880 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74  Used2, char *Not
32890 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44  Used3){.  UNUSED
328a0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
328b0 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed);.  UNUSED_PA
328c0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32  RAMETER(NotUsed2
328d0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
328e0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b  METER(NotUsed3);
328f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
32900 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./*.************
32910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
32920 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
32930 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
32940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32950 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
32960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329a0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
329b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329f0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
32a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
32a10 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b  Begin Proxy Lock
32a20 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
32a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32a40 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ****.**.** Proxy
32a50 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75   locking is a "u
32a60 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
32a70 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73  od" in this sens
32a80 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a  e:  It uses the.
32a90 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
32aa0 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f   methods on seco
32ab0 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73  ndary lock files
32ac0 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  .  Proxy locking
32ad0 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61   is a.** meta-la
32ae0 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20  yer over top of 
32af0 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
32b00 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65  cking implemente
32b10 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a  d above.  For.**
32b20 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
32b30 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
32b40 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72  implements of pr
32b50 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  oxy locking is d
32b60 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c  eferred.** until
32b70 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c   late in the fil
32b80 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61  e (here) after a
32b90 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ll of the other 
32ba0 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65  I/O methods have
32bb0 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64  .** been defined
32bc0 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70   - so that the p
32bd0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
32be0 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61   methods are ava
32bf0 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72  ilable.** as ser
32c00 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69  vices to help wi
32c10 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  th the implement
32c20 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c  ation of proxy l
32c30 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a  ocking..**.****.
32c40 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
32c50 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  t locking scheme
32c60 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20  s in SQLite use 
32c70 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
32c80 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
32c90 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72  ase file to coor
32ca0 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e  dinate safe, con
32cb0 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62  current access b
32cc0 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  y multiple reade
32cd0 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72  rs.** and writer
32ce0 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65  s [http://sqlite
32cf0 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68  .org/lockingv3.h
32d00 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20  tml].  The five 
32d10 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  file locking.** 
32d20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44  states (UNLOCKED
32d30 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45  , PENDING, SHARE
32d40 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43  D, RESERVED, EXC
32d50 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c  LUSIVE) are impl
32d60 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f  emented.** as PO
32d70 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65  SIX read & write
32d80 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65   locks over fixe
32d90 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f  d set of locatio
32da0 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a  ns (via fsctl),.
32db0 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d  ** on AFP and SM
32dc0 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65  B only exclusive
32dd0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
32de0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
32df0 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74  via fsctl.** wit
32e00 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c  h _IOWR('z', 23,
32e10 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
32e20 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61  eLockPB2) to tra
32e30 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74  ck the same 5 st
32e40 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75  ates..** To simu
32e50 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f  late a F_RDLCK o
32e60 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
32e70 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e  ge, on AFP a ran
32e80 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a  domly selected.*
32e90 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65  * address in the
32ea0 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
32eb0 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41   taken for a SHA
32ec0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e  RED lock, the en
32ed0 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72  tire.** shared r
32ee0 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
32ef0 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
32f00 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ock):.**.**     
32f10 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20   PENDING_BYTE   
32f20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30 0a       0x40000000.
32f30 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56 45 44  **      RESERVED
32f40 5f 42 59 54 45 20 20 20 20 20 20 20 30 78 34 30  _BYTE       0x40
32f50 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53  000001.**      S
32f60 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20  HARED_RANGE     
32f70 20 20 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e     0x40000002 ->
32f80 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a   0x40000200.**.*
32f90 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c  * This works wel
32fa0 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  l on the local f
32fb0 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20  ile system, but 
32fc0 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31  shows a nearly 1
32fd0 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20  00x.** slowdown 
32fe0 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61  in read performa
32ff0 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75  nce on AFP becau
33000 73 65 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e  se the AFP clien
33010 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68  t disables.** th
33020 65 20 72 65 61 64 20 63 61 63 68 65 20 77 68 65  e read cache whe
33030 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  n byte-range loc
33040 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20  ks are present. 
33050 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65   Enabling the re
33060 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f  ad.** cache expo
33070 73 65 73 20 61 20 63 61 63 68 65 20 63 6f 68 65  ses a cache cohe
33080 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68  rency problem th
33090 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e  at is present on
330a0 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70   all OS X.** sup
330b0 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66  ported network f
330c0 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46  ile systems.  NF
330d0 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f  S and AFP both o
330e0 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c  bserve the.** cl
330f0 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61  ose-to-open sema
33100 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69  ntics for ensuri
33110 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e  ng cache coheren
33120 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66  cy.** [http://nf
33130 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65  s.sourceforge.ne
33140 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63  t/#faq_a8], whic
33150 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63  h does not effec
33160 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73  tively.** addres
33170 73 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e  s the requiremen
33180 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ts for concurren
33190 74 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  t database acces
331a0 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  s by multiple.**
331b0 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69   readers and wri
331c0 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f  ters.** [http://
331d0 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53  www.nabble.com/S
331e0 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63  QLite-on-NFS-cac
331f0 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31  he-coherency-td1
33200 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a  5655701.html]..*
33210 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20  *.** To address 
33220 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
33230 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72 65  and cache cohere
33240 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78  ncy issues, prox
33250 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a  y file locking.*
33260 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20 77 61  * changes the wa
33270 79 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  y database acces
33280 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20  s is controlled 
33290 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65  by limiting acce
332a0 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c  ss to a.** singl
332b0 65 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65  e host at a time
332c0 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65   and moving file
332d0 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68   locks off of th
332e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
332f0 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72  ** and onto a pr
33300 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20  oxy file on the 
33310 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
33320 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  m.  .**.**.** Us
33330 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a  ing proxy locks.
33340 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
33350 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49  ----.**.** C API
33360 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33  s.**.**  sqlite3
33370 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
33380 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45  , dbname, SQLITE
33390 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
333a0 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  LE,.**          
333b0 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72               <pr
333c0 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75  oxy_path> | ":au
333d0 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74  to:");.**  sqlit
333e0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
333f0 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
33400 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
33410 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61  FILE, &<proxy_pa
33420 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53  th>);.**.**.** S
33430 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a  QL pragmas.**.**
33440 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
33450 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
33460 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e  ile=<proxy_path>
33470 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52   | :auto:.**  PR
33480 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
33490 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a  lock_proxy_file.
334a0 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67  **.** Specifying
334b0 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20   ":auto:" means 
334c0 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73  that if there is
334d0 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69   a conch file wi
334e0 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a  th a matching.**
334f0 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20   host ID in it, 
33500 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69  the proxy path i
33510 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
33520 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f   will be used, o
33530 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72  therwise.** a pr
33540 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f  oxy path based o
33550 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d  n the user's tem
33560 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f  p dir.** (via co
33570 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
33580 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e  _USER_TEMP_DIR,.
33590 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65  ..)) will be use
335a0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74  d and the.** act
335b0 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e  ual proxy file n
335c0 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ame is generated
335d0 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61   from the name a
335e0 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a  nd path of the.*
335f0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
33600 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
33610 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64  *.**       For d
33620 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55  atabase path "/U
33630 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20  sers/me/foo.db" 
33640 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f  .**       The lo
33650 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20  ck path will be 
33660 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65  "<tmpdir>/sqlite
33670 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65  plocks/_Users_me
33680 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a  _foo.db:auto:").
33690 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63  **.** Once a loc
336a0 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69  k proxy is confi
336b0 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61  gured for a data
336c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c  base connection,
336d0 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62   it can not.** b
336e0 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76  e removed, howev
336f0 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69  er it may be swi
33700 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65  tched to a diffe
33710 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20  rent proxy path 
33720 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65  via.** the above
33730 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20   APIs (assuming 
33740 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  the conch file i
33750 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64  s not being held
33760 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63   by another.** c
33770 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f  onnection or pro
33780 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  cess). .**.**.**
33790 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69   How proxy locki
337a0 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d  ng works.** ----
337b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
337c0 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ---.**.** Proxy 
337d0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c  file locking rel
337e0 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e  ies primarily on
337f0 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74   two new support
33800 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a  ing files: .**.*
33810 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c  *   *  conch fil
33820 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73  e to limit acces
33830 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
33840 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67  e file to a sing
33850 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20  le host.**      
33860 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20  at a time.**.** 
33870 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20    *  proxy file 
33880 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78  to act as a prox
33890 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f  y for the adviso
338a0 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c  ry locks normall
338b0 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20  y.**      taken 
338c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
338d0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20  **.** The conch 
338e0 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20  file - to use a 
338f0 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69  proxy file, sqli
33900 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68  te must first "h
33910 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a  old the conch".*
33920 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73  * by taking an s
33930 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72  qlite-style shar
33940 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
33950 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69  onch file, readi
33960 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
33970 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67  ts and comparing
33980 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71   the host's uniq
33990 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20  ue host ID (see 
339a0 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a  below) and lock.
339b0 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67  ** proxy path ag
339c0 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73  ainst the values
339d0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
339e0 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68  onch.  The conch
339f0 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72   file is.** stor
33a00 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
33a10 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20  irectory as the 
33a20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
33a30 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a  d the file name.
33a40 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20  ** is patterned 
33a50 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61  after the databa
33a60 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  se file name as 
33a70 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e  ".<databasename>
33a80 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74  -conch"..** If t
33a90 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f  he conch file do
33aa0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  es not exist, or
33ab0 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20 64   it's contents d
33ac0 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a  o not match the.
33ad0 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f  ** host ID and/o
33ae0 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68  r proxy path, th
33af0 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65  en the lock is e
33b00 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65  scalated to an e
33b10 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b  xclusive.** lock
33b20 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66   and the conch f
33b30 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20  ile contents is 
33b40 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65  updated with the
33b50 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f   host ID and pro
33b60 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74  xy.** path and t
33b70 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67  he lock is downg
33b80 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65  raded to a share
33b90 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49  d lock again.  I
33ba0 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69  f the conch.** i
33bb0 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  s held by anothe
33bc0 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20  r process (with 
33bd0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20  a shared lock), 
33be0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
33bf0 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20  ck.** will fail 
33c00 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20  and SQLITE_BUSY 
33c10 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
33c20 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c  ** The proxy fil
33c30 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74  e - a single-byt
33c40 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
33c50 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c  all advisory fil
33c60 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61  e locks.** norma
33c70 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65  lly taken on the
33c80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
33c90 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f    This allows fo
33ca0 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a  r safe sharing.*
33cb0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
33cc0 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69  e file for multi
33cd0 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20  ple readers and 
33ce0 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73  writers on the s
33cf0 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65  ame.** host (the
33d00 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74   conch ensures t
33d10 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65  hat they all use
33d20 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20   the same local 
33d30 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a  lock file)..**.*
33d40 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65  * Requesting the
33d50 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73   lock proxy does
33d60 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79   not immediately
33d70 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c   take the conch,
33d80 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74   it is.** only t
33d90 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69  aken when the fi
33da0 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c  rst request to l
33db0 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ock database fil
33dc0 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20  e is made.  .** 
33dd0 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65  This matches the
33de0 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68   semantics of th
33df0 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f  e traditional lo
33e00 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20  cking behavior, 
33e10 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67  where.** opening
33e20 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
33e30 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
33e40 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61   does not take a
33e50 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20   lock on it..** 
33e60 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  The shared lock 
33e70 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  and an open file
33e80 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
33e90 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c  maintained until
33ea0 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74   .** the connect
33eb0 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
33ec0 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a  ase is closed. .
33ed0 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
33ee0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  file and the loc
33ef0 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72  k file are never
33f00 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79   deleted so they
33f10 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f   only need.** to
33f20 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20   be created the 
33f30 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20  first time they 
33f40 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  are used..**.** 
33f50 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70  Configuration op
33f60 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  tions.** -------
33f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
33f80 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45  *.**  SQLITE_PRE
33f90 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
33fa0 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61  G.**.**       Da
33fb0 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63  tabase files acc
33fc0 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63  essed on non-loc
33fd0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20  al file systems 
33fe0 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74  are.**       aut
33ff0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69  omatically confi
34000 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20  gured for proxy 
34010 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69  locking, lock fi
34020 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  les are.**      
34030 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
34040 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73  ally using the s
34050 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20  ame logic as.** 
34060 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63        PRAGMA loc
34070 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61  k_proxy_file=":a
34080 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20  uto:".**    .** 
34090 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
340a0 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  BUG.**.**       
340b0 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67  Enables the logg
340c0 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73  ing of error mes
340d0 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73  sages during hos
340e0 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20  t id file.**    
340f0 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64     retrieval and
34100 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20   creation.**.** 
34110 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a   LOCKPROXYDIR.**
34120 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69  .**       Overri
34130 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20  des the default 
34140 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66  directory used f
34150 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69  or lock proxy fi
34160 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  les that.**     
34170 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f    are named auto
34180 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68  matically via th
34190 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69  e ":auto:" setti
341a0 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  ng.**.**  SQLITE
341b0 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
341c0 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a  R_PERMISSIONS.**
341d0 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73  .**       Permis
341e0 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65  sions to use whe
341f0 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72  n creating a dir
34200 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69  ectory for stori
34210 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
34220 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73  lock proxy files
34230 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  , only used when
34240 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73   LOCKPROXYDIR is
34250 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20   not set..**    
34260 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65  .**    .** As me
34270 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77  ntioned above, w
34280 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  hen compiled wit
34290 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  h SQLITE_PREFER_
342a0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a  PROXY_LOCKING,.*
342b0 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e  * setting the en
342c0 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
342d0 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  le SQLITE_FORCE_
342e0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f  PROXY_LOCKING to
342f0 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65   1 will.** force
34300 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
34310 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76  o be used for ev
34320 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ery database fil
34330 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a  e opened, and 0.
34340 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75  ** will force au
34350 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f  tomatic proxy lo
34360 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61  cking to be disa
34370 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74  bled for all dat
34380 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28  abase.** files (
34390 65 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e  explicity callin
343a0 67 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 54  g the SQLITE_SET
343b0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70  _LOCKPROXYFILE p
343c0 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69  ragma or.** sqli
343d0 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  te_file_control 
343e0 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63  API is not affec
343f0 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f  ted by SQLITE_FO
34400 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
34410 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72  G)..*/../*.** Pr
34420 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  oxy locking is o
34430 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
34440 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20   MacOSX .*/.#if 
34450 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
34460 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
34470 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
34480 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  E../*.** The pro
34490 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
344a0 20 68 61 73 20 74 68 65 20 70 61 74 68 20 61 6e   has the path an
344b0 64 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  d file structure
344c0 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65  s for the remote
344d0 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70   .** and local p
344e0 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74  roxy files in it
344f0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
34500 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  ct proxyLockingC
34510 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b  ontext proxyLock
34520 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
34530 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  ct proxyLockingC
34540 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46  ontext {.  unixF
34550 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
34560 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
34570 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
34580 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50  char *conchFileP
34590 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ath;         /* 
345a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  Name of the conc
345b0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  h file */.  unix
345c0 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b  File *lockProxy;
345d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
345e0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
345f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b   */.  char *lock
34600 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20  ProxyPath;      
34610 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
34620 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
34630 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50  e */.  char *dbP
34640 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
34650 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
34660 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a  he open file */.
34670 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b    int conchHeld;
34680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34690 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68  * 1 if the conch
346a0 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20   is held, -1 if 
346b0 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 76 6f  lockless */.  vo
346c0 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  id *oldLockingCo
346d0 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72  ntext;     /* Or
346e0 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f  iginal lockingco
346f0 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72 65  ntext to restore
34700 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73   on close */.  s
34710 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
34720 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74  s const *pOldMet
34730 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  hod;     /* Orig
34740 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73  inal I/O methods
34750 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b   for close */.};
34760 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f  ../* .** The pro
34770 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  xy lock file pat
34780 68 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  h for the databa
34790 73 65 20 61 74 20 64 62 50 61 74 68 20 69 73 20  se at dbPath is 
347a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61  written into lPa
347b0 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75  th, .** which mu
347c0 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69  st point to vali
347d0 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f  d, writable memo
347e0 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ry large enough 
347f0 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e  for a maxLen len
34800 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68  gth.** file path
34810 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
34820 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74   proxyGetLockPat
34830 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62  h(const char *db
34840 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74  Path, char *lPat
34850 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e  h, size_t maxLen
34860 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ){.  int len;.  
34870 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74  int dbLen;.  int
34880 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b   i;..#ifdef LOCK
34890 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d  PROXYDIR.  len =
348a0 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20   strlcpy(lPath, 
348b0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61  LOCKPROXYDIR, ma
348c0 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69  xLen);.#else.# i
348d0 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f  fdef _CS_DARWIN_
348e0 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20  USER_TEMP_DIR.  
348f0 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66 73  {.    if( !confs
34900 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  tr(_CS_DARWIN_US
34910 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61  ER_TEMP_DIR, lPa
34920 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20  th, maxLen) ){. 
34930 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 47       OSTRACE(("G
34940 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69 6c  ETLOCKPATH  fail
34950 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20 70  ed %s errno=%d p
34960 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  id=%d\n",.      
34970 20 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c 20           lPath, 
34980 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28 29 29  errno, getpid())
34990 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
349a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
349b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  K;.    }.    len
349c0 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
349d0 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22  , "sqliteplocks"
349e0 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20  , maxLen);    . 
349f0 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20   }.# else.  len 
34a00 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
34a10 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e   "/tmp/", maxLen
34a20 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  );.# endif.#endi
34a30 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c  f..  if( lPath[l
34a40 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  en-1]!='/' ){.  
34a50 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
34a60 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c  lPath, "/", maxL
34a70 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  en);.  }.  .  /*
34a80 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64   transform the d
34a90 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71  b path to a uniq
34aa0 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f  ue cache name */
34ab0 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29  .  dbLen = (int)
34ac0 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a  strlen(dbPath);.
34ad0 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62    for( i=0; i<db
34ae0 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29  Len && (i+len+7)
34af0 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b  <(int)maxLen; i+
34b00 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  +){.    char c =
34b10 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20   dbPath[i];.    
34b20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28  lPath[i+len] = (
34b30 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20  c=='/')?'_':c;. 
34b40 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e   }.  lPath[i+len
34b50 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61  ]='\0';.  strlca
34b60 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a  t(lPath, ":auto:
34b70 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53  ", maxLen);.  OS
34b80 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
34b90 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
34ba0 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
34bb0 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64  ", lPath, getpid
34bc0 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ()));.  return S
34bd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
34be0 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65  . ** Creates the
34bf0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61   lock file and a
34c00 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63  ny missing direc
34c10 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61  tories in lockPa
34c20 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th. */.static in
34c30 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  t proxyCreateLoc
34c40 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
34c50 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69   *lockPath){.  i
34c60 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61  nt i, len;.  cha
34c70 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e  r buf[MAXPATHLEN
34c80 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  ];.  int start =
34c90 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   0;.  .  assert(
34ca0 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b  lockPath!=NULL);
34cb0 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65  .  /* try to cre
34cc0 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65  ate all the inte
34cd0 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f  rmediate directo
34ce0 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20  ries */.  len = 
34cf0 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b  (int)strlen(lock
34d00 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20  Path);.  buf[0] 
34d10 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20  = lockPath[0];. 
34d20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e   for( i=1; i<len
34d30 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28  ; i++ ){.    if(
34d40 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20   lockPath[i] == 
34d50 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61 72  '/' && (i - star
34d60 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20  t > 0) ){.      
34d70 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66  /* only mkdir if
34d80 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22   leaf dir != "."
34d90 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20   or "/" or ".." 
34da0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73  */.      if( i-s
34db0 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61  tart>2 || (i-sta
34dc0 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61  rt==1 && buf[sta
34dd0 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
34de0 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29  f[start] != '/')
34df0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
34e00 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66  -start==2 && buf
34e10 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
34e20 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21  & buf[start+1] !
34e30 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20  = '.') ){.      
34e40 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20    buf[i]='\0';. 
34e50 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b 64         if( osMkd
34e60 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44  ir(buf, SQLITE_D
34e70 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
34e80 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a  PERMISSIONS) ){.
34e90 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72            int er
34ea0 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  r=errno;.       
34eb0 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49     if( err!=EEXI
34ec0 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ST ) {.         
34ed0 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45     OSTRACE(("CRE
34ee0 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49  ATELOCKPATH  FAI
34ef0 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c  LED creating %s,
34f00 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
34f10 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72          "'%s' pr
34f20 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
34f30 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
34f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f50 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65   buf, strerror(e
34f60 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67  rr), lockPath, g
34f70 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20  etpid()));.     
34f80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 72         return er
34f90 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
34fa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34fb0 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31  .      start=i+1
34fc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b  ;.    }.    buf[
34fd0 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d  i] = lockPath[i]
34fe0 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
34ff0 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
35000 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
35010 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  h=%s pid=%d\n", 
35020 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64  lockPath, getpid
35030 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ()));.  return 0
35040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
35050 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65  e a new VFS file
35060 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f   descriptor (sto
35070 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  red in memory ob
35080 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
35090 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61  qlite3_malloc) a
350a0 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  nd open the file
350b0 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e   named "path" in
350c0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
350d0 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ptor..**.** The 
350e0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
350f0 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66  sible not only f
35100 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66  or closing the f
35110 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
35120 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66  * but also for f
35130 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72  reeing the memor
35140 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
35150 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  h the file descr
35160 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  iptor..*/.static
35170 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
35180 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f  UnixFile(.    co
35190 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
351a0 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66         /* path f
351b0 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46  or the new unixF
351c0 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46  ile */.    unixF
351d0 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20  ile **ppFile,   
351e0 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20      /* unixFile 
351f0 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74 75  created and retu
35200 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20  rned by ref */. 
35210 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c     int islockfil
35220 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  e           /* i
35230 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69  f non zero missi
35240 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20  ng dirs will be 
35250 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20  created */.) {. 
35260 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20   int fd = -1;.  
35270 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a  unixFile *pNew;.
35280 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35290 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e  E_OK;.  int open
352a0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c  Flags = O_RDWR |
352b0 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69   O_CREAT;.  sqli
352c0 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73  te3_vfs dummyVfs
352d0 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d  ;.  int terrno =
352e0 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   0;.  UnixUnused
352f0 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55  Fd *pUnused = NU
35300 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72  LL;..  /* 1. fir
35310 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63  st try to open/c
35320 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20  reate the file. 
35330 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66   ** 2. if that f
35340 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69  ails, and this i
35350 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e  s a lock file (n
35360 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63  ot-conch), try c
35370 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
35380 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72   parent director
35390 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79  ies and then try
353a0 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20   again..  ** 3. 
353b0 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74  if that fails, t
353c0 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ry to open the f
353d0 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20  ile read-only.  
353e0 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65 74  ** otherwise ret
353f0 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63  urn BUSY (if loc
35400 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f  k file) or CANTO
35410 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  PEN for the conc
35420 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55  h file.  */.  pU
35430 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
35440 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65  ableFd(path, ope
35450 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70  nFlags);.  if( p
35460 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64  Unused ){.    fd
35470 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
35480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e    }else{.    pUn
35490 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
354a0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55  alloc(sizeof(*pU
354b0 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28  nused));.    if(
354c0 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
354d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
354e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
354f0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
35500 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
35510 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
35520 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65  lags, 0);.    te
35530 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
35540 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
35550 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69  rno==ENOENT && i
35560 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
35570 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61     if( proxyCrea
35580 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29  teLockPath(path)
35590 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   == SQLITE_OK ){
355a0 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f  .        fd = ro
355b0 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
355c0 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
355d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
355e0 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
355f0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f     openFlags = O
35600 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20  _RDONLY;.    fd 
35610 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
35620 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30  th, openFlags, 0
35630 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20  );.    terrno = 
35640 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28  errno;.  }.  if(
35650 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28   fd<0 ){.    if(
35660 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20   islockfile ){. 
35670 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35680 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
35690 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e     switch (terrn
356a0 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20  o) {.      case 
356b0 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20  EACCES:.        
356c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
356d0 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45  RM;.      case E
356e0 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74  IO: .        ret
356f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
35700 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74  _LOCK; /* even t
35710 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 20  hough it is the 
35720 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64  conch */.      d
35730 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
35740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
35750 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
35760 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77   }.  }.  .  pNew
35770 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73   = (unixFile *)s
35780 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
35790 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
357a0 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
357b0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
357c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
357d0 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f  o end_create_pro
357e0 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  xy;.  }.  memset
357f0 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
35800 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70  (unixFile));.  p
35810 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  New->openFlags =
35820 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65   openFlags;.  me
35830 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20  mset(&dummyVfs, 
35840 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56  0, sizeof(dummyV
35850 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73  fs));.  dummyVfs
35860 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69  .pAppData = (voi
35870 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
35880 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73  nder;.  dummyVfs
35890 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22  .zName = "dummy"
358a0 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20  ;.  pUnused->fd 
358b0 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d  = fd;.  pUnused-
358c0 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  >flags = openFla
358d0 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75  gs;.  pNew->pUnu
358e0 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
358f0 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55   .  rc = fillInU
35900 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66  nixFile(&dummyVf
35910 73 2c 20 66 64 2c 20 28 73 71 6c 69 74 65 33 5f  s, fd, (sqlite3_
35920 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68  file*)pNew, path
35930 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
35940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35950 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b   *ppFile = pNew;
35960 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
35970 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63  TE_OK;.  }.end_c
35980 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20  reate_proxy:    
35990 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
359a0 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  pNew, fd, __LINE
359b0 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  __);.  sqlite3_f
359c0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c  ree(pNew);.  sql
359d0 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65  ite3_free(pUnuse
359e0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
359f0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
35a00 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61  E_TEST./* simula
35a10 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
35a20 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
35a30 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
35a40 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71   paths */.int sq
35a50 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
35a60 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64   = 0;.#endif..#d
35a70 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54  efine PROXY_HOST
35a80 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20  IDLEN    16  /* 
35a90 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20  conch file host 
35aa0 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a  id length */../*
35ab0 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69   Not always defi
35ac0 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  ned in the heade
35ad0 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20 74  rs as it ought t
35ae0 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69  o be */.extern i
35af0 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28 75  nt gethostuuid(u
35b00 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20  uid_t id, const 
35b10 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
35b20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74 20  *wait);../* get 
35b30 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20  the host ID via 
35b40 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70  gethostuuid(), p
35b50 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e  HostID must poin
35b60 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49  t to PROXY_HOSTI
35b70 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f  DLEN .** bytes o
35b80 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  f writable memor
35b90 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
35ba0 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
35bb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
35bc0 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72  HostID, int *pEr
35bd0 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50  ror){.  assert(P
35be0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d  ROXY_HOSTIDLEN =
35bf0 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29  = sizeof(uuid_t)
35c00 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73  );.  memset(pHos
35c10 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f  tID, 0, PROXY_HO
35c20 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64 65  STIDLEN);.#if de
35c30 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58  fined(__MAX_OS_X
35c40 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
35c50 55 49 52 45 44 29 5c 0a 20 20 20 20 20 20 20 20  UIRED)\.        
35c60 20 20 20 20 20 20 20 26 26 20 5f 5f 4d 41 43 5f         && __MAC_
35c70 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  OS_X_VERSION_MIN
35c80 5f 52 45 51 55 49 52 45 44 3c 31 30 35 30 0a 20  _REQUIRED<1050. 
35c90 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
35ca0 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73  nst struct times
35cb0 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31  pec timeout = {1
35cc0 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74  , 0}; /* 1 sec t
35cd0 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66  imeout */.    if
35ce0 28 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48  ( gethostuuid(pH
35cf0 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29  ostID, &timeout)
35d00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
35d10 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  r = errno;.     
35d20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20   if( pError ){. 
35d30 20 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d         *pError =
35d40 20 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20   err;.      }.  
35d50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35d60 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
35d70 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45   }.#else.  UNUSE
35d80 44 5f 50 41 52 41 4d 45 54 45 52 28 70 45 72 72  D_PARAMETER(pErr
35d90 6f 72 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  or);.#endif.#ifd
35da0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
35db0 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c   /* simulate mul
35dc0 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
35dd0 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
35de0 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
35df0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
35e00 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20  3_hostid_num != 
35e10 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b  0){.    pHostID[
35e20 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73  0] = (char)(pHos
35e30 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28  tID[0] + (char)(
35e40 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
35e50 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d  um & 0xFF));.  }
35e60 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74  .#endif.  .  ret
35e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
35e80 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  ../* The conch f
35e90 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
35ea0 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64   header, host id
35eb0 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   and lock file p
35ec0 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ath. */.#define 
35ed0 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
35ee0 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65  ON 2   /* 1-byte
35ef0 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65   header, 16-byte
35f00 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a   host id, path *
35f10 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
35f20 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20  HEADERLEN    1  
35f30 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68   /* conch file h
35f40 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a  eader length */.
35f50 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41  #define PROXY_PA
35f60 54 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58  THINDEX    (PROX
35f70 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
35f80 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65  Y_HOSTIDLEN).#de
35f90 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f  fine PROXY_MAXCO
35fa0 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48  NCHLEN  (PROXY_H
35fb0 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
35fc0 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48  OSTIDLEN+MAXPATH
35fd0 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b  LEN)../* .** Tak
35fe0 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68  es an open conch
35ff0 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68   file, copies th
36000 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20  e contents to a 
36010 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65  new path and the
36020 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62  n moves .** it b
36030 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20  ack.  The newly 
36040 63 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66  created file's f
36050 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
36060 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  s assigned to th
36070 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20  e.** conch file 
36080 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69  structure and fi
36090 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e  nally the origin
360a0 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65  al conch file de
360b0 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20  scriptor is .** 
360c0 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73  closed.  Returns
360d0 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73   zero if success
360e0 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ful..*/.static i
360f0 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e  nt proxyBreakCon
36100 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  chLock(unixFile 
36110 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d  *pFile, uuid_t m
36120 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78  yHostID){.  prox
36130 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
36140 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
36150 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
36160 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
36170 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
36180 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
36190 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
361a0 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58    char tPath[MAX
361b0 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  PATHLEN];.  char
361c0 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f   buf[PROXY_MAXCO
361d0 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  NCHLEN];.  char 
361e0 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63  *cPath = pCtx->c
361f0 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20  onchFilePath;.  
36200 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d  size_t readLen =
36210 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74   0;.  size_t pat
36220 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  hLen = 0;.  char
36230 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22   errmsg[64] = ""
36240 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
36250 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a  .  int rc = -1;.
36260 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
36270 45 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20  ER(myHostID);.. 
36280 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77   /* create a new
36290 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65   path by replace
362a0 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d   the trailing '-
362b0 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72  conch' with '-br
362c0 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65  eak' */.  pathLe
362d0 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74  n = strlcpy(tPat
362e0 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54  h, cPath, MAXPAT
362f0 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74  HLEN);.  if( pat
36300 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20  hLen>MAXPATHLEN 
36310 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20  || pathLen<6 || 
36320 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26  .     (strlcpy(&
36330 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d  tPath[pathLen-5]
36340 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d  , "break", 6) !=
36350 20 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   5) ){.    sqlit
36360 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
36370 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73  of(errmsg),errms
36380 67 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c  g,"path error (l
36390 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74  en %d)",(int)pat
363a0 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  hLen);.    goto 
363b0 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
363c0 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65   }.  /* read the
363d0 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a   conch content *
363e0 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73  /.  readLen = os
363f0 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d  Pread(conchFile-
36400 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d  >h, buf, PROXY_M
36410 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a  AXCONCHLEN, 0);.
36420 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52    if( readLen<PR
36430 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b  OXY_PATHINDEX ){
36440 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
36450 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
36460 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61  msg),errmsg,"rea
36470 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  d error (len %d)
36480 22 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b  ",(int)readLen);
36490 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
364a0 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f  eaklock;.  }.  /
364b0 2a 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  * write it out t
364c0 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  o the temporary 
364d0 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20  break file */.  
364e0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
364f0 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c  (tPath, (O_RDWR|
36500 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c  O_CREAT|O_EXCL),
36510 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20   0);.  if( fd<0 
36520 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
36530 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
36540 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
36550 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 28  "create failed (
36560 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
36570 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
36580 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lock;.  }.  if( 
36590 6f 73 50 77 72 69 74 65 28 66 64 2c 20 62 75 66  osPwrite(fd, buf
365a0 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d  , readLen, 0) !=
365b0 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65   (ssize_t)readLe
365c0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
365d0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
365e0 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
365f0 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64 20  , "write failed 
36600 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
36610 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
36620 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
36630 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63   rename(tPath, c
36640 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c  Path) ){.    sql
36650 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
36660 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
36670 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61  rmsg, "rename fa
36680 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
36690 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
366a0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
366b0 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69    rc = 0;.  fpri
366c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f  ntf(stderr, "bro
366d0 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ke stale lock on
366e0 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a   %s\n", cPath);.
366f0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
36700 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  File, conchFile-
36710 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
36720 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20   conchFile->h = 
36730 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  fd;.  conchFile-
36740 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52  >openFlags = O_R
36750 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a  DWR | O_CREAT;..
36760 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20  end_breaklock:. 
36770 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
36780 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
36790 20 20 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68    osUnlink(tPath
367a0 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
367b0 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c  close(pFile, fd,
367c0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
367d0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  }.    fprintf(st
367e0 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f  derr, "failed to
367f0 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63   break stale loc
36800 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20  k on %s, %s\n", 
36810 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a  cPath, errmsg);.
36820 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
36830 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20  .}../* Take the 
36840 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f  requested lock o
36850 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
36860 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61   and break a sta
36870 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a  le lock if the .
36880 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  ** host id match
36890 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
368a0 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  t proxyConchLock
368b0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
368c0 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
368d0 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29  D, int lockType)
368e0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
368f0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
36900 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
36910 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
36920 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
36930 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
36940 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
36950 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  chFile;.  int rc
36960 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
36970 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a  int nTries = 0;.
36980 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
36990 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a  c conchModTime;.
369a0 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e    .  memset(&con
369b0 63 68 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69  chModTime, 0, si
369c0 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d  zeof(conchModTim
369d0 65 29 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  e));.  do {.    
369e0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
369f0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
36a00 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
36a10 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
36a20 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b  e);.    nTries +
36a30 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  +;.    if( rc==S
36a40 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
36a50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f      /* If the lo
36a60 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29  ck failed (busy)
36a70 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74  :.       * 1st t
36a80 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20  ry: get the mod 
36a90 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  time of the conc
36aa0 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64  h, wait 0.5s and
36ab0 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20   try again. .   
36ac0 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66      * 2nd try: f
36ad0 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74  ail if the mod t
36ae0 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68  ime changed or h
36af0 6f 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72  ost id is differ
36b00 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20  ent, wait .     
36b10 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30    *           10
36b20 20 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61   sec and try aga
36b30 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20  in.       * 3rd 
36b40 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c  try: break the l
36b50 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  ock unless the m
36b60 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e  od time has chan
36b70 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ged..       */. 
36b80 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
36b90 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20   buf;.      if( 
36ba0 6f 73 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c  osFstat(conchFil
36bb0 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20  e->h, &buf) ){. 
36bc0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
36bd0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
36be0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
36bf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
36c00 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
36c10 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69   .      if( nTri
36c20 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  es==1 ){.       
36c30 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20   conchModTime = 
36c40 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
36c50 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  ;.        usleep
36c60 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69  (500000); /* wai
36c70 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72  t 0.5 sec and tr
36c80 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e  y the lock again
36c90 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  */.        conti
36ca0 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a  nue;  .      }..
36cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54        assert( nT
36cc0 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20  ries>1 );.      
36cd0 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  if( conchModTime
36ce0 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73  .tv_sec != buf.s
36cf0 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73  t_mtimespec.tv_s
36d00 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ec || .         
36d10 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
36d20 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d  nsec != buf.st_m
36d30 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63  timespec.tv_nsec
36d40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
36d50 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
36d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
36d70 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d       if( nTries=
36d80 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20  =2 ){  .        
36d90 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f  char tBuf[PROXY_
36da0 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
36db0 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
36dc0 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c  osPread(conchFil
36dd0 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58  e->h, tBuf, PROX
36de0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30  Y_MAXCONCHLEN, 0
36df0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
36e00 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en<0 ){.        
36e10 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
36e20 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
36e30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36e40 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
36e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36e60 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f    if( len>PROXY_
36e70 50 41 54 48 49 4e 44 45 58 20 26 26 20 74 42 75  PATHINDEX && tBu
36e80 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58  f[0]==(char)PROX
36e90 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b  Y_CONCHVERSION){
36ea0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
36eb0 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
36ec0 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ck if the host i
36ed0 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  d doesn't match 
36ee0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
36ef0 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66   0!=memcmp(&tBuf
36f00 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
36f10 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
36f20 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b  XY_HOSTIDLEN) ){
36f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
36f40 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
36f50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36f60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36f70 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
36f80 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  reak the lock on
36f90 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61   short read or a
36fa0 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63   version mismatc
36fb0 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  h */.          r
36fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
36fd0 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
36fe0 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30       usleep(1000
36ff0 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31  0000); /* wait 1
37000 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  0 sec and try th
37010 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a  e lock again */.
37020 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
37030 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
37040 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20   .      assert( 
37050 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20  nTries==3 );.   
37060 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42     if( 0==proxyB
37070 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  reakConchLock(pF
37080 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29  ile, myHostID) )
37090 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
370a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
370b0 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
370c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
370d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
370e0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
370f0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
37100 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
37110 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
37120 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  );          .   
37130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
37140 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
37150 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
37160 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
37170 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
37180 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
37190 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20  kType);.        
371a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
371b0 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53    } while( rc==S
371c0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54  QLITE_BUSY && nT
371d0 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72  ries<3 );.  .  r
371e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
371f0 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20  Takes the conch 
37200 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72  by taking a shar
37210 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64  ed lock and read
37220 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f   the contents co
37230 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b  nch, if .** lock
37240 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  Path is non-NULL
37250 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  , the host ID an
37260 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
37270 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20   must match.  A 
37280 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74  NULL .** lockPat
37290 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  h means that the
372a0 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65   lockPath in the
372b0 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
372c0 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
372d0 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74  .** host IDs mat
372e0 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63  ch, or a new loc
372f0 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67  k path will be g
37300 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74  enerated automat
37310 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77  ically .** and w
37320 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f  ritten to the co
37330 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nch file..*/.sta
37340 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b  tic int proxyTak
37350 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20  eConch(unixFile 
37360 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79  *pFile){.  proxy
37370 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
37380 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
37390 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
373a0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
373b0 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70  ext; .  .  if( p
373c0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d  Ctx->conchHeld!=
373d0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
373e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
373f0 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  se{.    unixFile
37400 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
37410 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
37420 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74     uuid_t myHost
37430 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72  ID;.    int pErr
37440 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  or = 0;.    char
37450 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d   readBuf[PROXY_M
37460 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
37470 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d   char lockPath[M
37480 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20  AXPATHLEN];.    
37490 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61  char *tempLockPa
374a0 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  th = NULL;.    i
374b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
374c0 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74  K;.    int creat
374d0 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20  eConch = 0;.    
374e0 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20  int hostIdMatch 
374f0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61  = 0;.    int rea
37500 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e  dLen = 0;.    in
37510 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68  t tryOldLockPath
37520 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f   = 0;.    int fo
37530 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d  rceNewLockPath =
37540 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54   0;.    .    OST
37550 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48  RACE(("TAKECONCH
37560 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
37570 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
37580 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
37590 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f    (pCtx->lockPro
375a0 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c  xyPath ? pCtx->l
375b0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22  ockProxyPath : "
375c0 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64  :auto:"), getpid
375d0 28 29 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  ()));..    rc = 
375e0 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d  proxyGetHostID(m
375f0 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72  yHostID, &pError
37600 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
37610 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
37620 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  RR ){.      pFil
37630 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70  e->lastErrno = p
37640 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74  Error;.      got
37650 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
37660 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
37670 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
37680 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
37690 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
376a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
376b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
376c0 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
376d0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65  .    }.    /* re
376e0 61 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ad the existing 
376f0 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
37700 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b    readLen = seek
37710 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c  AndRead((unixFil
37720 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c  e*)conchFile, 0,
37730 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f   readBuf, PROXY_
37740 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20  MAXCONCHLEN);.  
37750 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20    if( readLen<0 
37760 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20  ){.      /* I/O 
37770 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f  error: lastErrno
37780 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
37790 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  ead */.      pFi
377a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
377b0 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45  conchFile->lastE
377c0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
377d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
377e0 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  AD;.      goto e
377f0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
37800 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64    }else if( read
37810 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44  Len<=(PROXY_HEAD
37820 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
37830 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20  IDLEN) || .     
37840 20 20 20 20 20 20 20 20 72 65 61 64 42 75 66 5b          readBuf[
37850 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f  0]!=(char)PROXY_
37860 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a  CONCHVERSION ){.
37870 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74        /* a short
37880 20 72 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e   read or version
37890 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68   format mismatch
378a0 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
378b0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a  o create a new .
378c0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66        ** conch f
378d0 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ile. .      */. 
378e0 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68       createConch
378f0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
37900 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  /* if the host i
37910 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68  d matches and th
37920 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65  e lock path alre
37930 61 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68  ady exists in th
37940 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77  e conch.    ** w
37950 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  e'll try to use 
37960 74 68 65 20 70 61 74 68 20 74 68 65 72 65 2c 20  the path there, 
37970 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e  if we can't open
37980 20 74 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c   that path, we'l
37990 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20  l .    ** retry 
379a0 77 69 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d  with a new auto-
379b0 67 65 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a  generated path .
379c0 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20      */.    do { 
379d0 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65  /* in case we ne
379e0 65 64 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20  ed to try again 
379f0 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61  for an :auto: na
37a00 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  med lock file */
37a10 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63 72 65  ..      if( !cre
37a20 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72  ateConch && !for
37a30 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b  ceNewLockPath ){
37a40 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d  .        hostIdM
37a50 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26  atch = !memcmp(&
37a60 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45  readBuf[PROXY_HE
37a70 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
37a80 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ID, .           
37a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37aa0 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53         PROXY_HOS
37ab0 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  TIDLEN);.       
37ac0 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68   /* if the conch
37ad0 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72   has data compar
37ae0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a  e the contents *
37af0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
37b00 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
37b10 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
37b20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65  /* for auto-name
37b30 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  d local lock fil
37b40 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68  e, just check th
37b50 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65  e host ID and we
37b60 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a  'll.           *
37b70 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20  * use the local 
37b80 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74  lock file path t
37b90 68 61 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e  hat's already in
37ba0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
37bb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
37bc0 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29  f( hostIdMatch )
37bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 69  {.            si
37be0 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28  ze_t pathLen = (
37bf0 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f  readLen - PROXY_
37c00 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20  PATHINDEX);.    
37c10 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
37c20 20 20 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e       if( pathLen
37c30 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a  >=MAXPATHLEN ){.
37c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
37c50 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e  thLen=MAXPATHLEN
37c60 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
37c70 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
37c80 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26  mcpy(lockPath, &
37c90 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41  readBuf[PROXY_PA
37ca0 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65  THINDEX], pathLe
37cb0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
37cc0 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e  lockPath[pathLen
37cd0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
37ce0 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20     tempLockPath 
37cf0 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20  = lockPath;.    
37d00 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f          tryOldLo
37d10 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20  ckPath = 1;.    
37d20 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74          /* creat
37d30 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
37d40 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74 68 65  lock path if the
37d50 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20   conch is taken 
37d60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  */.            g
37d70 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
37d80 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
37d90 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
37da0 20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20 20 20   hostIdMatch.   
37db0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 21              && !
37dc0 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f  strncmp(pCtx->lo
37dd0 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 26 72 65  ckProxyPath, &re
37de0 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48  adBuf[PROXY_PATH
37df0 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20 20 20  INDEX],.        
37e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e10 20 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59     readLen-PROXY
37e20 5f 50 41 54 48 49 4e 44 45 58 29 0a 20 20 20 20  _PATHINDEX).    
37e30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
37e40 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20 61   /* conch host a
37e50 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74  nd lock path mat
37e60 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
37e70 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
37e80 63 68 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  ch; .        }. 
37e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
37ea0 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f      /* if the co
37eb0 6e 63 68 20 69 73 6e 27 74 20 77 72 69 74 61 62  nch isn't writab
37ec0 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d  le and doesn't m
37ed0 61 74 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74  atch, we can't t
37ee0 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ake it */.      
37ef0 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  if( (conchFile->
37f00 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52  openFlags&O_RDWR
37f10 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20  ) == 0 ){.      
37f20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
37f30 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  SY;.        goto
37f40 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
37f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
37f60 20 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20 74       /* either t
37f70 68 65 20 63 6f 6e 63 68 20 64 69 64 6e 27 74 20  he conch didn't 
37f80 6d 61 74 63 68 20 6f 72 20 77 65 20 6e 65 65 64  match or we need
37f90 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
37fa0 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 66   one */.      if
37fb0 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
37fc0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
37fd0 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61    proxyGetLockPa
37fe0 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  th(pCtx->dbPath,
37ff0 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41   lockPath, MAXPA
38000 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  THLEN);.        
38010 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c  tempLockPath = l
38020 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20  ockPath;.       
38030 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70   /* create a cop
38040 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61  y of the lock pa
38050 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65  th _only_ if the
38060 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20   conch is taken 
38070 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
38080 20 0a 20 20 20 20 20 20 2f 2a 20 75 70 64 61 74   .      /* updat
38090 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68 6f 73  e conch with hos
380a0 74 20 61 6e 64 20 70 61 74 68 20 28 74 68 69 73  t and path (this
380b0 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74   will fail if ot
380c0 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20  her process.    
380d0 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65    ** has a share
380e0 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c  d lock already),
380f0 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
38100 6d 61 74 63 68 65 73 2c 20 75 73 65 20 74 68 65  matches, use the
38110 20 62 69 67 0a 20 20 20 20 20 20 2a 2a 20 73 74   big.      ** st
38120 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ick..      */.  
38130 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63      futimes(conc
38140 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b  hFile->h, NULL);
38150 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49  .      if( hostI
38160 64 4d 61 74 63 68 20 26 26 20 21 63 72 65 61 74  dMatch && !creat
38170 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20  eConch ){.      
38180 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d    if( conchFile-
38190 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f 6e 63 68  >pInode && conch
381a0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
381b0 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 20  hared>1 ){.     
381c0 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74       /* We are t
381d0 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
381e0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
381f0 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
38200 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
38210 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
38220 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
38230 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
38240 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
38250 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
38260 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
38270 7b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  {          .    
38280 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
38290 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
382a0 20 6d 79 48 6f 73 74 49 44 2c 20 45 58 43 4c 55   myHostID, EXCLU
382b0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
382c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
382d0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
382e0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
382f0 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
38300 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
38310 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  le, EXCLUSIVE_LO
38320 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
38330 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
38350 63 68 61 72 20 77 72 69 74 65 42 75 66 66 65 72  char writeBuffer
38360 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
38370 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  EN];.        int
38380 20 77 72 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a   writeSize = 0;.
38390 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
383a0 20 77 72 69 74 65 42 75 66 66 65 72 5b 30 5d 20   writeBuffer[0] 
383b0 3d 20 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  = (char)PROXY_CO
383c0 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20  NCHVERSION;.    
383d0 20 20 20 20 6d 65 6d 63 70 79 28 26 77 72 69 74      memcpy(&writ
383e0 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 48 45  eBuffer[PROXY_HE
383f0 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
38400 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ID, PROXY_HOSTID
38410 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LEN);.        if
38420 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ( pCtx->lockProx
38430 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20  yPath!=NULL ){. 
38440 20 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79           strlcpy
38450 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
38460 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20  OXY_PATHINDEX], 
38470 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
38480 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
38490 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
384a0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63  .          strlc
384b0 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
384c0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
384d0 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20  , tempLockPath, 
384e0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
384f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77       }.        w
38500 72 69 74 65 53 69 7a 65 20 3d 20 50 52 4f 58 59  riteSize = PROXY
38510 5f 50 41 54 48 49 4e 44 45 58 20 2b 20 73 74 72  _PATHINDEX + str
38520 6c 65 6e 28 26 77 72 69 74 65 42 75 66 66 65 72  len(&writeBuffer
38530 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
38540 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  ]);.        robu
38550 73 74 5f 66 74 72 75 6e 63 61 74 65 28 63 6f 6e  st_ftruncate(con
38560 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65  chFile->h, write
38570 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Size);.        r
38580 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28 73  c = unixWrite((s
38590 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f  qlite3_file *)co
385a0 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65 42 75  nchFile, writeBu
385b0 66 66 65 72 2c 2