/ Hex Artifact Content
Login

Artifact 35510fa3a2f38b076a9628557c1ead63bbb49cdc:


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 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 4f 53 5f  ING_STYLE || OS_
0c60: 56 58 57 4f 52 4b 53 0a 23 20 69 6e 63 6c 75 64  VXWORKS.# includ
0c70: 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a  e <sys/ioctl.h>.
0c80: 23 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  # if OS_VXWORKS.
0c90: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61  #  include <sema
0ca0: 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c  phore.h>.#  incl
0cb0: 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23  ude <limits.h>.#
0cc0: 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65   else.#  include
0cd0: 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20   <sys/file.h>.# 
0ce0: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61   include <sys/pa
0cf0: 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23  ram.h>.# endif.#
0d00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
0d10: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
0d20: 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66  TYLE */..#if def
0d30: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
0d40: 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  || (SQLITE_ENABL
0d50: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0d60: 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a  && !OS_VXWORKS).
0d70: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
0d80: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
0d90: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
0da0: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
0db0: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
0dc0: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0dd0: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
0de0: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
0df0: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
0e00: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
0e10: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
0e20: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0e30: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0e40: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0e50: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0e60: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0e70: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
0e80: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
0e90: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
0ea0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
0eb0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
0ec0: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
0ed0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
0ee0: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
0ef0: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
0f00: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
0f10: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
0f20: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
0f30: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
0f40: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
0f50: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
0f60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
0f70: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
0f80: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
0f90: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
0fa0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0fb0: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
0fc0: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
0fd0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
0fe0: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
0ff0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1000: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1010: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
1020: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
1030: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
1040: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c  HNAME 512../* Al
1050: 77 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65  ways cast the ge
1060: 74 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79  tpid() return ty
1070: 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  pe for compatibi
1080: 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72  lity with.** ker
1090: 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56  nel modules in V
10a0: 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69  xWorks. */.#defi
10b0: 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28  ne osGetpid(X) (
10c0: 70 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a  pid_t)getpid()..
10d0: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
10e0: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
10f0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1100: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1110: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
1120: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
1130: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
1140: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
1150: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
1160: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
1170: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1180: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1190: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
11a0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
11b0: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
11c0: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
11d0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
11e0: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
11f0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1200: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1210: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
1220: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
1230: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1240: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
1250: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
1260: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
1270: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1280: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1290: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
12a0: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
12b0: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
12c0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
12d0: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
12e0: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
12f0: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1300: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1310: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
1320: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
1330: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
1340: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
1350: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
1360: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
1370: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1380: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1390: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
13a0: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
13b0: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
13c0: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
13d0: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
13e0: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
13f0: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1400: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1420: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1430: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
1440: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
1450: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1460: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
1470: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1480: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1490: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
14a0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
14b0: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
14c0: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
14d0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
14e0: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
14f0: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1500: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1510: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
1520: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
1530: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
1540: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1550: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
1560: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
1570: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1580: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1590: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
15a0: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
15b0: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
15c0: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15e0: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
15f0: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1600: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1610: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1630: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1640: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1650: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1680: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1690: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
16a0: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
16b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
16c0: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
16d0: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
16e0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
16f0: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1700: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1710: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1720: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1730: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1760: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1770: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1780: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1790: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
17a0: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
17b0: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
17c0: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
17d0: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17f0: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1800: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1810: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1830: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1840: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1850: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1880: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1890: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
18a0: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c0: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
18d0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
18e0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
18f0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1900: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1930: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1940: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1950: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1960: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1970: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1980: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1990: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
19a0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
19b0: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
19c0: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
19d0: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
19e0: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
19f0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1a00: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1a10: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1a20: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1a30: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1a40: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1a70: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1a80: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1a90: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1aa0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1ac0: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1ad0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1ae0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1b00: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1b10: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1b20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1b30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1b40: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1b50: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1b80: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1b90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1ba0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1bb0: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1bc0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1bd0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1be0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1bf0: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1c00: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1c10: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1c20: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1c30: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1c40: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1c50: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1c60: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1c70: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1c80: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1c90: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1ca0: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1cb0: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1cc0: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1cd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ce0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1cf0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1d00: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1d10: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1d20: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d30: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1d40: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1d50: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1d60: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1d70: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1d80: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1d90: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1da0: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1db0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1dc0: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1dd0: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1de0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1df0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1e00: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1e10: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1e20: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1e30: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1e40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e50: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1e60: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1e70: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
1e80: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
1e90: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
1ea0: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
1eb0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1ec0: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
1ed0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
1ee0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
1ef0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
1f00: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1f10: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
1f20: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
1f30: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
1f40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
1f50: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
1f60: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
1f70: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
1f80: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
1f90: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
1fa0: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
1fb0: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
1fc0: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
1fd0: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
1fe0: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
1ff0: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2000: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2010: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
2020: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
2030: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
2040: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
2050: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
2060: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
2070: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2080: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2090: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
20a0: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
20b0: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
20c0: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
20d0: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
20e0: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
20f0: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2100: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2110: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
2120: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
2130: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
2140: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
2150: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
2160: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
2170: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2180: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2190: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
21a0: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
21b0: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
21c0: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
21d0: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
21e0: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
21f0: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2200: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2210: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
2220: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
2230: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
2240: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
2250: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
2260: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
2270: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2280: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2290: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
22a0: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
22b0: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
22c0: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
22d0: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
22e0: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
22f0: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2300: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2310: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
2320: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
2330: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2340: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
2350: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
2360: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
2370: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2380: 45 5f 57 41 52 4e 45 44 20 20 20 20 30 78 30 31  E_WARNED    0x01
2390: 30 30 20 20 20 20 20 2f 2a 20 76 65 72 69 66 79  00     /* verify
23a0: 44 62 46 69 6c 65 28 29 20 77 61 72 6e 69 6e 67  DbFile() warning
23b0: 73 20 69 73 73 75 65 64 20 2a 2f 0a 0a 2f 2a 0a  s issued */../*.
23c0: 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20  ** Include code 
23d0: 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  that is common t
23e0: 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c  o all os_*.c fil
23f0: 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  es.*/.#include "
2400: 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a  os_common.h"../*
2410: 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f  .** Define vario
2420: 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61  us macros that a
2430: 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  re missing from 
2440: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  some systems..*/
2450: 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .#ifndef O_LARGE
2460: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
2470: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2480: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2490: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75  _DISABLE_LFS.# u
24a0: 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45  ndef O_LARGEFILE
24b0: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47  .# define O_LARG
24c0: 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23  EFILE 0.#endif.#
24d0: 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f  ifndef O_NOFOLLO
24e0: 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46  W.# define O_NOF
24f0: 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23  OLLOW 0.#endif.#
2500: 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a  ifndef O_BINARY.
2510: 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52  # define O_BINAR
2520: 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  Y 0.#endif../*.*
2530: 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d  * The threadid m
2540: 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f  acro resolves to
2550: 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f   the thread-id o
2560: 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f  r to 0.  Used fo
2570: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
2580: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
2590: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
25a0: 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e  HREADSAFE.#defin
25b0: 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65  e threadid pthre
25c0: 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a  ad_self().#else.
25d0: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
25e0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
25f0: 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66   HAVE_MREMAP def
2600: 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e  aults to true on
2610: 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65   Linux and false
2620: 20 65 76 65 72 79 77 68 65 72 65 20 65 6c 73 65   everywhere else
2630: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
2640: 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23  d(HAVE_MREMAP).#
2650: 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   if defined(__li
2660: 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65  nux__) && define
2670: 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23  d(_GNU_SOURCE).#
2680: 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52    define HAVE_MR
2690: 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20  EMAP 1.# else.# 
26a0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45   define HAVE_MRE
26b0: 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65  MAP 0.# endif.#e
26c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c  ndif../*.** Expl
26d0: 69 63 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20  icitly call the 
26e0: 36 34 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f  64-bit version o
26f0: 66 20 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64  f lseek() on And
2700: 72 6f 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  roid. Otherwise,
2710: 20 6c 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74   lseek().** is t
2720: 68 65 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f  he 32-bit versio
2730: 6e 2c 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45  n, even if _FILE
2740: 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20  _OFFSET_BITS=64 
2750: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
2760: 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f  ifdef __ANDROID_
2770: 5f 0a 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b  _.# define lseek
2780: 20 6c 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a   lseek64.#endif.
2790: 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ./*.** Different
27a0: 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65   Unix systems de
27b0: 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20  clare open() in 
27c0: 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20  different ways. 
27d0: 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65   Same use.** ope
27e0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
27f0: 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65  t,mode_t).  Othe
2800: 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73  rs use open(cons
2810: 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29  t char*,int,...)
2820: 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  ..** The differe
2830: 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  nce is important
2840: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f   when using a po
2850: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e  inter to the fun
2860: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
2870: 20 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64   safest way to d
2880: 65 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f  eal with the pro
2890: 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79  blem is to alway
28a0: 73 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70  s use this wrapp
28b0: 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61  er.** which alwa
28c0: 79 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ys has the same 
28d0: 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74  well-defined int
28e0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
28f0: 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28  c int posixOpen(
2900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2910: 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e  e, int flags, in
2920: 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72  t mode){.  retur
2930: 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c  n open(zFile, fl
2940: 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f  ags, mode);.}../
2950: 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73  *.** On some sys
2960: 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66  tems, calls to f
2970: 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69  chown() will tri
2980: 67 67 65 72 20 61 20 6d 65 73 73 61 67 65 20 69  gger a message i
2990: 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20  n a security.** 
29a0: 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65  log if they come
29b0: 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70   from non-root p
29c0: 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76  rocesses.  So av
29d0: 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f  oid calling fcho
29e0: 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72  wn() if.** we ar
29f0: 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73  e not running as
2a00: 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   root..*/.static
2a10: 20 69 6e 74 20 70 6f 73 69 78 46 63 68 6f 77 6e   int posixFchown
2a20: 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75  (int fd, uid_t u
2a30: 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a  id, gid_t gid){.
2a40: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2a50: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65   return 0;.#else
2a60: 0a 20 20 72 65 74 75 72 6e 20 67 65 74 65 75 69  .  return geteui
2a70: 64 28 29 20 3f 20 30 20 3a 20 66 63 68 6f 77 6e  d() ? 0 : fchown
2a80: 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65  (fd,uid,gid);.#e
2a90: 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  ndif.}../* Forwa
2aa0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
2ab0: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
2ac0: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
2ad0: 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61  har*, int*);.sta
2ae0: 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70  tic int unixGetp
2af0: 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a 0a  agesize(void);..
2b00: 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65  /*.** Many syste
2b10: 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65  m calls are acce
2b20: 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69  ssed through poi
2b30: 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e  nter-to-function
2b40: 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  s so that.** the
2b50: 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  y may be overrid
2b60: 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74  den at runtime t
2b70: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75  o facilitate fau
2b80: 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72  lt injection dur
2b90: 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  ing.** testing a
2ba0: 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20  nd sandboxing.  
2bb0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  The following ar
2bc0: 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  ray holds the na
2bd0: 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73  mes and pointers
2be0: 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72  .** to all overr
2bf0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
2c00: 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alls..*/.static 
2c10: 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63  struct unix_sysc
2c20: 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  all {.  const ch
2c30: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
2c40: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2c50: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
2c60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
2c70: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
2c80: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
2c90: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
2ca0: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
2cb0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2cc0: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
2cd0: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
2ce0: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
2cf0: 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20    { "open",     
2d00: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2d10: 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70  call_ptr)posixOp
2d20: 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69  en,  0  },.#defi
2d30: 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28  ne osOpen      (
2d40: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
2d50: 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79  ar*,int,int))aSy
2d60: 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e  scall[0].pCurren
2d70: 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c  t)..  { "close",
2d80: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2d90: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f  _syscall_ptr)clo
2da0: 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  se,      0  },.#
2db0: 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20  define osClose  
2dc0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29     ((int(*)(int)
2dd0: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
2de0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63  rrent)..  { "acc
2df0: 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ess",       (sql
2e00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2e10: 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20  )access,     0  
2e20: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63  },.#define osAcc
2e30: 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ess    ((int(*)(
2e40: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
2e50: 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75  )aSyscall[2].pCu
2e60: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74  rrent)..  { "get
2e70: 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c  cwd",       (sql
2e80: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2e90: 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20  )getcwd,     0  
2ea0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  },.#define osGet
2eb0: 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a  cwd    ((char*(*
2ec0: 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29  )(char*,size_t))
2ed0: 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72  aSyscall[3].pCur
2ee0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74  rent)..  { "stat
2ef0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
2f00: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2f10: 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d  stat,       0  }
2f20: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74  ,.#define osStat
2f30: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
2f40: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63  onst char*,struc
2f50: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
2f60: 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[4].pCurrent)..
2f70: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
2f80: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
2f90: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
2fa0: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
2fb0: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
2fc0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
2fd0: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
2fe0: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
2ff0: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
3000: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
3010: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
3020: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
3030: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
3040: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
3050: 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61   it is DOS - wha
3060: 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74  t did you expect
3070: 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a  ?.*/.#ifdef __DJ
3080: 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74  GPP__.  { "fstat
3090: 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20  ",        0,    
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
30b0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74  },.#define osFst
30c0: 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23  at(a,b,c)    0.#
30d0: 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66  else     .  { "f
30e0: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73  stat",        (s
30f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3100: 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30  tr)fstat,      0
3110: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
3120: 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a  stat     ((int(*
3130: 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61  )(int,struct sta
3140: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e  t*))aSyscall[5].
3150: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
3160: 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65  ..  { "ftruncate
3170: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
3180: 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e  yscall_ptr)ftrun
3190: 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65  cate,  0  },.#de
31a0: 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65  fine osFtruncate
31b0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66   ((int(*)(int,of
31c0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d  f_t))aSyscall[6]
31d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
31e0: 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20  "fcntl",        
31f0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3200: 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20  _ptr)fcntl,     
3210: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3220: 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74  sFcntl     ((int
3230: 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29  (*)(int,int,...)
3240: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
3250: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61  rrent)..  { "rea
3260: 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  d",         (sql
3270: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3280: 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20  )read,       0  
3290: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  },.#define osRea
32a0: 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  d      ((ssize_t
32b0: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
32c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38  ze_t))aSyscall[8
32d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
32e0: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
32f0: 41 44 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  AD) || (SQLITE_E
3300: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
3310: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
3320: 4b 53 29 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  KS).  { "pread",
3330: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3340: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
3350: 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  ad,      0  },.#
3360: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22  else.  { "pread"
3370: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3380: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3390: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
33a0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
33b0: 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69  sPread     ((ssi
33c0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
33d0: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
33e0: 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72  aSyscall[9].pCur
33f0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3400: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
3410: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
3420: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3430: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34  call_ptr)pread64
3440: 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  ,    0  },.#else
3450: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
3460: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3470: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3480: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3490: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
34a0: 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f 74  ad64   ((ssize_t
34b0: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
34c0: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
34d0: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
34e0: 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c  t)..  { "write",
34f0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3500: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69  _syscall_ptr)wri
3510: 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  te,      0  },.#
3520: 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20  define osWrite  
3530: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
3540: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
3550: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
3560: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
3570: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3580: 50 52 45 41 44 29 20 7c 7c 20 28 53 51 4c 49 54  PREAD) || (SQLIT
3590: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
35a0: 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
35b0: 57 4f 52 4b 53 29 0a 20 20 7b 20 22 70 77 72 69  WORKS).  { "pwri
35c0: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
35d0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35e0: 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d  pwrite,     0  }
35f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
3600: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
3610: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3620: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3630: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3640: 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28  e osPwrite    ((
3650: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3660: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3670: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3690: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
36a0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
36b0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
36c0: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
36d0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
36e0: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36  call_ptr)pwrite6
36f0: 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  4,   0  },.#else
3700: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
3710: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3720: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3730: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3740: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3750: 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74  ite64  ((ssize_t
3760: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3770: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3780: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3790: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
37a0: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
37b0: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
37c0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
37d0: 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c  call_ptr)fchmod,
37e0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
37f0: 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28  ne osFchmod    (
3800: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65  (int(*)(int,mode
3810: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d  _t))aSyscall[14]
3820: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3830: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53  defined(HAVE_POS
3840: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26  IX_FALLOCATE) &&
3850: 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c   HAVE_POSIX_FALL
3860: 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f  OCATE.  { "fallo
3870: 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74  cate",    (sqlit
3880: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3890: 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20  osix_fallocate, 
38a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
38b0: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
38c0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
38d0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
38e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
38f0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c  if.#define osFal
3900: 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  locate ((int(*)(
3910: 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29  int,off_t,off_t)
3920: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
3930: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e  urrent)..  { "un
3940: 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71  link",       (sq
3950: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3960: 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20  r)unlink,       
3970: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3980: 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69   osUnlink    ((i
3990: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
39a0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e  *))aSyscall[16].
39b0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
39c0: 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20  openDirectory", 
39d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
39e0: 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65  all_ptr)openDire
39f0: 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c  ctory,      0 },
3a00: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44  .#define osOpenD
3a10: 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a  irectory ((int(*
3a20: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
3a30: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  t*))aSyscall[17]
3a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3a50: 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20  "mkdir",        
3a60: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3a70: 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20  _ptr)mkdir,     
3a80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69        0 },.#defi
3a90: 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28  ne osMkdir     (
3aa0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3ab0: 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73  ar*,mode_t))aSys
3ac0: 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e  call[18].pCurren
3ad0: 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c  t)..  { "rmdir",
3ae0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3af0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64  _syscall_ptr)rmd
3b00: 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  ir,           0 
3b10: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64  },.#define osRmd
3b20: 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ir     ((int(*)(
3b30: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79  const char*))aSy
3b40: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
3b50: 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e  nt)..  { "fchown
3b60: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3b70: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
3b80: 73 69 78 46 63 68 6f 77 6e 2c 20 20 20 20 20 30  sixFchown,     0
3b90: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
3ba0: 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29  hown    ((int(*)
3bb0: 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74  (int,uid_t,gid_t
3bc0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70  ))aSyscall[20].p
3bd0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
3be0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3bf0: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
3c00: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
3c10: 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20  0.  { "mmap",   
3c20: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c30: 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20  call_ptr)mmap,  
3c40: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3c50: 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a  osMmap ((void*(*
3c60: 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 69  )(void*,size_t,i
3c70: 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74  nt,int,int,off_t
3c80: 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70  ))aSyscall[21].p
3c90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d  Current)..  { "m
3ca0: 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73  unmap",       (s
3cb0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3cc0: 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20 20  tr)munmap,      
3cd0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3ce0: 20 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69 64   osMunmap ((void
3cf0: 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f  *(*)(void*,size_
3d00: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e  t))aSyscall[22].
3d10: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 48  pCurrent)..#if H
3d20: 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 7b 20 22  AVE_MREMAP.  { "
3d30: 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28  mremap",       (
3d40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3d50: 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20 20  ptr)mremap,     
3d60: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3d70: 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20    { "mremap",   
3d80: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3d90: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3da0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3db0: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
3dc0: 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a  Mremap ((void*(*
3dd0: 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 73  )(void*,size_t,s
3de0: 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61  ize_t,int,...))a
3df0: 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72  Syscall[23].pCur
3e00: 72 65 6e 74 29 0a 20 20 7b 20 22 67 65 74 70 61  rent).  { "getpa
3e10: 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74  gesize",  (sqlit
3e20: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75  e3_syscall_ptr)u
3e30: 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20  nixGetpagesize, 
3e40: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47  0 },.#define osG
3e50: 65 74 70 61 67 65 73 69 7a 65 20 28 28 69 6e 74  etpagesize ((int
3e60: 28 2a 29 28 76 6f 69 64 29 29 61 53 79 73 63 61  (*)(void))aSysca
3e70: 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[24].pCurrent)
3e80: 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20 2f 2a 20  ..#endif..}; /* 
3e90: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
3ea0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
3eb0: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
3ec0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
3ed0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
3ee0: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
3ef0: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
3f00: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
3f10: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
3f20: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
3f30: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
3f40: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
3f50: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
3f60: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
3f70: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
3f80: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
3f90: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
3fa0: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
3fb0: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
3fc0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
3fd0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
3fe0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
3ff0: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
4000: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
4010: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
4020: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4030: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
4040: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
4050: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4060: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
4070: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
4080: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
4090: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
40a0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
40b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
40c0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
40d0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
40e0: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
40f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
4100: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
4110: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
4120: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
4130: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
4140: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
4150: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
4160: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
4170: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
4180: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
4190: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
41a0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
41b0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
41c0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
41d0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
41e0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
41f0: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
4200: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
4210: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
4220: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
4230: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
4240: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
4250: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
4260: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
4270: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
4280: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
4290: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
42a0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
42b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
42c0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
42d0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
42e0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
42f0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4300: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
4310: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
4320: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
4330: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4340: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
4350: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
4360: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
4370: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
4380: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
4390: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
43a0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
43b0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
43c0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
43d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
43e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
43f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4400: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
4410: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
4420: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4430: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
4440: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
4450: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
4460: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
4470: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
4480: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
4490: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
44a0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
44b0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
44c0: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
44d0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
44e0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
44f0: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
4500: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
4510: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
4520: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4530: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
4540: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4550: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4560: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4570: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
4580: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4590: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
45a0: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
45b0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
45c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
45d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
45e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
45f0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
4600: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
4610: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
4620: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
4630: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
4640: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
4650: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
4660: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
4670: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
4680: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
4690: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
46a0: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
46b0: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
46c0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
46d0: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
46e0: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
46f0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
4700: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
4710: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
4720: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
4730: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
4740: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
4750: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
4760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4770: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
4780: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4790: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
47a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
47b0: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
47c0: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
47d0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
47e0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=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 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
4810: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4820: 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63  /*.** Do not acc
4830: 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73  ept any file des
4840: 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61  criptor less tha
4850: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e  n this value, in
4860: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a   order to avoid.
4870: 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62  ** opening datab
4880: 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66  ase file using f
4890: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
48a0: 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c  that are commonl
48b0: 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73  y used for .** s
48c0: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
48d0: 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72  utput, and error
48e0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
48f0: 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45  ITE_MINIMUM_FILE
4900: 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65  _DESCRIPTOR.# de
4910: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49  fine SQLITE_MINI
4920: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
4930: 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TOR 3.#endif../*
4940: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28  .** Invoke open(
4950: 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70  ).  Do so multip
4960: 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20  le times, until 
4970: 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65  it either succee
4980: 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66  ds or.** fails f
4990: 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f  or some reason o
49a0: 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e  ther than EINTR.
49b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
49c0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
49d0: 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73   "m" is 0 then s
49e0: 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66  et it to the def
49f0: 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69  ault for.** SQLi
4a00: 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  te.  The default
4a10: 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55   is SQLITE_DEFAU
4a20: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
4a30: 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ONS (normally.**
4a40: 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69   0644) as modifi
4a50: 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d  ed by the system
4a60: 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73   umask.  If m is
4a70: 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20   not 0, then.** 
4a80: 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72  make the file cr
4a90: 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65  eation mode be e
4aa0: 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e  xactly m ignorin
4ab0: 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a  g the umask..**.
4ac0: 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74  ** The m paramet
4ad0: 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a  er will be non-z
4ae0: 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72  ero only when cr
4af0: 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f  eating -wal, -jo
4b00: 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73  urnal,.** and -s
4b10: 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61  hm files.  We wa
4b20: 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74  nt those files t
4b30: 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a  o have *exactly*
4b40: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72   the same.** per
4b50: 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69  missions as thei
4b60: 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  r original datab
4b70: 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74  ase, unadulterat
4b80: 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
4b90: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c  .** In that way,
4ba0: 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
4bb0: 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77  ile is -rw-rw-rw
4bc0: 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61   or -rw-rw-r-, a
4bd0: 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74  nd a.** transact
4be0: 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20  ion crashes and 
4bf0: 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f  leaves behind ho
4c00: 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
4c10: 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20   any.** process 
4c20: 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20  that is able to 
4c30: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
4c40: 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20  abase will also 
4c50: 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65  be able to.** re
4c60: 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f  cover the hot jo
4c70: 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  urnals..*/.stati
4c80: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65  c int robust_ope
4c90: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
4ca0: 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d   int f, mode_t m
4cb0: 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d  ){.  int fd;.  m
4cc0: 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d  ode_t m2 = m ? m
4cd0: 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   : SQLITE_DEFAUL
4ce0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
4cf0: 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  NS;.  while(1){.
4d00: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c  #if defined(O_CL
4d10: 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20  OEXEC).    fd = 
4d20: 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f  osOpen(z,f|O_CLO
4d30: 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a  EXEC,m2);.#else.
4d40: 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28      fd = osOpen(
4d50: 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a  z,f,m2);.#endif.
4d60: 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
4d70: 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d        if( errno=
4d80: 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75  =EINTR ) continu
4d90: 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
4da0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64      }.    if( fd
4db0: 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  >=SQLITE_MINIMUM
4dc0: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
4dd0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73   ) break;.    os
4de0: 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73  Close(fd);.    s
4df0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
4e00: 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20  E_WARNING, .    
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74              "att
4e20: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25  empt to open \"%
4e30: 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63  s\" as file desc
4e40: 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66  riptor %d", z, f
4e50: 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b  d);.    fd = -1;
4e60: 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28  .    if( osOpen(
4e70: 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20  "/dev/null", f, 
4e80: 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m)<0 ) break;.  
4e90: 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b  }.  if( fd>=0 ){
4ea0: 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b  .    if( m!=0 ){
4eb0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
4ec0: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20  at statbuf;.    
4ed0: 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64    if( osFstat(fd
4ee0: 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a  , &statbuf)==0 .
4ef0: 20 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75         && statbu
4f00: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20  f.st_size==0.   
4f10: 20 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e      && (statbuf.
4f20: 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d  st_mode&0777)!=m
4f30: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
4f40: 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20     osFchmod(fd, 
4f50: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
4f60: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44  }.#if defined(FD
4f70: 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64  _CLOEXEC) && (!d
4f80: 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43  efined(O_CLOEXEC
4f90: 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d  ) || O_CLOEXEC==
4fa0: 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  0).    osFcntl(f
4fb0: 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
4fc0: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
4fd0: 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
4fe0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
4ff0: 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a  return fd;.}../*
5000: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
5010: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
5020: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
5030: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
5040: 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
5050: 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
5060: 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49  rotect the unixI
5070: 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20  nodeInfo and.** 
5080: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
5090: 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68  jects used by th
50a0: 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
50b0: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
50c0: 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
50d0: 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
50e0: 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78  ** Function unix
50f0: 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
5100: 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
5110: 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
5120: 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c  mutex .** is hel
5130: 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
5140: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
5150: 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
5160: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
5170: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
5180: 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69  e.g..**.**   uni
5190: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  xEnterMutex().**
51a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
51b0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
51c0: 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65  **   unixEnterLe
51d0: 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ave().*/.static 
51e0: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
51f0: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
5200: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
5210: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
5220: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
5230: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
5240: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
5250: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  nixLeaveMutex(vo
5260: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
5270: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
5280: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
5290: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
52a0: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
52b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
52c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
52d0: 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
52e0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
52f0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
5300: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
5310: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
5320: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
5330: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66  #endif...#if def
5340: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
5350: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
5360: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
5370: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
5380: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
5390: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
53a0: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
53b0: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
53c0: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
53d0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
53e0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
53f0: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
5400: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
5410: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5420: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
5430: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
5440: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
5450: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
5460: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
5470: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
5480: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
5490: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
54a0: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
54b0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
54c0: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
54d0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
54e0: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
54f0: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
5500: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
5510: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
5520: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
5530: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
5540: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
5550: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
5560: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
5570: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
5580: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
5590: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
55a0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
55b0: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
55c0: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
55d0: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
55e0: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
55f0: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
5600: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
5610: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
5620: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
5630: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
5640: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
5650: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
5660: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
5670: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
5680: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
5690: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
56a0: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
56b0: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
56c0: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
56d0: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
56e0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
56f0: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
5700: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
5710: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
5720: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
5730: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
5740: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
5750: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
5760: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
5770: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
5780: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
5790: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
57a0: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
57b0: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
57c0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
57d0: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
57e0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
57f0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
5800: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
5810: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
5820: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5830: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
5840: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
5850: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
5860: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
5870: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
5880: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
5890: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
58a0: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
58b0: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
58c0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
58d0: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
58e0: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
58f0: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
5900: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
5910: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
5920: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
5930: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
5940: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
5950: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
5960: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
5970: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
5980: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
5990: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
59a0: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
59b0: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
59c0: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
59d0: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
59e0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
59f0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
5a00: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
5a10: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
5a20: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
5a30: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
5a40: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
5a50: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
5a60: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
5a70: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
5a80: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
5a90: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
5aa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5ab0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5ac0: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
5ad0: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
5ae0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
5af0: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
5b00: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
5b10: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
5b20: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
5b30: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
5b40: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
5b50: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
5b60: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
5b70: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
5b80: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5b90: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79   */../*.** Retry
5ba0: 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c   ftruncate() cal
5bb0: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
5bc0: 20 74 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20   to EINTR.**.** 
5bd0: 41 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72  All calls to ftr
5be0: 75 6e 63 61 74 65 28 29 20 77 69 74 68 69 6e 20  uncate() within 
5bf0: 74 68 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64  this file should
5c00: 20 62 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68   be made through
5c10: 0a 2a 2a 20 74 68 69 73 20 77 72 61 70 70 65 72  .** this wrapper
5c20: 2e 20 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69  .  On the Androi
5c30: 64 20 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61  d platform, bypa
5c40: 73 73 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20  ssing the logic 
5c50: 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c  below.** could l
5c60: 65 61 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74  ead to a corrupt
5c70: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
5c80: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
5c90: 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c  ftruncate(int h,
5ca0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
5cb0: 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  z){.  int rc;.#i
5cc0: 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f  fdef __ANDROID__
5cd0: 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64  .  /* On Android
5ce0: 2c 20 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c  , ftruncate() al
5cf0: 77 61 79 73 20 75 73 65 73 20 33 32 2d 62 69 74  ways uses 32-bit
5d00: 20 6f 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69   offsets, even i
5d10: 66 20 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46  f .  ** _FILE_OF
5d20: 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20  FSET_BITS=64 is 
5d30: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65  defined. This me
5d40: 61 6e 73 20 69 74 20 69 73 20 75 6e 73 61 66 65  ans it is unsafe
5d50: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20   to attempt to. 
5d60: 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66   ** truncate a f
5d70: 69 6c 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20  ile to any size 
5d80: 6c 61 72 67 65 72 20 74 68 61 6e 20 32 47 69 42  larger than 2GiB
5d90: 2e 20 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72  . Silently ignor
5da0: 65 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  e any.  ** such 
5db0: 61 74 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20  attempts.  */.  
5dc0: 69 66 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f  if( sz>(sqlite3_
5dd0: 69 6e 74 36 34 29 30 78 37 46 46 46 46 46 46 46  int64)0x7FFFFFFF
5de0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
5df0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a  ITE_OK;.  }else.
5e00: 23 65 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20  #endif.  do{ rc 
5e10: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
5e20: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
5e30: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
5e40: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
5e50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5e60: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
5e70: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
5e80: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
5e90: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
5ea0: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
5eb0: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
5ec0: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
5ed0: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
5ee0: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
5ef0: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
5f00: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
5f10: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
5f20: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
5f30: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
5f40: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
5f50: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
5f60: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
5f70: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
5f80: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
5f90: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
5fa0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
5fb0: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
5fc0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
5fd0: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
5fe0: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
5ff0: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
6000: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
6010: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6020: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
6030: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
6040: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
6050: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77  iteIOErr) {.  sw
6060: 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72  itch (posixError
6070: 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41  ) {.#if 0.  /* A
6080: 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
6090: 20 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f   code was not co
60a0: 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20  mmented out. In 
60b0: 74 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61  theory, this bra
60c0: 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  nch.  ** should 
60d0: 6e 65 76 65 72 20 62 65 20 68 69 74 2c 20 61 73  never be hit, as
60e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
60f0: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
6100: 6c 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20  lled after.  ** 
6110: 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65  a locking-relate
6120: 64 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  d function (i.e.
6130: 20 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65   fcntl()) has re
6140: 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20  turned non-zero 
6150: 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61  with.  ** the va
6160: 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20  lue of errno as 
6170: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
6180: 6e 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74  nt. Since a syst
6190: 65 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c  em call has fail
61a0: 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73  ed,.  ** errno s
61b0: 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72  hould be non-zer
61c0: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73  o..  **.  ** Des
61d0: 70 69 74 65 20 74 68 69 73 2c 20 69 66 20 65 72  pite this, if er
61e0: 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65  rno really is ze
61f0: 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e  ro, we still don
6200: 27 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72  't want to retur
6210: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  n.  ** SQLITE_OK
6220: 2e 20 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c  . The system cal
6230: 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73  l failed, and *s
6240: 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  ome* SQLite erro
6250: 72 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a  r should be.  **
6260: 20 70 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b   propagated back
6270: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
6280: 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  Commenting this 
6290: 62 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73  branch out means
62a0: 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77   errno==0.  ** w
62b0: 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62  ill be handled b
62c0: 79 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22  y the "default:"
62d0: 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a   case below..  *
62e0: 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  /.  case 0: .   
62f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6300: 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73  K;.#endif..  cas
6310: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
6320: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
6330: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
6340: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
6350: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
6360: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
6370: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
6380: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
6390: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
63a0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
63b0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
63c0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
63d0: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
63e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
63f0: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
6400: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
6410: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
6420: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
6430: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
6440: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
6450: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
6460: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
6470: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
6480: 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  OCK) || .       
6490: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
64a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
64b0: 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20  LOCK) || .      
64c0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
64d0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
64e0: 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20  DLOCK) ||.      
64f0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
6500: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
6510: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
6520: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
6530: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
6540: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65     }.    /* else
6550: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   fall through */
6560: 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a  .  case EPERM: .
6570: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6580: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 23 69 66  E_PERM;.    .#if
6590: 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f   EOPNOTSUPP!=ENO
65a0: 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e  TSUP.  case EOPN
65b0: 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20  OTSUPP: .    /* 
65c0: 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74  something went t
65d0: 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e  erribly awry, un
65e0: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
65f0: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
6600: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
6610: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
6620: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
6630: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
6640: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
6650: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
6660: 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20  NOTSUP: .    /* 
6670: 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65  invalid fd, unle
6680: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
6690: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e  ystem support in
66a0: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
66b0: 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74  which .     * it
66c0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
66d0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
66e0: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49  #endif.  case EI
66f0: 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a  O:.  case EBADF:
6700: 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a  .  case EINVAL:.
6710: 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a    case ENOTCONN:
6720: 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a  .  case ENODEV:.
6730: 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20    case ENXIO:.  
6740: 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66  case ENOENT:.#if
6750: 64 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20  def ESTALE      
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6770: 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20  * ESTALE is not 
6780: 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72  defined on Inter
6790: 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ix systems */.  
67a0: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e  case ESTALE:.#en
67b0: 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  dif.  case ENOSY
67c0: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
67d0: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
67e0: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
67f0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
6800: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
6810: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
6820: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
6830: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a  rr;.  }.}.../***
6840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
6890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
68a0: 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65  egin Unique File
68b0: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
68c0: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
68d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
68e0: 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f  * On most versio
68f0: 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63  ns of unix, we c
6900: 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20  an get a unique 
6910: 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79  ID for a file by
6920: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a   concatenating.*
6930: 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d  * the device num
6940: 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64  ber and the inod
6950: 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74  e number.  But t
6960: 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  his does not wor
6970: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
6980: 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75   On VxWorks, a u
6990: 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75  nique file id mu
69a0: 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  st be based on t
69b0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
69c0: 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70  ename..**.** A p
69d0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
69e0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
69f0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
6a00: 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20   can be used as 
6a10: 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65  a.** unique file
6a20: 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20   ID in VxWorks. 
6a30: 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
6a40: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
6a50: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63   contains.** a c
6a60: 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e  opy of the canon
6a70: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20  ical filename.  
6a80: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
6a90: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e  reference count.
6aa0: 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74    .** The struct
6ab0: 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64  ure is reclaimed
6ac0: 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
6ad0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
6ae0: 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a  it drops to.** z
6af0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ero..**.** There
6b00: 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20   are never very 
6b10: 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20  many files open 
6b20: 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20  at one time and 
6b30: 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a  lookups are not.
6b40: 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ** a performance
6b50: 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20  -critical path, 
6b60: 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69  so it is suffici
6b70: 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65  ent to put these
6b80: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f  .** structures o
6b90: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  n a linked list.
6ba0: 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72  .*/.struct vxwor
6bb0: 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72  ksFileId {.  str
6bc0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6bd0: 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65  d *pNext;  /* Ne
6be0: 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  xt in a list of 
6bf0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e  them all */.  in
6c00: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6c20: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
6c30: 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20  ces to this one 
6c40: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c60: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
6c70: 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  the zCanonicalNa
6c80: 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20  me[] string */. 
6c90: 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61   char *zCanonica
6ca0: 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f  lName;         /
6cb0: 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * Canonical file
6cc0: 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20  name */.};..#if 
6cd0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a  OS_VXWORKS./* .*
6ce0: 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c  * All unique fil
6cf0: 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20  enames are held 
6d00: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
6d10: 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a   headed by this.
6d20: 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a  ** variable:.*/.
6d30: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
6d40: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
6d50: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30  orksFileList = 0
6d60: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66  ;../*.** Simplif
6d70: 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  y a filename int
6d80: 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20  o its canonical 
6d90: 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e  form.** by makin
6da0: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
6db0: 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  changes:.**.**  
6dc0: 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74  * removing any t
6dd0: 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c  railing and dupl
6de0: 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f  icate /.**  * co
6df0: 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a  nvert /./ into j
6e00: 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ust /.**  * conv
6e10: 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65  ert /A/../ where
6e20: 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65   A is any simple
6e30: 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20   name into just 
6e40: 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20  /.**.** Changes 
6e50: 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63  are made in-plac
6e60: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
6e70: 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a  ew name length..
6e80: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
6e90: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69  al filename is i
6ea0: 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65  n z[0..n-1].  Re
6eb0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
6ec0: 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  of.** characters
6ed0: 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69   in the simplifi
6ee0: 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  ed name..*/.stat
6ef0: 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69  ic int vxworksSi
6f00: 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20  mplifyName(char 
6f10: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
6f20: 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28  t i, j;.  while(
6f30: 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>1 && z[n-1]==
6f40: 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  '/' ){ n--; }.  
6f50: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
6f60: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
6f70: 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
6f80: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27   if( z[i+1]=='/'
6f90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6fa0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
6fb0: 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a  .' && i+2<n && z
6fc0: 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+2]=='/' ){.  
6fd0: 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20        i += 1;.  
6fe0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
6ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7000: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
7010: 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+3<n && z[i+2]
7020: 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d  =='.' && z[i+3]=
7030: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
7040: 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b  while( j>0 && z[
7050: 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d  j-1]!='/' ){ j--
7060: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
7070: 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  j>0 ){ j--; }.  
7080: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
7090: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
70a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
70b0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
70c0: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
70d0: 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a  .  return j;.}..
70e0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69  /*.** Find a uni
70f0: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
7100: 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75  the given absolu
7110: 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65  te pathname.  Re
7120: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
7130: 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73  r to the vxworks
7140: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
7150: 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20  This pointer is 
7160: 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69  the unique.** fi
7170: 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  le ID..**.** The
7180: 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74   nRef field of t
7190: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
71a0: 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65   object is incre
71b0: 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a  mented before.**
71c0: 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72   the object is r
71d0: 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20  eturned.  A new 
71e0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
71f0: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a  ject is created.
7200: 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ** and added to 
7210: 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20  the global list 
7220: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
7230: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
7240: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
7250: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
7260: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
7270: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7280: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e  leId *vxworksFin
7290: 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68  dFileId(const ch
72a0: 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  ar *zAbsoluteNam
72b0: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  e){.  struct vxw
72c0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77  orksFileId *pNew
72d0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61  ;         /* sea
72e0: 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20  rch key and new 
72f0: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72  file ID */.  str
7300: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
7310: 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20  d *pCandidate;  
7320: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
7330: 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69  over existing fi
7340: 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20  le IDs */.  int 
7350: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62  /* Length of zAb
7380: 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e  soluteName strin
7390: 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  g */..  assert( 
73a0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d  zAbsoluteName[0]
73b0: 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28  =='/' );.  n = (
73c0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f  int)strlen(zAbso
73d0: 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65  luteName);.  pNe
73e0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
73f0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
7400: 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69  ) + (n+1) );.  i
7410: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
7420: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a  urn 0;.  pNew->z
7430: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20  CanonicalName = 
7440: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
7450: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e  .  memcpy(pNew->
7460: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7470: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e  zAbsoluteName, n
7480: 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72  +1);.  n = vxwor
7490: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70  ksSimplifyName(p
74a0: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
74b0: 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53  ame, n);..  /* S
74c0: 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
74d0: 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74  sting entry that
74e0: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61   matching the ca
74f0: 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20  nonical name..  
7500: 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63  ** If found, inc
7510: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
7520: 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72  ence count and r
7530: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
7540: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73  to.  ** the exis
7550: 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20  ting file ID..  
7560: 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
7570: 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61  tex();.  for(pCa
7580: 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46  ndidate=vxworksF
7590: 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64  ileList; pCandid
75a0: 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d  ate; pCandidate=
75b0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78  pCandidate->pNex
75c0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e  t){.    if( pCan
75d0: 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e  didate->nName==n
75e0: 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70   .     && memcmp
75f0: 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61  (pCandidate->zCa
7600: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65  nonicalName, pNe
7610: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7620: 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  e, n)==0.    ){.
7630: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
7640: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
7650: 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52    pCandidate->nR
7660: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69  ef++;.       uni
7670: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
7680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61        return pCa
7690: 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20  ndidate;.    }. 
76a0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63   }..  /* No matc
76b0: 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65  h was found.  We
76c0: 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77   will make a new
76d0: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e   file ID */.  pN
76e0: 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
76f0: 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b  pNew->nName = n;
7700: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
7710: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
7720: 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ;.  vxworksFileL
7730: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e  ist = pNew;.  un
7740: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7750: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7760: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
7770: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
7780: 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72  count on a vxwor
7790: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
77a0: 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62    Free.** the ob
77b0: 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65  ject when the re
77c0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
77d0: 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  aches zero..*/.s
77e0: 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72  tatic void vxwor
77f0: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
7800: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7810: 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e  leId *pId){.  un
7820: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
7830: 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e    assert( pId->n
7840: 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e  Ref>0 );.  pId->
7850: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49  nRef--;.  if( pI
7860: 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  d->nRef==0 ){.  
7870: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
7880: 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20  FileId **pp;.   
7890: 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73   for(pp=&vxworks
78a0: 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26  FileList; *pp &&
78b0: 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20   *pp!=pId; pp = 
78c0: 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
78d0: 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  {}.    assert( *
78e0: 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a  pp==pId );.    *
78f0: 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b  pp = pId->pNext;
7900: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7910: 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  e(pId);.  }.  un
7920: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7930: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
7940: 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  XWORKS */./*****
7950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
7960: 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44  f Unique File ID
7970: 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79   Utility Used By
7980: 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a   VxWorks *******
7990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 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 2f 0a 0a 0a 2f 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
7a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a50: 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64  ******* Posix Ad
7a60: 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a  visory Locking *
7a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
7a90: 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  * POSIX advisory
7aa0: 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65   locks are broke
7ab0: 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e  n by design.  AN
7ac0: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
7ad0: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
7ae0: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
7af0: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
7b00: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
7b10: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
7b20: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
7b30: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
7b40: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
7b50: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
7b60: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
7b70: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
7b80: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
7b90: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
7ba0: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
7bb0: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
7bc0: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
7bd0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
7be0: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
7bf0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
7c00: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
7c10: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
7c20: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
7c30: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
7c40: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
7c50: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
7c60: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
7c70: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
7c80: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
7c90: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
7ca0: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
7cb0: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
7cc0: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
7cd0: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
7ce0: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
7cf0: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
7d00: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
7d10: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
7d20: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
7d30: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
7d40: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
7d50: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
7d60: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
7d70: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
7d80: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
7d90: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
7da0: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
7db0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
7dc0: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
7dd0: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
7de0: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
7df0: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
7e00: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7e10: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
7e20: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
7e30: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
7e40: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
7e50: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
7e60: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
7e70: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
7e80: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
7e90: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  * This means tha
7ea0: 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  t we cannot use 
7eb0: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73  POSIX locks to s
7ec0: 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20  ynchronize file 
7ed0: 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20  access.** among 
7ee0: 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64  competing thread
7ef0: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72  s of the same pr
7f00: 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f  ocess.  POSIX lo
7f10: 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69  cks will work fi
7f20: 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f  ne.** to synchro
7f30: 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20  nize access for 
7f40: 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72  threads in separ
7f50: 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62  ate processes, b
7f60: 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64  ut not.** thread
7f70: 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  s within the sam
7f80: 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  e process..**.**
7f90: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
7fa0: 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c  the problem, SQL
7fb0: 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67  ite has to manag
7fc0: 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74  e file locks int
7fd0: 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74  ernally.** on it
7fe0: 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72  s own.  Whenever
7ff0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
8000: 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61  is opened, we ha
8010: 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a  ve to find the.*
8020: 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65  * specific inode
8030: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
8040: 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65   file (the inode
8050: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
8060: 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20  y the.** st_dev 
8070: 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64  and st_ino field
8080: 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74  s of the stat st
8090: 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74  ructure that fst
80a0: 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a  at() fills in).*
80b0: 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20  * and check for 
80c0: 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78  locks already ex
80d0: 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69  isting on that i
80e0: 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b  node.  When lock
80f0: 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64  s are.** created
8100: 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20   or removed, we 
8110: 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20  have to look at 
8120: 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c  our own internal
8130: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a   record of the.*
8140: 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69  * locks to see i
8150: 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  f another thread
8160: 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   has previously 
8170: 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  set a lock on th
8180: 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65  at same.** inode
8190: 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20  ..**.** (Aside: 
81a0: 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65  The use of inode
81b0: 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71   numbers as uniq
81c0: 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20  ue IDs does not 
81d0: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
81e0: 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c  .** For VxWorks,
81f0: 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20   we have to use 
8200: 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  the alternative 
8210: 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d  unique ID system
8220: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e   based on.** can
8230: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
8240: 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  and implemented 
8250: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
8260: 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a  division.).**.**
8270: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   The sqlite3_fil
8280: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
8290: 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67  POSIX is no long
82a0: 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67  er just an integ
82b0: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
82c0: 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f  iptor.  It is no
82d0: 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  w a structure th
82e0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74  at holds the int
82f0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
8300: 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f  criptor and a po
8310: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63  inter to a struc
8320: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
8330: 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  bes the internal
8340: 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  .** locks on the
8350: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
8360: 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20  node.  There is 
8370: 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  one locking stru
8380: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f  cture.** per ino
8390: 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61  de, so if the sa
83a0: 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e  me inode is open
83b0: 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75  ed twice, both u
83c0: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
83d0: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
83e0: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
83f0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
8400: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
8410: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
8420: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
8430: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
8440: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
8450: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
8460: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
8470: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
8480: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
8490: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
84a0: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
84b0: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
84c0: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
84d0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
84e0: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
84f0: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
8500: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
8510: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
8520: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
8530: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
8540: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
8550: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
8560: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
8570: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
8580: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
8590: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
85a0: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
85b0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
85c0: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
85d0: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
85e0: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
85f0: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
8600: 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61  te..**.** But wa
8610: 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79  it:  there are y
8620: 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73  et more problems
8630: 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69   with POSIX advi
8640: 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  sory locks..**.*
8650: 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61  * If you close a
8660: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8670: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
8680: 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
8690: 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f  locks,.** all lo
86a0: 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  cks on that file
86b0: 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20   that are owned 
86c0: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  by the current p
86d0: 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65  rocess are.** re
86e0: 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b  leased.  To work
86f0: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
8700: 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49  blem, each unixI
8710: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a  nodeInfo object.
8720: 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63  ** maintains a c
8730: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
8740: 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f  er of pending lo
8750: 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65  cks on tha inode
8760: 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74  ..** When an att
8770: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
8780: 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c  close an unixFil
8790: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
87a0: 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c  ** other unixFil
87b0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  e open on the sa
87c0: 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72  me inode that ar
87d0: 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c  e holding locks,
87e0: 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20   the call.** to 
87f0: 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65  close() the file
8800: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64   descriptor is d
8810: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
8820: 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63  l of the locks c
8830: 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69  lear..** The uni
8840: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
8850: 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73  ture keeps a lis
8860: 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69  t of file descri
8870: 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ptors that need 
8880: 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20  to.** be closed 
8890: 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73  and that list is
88a0: 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65   walked (and cle
88b0: 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c  ared) when the l
88c0: 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61  ast lock.** clea
88d0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e  rs..**.** Yet an
88e0: 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20  other problem:  
88f0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20  LinuxThreads do 
8900: 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69  not play well wi
8910: 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a  th posix locks..
8920: 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72  **.** Many older
8930: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e   versions of lin
8940: 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78  ux use the Linux
8950: 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20  Threads library 
8960: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20  which is.** not 
8970: 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e  posix compliant.
8980: 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72    Under LinuxThr
8990: 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65  eads, a lock cre
89a0: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a  ated by thread.*
89b0: 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f  * A cannot be mo
89c0: 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69  dified or overri
89d0: 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72  dden by a differ
89e0: 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a  ent thread B..**
89f0: 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63   Only thread A c
8a00: 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f  an modify the lo
8a10: 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68  ck.  Locking beh
8a20: 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74  avior is correct
8a30: 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69  .** if the appli
8a40: 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e  ation uses the n
8a50: 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69  ewer Native Posi
8a60: 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79  x Thread Library
8a70: 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69   (NPTL).** on li
8a80: 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20  nux - with NPTL 
8a90: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
8aa0: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  y thread A can o
8ab0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
8ac0: 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42   in thread B.  B
8ad0: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
8ae0: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f  ay to know at co
8af0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68  mpile-time which
8b00: 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69  .** threading li
8b10: 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75  brary is being u
8b20: 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69  sed.  So there i
8b30: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
8b40: 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74   at.** compile-t
8b50: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
8b60: 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ot thread A can 
8b70: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f  override locks o
8b80: 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  n thread B..** O
8b90: 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72  ne has to do a r
8ba0: 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f  un-time check to
8bb0: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65   discover the be
8bc0: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a  havior of the.**
8bd0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
8be0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75  ..**.** SQLite u
8bf0: 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c  sed to support L
8c00: 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75  inuxThreads.  Bu
8c10: 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69  t support for Li
8c20: 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61  nuxThreads.** wa
8c30: 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e  s dropped beginn
8c40: 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e  ing with version
8c50: 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20   3.7.0.  SQLite 
8c60: 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20  will still work 
8c70: 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72  with.** LinuxThr
8c80: 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68  eads provided th
8c90: 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20  at (1) there is 
8ca0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
8cb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
8cc0: 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  per database fil
8cd0: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  e in the same pr
8ce0: 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61  ocess and (2) da
8cf0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8d00: 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76  ns.** do not mov
8d10: 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  e across threads
8d20: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ..*/../*.** An i
8d30: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
8d40: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
8d50: 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65  re serves as the
8d60: 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20   key used.** to 
8d70: 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75  locate a particu
8d80: 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  lar unixInodeInf
8d90: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72  o object..*/.str
8da0: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b  uct unixFileId {
8db0: 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20  .  dev_t dev;   
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8dd0: 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20  * Device number 
8de0: 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
8df0: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
8e00: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
8e10: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
8e20: 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a  D for vxworks. *
8e30: 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20  /.#else.  ino_t 
8e40: 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  ino;            
8e50: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
8e60: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
8e70: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
8e80: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
8e90: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
8ea0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
8eb0: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
8ec0: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
8ed0: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
8ee0: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
8ef0: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
8f00: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
8f10: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
8f20: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
8f30: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
8f40: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
8f50: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
8f60: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
8f70: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
8f80: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
8f90: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
8fa0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
8fb0: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
8fc0: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
8fd0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
8fe0: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
8ff0: 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  g to it..*/.stru
9000: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
9010: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
9020: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
9030: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b       /* The look
9040: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
9050: 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  nShared;        
9060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9070: 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20  umber of SHARED 
9080: 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
9090: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
90a0: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
90b0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
90c0: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
90d0: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75  LOCK etc. */.  u
90e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72  nsigned char bPr
90f0: 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f  ocessLock;     /
9100: 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70  * An exclusive p
9110: 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68  rocess lock is h
9120: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  eld */.  int nRe
9130: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9140: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9150: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
9160: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
9170: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
9180: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
9190: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
91a0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
91b0: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64  d with this inod
91c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
91d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
91e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
91f0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
9200: 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  file locks */.  
9210: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
9220: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
9230: 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64  /* Unused file d
9240: 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c  escriptors to cl
9250: 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ose */.  unixIno
9260: 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  deInfo *pNext;  
9270: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
9280: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
9290: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
92a0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
92b0: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
92c0: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
92d0: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23  ubly linked */.#
92e0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
92f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
9300: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
9310: 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20  ong sharedByte; 
9320: 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75   /* for AFP simu
9330: 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63  lated shared loc
9340: 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  k */.#endif.#if 
9350: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d  OS_VXWORKS.  sem
9360: 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20  _t *pSem;       
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9380: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
9390: 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  phore */.  char 
93a0: 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54  aSemName[MAX_PAT
93b0: 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61  HNAME+2];  /* Na
93c0: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
93d0: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  hore */.#endif.}
93e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73  ;../*.** A lists
93f0: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
9400: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a  eInfo objects..*
9410: 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f  /.static unixIno
9420: 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73  deInfo *inodeLis
9430: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  t = 0;../*.**.**
9440: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
9450: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28   unixLogError_x(
9460: 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  ), is only ever 
9470: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
9480: 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45  acro.** unixLogE
9490: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74  rror()..**.** It
94a0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
94b0: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
94c0: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
94d0: 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61  ion and errno ha
94e0: 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49  s been.** set. I
94f0: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
9500: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
9510: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
9520: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
9530: 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e  e of.** errno an
9540: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
9550: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
9560: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
9570: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
9580: 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
9590: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
95a0: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
95b0: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
95c0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
95d0: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
95e0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
95f0: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
9600: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
9610: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
9620: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
9630: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
9640: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
9650: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
9660: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
9670: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65  hat.** failed (e
9680: 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f  .g. "unlink", "o
9690: 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73  pen") and the as
96a0: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
96b0: 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66  stem path,.** if
96c0: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
96d0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c   unixLogError(a,
96e0: 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67  b,c)     unixLog
96f0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c  ErrorAtLine(a,b,
9700: 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  c,__LINE__).stat
9710: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72  ic int unixLogEr
9720: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
9730: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9750: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
9760: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
9770: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
9780: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
9790: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
97a0: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
97b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
97c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
97d0: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
97e0: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
97f0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9810: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
9820: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
9830: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
9840: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  d */.){.  char *
9850: 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  zErr;           
9860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73            /* Mes
9870: 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72  sage from strerr
9880: 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65  or() or equivale
9890: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72  nt */.  int iErr
98a0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20  no = errno;     
98b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
98c0: 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e   syscall error n
98d0: 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49  umber */..  /* I
98e0: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
98f0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
9900: 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53   (SQLITE_THREADS
9910: 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73  AFE==0), then us
9920: 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72  e.  ** the strer
9930: 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  ror() function t
9940: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d  o obtain the hum
9950: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an-readable erro
9960: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65  r message.  ** e
9970: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72  quivalent to err
9980: 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  no. Otherwise, u
9990: 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  se strerror_r().
99a0: 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54  .  */ .#if SQLIT
99b0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
99c0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52  defined(HAVE_STR
99d0: 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20  ERROR_R).  char 
99e0: 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73  aErr[80];.  mems
99f0: 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65  et(aErr, 0, size
9a00: 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72  of(aErr));.  zEr
9a10: 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20  r = aErr;..  /* 
9a20: 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  If STRERROR_R_CH
9a30: 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74  AR_P (set by aut
9a40: 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f  oconf scripts) o
9a50: 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64  r __USE_GNU is d
9a60: 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73  efined,.  ** ass
9a70: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
9a80: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
9a90: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20   GNU version of 
9aa0: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61  strerror_r() tha
9ab0: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  t.  ** returns a
9ac0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
9ad0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
9ae0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
9af0: 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20  e. That pointer 
9b00: 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20  .  ** may point 
9b10: 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74  to aErr[], or it
9b20: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f   may point to so
9b30: 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67  me static storag
9b40: 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20  e somewhere. .  
9b50: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
9b60: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
9b70: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
9b80: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
9b90: 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f  of .  ** strerro
9ba0: 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77  r_r(), which alw
9bb0: 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72  ays writes an er
9bc0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
9bd0: 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20   aErr[]..  **.  
9be0: 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69  ** If the code i
9bf0: 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d  ncorrectly assum
9c00: 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  es that it is th
9c10: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
9c20: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61  that is.  ** ava
9c30: 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f  ilable, the erro
9c40: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f  r message will o
9c50: 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79  ften be an empty
9c60: 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20   string. Not a. 
9c70: 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d   ** huge problem
9c80: 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f  . Incorrectly co
9c90: 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68  ncluding that th
9ca0: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73  e GNU version is
9cb0: 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a   available .  **
9cc0: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
9cd0: 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68   segfault though
9ce0: 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
9cf0: 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  ed(STRERROR_R_CH
9d00: 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64  AR_P) || defined
9d10: 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45  (__USE_GNU).  zE
9d20: 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20  rr = .# endif.  
9d30: 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e  strerror_r(iErrn
9d40: 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28  o, aErr, sizeof(
9d50: 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66  aErr)-1);..#elif
9d60: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
9d70: 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  FE.  /* This is 
9d80: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
9d90: 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72  ld, but strerror
9da0: 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69  _r() is not avai
9db0: 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72  lable. */.  zErr
9dc0: 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f   = "";.#else.  /
9dd0: 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65  * Non-threadsafe
9de0: 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65   build, use stre
9df0: 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72  rror(). */.  zEr
9e00: 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72  r = strerror(iEr
9e10: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rno);.#endif..  
9e20: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
9e30: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c  Path = "";.  sql
9e40: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
9e50: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78  ,.      "os_unix
9e60: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
9e70: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
9e80: 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a  iLine, iErrno, z
9e90: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72  Func, zPath, zEr
9ea0: 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  r.  );..  return
9eb0: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
9ec0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
9ed0: 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
9ee0: 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74  * We assume that
9ef0: 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20   close() almost 
9f00: 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69  always works, si
9f10: 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69  nce it is only i
9f20: 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b  n a.** very sick
9f30: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20   application or 
9f40: 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70  on a very sick p
9f50: 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20  latform that it 
9f60: 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49  might fail..** I
9f70: 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20  f it does fail, 
9f80: 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20  simply leak the 
9f90: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
9fa0: 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a   but do log the.
9fb0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
9fc0: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
9fd0: 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72  not safe to retr
9fe0: 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20  y close() after 
9ff0: 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a  EINTR since the.
a000: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
a010: 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c  or might have al
a020: 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65  ready been reuse
a030: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72  d by another thr
a040: 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f  ead..** So we do
a050: 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20  n't even try to 
a060: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20  recover from an 
a070: 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67  EINTR.  Just log
a080: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e   the error.** an
a090: 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74  d move on..*/.st
a0a0: 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74  atic void robust
a0b0: 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20  _close(unixFile 
a0c0: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69  *pFile, int h, i
a0d0: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66  nt lineno){.  if
a0e0: 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a  ( osClose(h) ){.
a0f0: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
a100: 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f  AtLine(SQLITE_IO
a110: 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73  ERR_CLOSE, "clos
a120: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
a130: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
a140: 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20   ? pFile->zPath 
a150: 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  : 0, lineno);.  
a160: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
a170: 68 65 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  he pFile->lastEr
a180: 72 6e 6f 2e 20 20 44 6f 20 74 68 69 73 20 69 6e  rno.  Do this in
a190: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 73   a subroutine as
a1a0: 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 0a 2a   that provides.*
a1b0: 2a 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  * a convenient p
a1c0: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
a1d0: 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  eakpoint..*/.sta
a1e0: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 4c 61  tic void storeLa
a1f0: 73 74 45 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65  stErrno(unixFile
a200: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 72 72   *pFile, int err
a210: 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61  or){.  pFile->la
a220: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b  stErrno = error;
a230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
a240: 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
a250: 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20  tors accumuated 
a260: 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  in the unixInode
a270: 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69  Info->pUnused li
a280: 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  st..*/ .static v
a290: 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  oid closePending
a2a0: 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Fds(unixFile *pF
a2b0: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
a2c0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
a2d0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
a2e0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
a2f0: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
a300: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
a310: 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  =pInode->pUnused
a320: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
a330: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
a340: 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  ext;.    robust_
a350: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e  close(pFile, p->
a360: 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
a370: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a380: 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65  p);.  }.  pInode
a390: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
a3a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
a3b0: 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  a unixInodeInfo 
a3c0: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
a3d0: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
a3e0: 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  y findInodeInfo(
a3f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
a400: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
a410: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
a420: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
a430: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
a440: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a450: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
a460: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
a470: 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69  aseInodeInfo(uni
a480: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
a490: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a4a0: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
a4b0: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
a4c0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
a4d0: 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
a4e0: 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20  S(pInode) ){.   
a4f0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b   pInode->nRef--;
a500: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
a510: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
a520: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
a530: 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b  ->pShmNode==0 );
a540: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
a550: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
a560: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
a570: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
a580: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
a590: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
a5a0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
a5b0: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d    pInode->pPrev-
a5c0: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
a5d0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
a5e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
a5f0: 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d  ert( inodeList==
a600: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
a610: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
a620: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
a630: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a640: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a  Inode->pNext ){.
a650: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a660: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
a670: 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Prev==pInode );.
a680: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
a690: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
a6a0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20  Inode->pPrev;.  
a6b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a6c0: 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29  te3_free(pInode)
a6d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
a6e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
a6f0: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
a700: 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f  cate the unixIno
a710: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  deInfo object th
a720: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
a730: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
a740: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
a750: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
a760: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
a770: 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74  turn value might
a780: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
a790: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
a7a0: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
a7b0: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
a7c0: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
a7d0: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
a7e0: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
a7f0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
a800: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
a810: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
a820: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
a830: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
a840: 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49  c int findInodeI
a850: 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  nfo(.  unixFile 
a860: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
a870: 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
a880: 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73  le with file des
a890: 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  c used in the ke
a8a0: 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  y */.  unixInode
a8b0: 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20  Info **ppInode  
a8c0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
a8d0: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
a8e0: 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f  o object here */
a8f0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
a920: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
a930: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a950: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
a960: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
a970: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
a980: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
a990: 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b  Id;      /* Look
a9a0: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
a9b0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a  nixInodeInfo */.
a9c0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
a9d0: 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
a9e0: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
a9f0: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
aa00: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
aa10: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20  o *pInode = 0;  
aa20: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
aa30: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
aa40: 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ject */..  asser
aa50: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
aa60: 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  () );..  /* Get 
aa70: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
aa80: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
aa90: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
aaa0: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
aab0: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
aac0: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
aad0: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
aae0: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73  le->h;.  rc = os
aaf0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
ab00: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
ab10: 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
ab20: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
ab30: 72 6e 6f 29 3b 0a 23 69 66 64 65 66 20 45 4f 56  rno);.#ifdef EOV
ab40: 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70  ERFLOW.    if( p
ab50: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
ab60: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
ab70: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
ab80: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
ab90: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
aba0: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
abb0: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
abc0: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
abd0: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
abe0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
abf0: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
ac00: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
ac10: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
ac20: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
ac30: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
ac40: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
ac50: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
ac60: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
ac70: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
ac80: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
ac90: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
aca0: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
acb0: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
acc0: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
acd0: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
ace0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
acf0: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
ad00: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
ad10: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
ad20: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
ad30: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
ad40: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
ad50: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
ad60: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
ad70: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
ad80: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
ad90: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
ada0: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
adb0: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
adc0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
add0: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
ade0: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
adf0: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
ae00: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
ae10: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
ae20: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
ae30: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
ae40: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
ae50: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
ae60: 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  .    do{ rc = os
ae70: 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  Write(fd, "S", 1
ae80: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
ae90: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
aea0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
aeb0: 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
aec0: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
aed0: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  errno);.      re
aee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
aef0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
af00: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
af10: 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28  tatbuf);.    if(
af20: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
af30: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
af40: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
af50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
af60: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
af70: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d   }.#endif..  mem
af80: 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20  set(&fileId, 0, 
af90: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b  sizeof(fileId));
afa0: 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20  .  fileId.dev = 
afb0: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
afc0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
afd0: 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46   fileId.pId = pF
afe0: 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a  ile->pId;.#else.
aff0: 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73    fileId.ino = s
b000: 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23  tatbuf.st_ino;.#
b010: 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d  endif.  pInode =
b020: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68   inodeList;.  wh
b030: 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d  ile( pInode && m
b040: 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26  emcmp(&fileId, &
b050: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
b060: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20  sizeof(fileId)) 
b070: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
b080: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
b090: 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d   }.  if( pInode=
b0a0: 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  =0 ){.    pInode
b0b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
b0c0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  c( sizeof(*pInod
b0d0: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  e) );.    if( pI
b0e0: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  node==0 ){.     
b0f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b100: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
b110: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
b120: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
b130: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
b140: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
b150: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
b160: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49  fileId));.    pI
b170: 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  node->nRef = 1;.
b180: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
b190: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
b1a0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
b1b0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
b1c0: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
b1d0: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
b1e0: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
b1f0: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
b200: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
b210: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
b220: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
b230: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
b240: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b250: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70  Return TRUE if p
b260: 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  File has been re
b270: 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65  named or unlinke
b280: 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66  d since it was f
b290: 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  irst opened..*/.
b2a0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48  static int fileH
b2b0: 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65  asMoved(unixFile
b2c0: 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53   *pFile){.#if OS
b2d0: 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72  _VXWORKS.  retur
b2e0: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
b2f0: 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64  =0 && pFile->pId
b300: 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  !=pFile->pInode-
b310: 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c  >fileId.pId;.#el
b320: 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  se.  struct stat
b330: 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70   buf;.  return p
b340: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
b350: 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74  &&.      (osStat
b360: 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
b370: 62 75 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73  buf)!=0 || buf.s
b380: 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49  t_ino!=pFile->pI
b390: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
b3a0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
b3b0: 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78  .** Check a unix
b3c0: 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64  File that is a d
b3d0: 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79  atabase.  Verify
b3e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
b3f0: 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20  **.** (1) There 
b400: 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68  is exactly one h
b410: 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ard link on the 
b420: 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20  file.** (2) The 
b430: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79  file is not a sy
b440: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28  mbolic link.** (
b450: 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20  3) The file has 
b460: 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64  not been renamed
b470: 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a   or unlinked.**.
b480: 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33  ** Issue sqlite3
b490: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
b4a0: 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65  ING,...) message
b4b0: 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73  s if anything is
b4c0: 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73   not right..*/.s
b4d0: 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66  tatic void verif
b4e0: 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  yDbFile(unixFile
b4f0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75   *pFile){.  stru
b500: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
b510: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 46 69  nt rc;.  if( pFi
b520: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
b530: 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 20  UNIXFILE_WARNED 
b540: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72  ){.    /* One or
b550: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 66 6f 6c   more of the fol
b560: 6c 6f 77 69 6e 67 20 77 61 72 6e 69 6e 67 73 20  lowing warnings 
b570: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
b580: 6e 20 69 73 73 75 65 64 2e 20 20 44 6f 20 6e 6f  n issued.  Do no
b590: 74 0a 20 20 20 20 2a 2a 20 72 65 70 65 61 74 20  t.    ** repeat 
b5a0: 74 68 65 6d 20 73 6f 20 61 73 20 6e 6f 74 20 74  them so as not t
b5b0: 6f 20 63 6c 75 74 74 65 72 20 74 68 65 20 65 72  o clutter the er
b5c0: 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20 20 20 72  ror log */.    r
b5d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
b5e0: 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  = osFstat(pFile-
b5f0: 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28  >h, &buf);.  if(
b600: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71   rc!=0 ){.    sq
b610: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b620: 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f  _WARNING, "canno
b630: 74 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20  t fstat db file 
b640: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
b650: 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  h);.    pFile->c
b660: 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
b670: 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20  FILE_WARNED;.   
b680: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
b690: 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d  f( buf.st_nlink=
b6a0: 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 63 74  =0 && (pFile->ct
b6b0: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
b6c0: 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b  LE_DELETE)==0 ){
b6d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
b6e0: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
b6f0: 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20   "file unlinked 
b700: 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c  while open: %s",
b710: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
b720: 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
b730: 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
b740: 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74  _WARNED;.    ret
b750: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62  urn;.  }.  if( b
b760: 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b  uf.st_nlink>1 ){
b770: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
b780: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
b790: 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73   "multiple links
b7a0: 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20 70   to file: %s", p
b7b0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
b7c0: 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
b7d0: 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57  gs |= UNIXFILE_W
b7e0: 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72  ARNED;.    retur
b7f0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c  n;.  }.  if( fil
b800: 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29  eHasMoved(pFile)
b810: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b820: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b830: 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65  NG, "file rename
b840: 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73  d while open: %s
b850: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
b860: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  ;.    pFile->ctr
b870: 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
b880: 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72  LE_WARNED;.    r
b890: 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  eturn;.  }.}.../
b8a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b8b0: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
b8c0: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
b8d0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
b8e0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
b8f0: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
b900: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
b910: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
b920: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
b930: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
b940: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
b950: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
b960: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
b970: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
b980: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
b990: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
b9a0: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
b9b0: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
b9c0: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
b9d0: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
b9e0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
b9f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
ba00: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
ba10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ba20: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
ba30: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
ba40: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
ba50: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
ba60: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
ba70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
ba80: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
ba90: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
baa0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
bab0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
bac0: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
bad0: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
bae0: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
baf0: 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ads */..  /* Che
bb00: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
bb10: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
bb20: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
bb30: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
bb40: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
bb50: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
bb60: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
bb70: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
bb80: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
bb90: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
bba0: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
bbb0: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
bbc0: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
bbd0: 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49  ed && !pFile->pI
bbe0: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
bbf0: 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ck ){.    struct
bc00: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
bc10: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
bc20: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
bc30: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
bc40: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
bc50: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
bc60: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
bc70: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
bc80: 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  if( osFcntl(pFil
bc90: 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  e->h, F_GETLK, &
bca0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72  lock) ){.      r
bcb0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
bcc0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
bcd0: 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  CK;.      storeL
bce0: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
bcf0: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 20 65 6c  errno);.    } el
bd00: 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
bd10: 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe!=F_UNLCK ){. 
bd20: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
bd30: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  1;.    }.  }.#en
bd40: 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61  dif.  .  unixLea
bd50: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
bd60: 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
bd70: 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e  OCK %d %d %d (un
bd80: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
bd90: 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
bda0: 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
bdb0: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
bdc0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bdd0: 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61  Attempt to set a
bde0: 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20   system-lock on 
bdf0: 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20  the file pFile. 
be00: 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   The lock is .**
be10: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 4c   described by pL
be20: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
be30: 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e  e pFile was open
be40: 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 66 72  ed read/write fr
be50: 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68  om unix-excl, th
be60: 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b  en the only lock
be70: 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65  .** ever obtaine
be80: 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76  d is an exclusiv
be90: 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69  e lock, and it i
bea0: 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74  s obtained exact
beb0: 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66  ly once.** the f
bec0: 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f  irst time any lo
bed0: 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e  ck is attempted.
bee0: 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74    All subsequent
bef0: 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a   system locking.
bf00: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65  ** operations be
bf10: 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f  come no-ops.  Lo
bf20: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
bf30: 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e   still happen in
bf40: 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20  ternally,.** in 
bf50: 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e  order to coordin
bf60: 61 74 65 20 61 63 63 65 73 73 20 62 65 74 77 65  ate access betwe
bf70: 65 6e 20 73 65 70 61 72 61 74 65 20 64 61 74 61  en separate data
bf80: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
bf90: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
bfa0: 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c  process, but all
bfb0: 20 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e 64   of that is hand
bfc0: 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e  led in memory an
bfd0: 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  d the.** operati
bfe0: 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e  ng system does n
bff0: 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a  ot participate..
c000: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
c010: 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68  ion is a pass-th
c020: 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46  rough to fcntl(F
c030: 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65  _SETLK) if pFile
c040: 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79   is using.** any
c050: 20 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20   VFS other than 
c060: 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69  "unix-excl" or i
c070: 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65  f pFile is opene
c080: 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  d on "unix-excl"
c090: 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d  .** and is read-
c0a0: 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f  only..**.** Zero
c0b0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
c0c0: 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74  the call complet
c0d0: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  es successfully,
c0e0: 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c   or -1 if a call
c0f0: 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66  .** to fcntl() f
c100: 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ails. In this ca
c110: 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74  se, errno is set
c120: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28   appropriately (
c130: 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a  by fcntl())..*/.
c140: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
c150: 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  ileLock(unixFile
c160: 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20   *pFile, struct 
c170: 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20  flock *pLock){. 
c180: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49   int rc;.  unixI
c190: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
c1a0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
c1b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
c1c0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
c1d0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21   assert( pInode!
c1e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46  =0 );.  if( ((pF
c1f0: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
c200: 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21   UNIXFILE_EXCL)!
c210: 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50  =0 || pInode->bP
c220: 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26  rocessLock).   &
c230: 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46  & ((pFile->ctrlF
c240: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
c250: 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b  RDONLY)==0).  ){
c260: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
c270: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
c280: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
c290: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
c2a0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
c2b0: 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  e->nLock==0 );. 
c2c0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
c2d0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
c2e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
c2f0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
c300: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
c310: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
c320: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  ;.      lock.l_t
c330: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
c340: 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74       rc = osFcnt
c350: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
c360: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
c370: 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72 65     if( rc<0 ) re
c380: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
c390: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
c3a0: 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ock = 1;.      p
c3b0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
c3c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c3d0: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   rc = 0;.    }. 
c3e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
c3f0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
c400: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63  h, F_SETLK, pLoc
c410: 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k);.  }.  return
c420: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
c430: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
c440: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
c450: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
c460: 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
c470: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
c480: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
c490: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
c4a0: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
c4b0: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
c4c0: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
c4d0: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
c4e0: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
c4f0: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
c500: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
c510: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
c520: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
c530: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
c540: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
c550: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
c560: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
c570: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
c580: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
c590: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
c5a0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
c5b0: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
c5c0: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
c5d0: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
c5e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
c5f0: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
c600: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
c610: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
c620: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
c630: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
c640: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
c650: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
c660: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
c670: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
c680: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
c690: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
c6a0: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
c6b0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
c6c0: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
c6d0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
c6e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
c6f0: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
c700: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
c710: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
c720: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
c730: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
c740: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
c750: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
c760: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
c770: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
c780: 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  {.  /* The follo
c790: 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74  wing describes t
c7a0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
c7b0: 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  n of the various
c7c0: 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20   locks and.  ** 
c7d0: 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73  lock transitions
c7e0: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
c7f0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
c800: 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75  shared and exclu
c810: 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70  sive.  ** lock p
c820: 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65  rimitives (calle
c830: 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64  d read-locks and
c840: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c   write-locks bel
c850: 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a  ow, to avoid.  *
c860: 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68  * confusion with
c870: 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d   SQLite lock nam
c880: 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74  es). The algorit
c890: 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61  hms are complica
c8a0: 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c  ted.  ** slightl
c8b0: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
c8c0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
c8d0: 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   windows systems
c8e0: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
c8f0: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
c900: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
c910: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
c920: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
c930: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
c940: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
c950: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
c960: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
c970: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
c980: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
c990: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
c9a0: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
c9b0: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
c9c0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
c9d0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
c9e0: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
c9f0: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
ca00: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
ca10: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
ca20: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
ca30: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
ca40: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
ca50: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
ca60: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
ca70: 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64  ccessful, a rand
ca80: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65  om byte from the
ca90: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
caa0: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  ** range' is rea
cab0: 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  d-locked and the
cac0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65   lock on the 'pe
cad0: 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65  nding byte' rele
cae0: 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ased..  **.  ** 
caf0: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
cb00: 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  ly obtain a RESE
cb10: 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20  RVED lock after 
cb20: 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20  it has a SHARED 
cb30: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53  lock..  ** A RES
cb40: 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d  ERVED lock is im
cb50: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61  plemented by gra
cb60: 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  bbing a write-lo
cb70: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27  ck on the.  ** '
cb80: 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20  reserved byte'. 
cb90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
cba0: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
cbb0: 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c  tain a PENDING l
cbc0: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
cbd0: 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a   obtained a.  **
cbe0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20   SHARED lock. A 
cbf0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
cc00: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
cc10: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
cc20: 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68  -lock.  ** on th
cc30: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
cc40: 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
cc50: 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45  hat no new SHARE
cc60: 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20  D locks can be. 
cc70: 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75   ** obtained, bu
cc80: 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45  t existing SHARE
cc90: 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f  D locks are allo
cca0: 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20  wed to persist. 
ccb0: 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64  A process.  ** d
ccc0: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
ccd0: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
cce0: 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61  D lock on the wa
ccf0: 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c  y to a PENDING l
cd00: 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70  ock..  ** This p
cd10: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
cd20: 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d  by the algorithm
cd30: 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63   for rolling bac
cd40: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
cd50: 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72  .  ** after a cr
cd60: 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ash..  **.  ** A
cd70: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
cd80: 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72  , obtained after
cd90: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
cda0: 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a  is held, is.  **
cdb0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
cdc0: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
cdd0: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e  e-lock on the en
cde0: 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74  tire 'shared byt
cdf0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53  e.  ** range'. S
ce00: 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c  ince all other l
ce10: 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72  ocks require a r
ce20: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20  ead-lock on one 
ce30: 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a  of the bytes.  *
ce40: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61  * within this ra
ce50: 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  nge, this ensure
ce60: 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  s that no other 
ce70: 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f  locks are held o
ce80: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
ce90: 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ase. .  **.  ** 
cea0: 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e  The reason a sin
ceb0: 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20  gle byte cannot 
cec0: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
ced0: 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62  of the 'shared b
cee0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
cef0: 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72  is that some ver
cf00: 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73  sions of windows
cf10: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
cf20: 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20  read-locks. By. 
cf30: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61   ** locking a ra
cf40: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61  ndom byte from a
cf50: 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65   range, concurre
cf60: 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  nt SHARED locks 
cf70: 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65  may exist.  ** e
cf80: 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69  ven if the locki
cf90: 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65  ng primitive use
cfa0: 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72  d is always a wr
cfb0: 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ite-lock..  */. 
cfc0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
cfd0: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
cfe0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
cff0: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
d000: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
d010: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
d020: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72  lock;.  int tErr
d030: 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
d040: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
d050: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
d060: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
d070: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
d080: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
d090: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
d0a0: 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
d0b0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
d0c0: 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
d0d0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
d0e0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
d0f0: 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49  Lock), pFile->pI
d100: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
d110: 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 29 29       osGetpid())
d120: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
d130: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
d140: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
d150: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
d160: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
d170: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
d180: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
d190: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
d1a0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
d1b0: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
d1c0: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
d1d0: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
d1e0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
d1f0: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
d200: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
d210: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
d220: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
d230: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
d240: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
d250: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
d260: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
d270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d280: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
d290: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
d2a0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
d2b0: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
d2c0: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
d2d0: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
d2e0: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
d2f0: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
d300: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
d310: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
d320: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
d330: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
d340: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
d350: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
d360: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
d370: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
d380: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
d390: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
d3a0: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
d3b0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
d3c0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
d3d0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
d3e0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
d3f0: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
d400: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
d410: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
d420: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d430: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
d440: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
d450: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
d460: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
d470: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
d480: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
d490: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
d4a0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
d4b0: 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
d4c0: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
d4d0: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
d4e0: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
d4f0: 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
d500: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
d510: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
d520: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
d530: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
d540: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
d550: 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
d560: 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
d570: 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
d580: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
d590: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
d5a0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
d5b0: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
d5c0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
d5d0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
d5e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
d5f0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
d600: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
d610: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
d620: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
d630: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
d640: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
d650: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
d660: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
d670: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
d680: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d690: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
d6a0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d6b0: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
d6c0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d6d0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
d6e0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d6f0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
d700: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
d710: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
d720: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
d730: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
d740: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
d750: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
d760: 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
d770: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
d780: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
d790: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
d7a0: 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
d7b0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
d7c0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
d7d0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
d7e0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
d7f0: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
d800: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
d810: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
d820: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
d830: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
d840: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
d850: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
d860: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
d870: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
d880: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
d890: 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
d8a0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
d8b0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
d8c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
d8d0: 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
d8e0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
d8f0: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
d900: 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
d910: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
d920: 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
d930: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
d940: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
d950: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
d960: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
d970: 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
d980: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
d990: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
d9a0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
d9b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d9c0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
d9d0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
d9e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
d9f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
da00: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
da10: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
da20: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
da30: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
da40: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
da50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  k;.    }.  }... 
da60: 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
da70: 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
da80: 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
da90: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
daa0: 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
dab0: 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
dac0: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
dad0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
dae0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
daf0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
db00: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
db10: 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
db20: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
db30: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
db40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
db50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
db60: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
db70: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
db80: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
db90: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
dba0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
dbb0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
dbc0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
dbd0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
dbe0: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
dbf0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
dc00: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
dc10: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
dc20: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
dc30: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
dc40: 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  }..    /* Drop t
dc50: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
dc60: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
dc70: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
dc80: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
dc90: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
dca0: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
dcb0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
dcc0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
dcd0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
dce0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
dcf0: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  K ){.      /* Th
dd00: 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20  is could happen 
dd10: 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d  with a network m
dd20: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45  ount */.      tE
dd30: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
dd40: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
dd50: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
dd60: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
dd70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
dd80: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
dd90: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
dda0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
ddb0: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
ddc0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
ddd0: 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
dde0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
ddf0: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
de00: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
de10: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
de20: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
de30: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
de40: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
de50: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
de60: 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
de70: 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
de80: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
de90: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
dea0: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
deb0: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
dec0: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
ded0: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
dee0: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
def0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
df00: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
df10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
df20: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
df30: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
df40: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
df50: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
df60: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
df70: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
df80: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
df90: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
dfa0: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
dfb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
dfc0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
dfd0: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
dfe0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
dff0: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
e000: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
e010: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
e020: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
e030: 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
e040: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
e050: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
e060: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
e070: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
e080: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e090: 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
e0a0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
e0b0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
e0c0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
e0d0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
e0e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
e0f0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e100: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
e110: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e120: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
e130: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
e140: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
e150: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
e160: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
e170: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
e180: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
e190: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
e1a0: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
e1b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a  }.    }.  }.  ..
e1c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
e1d0: 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
e1e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
e1f0: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
e200: 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
e210: 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
e220: 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
e230: 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
e240: 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
e250: 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
e260: 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
e270: 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
e280: 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
e290: 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
e2a0: 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
e2b0: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
e2c0: 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
e2d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
e2e0: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
e2f0: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
e300: 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  .   && eFileLock
e310: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ==RESERVED_LOCK.
e320: 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e    ){.    pFile->
e330: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
e340: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  0;.    pFile->db
e350: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
e360: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
e370: 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  rite = 1;.  }.#e
e380: 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d  ndif...  if( rc=
e390: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e3a0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
e3b0: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
e3c0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
e3d0: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
e3e0: 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
e3f0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
e400: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
e410: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e420: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
e430: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
e440: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
e450: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
e460: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
e470: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
e480: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
e490: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
e4a0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
e4b0: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
e4c0: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
e4d0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
e4e0: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
e4f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e500: 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20  ** Add the file 
e510: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
e520: 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  by file handle p
e530: 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72  File to the corr
e540: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e  esponding.** pUn
e550: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  used list..*/.st
e560: 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e  atic void setPen
e570: 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20  dingFd(unixFile 
e580: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
e590: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
e5a0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
e5b0: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
e5c0: 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e   *p = pFile->pUn
e5d0: 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  used;.  p->pNext
e5e0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73   = pInode->pUnus
e5f0: 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55  ed;.  pInode->pU
e600: 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69  nused = p;.  pFi
e610: 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46  le->h = -1;.  pF
e620: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30  ile->pUnused = 0
e630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
e640: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
e650: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
e660: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
e670: 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
e680: 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
e690: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
e6a0: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
e6b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
e6c0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
e6d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
e6e0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
e6f0: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
e700: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
e710: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
e720: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
e730: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c  .** .** If handl
e740: 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72  eNFSUnlock is tr
e750: 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e  ue, then on down
e760: 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  grading an EXCLU
e770: 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41  SIVE_LOCK to SHA
e780: 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20  RED.** the byte 
e790: 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64  range is divided
e7a0: 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e   into 2 parts an
e7b0: 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  d the first part
e7c0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65   is unlocked the
e7d0: 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65  n.** set to a re
e7e0: 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ad lock, then th
e7f0: 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20  e other part is 
e800: 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  simply unlocked.
e810: 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a    This works .**
e820: 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e   around a bug in
e830: 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28   BSD NFS lockd (
e840: 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63  also seen on Mac
e850: 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20  OSX 10.3+) that 
e860: 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d  fails to .** rem
e870: 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ove the write lo
e880: 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77  ck on a region w
e890: 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
e8a0: 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  is set..*/.stati
e8b0: 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63  c int posixUnloc
e8c0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
e8d0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
e8e0: 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53  k, int handleNFS
e8f0: 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46  Unlock){.  unixF
e900: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
e910: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
e920: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
e930: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ode;.  struct fl
e940: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
e950: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e960: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
e970: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
e980: 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
e990: 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
e9a0: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
e9b0: 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
e9c0: 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  k,.      pFile->
e9d0: 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
e9e0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
e9f0: 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
ea00: 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
ea10: 20 20 20 6f 73 47 65 74 70 69 64 28 29 29 29 3b     osGetpid()));
ea20: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
ea30: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
ea40: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
ea50: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
ea60: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
ea70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ea80: 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
ea90: 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
eaa0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
eab0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
eac0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
ead0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
eae0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
eaf0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
eb00: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
eb10: 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
eb20: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66  FileLock );..#if
eb30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
eb40: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
eb50: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
eb60: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
eb70: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
eb80: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
eb90: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
eba0: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
ebb0: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
ebc0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
ebd0: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
ebe0: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
ebf0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
ec00: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
ec10: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
ec20: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
ec30: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
ec40: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
ec50: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
ec60: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
ec70: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
ec80: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
ec90: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
eca0: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
ecb0: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
ecc0: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
ecd0: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
ece0: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
ecf0: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
ed00: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
ed10: 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e    */.    pFile->
ed20: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
ed30: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
ed40: 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f  * downgrading to
ed50: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
ed60: 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63  n NFS involves c
ed70: 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74  learing the writ
ed80: 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65  e lock.    ** be
ed90: 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e  fore establishin
eda0: 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d  g the readlock -
edb0: 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65   to avoid a race
edc0: 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f   condition we do
edd0: 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74  wngrade.    ** t
ede0: 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f  he lock in 2 blo
edf0: 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72  cks, so that par
ee00: 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77  t of the range w
ee10: 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62  ill be covered b
ee20: 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74  y a .    ** writ
ee30: 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65  e lock until the
ee40: 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64   rest is covered
ee50: 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a   by a read lock:
ee60: 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57  .    **  1:   [W
ee70: 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a  WWWW].    **  2:
ee80: 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a     [....W].    *
ee90: 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a  *  3:   [RRRRW].
eea0: 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52      **  4:   [RR
eeb0: 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RR.].    */.    
eec0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
eed0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69  HARED_LOCK ){.#i
eee0: 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  f !defined(__APP
eef0: 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45  LE__) || !SQLITE
ef00: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
ef10: 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69  STYLE.      (voi
ef20: 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  d)handleNFSUnloc
ef30: 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
ef40: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
ef50: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==0 );.#endif.#i
ef60: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
ef70: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
ef80: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
ef90: 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61  YLE.      if( ha
efa0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b  ndleNFSUnlock ){
efb0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
efc0: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
efd0: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
efe0: 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
eff0: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
f000: 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a      off_t divSiz
f010: 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20  e = SHARED_SIZE 
f020: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  - 1;.        .  
f030: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
f040: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
f050: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f060: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f070: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
f080: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f090: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
f0a0: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
f0b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f0c0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f0d0: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
f0e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
f0f0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
f100: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f110: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
f120: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
f130: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
f140: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
f150: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
f160: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
f170: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f180: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
f190: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
f1a0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
f1b0: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
f1c0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
f1d0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f1e0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
f1f0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f200: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
f210: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
f220: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
f230: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f240: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
f250: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
f260: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f270: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f280: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
f290: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
f2a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
f2b0: 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
f2c0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
f2d0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
f2e0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f2f0: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
f300: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f310: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
f320: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
f330: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
f340: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
f350: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
f360: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
f370: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
f380: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
f390: 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b  D_FIRST+divSize;
f3a0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f3b0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
f3c0: 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  E-divSize;.     
f3d0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
f3e0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
f3f0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
f400: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
f410: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
f420: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
f430: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
f440: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
f450: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
f460: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
f470: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
f480: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
f490: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
f4a0: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
f4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
f4c0: 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  lse.#endif /* de
f4d0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
f4e0: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
f4f0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
f500: 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
f510: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
f520: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
f530: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f540: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f550: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f560: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
f570: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f580: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
f590: 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  E;.        if( u
f5a0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f5b0: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
f5c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
f5d0: 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ory, the call to
f5e0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20   unixFileLock() 
f5f0: 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61  cannot fail beca
f600: 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  use another.    
f610: 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
f620: 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69   is holding an i
f630: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b  ncompatible lock
f640: 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68  . If it does, th
f650: 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
f660: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
f670: 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  the other proces
f680: 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
f690: 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20  ng the locking. 
f6a0: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74           ** prot
f6b0: 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61  ocol. If this ha
f6c0: 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  ppens, return SQ
f6d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
f6e0: 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20  K. Returning.   
f6f0: 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
f700: 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66  _BUSY would conf
f710: 75 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61  use the upper la
f720: 79 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65  yer (in practice
f730: 20 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20   it causes .    
f740: 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65        ** an asse
f750: 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20  rt to fail). */ 
f760: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f770: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
f780: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  OCK;.          s
f790: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
f7a0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
f7b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
f7c0: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
f7d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
f7e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
f7f0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c  = F_UNLCK;.    l
f800: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f810: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
f820: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
f830: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
f840: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20  ck.l_len = 2L;  
f850: 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f  assert( PENDING_
f860: 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44  BYTE+1==RESERVED
f870: 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28  _BYTE );.    if(
f880: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f890: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
f8a0: 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
f8b0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
f8c0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
f8d0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
f8e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f8f0: 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  CK;.      storeL
f900: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
f910: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f  errno);.      go
f920: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
f930: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
f940: 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
f950: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72  K ){.    /* Decr
f960: 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
f970: 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
f980: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
f990: 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
f9a0: 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
f9b0: 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
f9c0: 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
f9d0: 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
f9e0: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
f9f0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  k..    */.    pI
fa00: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
fa10: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
fa20: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
fa30: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
fa40: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
fa50: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
fa60: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
fa70: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
fa80: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
fa90: 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
faa0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
fab0: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
fac0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
fad0: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
fae0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
faf0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
fb00: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
fb10: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
fb20: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
fb30: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  rrno);.        p
fb40: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
fb50: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
fb60: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
fb70: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
fb80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
fb90: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
fba0: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63  the count of loc
fbb0: 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  ks against this 
fbc0: 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e  same file.  When
fbd0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e   the.    ** coun
fbe0: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20  t reaches zero, 
fbf0: 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20  close any other 
fc00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
fc10: 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20   whose close.   
fc20: 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64   ** was deferred
fc30: 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73   because of outs
fc40: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20  tanding locks.. 
fc50: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
fc60: 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61  ->nLock--;.    a
fc70: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
fc80: 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
fc90: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
fca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f  ==0 ){.      clo
fcb0: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
fcc0: 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  le);.    }.  }..
fcd0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e  end_unlock:.  un
fce0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
fcf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
fd00: 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
fd10: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
fd20: 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
fd30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
fd40: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fd50: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
fd60: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
fd70: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
fd80: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
fd90: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
fda0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
fdb0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
fdc0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
fdd0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
fde0: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
fdf0: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
fe00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
fe10: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
fe20: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
fe30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
fe40: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
fe50: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
fe60: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53  FileLock){.#if S
fe70: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
fe80: 49 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28 20  IZE>0.  assert( 
fe90: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
fea0: 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78  D_LOCK || ((unix
feb0: 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74  File *)id)->nFet
fec0: 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64  chOut==0 );.#end
fed0: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  if.  return posi
fee0: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
fef0: 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69  eLock, 0);.}..#i
ff00: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
ff10: 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
ff20: 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  int unixMapfile(
ff30: 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69  unixFile *pFd, i
ff40: 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69  64 nByte);.stati
ff50: 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70  c void unixUnmap
ff60: 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
ff70: 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  Fd);.#endif../*.
ff80: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
ff90: 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61   performs the pa
ffa0: 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73  rts of the "clos
ffb0: 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f  e file" operatio
ffc0: 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20  n .** common to 
ffd0: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  all locking sche
ffe0: 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74  mes. It closes t
fff0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  he directory and
10000 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73   file.** handles
10010 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61  , if they are va
10020 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c  lid, and sets al
10030 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
10040 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
10050 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  cture to 0..**.*
10060 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65  * It is *not* ne
10070 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20  cessary to hold 
10080 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74  the mutex when t
10090 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
100a0 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f  alled,.** even o
100b0 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75  n VxWorks.  A mu
100c0 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75  tex will be acqu
100d0 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20  ired on VxWorks 
100e0 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b  by the.** vxwork
100f0 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29  sReleaseFileId()
10100 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
10110 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69  tic int closeUni
10120 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69  xFile(sqlite3_fi
10130 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
10140 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10150 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20  ixFile*)id;.#if 
10160 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
10170 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d  SIZE>0.  unixUnm
10180 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23  apfile(pFile);.#
10190 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c  endif.  if( pFil
101a0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72  e->h>=0 ){.    r
101b0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
101c0 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  e, pFile->h, __L
101d0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c  INE__);.    pFil
101e0 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23  e->h = -1;.  }.#
101f0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
10200 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29  if( pFile->pId )
10210 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  {.    if( pFile-
10220 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
10230 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a  XFILE_DELETE ){.
10240 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70        osUnlink(p
10250 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
10260 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
10270 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c  }.    vxworksRel
10280 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65  easeFileId(pFile
10290 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c  ->pId);.    pFil
102a0 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a  e->pId = 0;.  }.
102b0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
102c0 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45  LITE_UNLINK_AFTE
102d0 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70 46  R_CLOSE.  if( pF
102e0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
102f0 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
10300 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b   ){.    osUnlink
10310 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a  (pFile->zPath);.
10320 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10330 28 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c 65  (*(char**)&pFile
10340 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46  ->zPath);.    pF
10350 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a  ile->zPath = 0;.
10360 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
10370 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25  RACE(("CLOSE   %
10380 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
10390 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ));.  OpenCounte
103a0 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(-1);.  sqlite3
103b0 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e  _free(pFile->pUn
103c0 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28  used);.  memset(
103d0 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
103e0 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72  (unixFile));.  r
103f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10410 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
10420 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
10430 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10440 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
10460 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10470 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76  ixFile *)id;.  v
10480 65 72 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c  erifyDbFile(pFil
10490 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  e);.  unixUnlock
104a0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
104b0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
104c0 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c  );..  /* unixFil
104d0 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61  e.pInode is alwa
104e0 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f  ys valid here. O
104f0 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66  therwise, a diff
10500 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a  erent close.  **
10510 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e   routine (e.g. n
10520 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f  olockClose()) wo
10530 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e  uld be called in
10540 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  stead..  */.  as
10550 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e  sert( pFile->pIn
10560 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20  ode->nLock>0 || 
10570 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
10580 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
10590 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
105a0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26  File->pInode) &&
105b0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
105c0 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20  nLock ){.    /* 
105d0 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
105e0 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
105f0 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
10600 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
10610 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62  ust.    ** yet b
10620 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
10630 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
10640 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
10650 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
10660 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
10670 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
10680 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20   list.  It will 
10690 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
106a0 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20   closed .    ** 
106b0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
106c0 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
106d0 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e     */.    setPen
106e0 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
106f0 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64   }.  releaseInod
10700 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
10710 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
10720 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65  le(id);.  unixLe
10730 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
10740 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
10750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
10760 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76  of the posix adv
10770 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65  isory lock imple
10780 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
10790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
107a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
107f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
10860 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
10870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
10890 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
108a0 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
108b0 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
108c0 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
108d0 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
108e0 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
108f0 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
10900 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
10910 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
10920 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
10930 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
10940 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
10950 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
10960 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
10970 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
10980 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
10990 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
109a0 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
109b0 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
109c0 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
109d0 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
109e0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
109f0 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
10a00 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
10a10 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
10a20 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
10a30 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
10a40 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
10a50 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
10a60 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
10a70 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
10a80 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
10a90 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
10aa0 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
10ab0 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
10ac0 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
10ad0 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
10ae0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
10af0 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
10b00 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
10b10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
10b20 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
10b30 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
10b40 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
10b50 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
10b60 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
10b70 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  nt nolockCheckRe
10b80 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
10b90 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
10ba0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
10bb0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10bc0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
10bd0 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
10be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10bf0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
10c00 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
10c10 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
10c20 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
10c30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10c40 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
10c50 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
10c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
10c70 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
10c80 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
10c90 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
10ca0 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
10cb0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
10cc0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
10cd0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
10ce0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10cf0 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   Close the file.
10d00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
10d10 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
10d20 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
10d30 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
10d40 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
10d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d60 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
10d70 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
10d80 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
10d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e50 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
10e60 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
10e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10e90 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
10ea0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
10eb0 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
10ec0 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65   existence of se
10ed0 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
10ee0 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64  iles (really a d
10ef0 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e  irectory) to con
10f00 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
10f10 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
10f20 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a  is works.** on j
10f30 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20  ust about every 
10f40 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
10f50 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
10f60 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
10f70 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
10f80 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
10f90 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
10fa0 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
10fb0 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
10fc0 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
10fd0 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
10fe0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
10ff0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
11000 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
11010 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
11020 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
11030 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
11040 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
11050 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
11060 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
11070 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
11080 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
11090 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
110a0 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
110b0 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
110c0 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
110d0 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
110e0 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
110f0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
11100 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
11110 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
11120 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f  ing a subdirecto
11130 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ry in the same d
11140 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74  irectory as.** t
11150 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
11160 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
11170 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e  me but with a ".
11180 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20  lock" extension 
11190 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78  added..** The ex
111a0 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63  istence of a loc
111b0 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c  k directory impl
111c0 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
111d0 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
111e0 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20  r.** lock types 
111f0 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
11200 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
11210 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
11220 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
11230 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
11240 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
11250 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
11260 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
11270 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
11280 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64  directory..*/.#d
11290 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55  efine DOTLOCK_SU
112a0 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a  FFIX ".lock"../*
112b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
112c0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
112d0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
112e0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
112f0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
11300 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
11310 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11320 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11330 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11340 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
11350 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
11360 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11370 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
11380 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
11390 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
113a0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
113b0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
113c0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
113d0 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  hecking..**.** I
113e0 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  n dotfile lockin
113f0 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b  g, either a lock
11400 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f   exists or it do
11410 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74  es not.  So in t
11420 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e  his.** variation
11430 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65   of CheckReserve
11440 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75  dLock(), *pResOu
11450 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
11460 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20   if any lock.** 
11470 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  is held on the f
11480 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ile and false if
11490 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
114a0 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ocked..*/.static
114b0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
114c0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
114d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
114e0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
114f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11500 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
11510 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
11520 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11530 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
11540 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
11550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
11560 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
11570 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
11580 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11590 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
115a0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
115b0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
115c0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
115d0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
115e0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
115f0 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
11600 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
11610 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  n or some other 
11620 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68  connection in th
11630 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20  e same process. 
11640 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f     ** holds a lo
11650 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ck on the file. 
11660 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   No need to chec
11670 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  k further. */.  
11680 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
11690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
116a0 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  The lock is held
116b0 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
116c0 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69  the lockfile exi
116d0 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  sts */.    const
116e0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
116f0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
11700 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11710 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72  ntext;.    reser
11720 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a  ved = osAccess(z
11730 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b  LockFile, 0)==0;
11740 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
11750 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
11760 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
11770 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
11780 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
11790 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
117a0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
117b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
117c0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
117d0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
117e0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
117f0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
11800 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
11810 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
11820 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
11830 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
11840 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
11850 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
11860 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
11870 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
11880 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
11890 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
118a0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
118b0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
118c0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
118d0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
118e0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
118f0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
11900 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
11910 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
11920 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
11930 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
11940 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
11950 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
11960 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
11970 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
11980 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
11990 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
119a0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
119b0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
119c0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
119d0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
119e0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
119f0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
11a00 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
11a10 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11a20 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
11a30 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
11a40 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11a50 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
11a60 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
11a70 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
11a80 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
11a90 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
11aa0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
11ab0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
11ac0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
11ad0 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
11ae0 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
11af0 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
11b00 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
11b10 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
11b20 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
11b30 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
11b40 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
11b50 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
11b60 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
11b70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11b80 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
11b90 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
11ba0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
11bb0 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
11bc0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
11bd0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
11be0 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
11bf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
11c00 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
11c10 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
11c20 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
11c30 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
11c40 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
11c50 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
11c60 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
11c70 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
11c80 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
11c90 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11ca0 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  k > NO_LOCK ){. 
11cb0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11cc0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11cd0 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
11ce0 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
11cf0 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
11d00 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  ile */.#ifdef HA
11d10 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69  VE_UTIME.    uti
11d20 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  me(zLockFile, NU
11d30 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  LL);.#else.    u
11d40 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
11d50 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
11d60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11d70 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11d80 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
11d90 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  ve lock */.  rc 
11da0 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46  = osMkdir(zLockF
11db0 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66  ile, 0777);.  if
11dc0 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( rc<0 ){.    /*
11dd0 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
11de0 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20  create the lock 
11df0 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
11e00 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
11e10 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
11e20 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
11e30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11e40 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
11e50 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
11e60 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11e70 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11e80 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
11e90 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
11ea0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
11eb0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  c) ){.        st
11ec0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
11ed0 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
11ee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
11ef0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20  eturn rc;.  } . 
11f00 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
11f10 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
11f20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
11f30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11f40 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
11f50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11f60 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
11f70 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
11f80 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
11f90 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
11fa0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
11fb0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
11fc0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
11fd0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
11fe0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
11ff0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
12000 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
12010 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
12020 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
12030 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
12040 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12050 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57  a no-op..**.** W
12060 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  hen the locking 
12070 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f  level reaches NO
12080 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68  _LOCK, delete th
12090 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  e lock file..*/.
120a0 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
120b0 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
120c0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
120d0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
120e0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
120f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12100 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
12110 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
12120 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
12130 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
12140 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12150 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
12160 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
12170 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b   pid=%d (dotlock
12180 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12190 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
121a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
121b0 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
121c0 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
121d0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
121e0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
121f0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
12200 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
12210 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
12220 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
12230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12240 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64  ;.  }..  /* To d
12250 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72  owngrade to shar
12260 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74  ed, simply updat
12270 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e  e our internal n
12280 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  otion of the.  *
12290 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e  * lock state.  N
122a0 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77  o need to mess w
122b0 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ith the file on 
122c0 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
122d0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
122e0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  ED_LOCK ){.    p
122f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12300 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
12310 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12320 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
12330 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
12340 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
12350 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
12360 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
12370 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
12380 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73  OCK );.  rc = os
12390 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29  Rmdir(zLockFile)
123a0 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20  ;.  if( rc<0 && 
123b0 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20 29  errno==ENOTDIR )
123c0 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a   rc = osUnlink(z
123d0 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
123e0 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74   rc<0 ){.    int
123f0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12400 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
12410 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74   if( ENOENT != t
12420 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
12430 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
12440 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  _UNLOCK;.    }. 
12450 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12460 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
12470 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
12480 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
12490 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
124a0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
124b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
124c0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
124d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
124e0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
124f0 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
12500 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
12510 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
12520 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
12530 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
12540 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
12550 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
12560 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12570 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
12580 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12590 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
125a0 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63      dotlockUnloc
125b0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
125c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
125d0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
125e0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20  ontext);.    rc 
125f0 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
12600 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
12610 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
12630 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
12640 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
12650 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
12660 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
126c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12700 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12720 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
12730 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
12740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12750 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
12760 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
12770 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
12780 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
12790 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
127a0 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
127b0 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
127c0 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
127d0 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
127e0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
127f0 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
12800 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
12810 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
12820 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
12830 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
12840 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
12850 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
12860 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
12870 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
12880 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12890 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
128a0 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
128b0 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
128c0 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
128d0 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
128e0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
128f0 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
12900 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
12910 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
12920 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
12930 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
12940 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12950 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
12960 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  f or if.** compi
12970 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53  ling for VXWORKS
12980 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
12990 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
129a0 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
129b0 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  RKS../*.** Retry
129c0 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74   flock() calls t
129d0 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49  hat fail with EI
129e0 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49  NTR.*/.#ifdef EI
129f0 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72  NTR.static int r
12a00 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20  obust_flock(int 
12a10 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  fd, int op){.  i
12a20 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
12a30 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20  = flock(fd,op); 
12a40 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
12a50 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
12a60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
12a70 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f  else.# define ro
12a80 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20  bust_flock(a,b) 
12a90 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69  flock(a,b).#endi
12aa0 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  f.     ../*.** T
12ab0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
12ac0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
12ad0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
12ae0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
12af0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
12b00 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
12b10 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
12b20 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
12b30 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
12b40 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
12b50 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
12b60 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
12b70 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
12b80 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
12b90 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
12ba0 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
12bb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
12bc0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
12bd0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
12be0 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  t flockCheckRese
12bf0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
12c00 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
12c10 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
12c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12c30 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
12c40 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
12c50 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12c60 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
12c70 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
12c80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
12c90 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
12ca0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
12cb0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a  rt( pFile );.  .
12cc0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
12cd0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
12ce0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
12cf0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
12d00 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
12d10 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
12d20 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
12d30 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
12d40 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
12d50 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
12d60 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
12d70 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
12d80 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
12d90 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
12da0 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
12db0 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
12dc0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
12dd0 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
12de0 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
12df0 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
12e00 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
12e10 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72  */.      lrc = r
12e20 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
12e30 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
12e40 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29        if ( lrc )
12e50 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
12e60 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12e70 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b         /* unlock
12e80 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20   failed with an 
12e90 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
12ea0 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f   lrc = SQLITE_IO
12eb0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
12ec0 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
12ed0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
12ee0 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
12ef0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
12f00 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
12f10 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
12f20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12f30 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
12f40 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
12f50 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72  rno;.      reser
12f60 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  ved = 1;.      /
12f70 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  * someone else m
12f80 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73  ight have it res
12f90 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c  erved */.      l
12fa0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12fb0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12fc0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
12fd0 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  ERR_LOCK); .    
12fe0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
12ff0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
13000 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
13010 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
13020 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
13030 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lrc;.      }.   
13040 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
13050 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
13060 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29  %d %d %d (flock)
13070 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
13080 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
13090 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
130a0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
130b0 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
130c0 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
130d0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
130e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
130f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65  ITE_OK;.    rese
13100 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64  rved=1;.  }.#end
13110 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
13120 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13130 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73  RRORS */.  *pRes
13140 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
13150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13160 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
13170 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
13180 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
13190 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
131a0 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
131b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
131c0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
131d0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
131e0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
131f0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
13200 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
13210 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
13220 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
13230 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
13240 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
13250 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
13260 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
13270 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
13280 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
13290 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
132a0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
132b0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
132c0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
132d0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
132e0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
132f0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
13300 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
13310 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
13320 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
13330 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
13340 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
13350 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
13360 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
13370 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
13380 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
13390 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
133a0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
133b0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
133c0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
133d0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
133e0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
133f0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
13400 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
13410 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  VE.**.** flock()
13420 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
13430 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
13440 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
13450 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
13460 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
13470 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
13480 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
13490 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
134a0 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
134b0 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
134c0 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
134d0 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
134e0 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
134f0 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
13500 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13510 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
13520 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
13530 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
13540 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
13550 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
13560 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
13570 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
13580 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
13590 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
135a0 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72  eLock) {.  int r
135b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
135c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
135d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
135e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
135f0 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  le );..  /* if w
13600 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
13610 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
13620 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
13630 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
13640 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
13650 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
13660 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
13670 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  ck > NO_LOCK) {.
13680 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13690 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
136a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
136b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
136c0 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
136d0 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
136e0 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c  .  if (robust_fl
136f0 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
13700 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
13710 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  ) {.    int tErr
13720 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
13730 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d  /* didn't get, m
13740 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20  ust be busy */. 
13750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
13760 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
13770 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
13780 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
13790 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
137a0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
137b0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
137c0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
137d0 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
137e0 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  .    /* got it, 
137f0 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
13800 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
13810 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13820 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13830 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
13840 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
13850 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
13860 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
13870 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
13880 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
13890 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
138a0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66   "failed"));.#if
138b0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
138c0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
138d0 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
138e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
138f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
13900 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13910 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BUSY;.  }.#endi
13920 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
13930 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13940 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  RORS */.  return
13950 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c   rc;.}.../*.** L
13960 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
13970 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
13980 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
13990 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
139a0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
139b0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
139c0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
139d0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
139e0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
139f0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
13a00 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
13a10 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
13a20 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
13a30 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
13a40 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13a50 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
13a60 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  nt flockUnlock(s
13a70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13a80 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
13a90 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
13aa0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13ab0 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
13ac0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
13ad0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
13ae0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
13af0 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
13b00 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
13b10 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
13b20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
13b30 20 6f 73 47 65 74 70 69 64 28 29 29 29 3b 0a 20   osGetpid()));. 
13b40 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
13b50 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
13b60 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
13b70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
13b80 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
13b90 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
13ba0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
13bb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13bc0 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
13bd0 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
13be0 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
13bf0 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
13c00 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
13c10 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
13c20 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
13c30 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
13c40 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
13c50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13c60 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
13c70 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
13c80 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f    if( robust_flo
13c90 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
13ca0 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20  K_UN) ){.#ifdef 
13cb0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
13cc0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
13cd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13ce0 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  E_OK;.#endif /* 
13cf0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
13d00 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
13d10 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
13d20 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
13d30 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
13d40 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13d50 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
13d60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13d70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
13d80 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
13d90 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
13da0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
13db0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
13dc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13dd0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
13de0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
13df0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63  NO_LOCK);.    rc
13e00 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
13e10 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
13e20 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
13e30 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
13e40 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
13e50 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
13e60 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
13e70 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
13e80 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
13e90 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
13ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13eb0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f00 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f50 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
13f70 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
13f80 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
13f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fa0 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
13fb0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
13fc0 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
13fd0 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
13fe0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
13ff0 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
14000 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
14010 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
14020 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
14030 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
14040 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
14050 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
14060 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
14070 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14080 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
14090 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
140a0 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
140b0 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
140c0 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
140d0 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
140e0 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
140f0 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
14100 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
14110 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
14120 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
14130 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
14140 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
14150 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
14160 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
14170 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
14180 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
14190 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
141a0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
141b0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
141c0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
141d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
141e0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
141f0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
14200 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
14210 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
14220 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
14230 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73  int semXCheckRes
14240 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
14250 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14260 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
14270 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14280 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
14290 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
142a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
142b0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
142c0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
142d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
142e0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
142f0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
14300 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
14310 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
14320 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
14330 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
14340 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
14350 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14360 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
14370 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
14380 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
14390 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
143a0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
143b0 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
143c0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
143d0 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
143e0 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
143f0 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66  e->pSem;..    if
14400 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
14410 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
14420 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
14430 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
14440 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
14450 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14460 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14470 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14480 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
14490 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
144a0 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  );.        store
144b0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
144c0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
144d0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
144e0 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
144f0 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68   has the lock wh
14500 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f  en we are in NO_
14510 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20  LOCK */.        
14520 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c  reserved = (pFil
14530 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53  e->eFileLock < S
14540 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
14550 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
14560 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
14570 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
14580 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
14590 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
145a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
145b0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
145c0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
145d0 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
145e0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
145f0 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
14600 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
14610 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
14620 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
14630 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
14640 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
14650 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
14660 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
14670 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
14680 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
14690 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
146a0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
146b0 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
146c0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
146d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
146e0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
146f0 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
14700 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
14710 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
14720 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
14730 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
14740 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
14750 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
14760 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
14770 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
14780 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
14790 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
147a0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
147b0 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
147c0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
147d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
147e0 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
147f0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
14800 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
14810 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
14820 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
14830 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
14840 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
14850 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
14860 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
14870 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14880 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
14890 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
148a0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
148b0 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
148c0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
148d0 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
148e0 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  s only really su
148f0 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
14900 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
14910 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
14920 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
14930 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
14940 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
14950 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
14960 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
14970 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
14980 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
14990 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
149a0 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
149b0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
149c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
149d0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
149e0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
149f0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
14a00 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
14a10 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
14a20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
14a30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
14a40 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  XLock(sqlite3_fi
14a50 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
14a60 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
14a70 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14a80 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
14a90 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
14aa0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
14ab0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14ac0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20  TE_OK;..  /* if 
14ad0 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
14ae0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
14af0 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
14b00 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
14b10 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
14b20 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
14b30 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
14b40 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
14b50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
14b60 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
14b70 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  k;.    rc = SQLI
14b80 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
14b90 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
14ba0 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73  }.  .  /* lock s
14bb0 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74  emaphore now but
14bc0 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61   bail out when a
14bd0 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a  lready locked. *
14be0 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77  /.  if( sem_tryw
14bf0 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
14c00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14c10 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
14c20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
14c30 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  }..  /* got it, 
14c40 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
14c50 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
14c60 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14c70 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20   = eFileLock;.. 
14c80 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
14c90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14ca0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
14cb0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
14cc0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
14cd0 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
14ce0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
14cf0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
14d00 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
14d10 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
14d20 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
14d30 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
14d40 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
14d50 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
14d60 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
14d70 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
14d80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14d90 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
14da0 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f  tic int semXUnlo
14db0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14dc0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14dd0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
14de0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14df0 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
14e00 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
14e10 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
14e20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
14e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
14e40 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
14e50 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
14e60 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
14e70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14e80 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
14e90 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
14ea0 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
14eb0 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
14ec0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
14ed0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
14ee0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
14ef0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
14f00 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
14f10 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
14f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14f30 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
14f40 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
14f50 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
14f60 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
14f70 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
14f80 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
14f90 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
14fa0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14fb0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
14fc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14fd0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
14fe0 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63  no, really unloc
14ff0 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d  k. */.  if ( sem
15000 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20  _post(pSem)==-1 
15010 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20  ) {.    int rc, 
15020 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
15030 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
15040 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
15050 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
15060 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
15070 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
15080 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
15090 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
150a0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
150b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
150c0 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
150d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
150e0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
150f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15100 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
15110 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
15120 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28  c int semXClose(
15130 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15140 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
15150 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
15160 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
15170 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c  )id;.    semXUnl
15180 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
15190 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
151a0 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45  ile );.    unixE
151b0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
151c0 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
151d0 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e  o(pFile);.    un
151e0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
151f0 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c      closeUnixFil
15200 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
15210 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15220 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
15230 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20  XWORKS */./*.** 
15240 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
15250 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
15260 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57  available on VxW
15270 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  orks..**.*******
15280 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
15290 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
152a0 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ore lock impleme
152b0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
152c0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
152d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15310 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
15320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
15370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15380 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50  ****** Begin AFP
15390 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
153a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
153c0 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c   AFP is the Appl
153d0 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f  e Filing Protoco
153e0 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74  l.  AFP is a net
153f0 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20  work filesystem 
15400 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c  found.** on Appl
15410 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70  e Macintosh comp
15420 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39  uters - both OS9
15430 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20   and OSX..**.** 
15440 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c  Third-party impl
15450 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41  ementations of A
15460 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  FP are available
15470 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65  .  But this code
15480 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f   here.** only wo
15490 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a  rks on OSX..*/..
154a0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
154b0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
154c0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
154d0 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  STYLE./*.** The 
154e0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
154f0 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  t structure cont
15500 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63  ains all afp loc
15510 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  k specific state
15520 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
15530 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
15540 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  text afpLockingC
15550 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61  ontext;.struct a
15560 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
15570 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65   {.  int reserve
15580 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
15590 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
155a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
155b0 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
155c0 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65  .};..struct Byte
155d0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20  RangeLockPB2.{. 
155e0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
155f0 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20  ong offset;     
15600 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20     /* offset to 
15610 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f  first byte to lo
15620 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
15630 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
15640 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72  h;        /* nbr
15650 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
15660 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
15670 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e  long long retRan
15680 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20  geStart; /* nbr 
15690 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b  of 1st byte lock
156a0 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
156b0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
156c0 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20  har unLockFlag; 
156d0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75          /* 1 = u
156e0 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20  nlock, 0 = lock 
156f0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
15700 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b  ar startEndFlag;
15710 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20         /* 1=rel 
15720 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20  to end of fork, 
15730 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a  0=rel to start *
15740 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15760 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65        /* file de
15770 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73  sc to assoc this
15780 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b   lock with */.};
15790 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42  ..#define afpfsB
157a0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
157b0 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28  TL        _IOWR(
157c0 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
157d0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
157e0 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  )../*.** This is
157f0 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73   a utility for s
15800 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69  etting or cleari
15810 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c  ng a bit-range l
15820 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50  ock on an.** AFP
15830 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20   filesystem..** 
15840 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
15850 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c  E_OK on success,
15860 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20   SQLITE_BUSY on 
15870 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
15880 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63  ic int afpSetLoc
15890 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  k(.  const char 
158a0 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  *path,          
158b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
158c0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f  he file to be lo
158d0 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64  cked or unlocked
158e0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
158f0 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
15900 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
15910 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
15920 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  path */.  unsign
15930 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
15940 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  set,     /* Firs
15950 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
15960 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ked */.  unsigne
15970 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
15980 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  th,     /* Numbe
15990 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
159a0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c  ck */.  int setL
159b0 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20  ockFlag         
159c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
159d0 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c  o set lock.  Fal
159e0 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b  se to clear lock
159f0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
15a00 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
15a10 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a   pb;.  int err;.
15a20 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c    .  pb.unLockFl
15a30 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67  ag = setLockFlag
15a40 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73   ? 0 : 1;.  pb.s
15a50 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b  tartEndFlag = 0;
15a60 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f  .  pb.offset = o
15a70 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67  ffset;.  pb.leng
15a80 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20  th = length; .  
15a90 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  pb.fd = pFile->h
15aa0 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28  ;.  .  OSTRACE((
15ab0 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d  "AFPSETLOCK [%s]
15ac0 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e   for %d%s in ran
15ad0 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c  ge %llx:%llx\n",
15ae0 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c   .    (setLockFl
15af0 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20  ag?"ON":"OFF"), 
15b00 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64  pFile->h, (pb.fd
15b10 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31  ==-1?"[testval-1
15b20 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73  ]":""),.    offs
15b30 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20  et, length));.  
15b40 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68  err = fsctl(path
15b50 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  , afpfsByteRange
15b60 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c  Lock2FSCTL, &pb,
15b70 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d   0);.  if ( err=
15b80 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
15b90 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  rc;.    int tErr
15ba0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
15bb0 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54  OSTRACE(("AFPSET
15bc0 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66  LOCK failed to f
15bd0 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25  sctl() '%s' %d %
15be0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
15bf0 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c     path, tErrno,
15c00 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f   strerror(tErrno
15c10 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  )));.#ifdef SQLI
15c20 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
15c30 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63  CK_ERRORS.    rc
15c40 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
15c50 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73  #else.    rc = s
15c60 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
15c70 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
15c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c90 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67       setLockFlag
15ca0 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   ? SQLITE_IOERR_
15cb0 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  LOCK : SQLITE_IO
15cc0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e  ERR_UNLOCK);.#en
15cd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
15ce0 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
15cf0 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20  RORS */.    if( 
15d00 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
15d10 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
15d20 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
15d30 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
15d40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15d50 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
15d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15d70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
15d80 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
15d90 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
15da0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
15db0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
15dc0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
15dd0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
15de0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
15df0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
15e00 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
15e10 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
15e20 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
15e30 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
15e40 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
15e50 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
15e60 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
15e70 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
15e80 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
15e90 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
15ea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15eb0 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
15ec0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
15ed0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
15ee0 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
15ef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
15f00 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
15f10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15f20 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15f30 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
15f40 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b  ontext *context;
15f50 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
15f60 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
15f70 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
15f80 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
15f90 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15fa0 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74  ile );.  context
15fb0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
15fc0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
15fd0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
15fe0 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72    if( context->r
15ff0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a  eserved ){.    *
16000 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20  pResOut = 1;.   
16010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16020 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
16030 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
16040 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
16050 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
16060 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
16070 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
16080 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
16090 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
160a0 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
160b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
160c0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
160d0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
160e0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
160f0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
16100 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
16110 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
16120 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
16130 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
16140 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
16150 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
16160 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
16170 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16180 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16190 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
161a0 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
161b0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72  f( SQLITE_OK==lr
161c0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  c ){.      /* if
161d0 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
161e0 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
161f0 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
16200 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
16210 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
16220 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
16230 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65       lrc = afpSe
16240 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16250 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
16260 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
16270 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
16280 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
16290 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
162a0 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
162b0 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
162c0 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
162d0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
162e0 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
162f0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
16300 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
16310 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
16320 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
16330 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
16340 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
16350 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
16360 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
16370 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
16380 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
16390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
163a0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
163b0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
163c0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
163d0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
163e0 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
163f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
16400 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
16410 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
16420 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
16430 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
16440 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
16450 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
16460 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
16470 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
16480 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
16490 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
164a0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
164b0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
164c0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
164d0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
164e0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
164f0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
16500 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
16510 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
16520 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
16530 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
16540 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
16550 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
16560 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
16570 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
16580 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
16590 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
165a0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
165b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
165c0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
165d0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
165e0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
165f0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
16600 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
16610 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
16620 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
16630 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
16640 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
16650 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
16660 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
16670 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
16680 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
16690 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
166a0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
166b0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
166c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
166d0 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
166e0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
166f0 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
16700 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16710 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16720 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
16730 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
16740 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
16750 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
16760 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
16770 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
16780 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
16790 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
167a0 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
167b0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
167c0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
167d0 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
167e0 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
167f0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
16800 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
16810 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
16820 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
16830 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
16840 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
16850 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
16860 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
16870 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65  ->nShared , osGe
16880 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20  tpid()));..  /* 
16890 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
168a0 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
168b0 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
168c0 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
168d0 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
168e0 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
168f0 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
16900 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
16910 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
16920 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
16930 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
16940 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
16950 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16960 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
16970 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
16980 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
16990 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61  already held) (a
169a0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
169b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
169c0 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
169d0 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
169e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
169f0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16a00 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
16a10 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
16a20 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
16a30 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
16a40 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
16a50 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
16a60 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
16a70 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
16a80 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
16a90 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
16aa0 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
16ab0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
16ac0 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
16ad0 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
16ae0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
16af0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
16b00 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
16b10 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
16b20 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
16b40 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
16b50 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
16b60 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
16b70 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
16b80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
16b90 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16ba0 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74    .  /* This mut
16bb0 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
16bc0 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
16bd0 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
16be0 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
16bf0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
16c00 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
16c10 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a  pFile->pInode;..
16c20 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
16c30 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
16c40 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
16c50 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
16c60 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
16c70 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
16c80 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
16c90 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
16ca0 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
16cb0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16cc0 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
16cd0 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28  ock && .       (
16ce0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16cf0 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
16d00 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
16d10 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20  RED_LOCK)).     
16d20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
16d30 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
16d40 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16d50 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61    }.  .  /* If a
16d60 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
16d70 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
16d80 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
16d90 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
16da0 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
16db0 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
16dc0 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
16dd0 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
16de0 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
16df0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
16e00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
16e10 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16e20 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e  CK && .     (pIn
16e30 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
16e40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
16e50 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16e60 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
16e70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16e80 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16e90 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
16ea0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
16eb0 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
16ec0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16ed0 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
16ee0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16ef0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
16f00 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
16f10 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
16f20 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
16f30 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
16f40 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20  ock;.  }.    .  
16f50 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
16f60 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
16f70 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
16f80 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
16f90 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
16fa0 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
16fb0 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
16fc0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
16fd0 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
16fe0 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
16ff0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
17000 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
17010 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
17020 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
17030 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
17040 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
17050 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
17060 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20     int failed;. 
17070 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
17080 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17090 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
170a0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
170b0 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c  1);.    if (fail
170c0 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed) {.      rc =
170d0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67   failed;.      g
170e0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
170f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
17100 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
17110 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
17120 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
17130 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
17140 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
17150 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
17160 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
17170 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
17180 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
17190 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
171a0 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20  int lrc1, lrc2, 
171b0 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lrc1Errno = 0;. 
171c0 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b     long lk, mask
171d0 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72  ;.    .    asser
171e0 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
171f0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
17200 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
17210 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
17220 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d       .    mask =
17230 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d   (sizeof(long)==
17240 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54  8) ? LARGEST_INT
17250 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b  64 : 0x7fffffff;
17260 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
17270 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48  the read-lock SH
17280 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  ARED_LOCK */.   
17290 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68   /* note that th
172a0 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65  e quality of the
172b0 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73   randomness does
172c0 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20  n't matter that 
172d0 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d  much */.    lk =
172e0 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20   random(); .    
172f0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
17300 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29  te = (lk & mask)
17310 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
17320 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61  1);.    lrc1 = a
17330 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17340 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17350 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41  , .          SHA
17360 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
17370 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
17380 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f   1);.    if( IS_
17390 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
173a0 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72   ){.      lrc1Er
173b0 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  rno = pFile->las
173c0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
173d0 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
173e0 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
173f0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32  lock */.    lrc2
17400 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17410 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17420 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
17430 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a  TE, 1, 0);.    .
17440 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
17450 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a  ERROR(lrc1) ) {.
17460 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
17470 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31  rrno(pFile, lrc1
17480 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  Errno);.      rc
17490 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67   = lrc1;.      g
174a0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
174b0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
174c0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
174d0 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63  rc2) ){.      rc
174e0 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67   = lrc2;.      g
174f0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
17500 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
17510 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f   lrc1 != SQLITE_
17520 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20  OK ) {.      rc 
17530 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c  = lrc1;.    } el
17540 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  se {.      pFile
17550 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
17560 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
17570 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
17580 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
17590 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
175a0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
175b0 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
175c0 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
175d0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
175e0 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
175f0 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
17600 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
17610 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
17620 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73  n this.     ** s
17630 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
17640 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
17650 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
17660 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
17670 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
17680 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
17690 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
176a0 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
176b0 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
176c0 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
176d0 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
176e0 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
176f0 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
17700 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
17710 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
17720 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
17730 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
17740 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
17750 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20    if (eFileLock 
17760 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  >= RESERVED_LOCK
17770 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
17780 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f  Lock < RESERVED_
17790 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
177a0 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
177b0 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ERVED lock */.  
177c0 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
177d0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
177e0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
177f0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
17800 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28   1,1);.      if(
17810 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20   !failed ){.    
17820 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
17830 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
17840 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
17850 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c  (!failed && eFil
17860 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49  eLock == EXCLUSI
17870 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  VE_LOCK) {.     
17880 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
17890 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f  XCLUSIVE lock */
178a0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
178b0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68  /* Remove the sh
178c0 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65  ared lock before
178d0 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67   trying the rang
178e0 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74  e.  we'll need t
178f0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73  o .      ** rees
17900 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
17910 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61  ed lock if we ca
17920 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70  n't get the  afp
17930 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a  Unlock.      */.
17940 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c        if( !(fail
17950 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
17960 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17970 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
17980 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20  IRST +.         
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
179b0 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20  te, 1, 0)) ){.  
179c0 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64        int failed
179d0 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
179e0 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74         /* now at
179f0 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68  temmpt to get th
17a00 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
17a10 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20   range */.      
17a20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
17a30 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17a40 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
17a50 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20  ARED_FIRST, .   
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
17a80 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20  ED_SIZE, 1);.   
17a90 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20       if( failed 
17aa0 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66  && (failed2 = af
17ab0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17ac0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17ad0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17ae0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
17af0 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e  FIRST + pInode->
17b00 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
17b10 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
17b20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62  /* Can't reestab
17b30 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
17b40 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61  lock.  Sqlite ca
17b50 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69  n't deal, this i
17b60 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
17b70 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72   critical I/O er
17b80 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ror.          */
17b90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17ba0 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54  ((failed & SQLIT
17bb0 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
17bc0 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c  TE_IOERR) ? fail
17bd0 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ed2 : .         
17be0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45        SQLITE_IOE
17bf0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
17c00 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
17c10 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20  lock;.        } 
17c20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17c30 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
17c40 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
17c50 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64  }.    if( failed
17c60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
17c70 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ailed;.    }.  }
17c80 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
17c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
17ca0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17cb0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
17cc0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
17cd0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
17ce0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
17cf0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
17d00 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
17d10 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
17d20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
17d30 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
17d40 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
17d50 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
17d60 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
17d70 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
17d80 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
17d90 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29 5c   %d %s %s (afp)\
17da0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
17db0 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
17dc0 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  ck), .         r
17dd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
17de0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
17df0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17e00 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
17e10 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
17e20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
17e30 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
17e40 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
17e50 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
17e60 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
17e70 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
17e80 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
17e90 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
17ea0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
17eb0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
17ec0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
17ed0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
17ee0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
17ef0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
17f00 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55  .static int afpU
17f10 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
17f20 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
17f30 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72  eLock) {.  int r
17f40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17f50 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17f60 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17f70 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
17f80 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  o *pInode;.  afp
17f90 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17fa0 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
17fb0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
17fc0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
17fd0 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69  ntext;.  int ski
17fe0 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66  pShared = 0;.#if
17ff0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18000 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d    int h = pFile-
18010 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  >h;.#endif..  as
18020 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
18030 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
18040 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
18050 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %d,%d) pid=%d (a
18060 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
18070 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
18080 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
18090 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
180a0 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
180b0 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
180c0 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
180d0 20 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28         osGetpid(
180e0 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
180f0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
18100 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
18110 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18120 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
18130 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18140 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
18150 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
18160 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
18170 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
18180 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18190 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
181a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
181b0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
181c0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
181d0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
181e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
181f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18200 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
18210 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18220 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
18230 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18240 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
18250 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
18260 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
18270 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
18280 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
18290 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
182a0 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
182b0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
182c0 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
182d0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
182e0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
182f0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
18300 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
18310 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18320 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
18330 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
18340 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
18350 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
18360 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
18370 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
18380 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
18390 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
183a0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
183b0 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
183c0 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
183d0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
183e0 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
183f0 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
18400 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
18410 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
18420 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
18430 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
18440 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
18450 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
18460 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
18470 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
18480 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
18490 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
184a0 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
184b0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
184c0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
184d0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
184e0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
184f0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
18500 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18510 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18520 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
18530 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
18540 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
18550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18560 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
18570 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
18580 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
18590 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
185a0 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
185b0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
185c0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
185d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
185e0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
185f0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
18600 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
18610 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
18620 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
18630 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
18640 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
18650 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
18660 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
18670 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
18680 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
18690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
186a0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
186b0 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
186c0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
186d0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
186e0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
186f0 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
18700 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
18710 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18720 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
18730 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
18740 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
18750 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
18760 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
18770 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
18780 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
18790 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
187a0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
187b0 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
187c0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
187d0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
187e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
187f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
18800 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
18810 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
18820 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
18830 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
18840 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
18850 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
18860 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18870 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
18880 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
18890 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
188a0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
188b0 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
188c0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
188d0 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
188e0 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
188f0 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
18900 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
18910 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
18920 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
18930 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
18940 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
18950 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
18960 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
18970 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
18980 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
18990 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
189a0 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
189b0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
189c0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
189d0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
189e0 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
189f0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
18a00 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
18a10 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
18a20 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
18a30 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18a40 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18a50 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
18a60 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
18a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18a80 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
18a90 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
18aa0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
18ab0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
18ac0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
18ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18ae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18af0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
18b00 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
18b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18b20 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
18b30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
18b40 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
18b50 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e          closePen
18b60 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
18b70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18b80 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
18b90 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
18ba0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
18bb0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18bc0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
18bd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18be0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
18bf0 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
18c00 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
18c10 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
18c20 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
18c30 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
18c40 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
18c50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
18c60 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
18c70 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
18c80 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
18c90 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
18ca0 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
18cb0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
18cc0 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
18cd0 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
18ce0 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
18cf0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
18d00 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
18d10 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
18d20 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
18d30 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
18d40 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
18d50 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
18d60 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
18d70 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
18d80 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
18d90 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
18da0 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
18db0 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
18dc0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
18dd0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
18de0 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
18df0 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
18e00 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
18e10 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
18e20 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
18e30 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
18e40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
18e50 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
18e60 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
18e70 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
18e80 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
18e90 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
18ea0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
18eb0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
18ec0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
18ed0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
18ee0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
18ef0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
18f00 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
18f10 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
18f20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
18f30 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
18f40 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
18f50 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
18f60 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
18f70 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
18f80 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
18f90 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
18fa0 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
18fb0 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
18fc0 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
18fd0 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
18fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ff0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
19000 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
19010 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
19020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
19030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
19080 0a 2f 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
190e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
190f0 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
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 2f  ***************/
19120 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
19130 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
19140 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
19150 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
19160 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
19170 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
19180 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
19190 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
191a0 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73  FileLock. ** mus
191b0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
191c0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
191d0 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74  CK.. **. ** If t
191e0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
191f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
19200 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
19210 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20  dy at or below. 
19220 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
19230 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
19240 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
19250 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61  a no-op.. */.sta
19260 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63  tic int nfsUnloc
19270 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
19280 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
19290 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
192a0 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
192b0 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
192c0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
192d0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
192e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
192f0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
19300 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
19310 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
19320 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
19330 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
19340 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
19350 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
19360 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
19370 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
19380 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
19390 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
193a0 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
193c0 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
193d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
193e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19440 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
19450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19490 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
194a0 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
194b0 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
194c0 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
194d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194e0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
194f0 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
19500 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
19510 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
19520 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
19530 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
19540 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
19550 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
19560 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
19570 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
19580 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
19590 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
195a0 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
195b0 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
195c0 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
195d0 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
195e0 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
195f0 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
19600 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
19610 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
19620 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
19630 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
19640 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
19650 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
19660 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
19670 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
19680 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
19690 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
196a0 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
196b0 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
196c0 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
196d0 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
196e0 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
196f0 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
19700 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
19710 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
19720 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
19730 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
19740 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
19750 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
19760 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
19770 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e   USE_PREAD.** in
19780 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66   any form by def
19790 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f  ault, we will no
197a0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66  t attempt to def
197b0 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
197c0 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74  E..** See ticket
197d0 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38  s #2741 and #268
197e0 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  1..**.** To avoi
197f0 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
19800 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
19810 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20  failed read the 
19820 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
19830 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
19840 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
19850 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
19860 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a  dRead(unixFile *
19870 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
19880 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a  4 offset, void *
19890 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
198a0 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74    int got;.  int
198b0 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20   prior = 0;.#if 
198c0 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
198d0 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
198e0 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
198f0 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
19900 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
19910 54 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20  TART;.  assert( 
19920 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66  cnt==(cnt&0x1fff
19930 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
19940 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 63 6e 74  id->h>2 );.  cnt
19950 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 64   &= 0x1ffff;.  d
19960 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  o{.#if defined(U
19970 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67 6f  SE_PREAD).    go
19980 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e  t = osPread(id->
19990 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
199a0 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c  fset);.    Simul
199b0 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
199c0 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65  = -1 );.#elif de
199d0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
199e0 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50  4).    got = osP
199f0 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42  read64(id->h, pB
19a00 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
19a10 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
19a20 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
19a30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65 77  );.#else.    new
19a40 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69  Offset = lseek(i
19a50 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45  d->h, offset, SE
19a60 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d  EK_SET);.    Sim
19a70 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
19a80 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20  wOffset-- );.   
19a90 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
19aa0 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  offset ){.      
19ab0 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
19ac0 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73   -1 ){.        s
19ad0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75  toreLastErrno((u
19ae0 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72  nixFile*)id, err
19af0 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  no);.      }else
19b00 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
19b10 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
19b20 6c 65 2a 29 69 64 2c 20 30 29 3b 0a 20 20 20 20  le*)id, 0);.    
19b30 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
19b40 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   -1;.    }.    g
19b50 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e  ot = osRead(id->
19b60 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
19b70 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67 6f  endif.    if( go
19b80 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a  t==cnt ) break;.
19b90 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b      if( got<0 ){
19ba0 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f  .      if( errno
19bb0 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d  ==EINTR ){ got =
19bc0 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a   1; continue; }.
19bd0 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30 3b        prior = 0;
19be0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
19bf0 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a  Errno((unixFile*
19c00 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a 20 20  )id,  errno);.  
19c10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19c20 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29  else if( got>0 )
19c30 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67  {.      cnt -= g
19c40 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  ot;.      offset
19c50 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
19c60 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20  rior += got;.   
19c70 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
19c80 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70  )(got + (char*)p
19c90 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  Buf);.    }.  }w
19ca0 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20  hile( got>0 );. 
19cb0 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53   TIMER_END;.  OS
19cc0 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20  TRACE(("READ    
19cd0 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
19ce0 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llu\n",.        
19cf0 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70      id->h, got+p
19d00 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69  rior, offset-pri
19d10 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  or, TIMER_ELAPSE
19d20 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
19d30 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  t+prior;.}../*.*
19d40 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
19d50 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
19d60 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
19d70 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
19d80 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
19d90 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
19da0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
19db0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
19dc0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
19dd0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65  tatic int unixRe
19de0 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
19df0 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20  le *id, .  void 
19e00 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
19e10 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
19e20 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75  64 offset.){.  u
19e30 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
19e40 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
19e50 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73  .  int got;.  as
19e60 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
19e70 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
19e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
19e90 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
19ea0 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
19eb0 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
19ec0 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
19ed0 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
19ee0 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
19ef0 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
19f00 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
19f10 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
19f20 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
19f30 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
19f40 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20  le->pUnused==0. 
19f50 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
19f60 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
19f70 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
19f80 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
19f90 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
19fa0 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  f..#if SQLITE_MA
19fb0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
19fc0 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
19fd0 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61  much of this rea
19fe0 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  d request as pos
19ff0 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
1a000 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
1a010 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
1a020 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
1a030 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
1a040 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
1a050 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
1a060 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
1a070 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1a080 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1a090 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
1a0a0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1a0b0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74  n))[offset], amt
1a0c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a0d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1a0e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1a0f0 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d  nCopy = pFile->m
1a100 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
1a110 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
1a120 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
1a130 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1a140 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
1a150 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
1a160 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
1a170 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
1a180 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
1a190 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
1a1a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1a1b0 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41  f..  got = seekA
1a1c0 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66  ndRead(pFile, of
1a1d0 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1a1e0 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  ;.  if( got==amt
1a1f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1a200 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1a210 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20  e if( got<0 ){. 
1a220 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1a230 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
1a240 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ad */.    return
1a250 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
1a260 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1a270 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1a280 70 46 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20  pFile, 0);   /* 
1a290 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
1a2a0 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72  or */.    /* Unr
1a2b0 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
1a2c0 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
1a2d0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
1a2e0 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
1a2f0 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30  r*)pBuf)[got], 0
1a300 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20  , amt-got);.    
1a310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a320 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
1a330 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
1a340 65 6d 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65  empt to seek the
1a350 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
1a360 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1a370 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
1a380 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66  .** absolute off
1a390 73 65 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61  set iOff, then a
1a3a0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
1a3b0 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 64 61  nBuf bytes of da
1a3c0 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20  ta from.** pBuf 
1a3d0 74 6f 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72  to it. If an err
1a3e0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
1a3f0 6e 20 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69  n -1 and set *pi
1a400 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  Errno. Otherwise
1a410 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  , .** return the
1a420 20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f   actual number o
1a430 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
1a440 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65  (which may be le
1a450 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29  ss than.** nBuf)
1a460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a470 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a  seekAndWriteFd(.
1a480 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20    int fd,       
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
1a4b0 70 74 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f  ptor to write to
1a4c0 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20   */.  i64 iOff, 
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66        /* File of
1a4f0 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72  fset to begin wr
1a500 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f  iting at */.  co
1a510 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a530 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1a540 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 74  this buffer to t
1a550 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
1a560 20 6e 42 75 66 2c 20 20 20 20 20 20 20 20 20 20   nBuf,          
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a580 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
1a590 42 75 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  Buf in bytes */.
1a5a0 20 20 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20    int *piErrno  
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
1a5d0 6e 75 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20  number if error 
1a5e0 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1a5f0 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a610 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1a620 20 62 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   by system call 
1a630 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42  */..  assert( nB
1a640 75 66 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66  uf==(nBuf&0x1fff
1a650 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
1a660 66 64 3e 32 20 29 3b 0a 20 20 6e 42 75 66 20 26  fd>2 );.  nBuf &
1a670 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d  = 0x1ffff;.  TIM
1a680 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64  ER_START;..#if d
1a690 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1a6a0 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e  ).  do{ rc = (in
1a6b0 74 29 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70  t)osPwrite(fd, p
1a6c0 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29  Buf, nBuf, iOff)
1a6d0 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
1a6e0 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1a6f0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1a700 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64  USE_PREAD64).  d
1a710 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50  o{ rc = (int)osP
1a720 77 72 69 74 65 36 34 28 66 64 2c 20 70 42 75 66  write64(fd, pBuf
1a730 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77  , nBuf, iOff);}w
1a740 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1a750 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c  rno==EINTR);.#el
1a760 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34  se.  do{.    i64
1a770 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66   iSeek = lseek(f
1a780 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45  d, iOff, SEEK_SE
1a790 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
1a7a0 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 2d 2d  IOError( iSeek--
1a7b0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 53 65   );..    if( iSe
1a7c0 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20  ek!=iOff ){.    
1a7d0 20 20 69 66 28 20 70 69 45 72 72 6e 6f 20 29 20    if( piErrno ) 
1a7e0 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69 53 65 65  *piErrno = (iSee
1a7f0 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f 20 3a 20  k==-1 ? errno : 
1a800 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
1a810 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   -1;.    }.    r
1a820 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20  c = osWrite(fd, 
1a830 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d  pBuf, nBuf);.  }
1a840 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
1a850 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
1a860 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45  endif..  TIMER_E
1a870 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ND;.  OSTRACE(("
1a880 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
1a890 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
1a8a0 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49  fd, rc, iOff, TI
1a8b0 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a  MER_ELAPSED));..
1a8c0 20 20 69 66 28 20 72 63 3c 30 20 26 26 20 70 69    if( rc<0 && pi
1a8d0 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f  Errno ) *piErrno
1a8e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75   = errno;.  retu
1a8f0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1a900 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
1a910 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65  set in id->offse
1a920 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  t then read cnt 
1a930 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
1a940 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1a950 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
1a960 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55  ctually read.  U
1a970 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74  pdate the offset
1a980 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
1a990 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
1a9a0 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
1a9b0 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20  ailed write the 
1a9c0 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
1a9d0 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
1a9e0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1a9f0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1aa00 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20  dWrite(unixFile 
1aa10 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *id, i64 offset,
1aa20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1aa30 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72  f, int cnt){.  r
1aa40 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57 72 69  eturn seekAndWri
1aa50 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73  teFd(id->h, offs
1aa60 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 26  et, pBuf, cnt, &
1aa70 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a  id->lastErrno);.
1aa80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
1aa90 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1aaa0 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
1aab0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1aac0 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
1aad0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
1aae0 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
1aaf0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
1ab00 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20  nt unixWrite(.  
1ab10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1ab20 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
1ab30 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
1ab40 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
1ab50 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20  64 offset .){.  
1ab60 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1ab70 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1ab80 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30  .  int wrote = 0
1ab90 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
1aba0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ;.  assert( amt>
1abb0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
1abc0 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
1abd0 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
1abe0 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
1abf0 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
1ac00 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
1ac10 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
1ac20 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
1ac30 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
1ac40 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
1ac50 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
1ac60 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
1ac70 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
1ac80 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
1ac90 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1aca0 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
1acb0 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
1acc0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1acd0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
1ace0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1acf0 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1ad00 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1ad10 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
1ad20 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1ad30 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1ad40 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1ad50 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1ad60 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
1ad70 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
1ad80 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
1ad90 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
1ada0 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
1adb0 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
1adc0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1add0 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
1ade0 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
1adf0 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
1ae00 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1ae10 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
1ae20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
1ae30 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
1ae40 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1ae50 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
1ae60 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
1ae70 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
1ae80 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
1ae90 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
1aea0 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
1aeb0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1aec0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1aed0 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
1aee0 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
1aef0 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
1af00 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1af10 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
1af20 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
1af30 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
1af40 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
1af50 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
1af60 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
1af70 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1af80 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
1af90 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
1afa0 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
1afb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1afc0 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1afd0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1afe0 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
1aff0 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
1b000 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
1b010 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
1b020 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
1b030 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
1b040 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
1b050 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
1b060 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
1b070 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1b080 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
1b090 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
1b0a0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
1b0b0 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1b0c0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1b0d0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1b0e0 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  , amt);.      re
1b0f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b110 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69   int nCopy = pFi
1b120 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
1b130 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d  ffset;.      mem
1b140 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
1b150 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1b160 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1b170 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
1b180 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
1b190 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
1b1a0 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
1b1b0 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
1b1c0 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
1b1d0 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28  #endif..  while(
1b1e0 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
1b1f0 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1b200 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
1b210 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a  Buf, amt))>0 ){.
1b220 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
1b230 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  ;.    offset += 
1b240 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20  wrote;.    pBuf 
1b250 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  = &((char*)pBuf)
1b260 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53  [wrote];.  }.  S
1b270 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28  imulateIOError((
1b280 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74   wrote=(-1), amt
1b290 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74  =1 ));.  Simulat
1b2a0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28  eDiskfullError((
1b2b0 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20   wrote=0, amt=1 
1b2c0 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30  ));..  if( amt>0
1b2d0 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74   ){.    if( wrot
1b2e0 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61  e<0 && pFile->la
1b2f0 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20  stErrno!=ENOSPC 
1b300 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74  ){.      /* last
1b310 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1b320 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
1b330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b340 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1b350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1b360 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1b370 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74 20  ile, 0); /* not 
1b380 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1b390 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1b3a0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1b3b0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1b3c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1b3d0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1b3e0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1b3f0 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
1b400 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
1b410 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
1b420 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
1b430 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
1b440 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
1b450 75 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  urring at the ri
1b460 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
1b470 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
1b480 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
1b490 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1b4a0 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
1b4b0 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f  ../*.** We do no
1b4c0 74 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20  t trust systems 
1b4d0 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72  to provide a wor
1b4e0 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29  king fdatasync()
1b4f0 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f  .  Some do..** O
1b500 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f  thers do no.  To
1b510 20 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c   be safe, we wil
1b520 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65  l stick with the
1b530 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65   (slightly slowe
1b540 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49  r).** fsync(). I
1b550 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20  f you know that 
1b560 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73  your system does
1b570 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79   support fdatasy
1b580 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a  nc() correctly,.
1b590 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63  ** then simply c
1b5a0 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64  ompile with -Dfd
1b5b0 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e  atasync=fdatasyn
1b5c0 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44 41 54  c or -DHAVE_FDAT
1b5d0 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21 64 65  ASYNC.*/.#if !de
1b5e0 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
1b5f0 20 26 26 20 21 48 41 56 45 5f 46 44 41 54 41 53   && !HAVE_FDATAS
1b600 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61  YNC.# define fda
1b610 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
1b620 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
1b630 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1b640 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
1b650 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
1b660 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
1b670 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
1b680 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
1b690 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
1b6a0 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
1b6b0 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
1b6c0 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
1b6d0 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
1b6e0 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
1b6f0 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
1b700 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
1b710 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
1b720 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
1b730 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
1b740 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
1b750 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
1b760 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
1b770 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
1b780 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
1b790 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
1b7a0 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
1b7b0 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
1b7c0 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
1b7d0 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
1b7e0 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
1b7f0 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
1b800 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
1b810 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
1b820 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
1b830 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
1b840 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
1b850 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
1b860 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
1b870 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
1b880 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
1b890 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
1b8a0 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
1b8b0 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
1b8c0 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
1b8d0 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
1b8e0 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
1b8f0 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
1b900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b910 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  e..**.** SQLite 
1b920 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c  sets the dataOnl
1b930 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69  y flag if the si
1b940 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
1b950 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  s unchanged..** 
1b960 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20  The idea behind 
1b970 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74  dataOnly is that
1b980 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20   it should only 
1b990 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63  write the file c
1b9a0 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73  ontent.** to dis
1b9b0 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65  k, not the inode
1b9c0 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64  .  We only set d
1b9d0 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66  ataOnly if the f
1b9e0 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20  ile size is .** 
1b9f0 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  unchanged since 
1ba00 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
1ba10 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f   part of the ino
1ba20 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a  de.  However, .*
1ba30 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73  * Ted Ts'o tells
1ba40 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79   us that fdatasy
1ba50 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77  nc() will also w
1ba60 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69  rite the inode i
1ba70 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69  f the.** file si
1ba80 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ze has changed. 
1ba90 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64   The only real d
1baa0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1bab0 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a  n fdatasync().**
1bac0 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65   and fsync(), Te
1bad0 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74  d tells us, is t
1bae0 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
1baf0 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74  will not flush t
1bb00 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74  he.** inode if t
1bb10 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65  he mtime or owne
1bb20 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65  r or other inode
1bb30 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65   attributes have
1bb40 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20   changed..** We 
1bb50 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
1bb60 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e  the file size, n
1bb70 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c  ot the other fil
1bb80 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f  e attributes, so
1bb90 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51  .** as far as SQ
1bba0 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65  Lite is concerne
1bbb0 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28  d, an fdatasync(
1bbc0 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71  ) is always adeq
1bbd0 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20  uate..** So, we 
1bbe0 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61  always use fdata
1bbf0 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20  sync() if it is 
1bc00 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72  available, regar
1bc10 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20  dless of.** the 
1bc20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
1bc30 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73  aOnly flag..*/.s
1bc40 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66  tatic int full_f
1bc50 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74  sync(int fd, int
1bc60 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64   fullSync, int d
1bc70 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  ataOnly){.  int 
1bc80 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  rc;..  /* The fo
1bc90 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65  llowing "ifdef/e
1bca0 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b  lif/else/" block
1bcb0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74   has the same st
1bcc0 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20  ructure as.  ** 
1bcd0 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49  the one below. I
1bce0 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20  t is replicated 
1bcf0 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61  here solely to a
1bd00 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20  void cluttering 
1bd10 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61  .  ** up the rea
1bd20 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20  l code with the 
1bd30 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bd40 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a  () macros..  */.
1bd50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1bd60 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  _SYNC.  UNUSED_P
1bd70 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
1bd80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bd90 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
1bda0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1bdb0 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20  ataOnly);.#elif 
1bdc0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1bdd0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1bde0 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1bdf0 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
1be00 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
1be10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1be20 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1be30 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f  endif..  /* Reco
1be40 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
1be50 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64   times that we d
1be60 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63  o a normal fsync
1be70 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c  () and .  ** FUL
1be80 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20  LSYNC.  This is 
1be90 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74  used during test
1bea0 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
1beb0 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  at this procedur
1bec0 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c  e.  ** gets call
1bed0 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  ed with the corr
1bee0 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20  ect arguments.. 
1bef0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1bf00 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c  E_TEST.  if( ful
1bf10 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f  lSync ) sqlite3_
1bf20 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
1bf30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  ;.  sqlite3_sync
1bf40 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
1bf50 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
1bf60 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
1bf70 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
1bf80 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
1bf90 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
1bfa0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1bfb0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63  ITE_NO_SYNC.  rc
1bfc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
1bfd0 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1bfe0 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
1bff0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c ){.    rc = os
1c000 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  Fcntl(fd, F_FULL
1c010 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
1c020 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
1c030 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
1c040 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
1c050 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
1c060 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
1c070 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
1c080 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
1c090 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
1c0a0 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
1c0b0 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
1c0c0 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
1c0d0 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
1c0e0 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
1c0f0 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
1c100 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
1c110 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
1c120 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
1c130 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
1c140 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
1c150 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
1c160 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
1c170 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
1c180 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
1c190 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
1c1a0 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
1c1b0 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
1c1c0 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
1c1d0 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
1c1e0 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
1c1f0 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
1c200 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
1c210 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
1c220 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
1c230 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
1c240 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
1c250 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
1c260 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
1c270 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
1c280 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
1c290 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
1c2a0 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
1c2b0 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
1c2c0 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
1c2d0 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
1c2e0 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
1c2f0 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
1c300 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
1c310 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
1c320 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
1c330 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
1c340 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
1c350 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
1c360 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
1c370 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
1c380 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
1c390 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
1c3a0 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
1c3b0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
1c3c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c3d0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
1c3e0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
1c3f0 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1c400 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69  taining file zFi
1c410 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75  lename..** If su
1c420 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69  ccessful, *pFd i
1c430 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65  s set to the ope
1c440 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ned file descrip
1c450 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  tor and.** SQLIT
1c460 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c470 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1c480 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c  curs, either SQL
1c490 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20  ITE_NOMEM.** or 
1c4a0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1c4b0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1c4c0 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61  *pFd is set to a
1c4d0 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76  n undefined.** v
1c4e0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alue..**.** The 
1c4f0 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
1c500 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65  escriptor is use
1c510 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74  d for only one t
1c520 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79  hing - to.** fsy
1c530 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79  nc() a directory
1c540 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69   to make sure fi
1c550 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  le creation and 
1c560 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a  deletion events.
1c570 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ** are flushed t
1c580 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73  o disk.  Such fs
1c590 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65  yncs are not nee
1c5a0 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20  ded on newer.** 
1c5b0 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73  journaling files
1c5c0 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20  ystems, but are 
1c5d0 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65  required on olde
1c5e0 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  r filesystems..*
1c5f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c600 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  e can be overrid
1c610 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53  den using the xS
1c620 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66  etSysCall interf
1c630 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c  ace..** The abil
1c640 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20  ity to override 
1c650 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1c660 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72   added in suppor
1c670 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f  t of the.** chro
1c680 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f  mium sandbox.  O
1c690 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f  pening a directo
1c6a0 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79  ry is a security
1c6b0 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a   risk (we are.**
1c6c0 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67   told) so making
1c6d0 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65   it overrideable
1c6e0 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f   allows the chro
1c6f0 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a  mium sandbox to.
1c700 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20  ** replace this 
1c710 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68  routine with a h
1c720 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20  armless no-op.  
1c730 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75  To make this rou
1c740 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c  tine.** a no-op,
1c750 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
1c760 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74   a stub that ret
1c770 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62  urns SQLITE_OK b
1c780 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46  ut leaves.** *pF
1c790 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74  d set to a negat
1c7a0 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  ive number..**.*
1c7b0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1c7c0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1c7d0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1c7e0 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e  sible for closin
1c7f0 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  g.** the file de
1c800 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73  scriptor *pFd us
1c810 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a  ing close()..*/.
1c820 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
1c830 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
1c840 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1c850 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74  int *pFd){.  int
1c860 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   ii;.  int fd = 
1c870 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e  -1;.  char zDirn
1c880 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
1c890 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  +1];..  sqlite3_
1c8a0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1c8b0 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c  HNAME, zDirname,
1c8c0 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65   "%s", zFilename
1c8d0 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74  );.  for(ii=(int
1c8e0 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  )strlen(zDirname
1c8f0 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e  ); ii>1 && zDirn
1c900 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
1c910 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
1c920 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
1c930 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ii] = '\0';.    
1c940 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
1c950 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
1c960 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
1c970 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  ;.    if( fd>=0 
1c980 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1c990 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
1c9a0 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
1c9b0 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
1c9c0 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
1c9d0 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
1c9e0 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45  LITE_OK:unixLogE
1c9f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1ca00 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
1ca10 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d  ", zDirname));.}
1ca20 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1ca30 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
1ca40 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
1ca50 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
1ca60 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
1ca70 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
1ca80 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
1ca90 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
1caa0 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
1cab0 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
1cac0 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
1cad0 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
1cae0 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
1caf0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
1cb00 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1cb10 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
1cb20 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
1cb30 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
1cb40 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1cb50 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
1cb60 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
1cb70 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
1cb80 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1cb90 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
1cba0 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
1cbb0 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
1cbc0 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
1cbd0 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
1cbe0 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
1cbf0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1cc00 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
1cc10 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
1cc20 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
1cc30 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
1cc40 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
1cc50 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1cc60 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
1cc70 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
1cc80 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1cc90 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
1cca0 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
1ccb0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1ccc0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
1ccd0 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
1cce0 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
1ccf0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1cd00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1cd10 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
1cd20 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
1cd30 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1cd40 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1cd50 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1cd60 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
1cd70 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
1cd80 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1cd90 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
1cda0 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
1cdb0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1cdc0 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
1cdd0 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
1cde0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1cdf0 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
1ce00 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
1ce10 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
1ce20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1ce30 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
1ce40 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1ce50 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
1ce60 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
1ce70 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
1ce80 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
1ce90 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
1cea0 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
1ceb0 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
1cec0 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
1ced0 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
1cee0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
1cef0 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1cf00 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
1cf10 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
1cf20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1cf30 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1cf40 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
1cf50 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63  pFile->h));.  rc
1cf60 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
1cf70 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
1cf80 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
1cf90 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1cfa0 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1cfb0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72  ( rc ){.    stor
1cfc0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1cfd0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
1cfe0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1cff0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
1d000 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e  SYNC, "full_fsyn
1d010 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  c", pFile->zPath
1d020 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73  );.  }..  /* Als
1d030 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65  o fsync the dire
1d040 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1d050 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65   the file if the
1d060 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20   DIRSYNC flag.  
1d070 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73  ** is set.  This
1d080 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f   is a one-time o
1d090 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79  ccurrence.  Many
1d0a0 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c   systems (exampl
1d0b0 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72  es: AIX).  ** ar
1d0c0 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e  e unable to fsyn
1d0d0 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73  c a directory, s
1d0e0 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20  o ignore errors 
1d0f0 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20  on the fsync..  
1d100 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1d110 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1d120 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a  FILE_DIRSYNC ){.
1d130 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20      int dirfd;. 
1d140 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52     OSTRACE(("DIR
1d150 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75  SYNC %s (have_fu
1d160 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
1d170 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
1d180 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20  e->zPath,.      
1d190 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
1d1a0 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
1d1b0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  ));.    rc = osO
1d1c0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69  penDirectory(pFi
1d1d0 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66  le->zPath, &dirf
1d1e0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1d1f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72  SQLITE_OK && dir
1d200 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  fd>=0 ){.      f
1d210 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c  ull_fsync(dirfd,
1d220 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f   0, 0);.      ro
1d230 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
1d240 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
1d250 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  _);.    }else if
1d260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
1d270 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72  TOPEN ){.      r
1d280 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d290 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1d2a0 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e  ctrlFlags &= ~UN
1d2b0 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a  IXFILE_DIRSYNC;.
1d2c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d2d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1d2e0 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
1d2f0 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
1d300 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
1d310 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
1d320 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1d330 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75   i64 nByte){.  u
1d340 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1d350 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1d360 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
1d370 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1d380 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1d390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1d3a0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b  OERR_TRUNCATE );
1d3b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
1d3c0 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
1d3d0 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
1d3e0 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
1d3f0 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
1d400 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
1d410 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
1d420 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
1d430 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
1d440 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
1d450 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
1d460 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
1d470 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
1d480 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
1d490 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
1d4a0 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1d4b0 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  nk>0 ){.    nByt
1d4c0 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
1d4d0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
1d4e0 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
1d4f0 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
1d500 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  nk;.  }..  rc = 
1d510 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1d520 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65  (pFile->h, nByte
1d530 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1d540 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1d550 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
1d560 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1d570 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1d580 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1d590 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1d5a0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
1d5b0 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
1d5c0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1d5d0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1d5e0 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
1d5f0 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
1d600 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
1d610 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
1d620 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1d630 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1d640 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1d650 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
1d660 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1d670 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
1d680 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1d690 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
1d6a0 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
1d6b0 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
1d6c0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1d6d0 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
1d6e0 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
1d6f0 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
1d700 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
1d710 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
1d720 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
1d730 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
1d740 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
1d750 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1d760 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29  te && nByte==0 )
1d770 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74  {.      pFile->t
1d780 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1d790 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1d7a0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1d7b0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f  MAP_SIZE>0.    /
1d7c0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
1d7d0 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64  s just truncated
1d7e0 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c   to a size small
1d7f0 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
1d800 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70  ently.    ** map
1d810 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75  ped region, redu
1d820 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1d830 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73   mapping size as
1d840 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69   well. SQLite wi
1d850 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65  ll.    ** use re
1d860 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29  ad() and write()
1d870 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20   to access data 
1d880 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e  beyond this poin
1d890 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20  t from now on.  
1d8a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d8b0 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61  nByte<pFile->mma
1d8c0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  pSize ){.      p
1d8d0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
1d8e0 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65   nByte;.    }.#e
1d8f0 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e  ndif..    return
1d900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d910 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
1d920 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
1d930 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
1d940 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
1d950 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a   int unixFileSiz
1d960 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1d970 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
1d980 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72  .  int rc;.  str
1d990 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
1d9a0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1d9b0 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75  rc = osFstat(((u
1d9c0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
1d9d0 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
1d9e0 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1d9f0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
1da00 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
1da10 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1da20 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  id, errno);.    
1da30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1da40 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20  ERR_FSTAT;.  }. 
1da50 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74   *pSize = buf.st
1da60 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65  _size;..  /* Whe
1da70 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f  n opening a zero
1da80 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20  -size database, 
1da90 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  the findInodeInf
1daa0 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20  o() procedure.  
1dab0 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67  ** writes a sing
1dac0 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61  le byte into tha
1dad0 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  t file in order 
1dae0 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
1daf0 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65   bug.  ** in the
1db00 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65   OS-X msdos file
1db10 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65  system.  In orde
1db20 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
1db30 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20  ems with upper. 
1db40 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e   ** layers, we n
1db50 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  eed to report th
1db60 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20  is file size as 
1db70 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68  zero even though
1db80 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c   it is.  ** real
1db90 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23  ly 1.   Ticket #
1dba0 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3260..  */.  if(
1dbb0 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53   *pSize==1 ) *pS
1dbc0 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74  ize = 0;...  ret
1dbd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1dbe0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1dbf0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1dc00 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1dc10 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61  PPLE__)./*.** Ha
1dc20 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d  ndler for proxy-
1dc30 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e  locking file-con
1dc40 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66  trol verbs.  Def
1dc50 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68  ined below in th
1dc60 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f  e.** proxying lo
1dc70 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a  cking division..
1dc80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
1dc90 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
1dca0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1dcb0 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1dcc0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
1dcd0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1dce0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51  to handle the SQ
1dcf0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1dd00 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f  HINT .** file-co
1dd10 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e  ntrol operation.
1dd20 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61    Enlarge the da
1dd30 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73  tabase to nBytes
1dd40 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75   in size.** (rou
1dd50 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e  nded up to the n
1dd60 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e  ext chunk-size).
1dd70 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1dd80 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  e is already.** 
1dd90 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72  nBytes or larger
1dda0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1ddb0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1ddc0 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69  atic int fcntlSi
1ddd0 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20  zeHint(unixFile 
1dde0 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74  *pFile, i64 nByt
1ddf0 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e){.  if( pFile-
1de00 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
1de10 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20    i64 nSize;    
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65  /* Required file
1de40 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
1de50 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20  uct stat buf;   
1de60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1de70 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72  ed to hold retur
1de80 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61  n values of fsta
1de90 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69  t() */.   .    i
1dea0 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65  f( osFstat(pFile
1deb0 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20  ->h, &buf) ){.  
1dec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ded0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1dee0 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20     }..    nSize 
1def0 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d  = ((nByte+pFile-
1df00 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46  >szChunk-1) / pF
1df10 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1df20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1df30 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69      if( nSize>(i
1df40 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  64)buf.st_size )
1df50 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  {..#if defined(H
1df60 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1df70 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53  ATE) && HAVE_POS
1df80 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20  IX_FALLOCATE.   
1df90 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62     /* The code b
1dfa0 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67  elow is handling
1dfb0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1dfc0 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65  e of osFallocate
1dfd0 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  () .      ** cor
1dfe0 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61  rectly. posix_fa
1dff0 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66  llocate() is def
1e000 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73  ined to "returns
1e010 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
1e020 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61  , .      ** or a
1e030 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f  n error number o
1e040 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65  n  failure". See
1e050 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72   the manpage for
1e060 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1e070 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
1e080 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72    do{.        er
1e090 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28  r = osFallocate(
1e0a0 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74  pFile->h, buf.st
1e0b0 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66  _size, nSize-buf
1e0c0 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20  .st_size);.     
1e0d0 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49   }while( err==EI
1e0e0 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28  NTR );.      if(
1e0f0 20 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51   err ) return SQ
1e100 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1e110 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a  ;.#else.      /*
1e120 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20   If the OS does 
1e130 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66  not have posix_f
1e140 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65  allocate(), fake
1e150 20 69 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20   it. Write a .  
1e160 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
1e170 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62  te to the last b
1e180 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63  yte in each bloc
1e190 6b 20 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74  k that falls ent
1e1a0 69 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77  irely.      ** w
1e1b0 69 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64  ithin the extend
1e1c0 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c  ed region. Then,
1e1d0 20 69 66 20 72 65 71 75 69 72 65 64 2c 20 61 20   if required, a 
1e1e0 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20  single byte.    
1e1f0 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28    ** at offset (
1e200 6e 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74  nSize-1), to set
1e210 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1e220 20 66 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e   file correctly.
1e230 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
1e240 73 20 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68  s a similar tech
1e250 6e 69 71 75 65 20 74 6f 20 74 68 61 74 20 75 73  nique to that us
1e260 65 64 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73  ed by glibc on s
1e270 79 73 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ystems.      ** 
1e280 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65  that do not have
1e290 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74   a real fallocat
1e2a0 65 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20  e() call..      
1e2b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  */.      int nBl
1e2c0 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69  k = buf.st_blksi
1e2d0 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73  ze;  /* File-sys
1e2e0 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a  tem block size *
1e2f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69  /.      int nWri
1e300 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  te = 0;         
1e310 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e320 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 62   bytes written b
1e330 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a  y seekAndWrite *
1e340 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69  /.      i64 iWri
1e350 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1e360 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73      /* Next offs
1e370 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  et to write to *
1e380 2f 0a 0a 20 20 20 20 20 20 69 57 72 69 74 65 20  /..      iWrite 
1e390 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20  = ((buf.st_size 
1e3a0 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42  + 2*nBlk - 1)/nB
1e3b0 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20  lk)*nBlk-1;.    
1e3c0 20 20 61 73 73 65 72 74 28 20 69 57 72 69 74 65    assert( iWrite
1e3d0 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 3b  >=buf.st_size );
1e3e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1e3f0 69 57 72 69 74 65 2f 6e 42 6c 6b 29 3d 3d 28 28  iWrite/nBlk)==((
1e400 62 75 66 2e 73 74 5f 73 69 7a 65 2b 6e 42 6c 6b  buf.st_size+nBlk
1e410 2d 31 29 2f 6e 42 6c 6b 29 20 29 3b 0a 20 20 20  -1)/nBlk) );.   
1e420 20 20 20 61 73 73 65 72 74 28 20 28 28 69 57 72     assert( ((iWr
1e430 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20  ite+1)%nBlk)==0 
1e440 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e  );.      for(/*n
1e450 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e  o-op*/; iWrite<n
1e460 53 69 7a 65 3b 20 69 57 72 69 74 65 2b 3d 6e 42  Size; iWrite+=nB
1e470 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 57  lk ){.        nW
1e480 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rite = seekAndWr
1e490 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74  ite(pFile, iWrit
1e4a0 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20  e, "", 1);.     
1e4b0 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31     if( nWrite!=1
1e4c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e4d0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1e4e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e4f0 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 28 6e 53  nWrite==0 || (nS
1e500 69 7a 65 25 6e 42 6c 6b 29 20 29 7b 0a 20 20 20  ize%nBlk) ){.   
1e510 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 65       nWrite = se
1e520 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1e530 2c 20 6e 53 69 7a 65 2d 31 2c 20 22 22 2c 20 31  , nSize-1, "", 1
1e540 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1e550 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1e560 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1e570 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65  RITE;.      }.#e
1e580 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
1e590 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1e5a0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28  MAP_SIZE>0.  if(
1e5b0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1e5c0 4d 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70  Max>0 && nByte>p
1e5d0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1e5e0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1e5f0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1e600 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20  hunk<=0 ){.     
1e610 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1e620 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1e630 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
1e640 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1e650 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
1e660 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75          return u
1e670 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1e680 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1e690 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  E, "ftruncate", 
1e6a0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1e6b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e6c0 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69    rc = unixMapfi
1e6d0 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29  le(pFile, nByte)
1e6e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1e6f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
1e700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  .}../*.** If *pA
1e720 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  rg is initially 
1e730 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
1e740 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
1e750 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
1e760 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
1e770 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1e780 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
1e790 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1e7a0 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
1e7b0 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
1e7c0 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
1e7d0 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
1e7e0 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1e7f0 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
1e800 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74  void unixModeBit
1e810 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1e820 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
1e830 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
1e840 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
1e850 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
1e860 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1e870 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
1e880 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
1e890 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
1e8a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1e8b0 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
1e8c0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1e8d0 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
1e8e0 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
1e8f0 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
1e900 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
1e910 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
1e920 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a  f, char *zBuf);.
1e930 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
1e940 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
1e950 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
1e960 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
1e970 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
1e980 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1e990 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
1e9a0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e  oid *pArg){.  un
1e9b0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1e9c0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1e9d0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1e9e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e9f0 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1ea00 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1ea10 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69  Arg = pFile->eFi
1ea20 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65  leLock;.      re
1ea30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ea40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1ea50 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54  QLITE_FCNTL_LAST
1ea60 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
1ea70 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1ea80 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
1ea90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1eaa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1eab0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1eac0 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
1ead0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1eae0 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
1eaf0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74  )pArg;.      ret
1eb00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1eb10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1eb20 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1eb30 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  HINT: {.      in
1eb40 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75  t rc;.      Simu
1eb50 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1eb60 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n(1);.      rc =
1eb70 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70   fcntlSizeHint(p
1eb80 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41  File, *(i64 *)pA
1eb90 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  rg);.      Simul
1eba0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1ebb0 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (0);.      retur
1ebc0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1ebd0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1ebe0 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
1ebf0 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42  .      unixModeB
1ec00 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49  it(pFile, UNIXFI
1ec10 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
1ec20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1ec30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ec40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1ec50 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1ec60 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1ec70 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  RITE: {.      un
1ec80 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  ixModeBit(pFile,
1ec90 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20   UNIXFILE_PSOW, 
1eca0 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1ecb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ecc0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1ecd0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1ece0 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  _VFSNAME: {.    
1ecf0 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1ed00 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1ed10 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70  f("%s", pFile->p
1ed20 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Vfs->zName);.   
1ed30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ed40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1ed50 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1ed60 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b  _TEMPFILENAME: {
1ed70 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46  .      char *zTF
1ed80 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
1ed90 6c 6c 6f 63 28 20 70 46 69 6c 65 2d 3e 70 56 66  lloc( pFile->pVf
1eda0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
1edb0 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c  .      if( zTFil
1edc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69  e ){.        uni
1edd0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69  xGetTempname(pFi
1ede0 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
1edf0 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20  name, zTFile);. 
1ee00 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
1ee10 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
1ee20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1ee30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ee40 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1ee50 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
1ee60 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28  OVED: {.      *(
1ee70 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65  int*)pArg = file
1ee80 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b  HasMoved(pFile);
1ee90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1eea0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1eeb0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1eec0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
1eed0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1eee0 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
1eef0 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
1ef00 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
1ef10 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
1ef20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
1ef30 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
1ef40 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ef50 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
1ef60 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
1ef70 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ef80 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
1ef90 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41  .      *(i64*)pA
1efa0 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  rg = pFile->mmap
1efb0 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69  SizeMax;.      i
1efc0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26  f( newLimit>=0 &
1efd0 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c  & newLimit!=pFil
1efe0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26  e->mmapSizeMax &
1eff0 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f  & pFile->nFetchO
1f000 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
1f010 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1f020 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a  Max = newLimit;.
1f030 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
1f040 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  e->mmapSize>0 ){
1f050 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55  .          unixU
1f060 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
1f070 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f080 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c  unixMapfile(pFil
1f090 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  e, -1);.        
1f0a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1f0b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f0c0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1f0d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1f0e0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c  /* The pager cal
1f0f0 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  ls this method t
1f100 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74  o signal that it
1f110 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a   has done.    **
1f120 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20   a rollback and 
1f130 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1f140 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75  e is therefore u
1f150 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20  nchanged and.   
1f160 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20   ** it hence it 
1f170 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72  is OK for the tr
1f180 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65  ansaction change
1f190 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20   counter to be. 
1f1a0 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e     ** unchanged.
1f1b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1f1c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1f1d0 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20  _UNCHANGED: {.  
1f1e0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1f1f0 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  id)->dbUpdate = 
1f200 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
1f210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1f220 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1f230 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1f240 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1f250 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1f260 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1f270 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
1f280 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  YFILE:.    case 
1f290 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54  SQLITE_FCNTL_GET
1f2a0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
1f2b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1f2c0 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
1f2d0 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20  id,op,pArg);.   
1f2e0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1f2f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1f300 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1f310 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
1f320 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  /.  }.  return S
1f330 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
1f340 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f350 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1f360 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
1f370 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
1f380 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
1f390 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1f3a0 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
1f3b0 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
1f3c0 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
1f3d0 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
1f3e0 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
1f3f0 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
1f400 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
1f410 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
1f420 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
1f430 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
1f440 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
1f450 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
1f460 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
1f470 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
1f480 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
1f490 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
1f4a0 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
1f4b0 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
1f4c0 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
1f4d0 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58  */.#ifndef __QNX
1f4e0 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e  NTO__ .static in
1f4f0 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  t unixSectorSize
1f500 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
1f510 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
1f520 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
1f530 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  sed);.  return S
1f540 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
1f550 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e  CTOR_SIZE;.}.#en
1f560 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
1f570 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e  ollowing version
1f580 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69   of unixSectorSi
1f590 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65  ze() is optimize
1f5a0 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69  d for QNX..*/.#i
1f5b0 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
1f5c0 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63  #include <sys/dc
1f5d0 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75  md_blk.h>.#inclu
1f5e0 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e  de <sys/statvfs.
1f5f0 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  h>.static int un
1f600 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
1f610 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
1f620 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1f630 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1f640 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  d;.  if( pFile->
1f650 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20  sectorSize == 0 
1f660 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
1f670 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  atvfs fsInfo;.  
1f680 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74       .    /* Set
1f690 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f   defaults for no
1f6a0 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65  n-supported file
1f6b0 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70  systems */.    p
1f6c0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f6d0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
1f6e0 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
1f6f0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1f700 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1f710 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74  = 0;.    if( fst
1f720 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20  atvfs(pFile->h, 
1f730 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
1f740 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1f750 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1f760 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
1f770 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
1f780 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d  .f_basetype, "tm
1f790 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  p") ) {.      pF
1f7a0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f7b0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
1f7c0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
1f7d0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f7e0 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
1f7f0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1f800 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20  IC4K |       /* 
1f810 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74  All ram filesyst
1f820 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74  em writes are at
1f830 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1f840 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1f850 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1f860 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1f870 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1f880 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f8b0 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1f8c0 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
1f8d0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1f8e0 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1f8f0 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1f900 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1f910 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
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 20 20 20 20 20 2a 2a 20 73              ** s
1f940 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1f950 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1f960 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73    }else if( strs
1f970 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  tr(fsInfo.f_base
1f980 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b  type, "etfs") ){
1f990 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
1f9a0 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
1f9b0 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
1f9c0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1f9d0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
1f9e0 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20          /* etfs 
1f9f0 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69  cluster size wri
1fa00 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
1fa10 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65  /.        (pFile
1fa20 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
1fa30 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
1fa40 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20  P_ATOMIC512) |. 
1fa50 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1fa60 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
1fa70 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
1fa80 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
1fa90 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fac0 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
1fad0 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
1fae0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1faf0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1fb00 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1fb10 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1fb20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1fb60 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1fb70 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1fb80 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1fb90 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71  o.f_basetype, "q
1fba0 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70  nx6") ){.      p
1fbb0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1fbc0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1fbd0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1fbe0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1fbf0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1fc00 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1fc10 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a  MIC |         /*
1fc20 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20   All filesystem 
1fc30 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
1fc40 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
1fc50 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1fc60 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
1fc70 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
1fc80 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
1fc90 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1fcc0 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
1fcd0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1fce0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1fcf0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
1fd00 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
1fd10 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
1fd20 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd40 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
1fd50 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
1fd60 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
1fd70 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70  else if( !strcmp
1fd80 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
1fd90 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20  pe, "qnx4") ){. 
1fda0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
1fdb0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
1fdc0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
1fdd0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1fde0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
1fdf0 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69        /* full bi
1fe00 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20  tset of atomics 
1fe10 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20  from max sector 
1fe20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72  size and smaller
1fe30 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46   */.        ((pF
1fe40 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1fe50 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
1fe60 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
1fe70 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20  << 1) - 2 |.    
1fe80 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1fe90 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1fea0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1feb0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1fec0 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1ff00 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1ff10 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1ff20 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e  ( strstr(fsInfo.
1ff30 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73  f_basetype, "dos
1ff40 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
1ff50 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1ff60 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
1ff70 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1ff80 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1ff90 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
1ffa0 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61  full bitset of a
1ffb0 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20  tomics from max 
1ffc0 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20  sector size and 
1ffd0 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20  smaller */.     
1ffe0 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74     ((pFile->sect
1fff0 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
20000 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
20010 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32  IC512) << 1) - 2
20020 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   |.        SQLIT
20030 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
20040 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
20050 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
20060 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
20070 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
200a0 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
200b0 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
200c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
200d0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
200e0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
200f0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
20100 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20  ATOMIC512 |     
20110 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61   /* blocks are a
20120 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
20130 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
20140 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
20150 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
20160 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
20170 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
201a0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
201b0 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  eds */.        0
201c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
201d0 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72   Last chance ver
201e0 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74  ification.  If t
201f0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
20200 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20  sn't a multiple 
20210 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e  of 512.  ** then
20220 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e   it isn't valid.
20230 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
20240 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32  sectorSize % 512
20250 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69   != 0 ){.    pFi
20260 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
20270 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
20280 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
20290 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
202a0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
202b0 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
202c0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
202d0 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  e;.}.#endif /* _
202e0 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a  _QNXNTO__ */../*
202f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
20300 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
20310 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69  stics for the fi
20320 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56  le..**.** This V
20330 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20  FS is set up to 
20340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
20350 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
20360 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75  ERWRITE by defau
20370 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  lt..** However, 
20380 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63  that choice is c
20390 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e  ontroversial sin
203a0 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74  ce technically t
203b0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
203c0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65   file system doe
203d0 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f  s not always pro
203e0 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f  vide powersafe o
203f0 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20  verwrites.  (In 
20400 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
20410 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f  after a power-lo
20420 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20  ss event, parts 
20430 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  of the file that
20440 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77   were never.** w
20450 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64  ritten might end
20460 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65   up being altere
20470 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f  d.)  However, no
20480 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20  n-PSOW behavior 
20490 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79  is very,.** very
204a0 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65   rare.  And asse
204b0 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73  rting PSOW makes
204c0 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69   a large reducti
204d0 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74  on in the amount
204e0 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20  .** of required 
204f0 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69  I/O for journali
20500 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20  ng, since a lot 
20510 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c  of padding is el
20520 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65  iminated..**  He
20530 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52  nce, while POWER
20540 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69  SAFE_OVERWRITE i
20550 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c  s on by default,
20560 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65   there is a file
20570 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69  -control.** avai
20580 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
20590 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65   off and URI que
205a0 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61  ry parameter ava
205b0 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
205c0 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  t off..*/.static
205d0 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43   int unixDeviceC
205e0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
205f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
20600 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20  {.  unixFile *p 
20610 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
20620 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
20630 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
20640 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72  .  if( p->sector
20650 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65  Size==0 ) unixSe
20660 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20  ctorSize(id);.  
20670 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68  rc = p->deviceCh
20680 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23  aracteristics;.#
20690 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63  endif.  if( p->c
206a0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
206b0 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20  ILE_PSOW ){.    
206c0 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43  rc |= SQLITE_IOC
206d0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
206e0 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65  RWRITE;.  }.  re
206f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
20700 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
20710 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
20720 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
20730 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  E>0../*.** Retur
20740 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67  n the system pag
20750 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
20760 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
20770 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ld not be called
20780 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68   directly by oth
20790 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  er code in this 
207a0 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61  file. .** Instea
207b0 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  d, it should be 
207c0 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f  called via macro
207d0 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29   osGetpagesize()
207e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
207f0 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28  unixGetpagesize(
20800 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58  void){.#if OS_VX
20810 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31  WORKS.  return 1
20820 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  024;.#elif defin
20830 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a  ed(_BSD_SOURCE).
20840 20 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65    return getpage
20850 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20  size();.#else.  
20860 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63  return (int)sysc
20870 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45  onf(_SC_PAGESIZE
20880 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e  );.#endif.}..#en
20890 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
208a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
208b0 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
208c0 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23  MAP_SIZE>0 */..#
208d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
208e0 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62  IT_WAL../*.** Ob
208f0 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
20900 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64  resent an shared
20910 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20   memory buffer. 
20920 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c   .**.** When mul
20930 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
20940 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
20950 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20  same wal-index, 
20960 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68  each thread.** h
20970 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53  as its own unixS
20980 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  hm object, but t
20990 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f  hey all point to
209a0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
209b0 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e  ce.** of this un
209c0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
209d0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
209e0 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65  s, each wal-inde
209f0 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  x is opened.** o
20a00 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
20a10 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  cess..**.** Each
20a20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20a30 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  ect is connected
20a40 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69   to a single uni
20a50 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
20a60 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63  t..** We could c
20a70 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a  oalesce this obj
20a80 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f  ect into unixIno
20a90 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74  deInfo, but that
20aa0 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65   would mean.** e
20ab0 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74  very open file t
20ac0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
20ad0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28   shared memory (
20ae0 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
20af0 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c  most.** open fil
20b00 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74  es) would have t
20b10 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74  o carry around t
20b20 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  his extra inform
20b30 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68  ation.  So.** th
20b40 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
20b50 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
20b60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
20b70 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
20b80 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ject.** and the 
20b90 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
20ba0 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e  ct is created on
20bb0 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a  ly when needed..
20bc0 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  **.** unixMutexH
20bd0 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
20be0 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
20bf0 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
20c00 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
20c10 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
20c20 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
20c30 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
20c40 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
20c50 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
20c60 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
20c70 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
20c80 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
20c90 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  ated:.** .**    
20ca0 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46    fid.**      zF
20cb0 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69  ilename.**.** Ei
20cc0 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ther unixShmNode
20cd0 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  .mutex must be h
20ce0 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f  eld or unixShmNo
20cf0 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
20d00 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  * unixMutexHeld(
20d10 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72  ) is true when r
20d20 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
20d30 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c  g any other fiel
20d40 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72  d.** in this str
20d50 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
20d60 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a  t unixShmNode {.
20d70 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
20d80 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  *pInode;     /* 
20d90 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68  unixInodeInfo th
20da0 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d  at owns this SHM
20db0 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   node */.  sqlit
20dc0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
20dd0 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
20de0 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
20df0 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
20e00 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
20e10 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
20e20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  the mmapped file
20e30 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
20e60 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e  scriptor */.  in
20e70 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20  t szRegion;     
20e80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20e90 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
20ea0 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75  y regions */.  u
20eb0 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20  16 nRegion;     
20ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20ed0 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67  e of array apReg
20ee0 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65  ion */.  u8 isRe
20ef0 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adonly;         
20f00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
20f10 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68  ead-only */.  ch
20f20 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20  ar **apRegion;  
20f30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
20f40 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72  y of mapped shar
20f50 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
20f60 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
20f90 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
20fa0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
20fb0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46  */.  unixShm *pF
20fc0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
20fd0 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f  /* All unixShm o
20fe0 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
20ff0 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65  to this */.#ifde
21000 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21010 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20   u8 exclMask;   
21020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21030 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
21040 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
21050 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20   u8 sharedMask; 
21060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21070 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
21080 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
21090 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20   nextShmId;     
210a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
210b0 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53   available unixS
210c0 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
210d0 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
210e0 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
210f0 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
21100 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
21110 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
21120 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
21130 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
21140 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
21150 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
21160 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
21170 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
21180 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
21190 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
211a0 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
211b0 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65     unixShm.pFile
211c0 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69  .**    unixShm.i
211d0 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
211e0 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
211f0 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e  d/write.  The un
21200 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74  ixShm.pFile->mut
21210 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
21220 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
21230 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
21240 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
21250 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20  uct unixShm {.  
21260 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
21270 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68  mNode;     /* Th
21280 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69  e underlying uni
21290 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
212a0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e  */.  unixShm *pN
212b0 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
212c0 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20  /* Next unixShm 
212d0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e  with the same un
212e0 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  ixShmNode */.  u
212f0 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
21300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21310 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
21320 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74   unixShmNode mut
21330 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20  ex */.  u8 id;  
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21350 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
21360 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
21370 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
21380 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  de */.  u16 shar
21390 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
213a0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
213b0 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
213c0 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
213d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
213e0 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
213f0 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
21400 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  */.};../*.** Con
21410 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
21420 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
21430 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  ne UNIX_SHM_BASE
21440 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
21450 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
21460 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
21470 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
21480 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20  ne UNIX_SHM_DMS 
21490 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53     (UNIX_SHM_BAS
214a0 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
214b0 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
214c0 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
214d0 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76   Apply posix adv
214e0 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
214f0 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f  all bytes from o
21500 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74  fst through ofst
21510 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b  +n-1..**.** Lock
21520 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d  s block if the m
21530 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55  ask is exactly U
21540 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72  NIX_SHM_C and ar
21550 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a  e non-blocking.*
21560 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
21570 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
21580 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
21590 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
215a0 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20  mNode, /* Apply 
215b0 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
215c0 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
215d0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
215e0 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
215f0 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
21600 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
21610 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
21620 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
21630 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
21640 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
21650 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21670 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
21680 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
21690 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
216a0 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  f;       /* The 
216b0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
216c0 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
216d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
216e0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52  QLITE_OK;   /* R
216f0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
21700 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
21710 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
21720 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
21730 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
21740 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
21750 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21760 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53  e3_mutex_held(pS
21770 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c  hmNode->mutex) |
21780 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  | pShmNode->nRef
21790 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61  ==0 );..  /* Sha
217a0 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20  red locks never 
217b0 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  span more than o
217c0 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73  ne byte */.  ass
217d0 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63  ert( n==1 || loc
217e0 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29  kType!=F_RDLCK )
217f0 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72  ;..  /* Locks ar
21800 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a  e within range *
21810 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  /.  assert( n>=1
21820 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d   && n<SQLITE_SHM
21830 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  _NLOCK );..  if(
21840 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
21850 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
21860 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
21870 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
21880 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c     memset(&f, 0,
21890 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20   sizeof(f));.   
218a0 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b   f.l_type = lock
218b0 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68  Type;.    f.l_wh
218c0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
218d0 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d  .    f.l_start =
218e0 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c   ofst;.    f.l_l
218f0 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20  en = n;..    rc 
21900 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f  = osFcntl(pShmNo
21910 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  de->h, F_SETLK, 
21920 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72  &f);.    rc = (r
21930 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54  c!=(-1)) ? SQLIT
21940 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55  E_OK : SQLITE_BU
21950 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  SY;.  }..  /* Up
21960 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  date the global 
21970 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64  lock state and d
21980 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20  o debug tracing 
21990 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
219a0 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d  _DEBUG.  { u16 m
219b0 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ask;.  OSTRACE((
219c0 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20  "SHM-LOCK "));. 
219d0 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20   mask = ofst>31 
219e0 3f 20 30 78 66 66 66 66 20 3a 20 28 31 3c 3c 28  ? 0xffff : (1<<(
219f0 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
21a00 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  fst);.  if( rc==
21a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21a20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
21a30 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
21a40 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
21a50 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
21a60 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21a70 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
21a80 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
21a90 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
21aa0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  = ~mask;.    }el
21ab0 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  se if( lockType=
21ac0 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
21ad0 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64    OSTRACE(("read
21ae0 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  -lock %d ok", of
21af0 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
21b00 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  Node->exclMask &
21b10 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
21b20 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
21b30 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
21b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
21b50 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
21b60 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
21b70 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
21b80 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  -lock %d ok", of
21b90 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
21ba0 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c  Node->exclMask |
21bb0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53  = mask;.      pS
21bc0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
21bd0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
21be0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
21bf0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
21c00 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
21c10 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
21c20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74  %d failed", ofst
21c30 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ));.    }else if
21c40 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44  ( lockType==F_RD
21c50 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
21c60 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b  RACE(("read-lock
21c70 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20   failed"));.    
21c80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
21c90 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
21ca0 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
21cb0 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
21cc0 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c  lock %d failed",
21cd0 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20   ofst));.    }. 
21ce0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20   }.  OSTRACE((" 
21cf0 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33  - afterwards %03
21d00 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20  x,%03x\n",.     
21d10 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21d20 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d  sharedMask, pShm
21d30 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29  Node->exclMask))
21d40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
21d50 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20  return rc;      
21d60 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75    .}../*.** Retu
21d70 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e  rn the minimum n
21d80 75 6d 62 65 72 20 6f 66 20 33 32 4b 42 20 73 68  umber of 32KB sh
21d90 6d 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 73  m regions that s
21da0 68 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20  hould be mapped 
21db0 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73  at.** a time, as
21dc0 73 75 6d 69 6e 67 20 74 68 61 74 20 65 61 63 68  suming that each
21dd0 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
21de0 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   an integer mult
21df0 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  iple of the.** c
21e00 75 72 72 65 6e 74 20 73 79 73 74 65 6d 20 70 61  urrent system pa
21e10 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55  ge-size..**.** U
21e20 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
21e30 31 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  1. The exception
21e40 20 73 65 65 6d 73 20 74 6f 20 62 65 20 73 79 73   seems to be sys
21e50 74 65 6d 73 20 74 68 61 74 20 61 72 65 20 63 6f  tems that are co
21e60 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75  nfigured.** to u
21e70 73 65 20 36 34 4b 42 20 70 61 67 65 73 20 2d 20  se 64KB pages - 
21e80 69 6e 20 74 68 69 73 20 63 61 73 65 20 65 61 63  in this case eac
21e90 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 63  h mapping must c
21ea0 6f 76 65 72 20 61 74 20 6c 65 61 73 74 20 74 77  over at least tw
21eb0 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73  o.** shm regions
21ec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21ed0 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72  unixShmRegionPer
21ee0 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  Map(void){.  int
21ef0 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34   shmsz = 32*1024
21f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21f10 53 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65 20  SHM region size 
21f20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  */.  int pgsz = 
21f30 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b  osGetpagesize();
21f40 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 70 61 67     /* System pag
21f50 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65  e size */.  asse
21f60 72 74 28 20 28 28 70 67 73 7a 2d 31 29 26 70 67  rt( ((pgsz-1)&pg
21f70 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50  sz)==0 );   /* P
21f80 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
21f90 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f   a power of 2 */
21fa0 0a 20 20 69 66 28 20 70 67 73 7a 3c 73 68 6d 73  .  if( pgsz<shms
21fb0 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  z ) return 1;.  
21fc0 72 65 74 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73  return pgsz/shms
21fd0 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67  z;.}../*.** Purg
21fe0 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  e the unixShmNod
21ff0 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c  eList list of al
22000 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75  l entries with u
22010 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  nixShmNode.nRef=
22020 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
22030 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
22040 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
22050 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
22060 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
22070 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
22080 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
22090 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
220a0 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75  d unixShmPurge(u
220b0 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20  nixFile *pFd){. 
220c0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20   unixShmNode *p 
220d0 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  = pFd->pInode->p
220e0 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72  ShmNode;.  asser
220f0 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
22100 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  () );.  if( p &&
22110 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
22120 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61     int nShmPerMa
22130 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f  p = unixShmRegio
22140 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69  nPerMap();.    i
22150 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74  nt i;.    assert
22160 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64  ( p->pInode==pFd
22170 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ->pInode );.    
22180 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
22190 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
221a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
221b0 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d  nRegion; i+=nShm
221c0 50 65 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69  PerMap){.      i
221d0 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
221e0 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
221f0 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70  ->apRegion[i], p
22200 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->szRegion);.   
22210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22220 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22230 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a  ->apRegion[i]);.
22240 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22250 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22260 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->apRegion);.   
22270 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
22280 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
22290 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f  se(pFd, p->h, __
222a0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70  LINE__);.      p
222b0 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ->h = -1;.    }.
222c0 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70      p->pInode->p
222d0 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ShmNode = 0;.   
222e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
222f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
22300 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  pen a shared-mem
22310 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
22320 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61  ted with open da
22330 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
22340 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72  d.  .** This par
22350 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e  ticular implemen
22360 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70  tation uses mmap
22370 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ped files..**.**
22380 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74   The file used t
22390 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72  o implement shar
223a0 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20  ed-memory is in 
223b0 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
223c0 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65  ry.** as the ope
223d0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
223e0 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
223f0 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65   name as the ope
22400 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  n database.** fi
22410 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68  le with the "-sh
22420 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e  m" suffix added.
22430 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
22440 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22450 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65  ile.** is "/home
22460 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
22470 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  " then the file 
22480 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
22490 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66  and mmapped.** f
224a0 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
224b0 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
224c0 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
224d0 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a  fig.db-shm".  .*
224e0 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70  *.** Another app
224f0 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75  roach to is to u
22500 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76  se files in /dev
22510 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70  /shm or /dev/tmp
22520 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f   or an.** some o
22530 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74  ther tmpfs mount
22540 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20  . But if a file 
22550 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  in a different d
22560 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d  irectory.** from
22570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22580 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
22590 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73   differing acces
225a0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  s permissions.**
225b0 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d   or a chroot() m
225c0 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64  ight cause two d
225d0 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
225e0 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  es on the same.*
225f0 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e  * database to en
22600 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65  d up using diffe
22610 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73  rent files for s
22620 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a  hared memory - .
22630 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  ** meaning that 
22640 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75  their memory wou
22650 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  ld not really be
22660 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74   shared - result
22670 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61  ing.** in databa
22680 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
22690 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68  Nevertheless, th
226a0 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73  is tmpfs file us
226b0 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e  age.** can be en
226c0 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
226d0 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51  -time using -DSQ
226e0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
226f0 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a  RY="/dev/shm".**
22700 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65   or the equivale
22710 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  nt.  The use of 
22720 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  the SQLITE_SHM_D
22730 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
22740 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20  -time.** option 
22750 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e  results in an in
22760 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64  compatible build
22770 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69   of SQLite;  bui
22780 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a  lds of SQLite.**
22790 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65   that with diffe
227a0 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f  ring SQLITE_SHM_
227b0 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e  DIRECTORY settin
227c0 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  gs attempt to us
227d0 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61  e the.** same da
227e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
227f0 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61  he same time, da
22800 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
22810 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  n will likely.**
22820 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c   result. The SQL
22830 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22840 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  Y compile-time o
22850 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65  ption is conside
22860 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72  red.** "unsuppor
22870 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20  ted" and may go 
22880 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65  away in a future
22890 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e   SQLite release.
228a0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
228b0 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
228c0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
228d0 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
228e0 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
228f0 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
22900 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
22910 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
22920 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
22930 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
22940 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
22950 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
22960 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
22970 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  der cleared..**.
22980 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  ** If the origin
22990 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
229a0 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e   (pDbFd) is usin
229b0 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c  g the "unix-excl
229c0 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65  " VFS.** that me
229d0 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c  ans that an excl
229e0 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65  usive lock is he
229f0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
22a00 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  se file and.** t
22a10 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
22a20 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20  cesses are able 
22a30 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
22a40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
22a50 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c  In.** that case,
22a60 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c   we do not reall
22a70 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65  y need shared me
22a80 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64  mory.  No shared
22a90 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20   memory.** file 
22aa0 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
22ab0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
22ac0 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64  ill be simulated
22ad0 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72   with heap memor
22ae0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
22af0 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
22b00 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a  emory(unixFile *
22b10 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
22b20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b   unixShm *p = 0;
22b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22b40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
22b50 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
22b60 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
22b70 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a   *pShmNode;   /*
22b80 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
22b90 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
22ba0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bc0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
22bd0 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
22be0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
22bf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f        /* The ino
22c00 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68  de of fd */.  ch
22c10 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  ar *zShmFilename
22c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22c30 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
22c40 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a  e used for SHM *
22c50 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65  /.  int nShmFile
22c60 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
22c70 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
22c80 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20  he SHM filename 
22c90 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
22ca0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
22cb0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
22cc0 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  xShm object. */.
22cd0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
22ce0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
22cf0 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
22d00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
22d10 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
22d20 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
22d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
22d40 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20  d->pShm==0 );.. 
22d50 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
22d60 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64   if a unixShmNod
22d70 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79  e object already
22d80 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61   exists. Reuse a
22d90 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
22da0 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
22db0 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
22dc0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
22dd0 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
22de0 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
22df0 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
22e00 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
22e10 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
22e20 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d  .  if( pShmNode=
22e30 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
22e40 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e60 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72  fstat() info for
22e70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
22e80 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22e90 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
22ea0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
22eb0 42 61 73 65 50 61 74 68 20 3d 20 70 44 62 46 64  BasePath = pDbFd
22ec0 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a  ->zPath;.#endif.
22ed0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74  .    /* Call fst
22ee0 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f  at() to figure o
22ef0 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ut the permissio
22f00 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ns on the databa
22f10 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20  se file. If.    
22f20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66  ** a new *-shm f
22f30 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
22f40 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20  an attempt will 
22f50 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74  be made to creat
22f60 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68  e it.    ** with
22f70 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
22f80 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  sions..    */.  
22f90 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44    if( osFstat(pD
22fa0 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  bFd->h, &sStat) 
22fb0 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  && pInode->bProc
22fc0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
22fd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22fe0 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
22ff0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
23000 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  _err;.    }..#if
23010 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
23020 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68  IRECTORY.    nSh
23030 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65  mFilename = size
23040 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  of(SQLITE_SHM_DI
23050 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23  RECTORY) + 31;.#
23060 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c  else.    nShmFil
23070 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74  ename = 6 + (int
23080 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74  )strlen(zBasePat
23090 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  h);.#endif.    p
230a0 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ShmNode = sqlite
230b0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
230c0 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
230d0 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
230e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
230f0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
23100 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23110 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
23120 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
23130 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
23140 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
23150 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e  mNode)+nShmFilen
23160 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69  ame);.    zShmFi
23170 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64  lename = pShmNod
23180 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  e->zFilename = (
23190 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b  char*)&pShmNode[
231a0 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1];.#ifdef SQLIT
231b0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
231c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
231d0 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
231e0 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  e, zShmFilename,
231f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
23200 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48         SQLITE_SH
23210 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71  M_DIRECTORY "/sq
23220 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c  lite-shm-%x-%x",
23230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23240 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74        (u32)sStat
23250 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53  .st_ino, (u32)sS
23260 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c  tat.st_dev);.#el
23270 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  se.    sqlite3_s
23280 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
23290 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
232a0 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42  me, "%s-shm", zB
232b0 61 73 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71  asePath);.    sq
232c0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
232d0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a  (pDbFd->zPath, z
232e0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65  ShmFilename);.#e
232f0 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
23300 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70  e->h = -1;.    p
23310 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
23320 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
23330 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
23340 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d  >pInode = pDbFd-
23350 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68  >pInode;.    pSh
23360 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73  mNode->mutex = s
23370 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
23380 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
23390 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70  FAST);.    if( p
233a0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
233b0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
233c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
233d0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
233e0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
233f0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
23400 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
23410 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46  .      int openF
23420 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
23430 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69  O_CREAT;.      i
23440 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
23450 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50  oolean(pDbFd->zP
23460 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73  ath, "readonly_s
23470 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  hm", 0) ){.     
23480 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f     openFlags = O
23490 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  _RDONLY;.       
234a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
234b0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
234c0 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
234d0 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70  e->h = robust_op
234e0 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  en(zShmFilename,
234f0 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74   openFlags, (sSt
23500 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  at.st_mode&0777)
23510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
23520 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
23530 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
23540 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
23550 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
23560 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  pen", zShmFilena
23570 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
23580 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
23590 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
235a0 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
235b0 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
235c0 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20  root, make sure 
235d0 74 68 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c  that the SHM fil
235e0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77  e.      ** is ow
235f0 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
23600 75 73 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74  user that owns t
23610 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
23620 62 61 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  base.  Otherwise
23630 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  ,.      ** the o
23640 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69  riginal owner wi
23650 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
23660 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20  o connect..     
23670 20 2a 2f 0a 20 20 20 20 20 20 6f 73 46 63 68 6f   */.      osFcho
23680 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
23690 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
236a0 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a  tat.st_gid);.  .
236b0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
236c0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
236d0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
236e0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
236f0 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
23700 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
23710 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
23720 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
23730 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
23740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23750 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
23760 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
23770 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
23780 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
23790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
237a0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
237b0 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
237c0 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
237d0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
237e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
237f0 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72  RR_SHMOPEN, "ftr
23800 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c  uncate", zShmFil
23810 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
23820 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23840 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
23850 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
23860 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
23870 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  RDLCK, UNIX_SHM_
23880 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  DMS, 1);.      }
23890 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
238a0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
238b0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
238c0 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
238d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
238e0 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68  ld of the unixSh
238f0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
23900 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
23910 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
23920 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
23930 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
23940 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
23950 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
23960 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
23970 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76   = p;.  unixLeav
23980 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
23990 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
239a0 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
239b0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
239c0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
239d0 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
239e0 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74  r of the unixEnt
239f0 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
23a00 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
23a10 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
23a20 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68  w (struct unixSh
23a30 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  m) object to the
23a40 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65   pShmNode has be
23a50 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74  en set. All that
23a60 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f   is.  ** left to
23a70 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74   do is to link t
23a80 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e  he new object in
23a90 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
23aa0 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  st starting.  **
23ab0 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46   at pShmNode->pF
23ac0 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20  irst. This must 
23ad0 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f  be done while ho
23ae0 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f  lding the pShmNo
23af0 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20  de->mutex .  ** 
23b00 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  mutex..  */.  sq
23b10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
23b20 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
23b30 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  x);.  p->pNext =
23b40 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
23b50 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  t;.  pShmNode->p
23b60 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c  First = p;.  sql
23b70 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
23b80 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
23b90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23ba0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
23bb0 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
23bc0 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
23bd0 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
23be0 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
23bf0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
23c00 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
23c10 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
23c20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
23c30 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
23c40 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
23c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23c60 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
23c70 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
23c80 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
23c90 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
23ca0 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
23cb0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
23cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23cd0 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
23ce0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
23cf0 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
23d00 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
23d10 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
23d20 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
23d30 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
23d40 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
23d50 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
23d60 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
23d70 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
23d80 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
23d90 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
23da0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62  erwise, if the b
23db0 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72  Extend parameter
23dc0 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
23dd0 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
23de0 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
23df0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
23e00 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
23e10 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
23e20 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
23e30 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
23e40 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
23e50 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
23e60 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
23e70 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62  turned. If .** b
23e80 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65  Extend is non-ze
23e90 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
23ea0 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
23eb0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
23ec0 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
23ed0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
23ee0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
23ef0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
23f00 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
23f10 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
23f20 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
23f30 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
23f40 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
23f50 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
23f60 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
23f70 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
23f80 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
23f90 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
23fa0 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
23fb0 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
23fc0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
23fd0 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
23fe0 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
23ff0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24010 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71  unixShmMap(.  sq
24020 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24040 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
24050 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24060 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24080 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
24090 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
240a0 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
240b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
240c0 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
240d0 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e   */.  int bExten
240e0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
240f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
24100 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
24110 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
24120 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
24130 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
24140 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
24150 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  mory */.){.  uni
24160 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
24170 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
24180 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e  unixShm *p;.  un
24190 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
241a0 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
241b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
241c0 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
241d0 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
241e0 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52  p();.  int nReqR
241f0 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  egion;..  /* If 
24200 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
24210 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
24220 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
24230 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
24240 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
24250 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
24260 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
24270 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
24280 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24290 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
242a0 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
242b0 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
242c0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
242d0 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
242e0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
242f0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
24300 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
24310 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
24320 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
24330 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61  Region==0 );.  a
24340 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
24350 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
24360 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  pInode );.  asse
24370 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
24380 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
24390 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
243a0 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
243b0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
243c0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
243d0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
243e0 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d  0 );..  /* Minim
243f0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67  um number of reg
24400 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f  ions required to
24410 20 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20   be mapped. */. 
24420 20 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20 28 28   nReqRegion = ((
24430 69 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d  iRegion+nShmPerM
24440 61 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70  ap) / nShmPerMap
24450 29 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a  ) * nShmPerMap;.
24460 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
24470 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67  >nRegion<nReqReg
24480 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ion ){.    char 
24490 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20  **apNew;        
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
244b0 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20   New apRegion[] 
244c0 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
244d0 20 6e 42 79 74 65 20 3d 20 6e 52 65 71 52 65 67   nByte = nReqReg
244e0 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20  ion*szRegion;   
244f0 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
24500 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
24510 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
24520 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
24530 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
24540 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20  by fstat() */.. 
24550 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
24560 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
24570 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  ;..    if( pShmN
24580 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
24590 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
245a0 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
245b0 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
245c0 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
245d0 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
245e0 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
245f0 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
24600 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
24610 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
24620 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20  x file is.      
24630 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
24640 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
24650 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
24660 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
24670 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53 68   if( osFstat(pSh
24680 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74  mNode->h, &sStat
24690 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
246a0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
246b0 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  HMSIZE;.        
246c0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
246d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
246e0 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f     if( sStat.st_
246f0 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20  size<nByte ){.  
24700 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
24710 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
24720 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
24730 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20  ist. If bExtend 
24740 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
24750 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74    ** false, exit
24760 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
24770 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
24780 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
24790 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20  turned..        
247a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
247b0 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20 20  bExtend ){.     
247c0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
247d0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
247e0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 74  ..        /* Alt
247f0 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62  ernatively, if b
24800 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20  Extend is true, 
24810 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e  extend the file.
24820 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20 20   Do this by.    
24830 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 61      ** writing a
24840 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20   single byte to 
24850 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20  the end of each 
24860 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67 0a  (OS) page being.
24870 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
24880 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
24890 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77  . Technically, w
248a0 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69 74  e need only writ
248b0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  e to the.       
248c0 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 6e   ** last page in
248d0 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e 64   order to extend
248e0 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20 77   the file. But w
248f0 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65  riting to all ne
24900 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
24910 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f 53  es forces the OS
24920 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
24930 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77  m immediately, w
24940 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20 20  hich reduces.   
24950 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61 6e       ** the chan
24960 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77 68  ces of SIGBUS wh
24970 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ile accessing th
24980 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
24990 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20  later on..      
249a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c 73    */.        els
249b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  e{.          sta
249c0 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70 67  tic const int pg
249d0 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 20  sz = 4096;.     
249e0 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20       int iPg;.. 
249f0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
24a00 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79  e to the last by
24a10 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c 79  te of each newly
24a20 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78   allocated or ex
24a30 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a 20  tended page */. 
24a40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
24a50 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29 3d   (nByte % pgsz)=
24a60 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
24a70 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e 73  for(iPg=(sStat.s
24a80 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50  t_size/pgsz); iP
24a90 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20  g<(nByte/pgsz); 
24aa0 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iPg++){.        
24ab0 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57      if( seekAndW
24ac0 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d  riteFd(pShmNode-
24ad0 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70  >h, iPg*pgsz + p
24ae0 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 30 29  gsz-1, "", 1, 0)
24af0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=1 ){.         
24b00 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24b10 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64  *zFile = pShmNod
24b20 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  e->zFilename;.  
24b30 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
24b40 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
24b50 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
24b60 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69  ZE, "write", zFi
24b70 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  le);.           
24b80 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
24b90 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  out;.           
24ba0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
24bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24bc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
24bd0 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
24be0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
24bf0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
24c00 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
24c10 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
24c20 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65   (char **)sqlite
24c30 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
24c40 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
24c50 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f  egion, nReqRegio
24c60 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  n*sizeof(char *)
24c70 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
24c80 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
24c90 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
24ca0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
24cb0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
24cc0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
24cd0 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20  ode->apRegion = 
24ce0 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65  apNew;.    while
24cf0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
24d00 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29  ion<nReqRegion )
24d10 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70  {.      int nMap
24d20 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d   = szRegion*nShm
24d30 50 65 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e  PerMap;.      in
24d40 74 20 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20  t i;.      void 
24d50 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  *pMem;.      if(
24d60 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
24d70 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  ){.        pMem 
24d80 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70  = osMmap(0, nMap
24d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ,.            pS
24da0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
24db0 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a  ly ? PROT_READ :
24dc0 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f   PROT_READ|PROT_
24dd0 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20  WRITE, .        
24de0 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20      MAP_SHARED, 
24df0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52  pShmNode->h, szR
24e00 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e  egion*(i64)pShmN
24e10 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20  ode->nRegion.   
24e20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
24e30 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41  if( pMem==MAP_FA
24e40 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
24e50 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
24e60 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
24e70 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c  _SHMMAP, "mmap",
24e80 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
24e90 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
24ea0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24eb0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
24ec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24ed0 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33    pMem = sqlite3
24ee0 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e  _malloc(szRegion
24ef0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
24f00 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
24f10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24f20 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
24f30 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24f40 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
24f50 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d       memset(pMem
24f60 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a  , 0, szRegion);.
24f70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
24f80 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65  or(i=0; i<nShmPe
24f90 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rMap; i++){.    
24fa0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
24fb0 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
24fc0 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28  >nRegion+i] = &(
24fd0 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52  (char*)pMem)[szR
24fe0 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20  egion*i];.      
24ff0 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  }.      pShmNode
25000 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68  ->nRegion += nSh
25010 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20  mPerMap;.    }. 
25020 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
25030 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
25040 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
25050 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53   ){.    *pp = pS
25060 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
25070 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c  [iRegion];.  }el
25080 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
25090 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
250a0 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
250b0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
250c0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52   ) rc = SQLITE_R
250d0 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74  EADONLY;.  sqlit
250e0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
250f0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
25100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25110 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
25120 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
25130 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
25140 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
25150 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65  Note that the re
25160 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
25170 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58  en SHAREd and EX
25180 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73  CLUSIVE locks is
25190 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66   a little.** dif
251a0 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e  ferent here than
251b0 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78   in posix.  In x
251c0 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63  ShmLock(), one c
251d0 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63  an go from unloc
251e0 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64  ked.** to shared
251f0 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f   and back or fro
25200 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78  m unlocked to ex
25210 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b  clusive and back
25220 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a  .  But one may.*
25230 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68  * not go from sh
25240 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  ared to exclusiv
25250 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73  e or from exclus
25260 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a  ive to shared..*
25270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
25280 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  xShmLock(.  sqli
25290 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
252a0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
252b0 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
252c0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
252d0 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252f0 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
25300 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
25310 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
25320 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25330 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25340 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
25350 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
25360 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25380 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
25390 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
253a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
253b0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
253c0 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  fd;      /* Conn
253d0 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
253e0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
253f0 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
25400 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
25410 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
25420 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
25430 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  ng locked */.  u
25440 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  nixShm *pX;     
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
25470 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
25480 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53  lings */.  unixS
25490 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
254a0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20   = p->pShmNode; 
254b0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
254c0 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f  ng file iNode */
254d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
254e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
254f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
25500 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
25510 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25530 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
25540 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
25550 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
25560 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
25570 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
25580 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
25590 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
255a0 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
255b0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
255c0 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
255d0 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
255e0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
255f0 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
25600 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
25610 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
25620 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
25630 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
25640 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
25650 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
25660 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
25670 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
25680 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
25690 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
256a0 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
256b0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
256c0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
256d0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
256e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
256f0 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
25700 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
25710 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  VE)!=0 );.  asse
25720 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
25730 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
25740 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
25750 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
25760 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
25770 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
25780 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
25790 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
257a0 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
257b0 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65  1<<ofst);.  asse
257c0 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
257d0 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
257e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
257f0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
25800 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
25810 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
25820 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
25830 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
25840 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
25850 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
25860 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
25870 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
25880 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
25890 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
258a0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
258b0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
258c0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
258d0 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
258e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
258f0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
25900 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
25910 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
25920 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
25930 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
25940 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
25950 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
25960 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
25970 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
25980 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
25990 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
259a0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
259b0 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b  ShmNode, F_UNLCK
259c0 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
259d0 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  BASE, n);.    }e
259e0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
259f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
25a00 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68  ..    /* Undo th
25a10 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f  e local locks */
25a20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25a40 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  p->exclMask &= ~
25a50 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73  mask;.      p->s
25a60 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
25a70 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c  sk;.    } .  }el
25a80 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
25a90 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
25aa0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
25ab0 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
25ac0 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
25ad0 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
25ae0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
25af0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
25b00 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
25b10 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
25b20 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
25b30 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
25b40 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
25b50 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
25b60 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
25b70 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
25b80 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
25b90 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
25ba0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
25bb0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
25bc0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
25bd0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
25be0 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
25bf0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
25c00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25c10 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
25c20 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25c30 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
25c40 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
25c50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
25c60 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
25c70 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
25c80 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
25c90 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
25ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25cb0 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
25cc0 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
25cd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
25ce0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
25cf0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
25d00 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
25d10 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
25d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25d30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25d50 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
25d60 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
25d70 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25d80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25d90 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
25da0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
25db0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25dc0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
25dd0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
25de0 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
25df0 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
25e00 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
25e10 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
25e20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
25e30 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
25e40 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25e50 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25e60 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25e70 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
25e80 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
25e90 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
25ea0 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
25eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25ec0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
25ed0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25ee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
25ef0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
25f00 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
25f10 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
25f20 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
25f30 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
25f40 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
25f50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
25f60 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
25f70 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25f80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25f90 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
25fa0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
25fb0 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73  de, F_WRLCK, ofs
25fc0 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
25fd0 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
25fe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25ff0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26000 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
26010 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
26020 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
26030 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
26040 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
26050 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
26060 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
26070 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
26080 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
26090 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
260a0 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
260b0 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 6f 73         p->id, os
260c0 47 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61  Getpid(), p->sha
260d0 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
260e0 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e  Mask));.  return
260f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
26100 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
26110 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
26120 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
26130 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
26140 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
26150 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
26160 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
26170 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
26180 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
26190 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
261a0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
261b0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
261c0 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  id unixShmBarrie
261d0 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
261e0 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20  e *fd           
261f0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
26200 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
26210 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
26220 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
26230 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
26240 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
26250 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
26260 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ex();.}../*.** C
26270 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
26280 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
26290 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
262a0 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
262b0 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
262c0 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Flag is true..**
262d0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
262e0 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  no shared memory
262f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
26300 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
26310 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
26320 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
26330 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ss no-op..*/.sta
26340 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55  tic int unixShmU
26350 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
26360 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
26370 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
26380 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
26390 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
263a0 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
263b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
263c0 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65  Delete shared-me
263d0 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a  mory if true */.
263e0 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  ){.  unixShm *p;
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
26410 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
26420 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  sed */.  unixShm
26430 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
26440 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26450 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
26460 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
26470 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b  .  unixShm **pp;
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26490 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
264a0 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
264b0 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
264c0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b  unixFile *pDbFd;
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264e0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
264f0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
26500 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75  */..  pDbFd = (u
26510 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  nixFile*)fd;.  p
26520 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
26530 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
26540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26550 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
26560 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  ShmNode;..  asse
26570 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
26580 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
26590 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
265a0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
265b0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
265c0 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  de );..  /* Remo
265d0 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
265e0 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
265f0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
26600 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
26610 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
26620 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
26630 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
26640 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
26650 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
26660 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
26670 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
26680 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
26690 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
266a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
266b0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
266c0 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
266d0 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
266e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
266f0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
26700 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
26710 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
26720 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
26730 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
26740 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
26750 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
26760 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
26770 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
26780 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
26790 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
267a0 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
267b0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
267c0 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65  {.    if( delete
267d0 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65  Flag && pShmNode
267e0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
267f0 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64  osUnlink(pShmNod
26800 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
26810 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d     }.    unixShm
26820 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20  Purge(pDbFd);.  
26830 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
26840 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
26850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
26860 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e  else.# define un
26870 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  ixShmMap     0.#
26880 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c   define unixShmL
26890 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
268a0 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  e unixShmBarrier
268b0 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
268c0 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e  ShmUnmap   0.#en
268d0 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
268e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
268f0 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  /..#if SQLITE_MA
26900 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
26910 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75 72  .** If it is cur
26920 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61  rently memory ma
26930 70 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65  pped, unmap file
26940 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pFd..*/.static 
26950 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69  void unixUnmapfi
26960 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
26970 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  ){.  assert( pFd
26980 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
26990 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61  ;.  if( pFd->pMa
269a0 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f  pRegion ){.    o
269b0 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61  sMunmap(pFd->pMa
269c0 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d  pRegion, pFd->mm
269d0 61 70 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20  apSizeActual);. 
269e0 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69     pFd->pMapRegi
269f0 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d  on = 0;.    pFd-
26a00 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20  >mmapSize = 0;. 
26a10 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
26a20 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
26a30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
26a40 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65   to set the size
26a50 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d   of the memory m
26a60 61 70 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65  apping maintaine
26a70 64 20 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65  d by file .** de
26a80 73 63 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20  scriptor pFd to 
26a90 6e 4e 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20  nNew bytes. Any 
26aa0 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
26ab0 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a   is discarded..*
26ac0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
26ad0 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ul, this functio
26ae0 6e 20 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f  n sets the follo
26af0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a  wing variables:.
26b00 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78  **.**       unix
26b10 46 69 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a  File.pMapRegion.
26b20 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
26b30 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20  e.mmapSize.**   
26b40 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61      unixFile.mma
26b50 70 53 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a  pSizeActual.**.*
26b60 2a 20 49 66 20 75 6e 73 75 63 63 65 73 73 66 75  * If unsuccessfu
26b70 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  l, an error mess
26b80 61 67 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69  age is logged vi
26b90 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  a sqlite3_log() 
26ba0 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65  and.** the three
26bb0 20 76 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65   variables above
26bc0 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20   are zeroed. In 
26bd0 74 68 69 73 20 63 61 73 65 20 53 51 4c 69 74 65  this case SQLite
26be0 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69   should.** conti
26bf0 6e 75 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  nue accessing th
26c00 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
26c10 20 74 68 65 20 78 52 65 61 64 28 29 20 61 6e 64   the xRead() and
26c20 20 78 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74   xWrite().** met
26c30 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
26c40 76 6f 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69  void unixRemapfi
26c50 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le(.  unixFile *
26c60 70 46 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  pFd,            
26c70 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
26c80 73 63 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20  scriptor object 
26c90 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20  */.  i64 nNew   
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cb0 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
26cc0 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f   mapping size */
26cd0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
26ce0 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b   *zErr = "mmap";
26cf0 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e  .  int h = pFd->
26d00 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
26d10 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
26d20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
26d30 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  on db file */.  
26d40 75 38 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20  u8 *pOrig = (u8 
26d50 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
26d60 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  n;   /* Pointer 
26d70 74 6f 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20  to current file 
26d80 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34  mapping */.  i64
26d90 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d   nOrig = pFd->mm
26da0 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20  apSizeActual;   
26db0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72    /* Size of pOr
26dc0 69 67 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74  ig region in byt
26dd0 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77  es */.  u8 *pNew
26de0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e00 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20  Location of new 
26e10 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  mapping */.  int
26e20 20 66 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45   flags = PROT_RE
26e30 41 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  AD;             
26e40 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
26e50 73 73 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a  ss to mmap() */.
26e60 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
26e70 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
26e80 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70    assert( nNew>p
26e90 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a  Fd->mmapSize );.
26ea0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d    assert( nNew<=
26eb0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
26ec0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
26ed0 65 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ew>0 );.  assert
26ee0 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  ( pFd->mmapSizeA
26ef0 63 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70  ctual>=pFd->mmap
26f00 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
26f10 28 20 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20  ( MAP_FAILED!=0 
26f20 29 3b 0a 0a 20 20 69 66 28 20 28 70 46 64 2d 3e  );..  if( (pFd->
26f30 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
26f40 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20  FILE_RDONLY)==0 
26f50 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f  ) flags |= PROT_
26f60 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 70 4f  WRITE;..  if( pO
26f70 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45 5f  rig ){.#if HAVE_
26f80 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20 6e  MREMAP.    i64 n
26f90 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61  Reuse = pFd->mma
26fa0 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20  pSize;.#else.   
26fb0 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73   const int szSys
26fc0 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67 65  page = osGetpage
26fd0 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34 20  size();.    i64 
26fe0 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d  nReuse = (pFd->m
26ff0 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53 79  mapSize & ~(szSy
27000 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69  spage-1));.#endi
27010 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d  f.    u8 *pReq =
27020 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b   &pOrig[nReuse];
27030 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61  ..    /* Unmap a
27040 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ny pages of the 
27050 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
27060 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20   that cannot be 
27070 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69  reused. */.    i
27080 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67  f( nReuse!=nOrig
27090 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d   ){.      osMunm
270a0 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e  ap(pReq, nOrig-n
270b0 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23  Reuse);.    }..#
270c0 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
270d0 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d     pNew = osMrem
270e0 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65  ap(pOrig, nReuse
270f0 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d  , nNew, MREMAP_M
27100 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72  AYMOVE);.    zEr
27110 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65  r = "mremap";.#e
27120 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  lse.    pNew = o
27130 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77  sMmap(pReq, nNew
27140 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20  -nReuse, flags, 
27150 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e  MAP_SHARED, h, n
27160 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Reuse);.    if( 
27170 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew!=MAP_FAILED
27180 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   ){.      if( pN
27190 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20  ew!=pReq ){.    
271a0 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65      osMunmap(pNe
271b0 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65  w, nNew - nReuse
271c0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  );.        pNew 
271d0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
271e0 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  {.        pNew =
271f0 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a   pOrig;.      }.
27200 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
27210 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74    /* The attempt
27220 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65   to extend the e
27230 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
27240 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e  failed. Free it.
27250 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77   */.    if( pNew
27260 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20  ==MAP_FAILED || 
27270 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
27280 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c   osMunmap(pOrig,
27290 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a   nReuse);.    }.
272a0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65    }..  /* If pNe
272b0 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c  w is still NULL,
272c0 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61   try to create a
272d0 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d  n entirely new m
272e0 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  apping. */.  if(
272f0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
27300 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c  pNew = osMmap(0,
27310 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41   nNew, flags, MA
27320 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b  P_SHARED, h, 0);
27330 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77  .  }..  if( pNew
27340 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
27350 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
27360 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    nNew = 0;.    
27370 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
27380 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46  ITE_OK, zErr, pF
27390 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20  d->zPath);..    
273a0 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29  /* If the mmap()
273b0 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61   above failed, a
273c0 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73  ssume that all s
273d0 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29  ubsequent mmap()
273e0 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69   calls.    ** wi
273f0 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c  ll probably fail
27400 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20   too. Fall back 
27410 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78  to using xRead/x
27420 57 72 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c  Write exclusivel
27430 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  y.    ** in this
27440 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70   case.  */.    p
27450 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
27460 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e  = 0;.  }.  pFd->
27470 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f  pMapRegion = (vo
27480 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64  id *)pNew;.  pFd
27490 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64  ->mmapSize = pFd
274a0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
274b0 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a   = nNew;.}../*.*
274c0 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20  * Memory map or 
274d0 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f  remap the file o
274e0 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65  pened by file-de
274f0 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66  scriptor pFd (if
27500 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
27510 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20  already mapped, 
27520 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
27530 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64  ping is replaced
27540 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72   by the new). Or
27550 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61  , if .** there a
27560 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
27570 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73  mapping for this
27580 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65   file, and there
27590 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f   are still .** o
275a0 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
275b0 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74  h() references t
275c0 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74  o it, this funct
275d0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
275e0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
275f0 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d  er nByte is non-
27600 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
27610 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74  t is the request
27620 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74  ed size of .** t
27630 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
27640 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
27650 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
27660 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
27670 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  n the .** reques
27680 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20  ted size is the 
27690 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
276a0 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63   on disk. The ac
276b0 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
276c0 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70  .** created mapp
276d0 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68  ing is either th
276e0 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
276f0 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f   or the value co
27700 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69  nfigured .** usi
27710 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ng SQLITE_FCNTL_
27720 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63  MMAP_LIMIT, whic
27730 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72  hever is smaller
27740 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
27750 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
27760 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
27770 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61   (even if the ma
27780 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20  pping is not.** 
27790 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72  recreated as a r
277a0 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e  esult of outstan
277b0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29  ding references)
277c0 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
277d0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  ror.** code othe
277e0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
277f0 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65   int unixMapfile
27800 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20  (unixFile *pFd, 
27810 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 36  i64 nByte){.  i6
27820 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a  4 nMap = nByte;.
27830 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
27840 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20  ert( nMap>=0 || 
27850 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
27860 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  0 );.  if( pFd->
27870 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65  nFetchOut>0 ) re
27880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27890 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b  .  if( nMap<0 ){
278a0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
278b0 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
278c0 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
278d0 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
278e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73 46   */.    rc = osF
278f0 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74  stat(pFd->h, &st
27900 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
27910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27920 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
27930 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
27940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70  ;.    }.    nMap
27950 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69   = statbuf.st_si
27960 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  ze;.  }.  if( nM
27970 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
27980 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
27990 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
279a0 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  ax;.  }..  if( n
279b0 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  Map!=pFd->mmapSi
279c0 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 4d  ze ){.    if( nM
279d0 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  ap>0 ){.      un
279e0 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c  ixRemapfile(pFd,
279f0 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65 6c 73   nMap);.    }els
27a00 65 7b 0a 20 20 20 20 20 20 75 6e 69 78 55 6e 6d  e{.      unixUnm
27a10 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20  apfile(pFd);.   
27a20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
27a30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
27a40 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
27a50 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
27a60 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  /../*.** If poss
27a70 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
27a80 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
27a90 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
27aa0 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
27ab0 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
27ac0 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
27ad0 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
27ae0 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
27af0 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
27b00 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
27b10 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
27b20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
27b30 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
27b40 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
27b50 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
27b60 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
27b70 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
27b80 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
27b90 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
27ba0 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
27bb0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
27bc0 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
27bd0 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
27be0 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
27bf0 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
27c00 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
27c10 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
27c20 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
27c30 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
27c40 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c  entually .** rel
27c50 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
27c60 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e  ce by calling un
27c70 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  ixUnfetch()..*/.
27c80 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
27c90 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
27ca0 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
27cb0 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20   int nAmt, void 
27cc0 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  **pp){.#if SQLIT
27cd0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
27ce0 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  0.  unixFile *pF
27cf0 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  d = (unixFile *)
27d00 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
27d10 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
27d20 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a   file */.#endif.
27d30 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20    *pp = 0;..#if 
27d40 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
27d50 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64  SIZE>0.  if( pFd
27d60 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
27d70 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  ){.    if( pFd->
27d80 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b  pMapRegion==0 ){
27d90 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
27da0 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64 2c  unixMapfile(pFd,
27db0 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   -1);.      if( 
27dc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27dd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
27de0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
27df0 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
27e00 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
27e10 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
27e20 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
27e30 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
27e40 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
27e50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
27e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27e70 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
27e80 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
27e90 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
27ea0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
27eb0 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65  eleases a .** re
27ec0 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
27ed0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
27ee0 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63 68  all to unixFetch
27ef0 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a  (). The second.*
27f00 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  * argument passe
27f10 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
27f20 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  on must be the s
27f30 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65  ame as the corre
27f40 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75  sponding.** argu
27f50 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61  ment that was pa
27f60 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69 78  ssed to the unix
27f70 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69  Fetch() invocati
27f80 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  on. .**.** Or, i
27f90 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
27fa0 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
27fb0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27fc0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
27fd0 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74   .** to inform t
27fe0 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61  he VFS layer tha
27ff0 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  t, according to 
28000 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74  POSIX, any exist
28010 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20  ing mapping .** 
28020 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
28030 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
28040 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
28050 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 66  atic int unixUnf
28060 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
28070 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
28080 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53   void *p){.#if S
28090 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
280a0 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65  IZE>0.  unixFile
280b0 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
280c0 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  e *)fd;   /* The
280d0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
280e0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 55  base file */.  U
280f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28100 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  iOff);..  /* If 
28110 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
28120 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
28130 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
28140 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a  no outstanding .
28150 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65    ** xFetch refe
28160 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70  rences. Or, if p
28170 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  !=0 (meaning it 
28180 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66  is an xFetch ref
28190 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68  erence),.  ** th
281a0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
281b0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
281c0 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20  tstanding.  */. 
281d0 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d   assert( (p==0)=
281e0 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  =(pFd->nFetchOut
281f0 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
28200 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d   p!=0, it must m
28210 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61  atch the iOff va
28220 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lue. */.  assert
28230 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28  ( p==0 || p==&((
28240 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
28250 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a  gion)[iOff] );..
28260 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
28270 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b  Fd->nFetchOut--;
28280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
28290 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  ixUnmapfile(pFd)
282a0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
282b0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
282c0 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  =0 );.#else.  UN
282d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
282e0 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
282f0 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55  AMETER(p);.  UNU
28300 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f  SED_PARAMETER(iO
28310 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ff);.#endif.  re
28320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28330 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  }../*.** Here en
28340 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
28350 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
28360 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
28370 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
28380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
28390 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
283a0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
283b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
283d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
283f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28410 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
28420 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
28430 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  ins definitions 
28440 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  of sqlite3_io_me
28450 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68  thods objects th
28460 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  at.** implement 
28470 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63  various file loc
28480 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
28490 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69    It also contai
284a0 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ns definitions.*
284b0 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75  * of "finder" fu
284c0 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64  nctions.  A find
284d0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  er-function is u
284e0 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  sed to locate th
284f0 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
28500 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28510 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  ods object for a
28520 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
28530 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20  base file.  The 
28540 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c  pAppData.** fiel
28550 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  d of the sqlite3
28560 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73  _vfs VFS objects
28570 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
28580 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20   to be pointers 
28590 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  to.** the correc
285a0 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  t finder-functio
285b0 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a  n for that VFS..
285c0 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65  **.** Most finde
285d0 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  r functions retu
285e0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
285f0 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f  a fixed sqlite3_
28600 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
28610 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ject.  The only 
28620 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64  interesting find
28630 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  er-function is a
28640 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  utolockIoFinder,
28650 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20   which.** looks 
28660 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
28670 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73  m type and tries
28680 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65   to guess the be
28690 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  st locking.** st
286a0 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74  rategy from that
286b0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64  ..**.** For find
286c0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20 74  er-function F, t
286d0 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  wo objects are c
286e0 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  reated:.**.**   
286f0 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69   (1) The real fi
28700 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61  nder-function na
28710 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a  med "FImpt()"..*
28720 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f  *.**    (2) A co
28730 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74  nstant pointer t
28740 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
28750 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a  named just "F"..
28760 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  **.**.** A point
28770 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e  er to the F poin
28780 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74  ter is used as t
28790 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75  he pAppData valu
287a0 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a  e for VFS.** obj
287b0 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74  ects.  We have t
287c0 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61  o do this instea
287d0 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70  d of letting pAp
287e0 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64  pData point.** d
287f0 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66  irectly at the f
28800 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73  inder-function s
28810 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70  ince C90 rules p
28820 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a  revent a void*.*
28830 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69  * from be cast i
28840 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  nto a function p
28850 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  ointer..**.**.**
28860 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
28870 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e  f this macro gen
28880 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63  erates two objec
28890 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ts:.**.**   *  A
288a0 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65   constant sqlite
288b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
288c0 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20  ect call METHOD 
288d0 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67  that has locking
288e0 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73  .**      methods
288f0 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
28900 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e  LOCK, CKRESLOCK.
28910 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49  .**.**   *  An I
28920 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  /O method finder
28930 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
28940 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74   FINDER that ret
28950 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  urns a pointer.*
28960 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45  *      to the ME
28970 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74  THOD object in t
28980 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c  he previous bull
28990 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  et..*/.#define I
289a0 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c  OMETHODS(FINDER,
289b0 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e 2c 43  METHOD,VERSION,C
289c0 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b  LOSE,LOCK,UNLOCK
289d0 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29 20  ,CKLOCK,SHMMAP) 
289e0 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
289f0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
28a00 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b  thods METHOD = {
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c     \.   VERSION,
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a50 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
28a60 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a80 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20    \.   CLOSE,   
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28aa0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20     /* xClose */ 
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20   \.   unixRead, 
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20  \.   unixWrite, 
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20   /* xWrite */   
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28b70 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  .   unixTruncate
28b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28b90 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28bc0 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20     unixSync,    
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28be0 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20  * xSync */      
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28c10 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20    unixFileSize, 
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c30 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c50 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28c60 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20   LOCK,          
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28c80 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  xLock */        
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ca0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28cb0 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  UNLOCK,         
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28cd0 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  Unlock */       
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
28d00 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  KLOCK,          
28d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
28d20 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
28d30 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28d40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28d50 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
28d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
28d70 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28da0 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  xSectorSize,    
28db0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
28dc0 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  torSize */      
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28df0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
28e00 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69  stics,  /* xDevi
28e10 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a  ceCapabilities *
28e20 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28e30 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d 41        \.   SHMMA
28e40 50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P,              
28e50 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
28e60 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e80 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
28e90 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
28ea0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
28eb0 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
28ee0 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
28ef0 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
28f00 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ier */          
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55     \.   unixShmU
28f30 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  nmap,           
28f40 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
28f50 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f70 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68    \.   unixFetch
28f80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28f90 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20     /* xFetch */ 
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fc0 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63   \.   unixUnfetc
28fd0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
28fe0 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29010 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29060 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
29070 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29080 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
29090 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
290a0 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
290b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
290c0 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
290d0 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29100 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29140 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
291a0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
291b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
291c0 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
291d0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
291e0 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
291f0 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
29200 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
29210 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
29220 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29230 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
29240 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
29250 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
29260 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
29270 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
29280 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
29290 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
292a0 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
292b0 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
292c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
292d0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
292e0 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
292f0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
29300 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
29310 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29320 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20   name */.  3,   
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29340 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29350 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61  emory and mmap a
29360 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  re enabled */.  
29370 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
29380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29390 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
293a0 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
293b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
293c0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
293d0 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nixUnlock,      
293e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
293f0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29400 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
29410 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68  dLock,    /* xCh
29420 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29430 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
29440 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20 20  ShmMap          
29450 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
29460 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
29470 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b  ETHODS(.  nolock
29480 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29490 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
294a0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
294b0 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73   nolockIoMethods
294c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ,          /* sq
294d0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
294e0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
294f0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
29500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29510 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
29520 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f  disabled */.  no
29530 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
29540 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
29550 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  e method */.  no
29560 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
29570 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29580 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
29590 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
295a0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
295b0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
295c0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
295d0 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68 65 63  dLock,  /* xChec
295e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
295f0 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29610 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
29620 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
29630 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49  HODS(.  dotlockI
29640 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
29650 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
29660 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  tion name */.  d
29670 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  otlockIoMethods,
29680 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
29690 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
296a0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
296b0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
296c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
296d0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
296e0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c  sabled */.  dotl
296f0 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
29700 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
29710 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
29720 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
29730 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29740 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
29750 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
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 64 6f 74 6c  method */.  dotl
29780 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
29790 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63 6b 52  Lock, /* xCheckR
297a0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
297b0 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297d0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
297e0 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51  hod */.)..#if SQ
297f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
29800 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
29810 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
29820 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
29830 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
29840 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
29850 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
29860 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
29870 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
29880 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
29890 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298b0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
298c0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
298d0 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  bled */.  flockC
298e0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
298f0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
29900 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
29910 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29920 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
29930 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
29940 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29950 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
29960 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
29970 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29980 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ,   /* xCheckRes
29990 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
299a0 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299c0 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
299d0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
299e0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
299f0 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
29a00 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
29a10 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
29a20 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
29a30 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
29a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29a50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29a60 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29a70 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29a90 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
29aa0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
29ab0 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  emXClose,       
29ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29ad0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
29ae0 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  emXLock,        
29af0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29b00 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
29b10 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  mXUnlock,       
29b20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
29b30 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
29b40 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65 64  emXCheckReserved
29b50 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65  Lock,    /* xChe
29b60 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29b70 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
29b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b90 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
29ba0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
29bb0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
29bc0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
29bd0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
29be0 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
29bf0 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64  ODS(.  afpIoFind
29c00 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
29c10 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
29c20 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66  ion name */.  af
29c30 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  pIoMethods,     
29c40 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29c50 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29c60 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
29c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29c80 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29c90 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
29ca0 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c  abled */.  afpCl
29cb0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29cc0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29cd0 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f  ethod */.  afpLo
29ce0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29cf0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29d00 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c  thod */.  afpUnl
29d10 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29d20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
29d30 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68  ethod */.  afpCh
29d40 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
29d50 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
29d60 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29d70 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d90 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
29da0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
29db0 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
29dc0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
29dd0 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
29de0 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
29df0 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
29e00 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
29e10 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
29e20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
29e30 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
29e40 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
29e50 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
29e60 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
29e70 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
29e80 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
29e90 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
29ea0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
29eb0 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
29ec0 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
29ed0 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
29ee0 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
29ef0 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
29f00 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
29f10 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
29f20 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
29f30 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
29f40 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
29f50 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
29f60 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
29f70 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
29f80 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
29f90 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
29fa0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
29fb0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
29fc0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
29fd0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
29fe0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
29ff0 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
2a000 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
2a010 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
2a020 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
2a030 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
2a040 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
2a050 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
2a060 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
2a070 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
2a080 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
2a090 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
2a0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2a0b0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2a0c0 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
2a0d0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2a0e0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2a0f0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2a100 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a120 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2a130 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2a140 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20  /.  proxyClose, 
2a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a160 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2a170 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20  /.  proxyLock,  
2a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a190 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2a1a0 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20  .  proxyUnlock, 
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a1c0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2a1d0 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65  /.  proxyCheckRe
2a1e0 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a  servedLock,   /*
2a1f0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2a200 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2a210 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2a220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2a230 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2a240 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20  .#endif../* nfs 
2a250 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e  lockd on OSX 10.
2a260 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72  3+ doesn't clear
2a270 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65   write locks whe
2a280 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
2a290 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69   set */.#if defi
2a2a0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2a2b0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2a2c0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
2a2d0 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f  METHODS(.  nfsIo
2a2e0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2a2f0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2a300 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2a310 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c  .  nfsIoMethods,
2a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a330 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a340 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2a350 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a370 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2a380 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2a390 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
2a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a3b0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2a3c0 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a3e0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2a3f0 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20  .  nfsUnlock,   
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a410 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2a420 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
2a430 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
2a440 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2a450 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2a460 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a480 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2a490 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
2a4a0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2a4b0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2a4c0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2a4d0 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
2a4e0 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
2a4f0 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
2a500 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
2a510 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
2a520 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
2a530 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
2a540 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
2a550 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
2a560 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
2a570 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
2a580 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
2a590 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
2a5a0 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
2a5b0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
2a5c0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2a5d0 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
2a5e0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
2a5f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
2a600 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
2a610 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2a620 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
2a630 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
2a640 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69        /* open fi
2a650 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
2a660 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a670 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
2a680 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70  onst struct Mapp
2a690 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ing {.    const 
2a6a0 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65  char *zFilesyste
2a6b0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2a6c0 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79  /* Filesystem ty
2a6d0 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  pe name */.    c
2a6e0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2a6f0 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
2a700 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69  s;   /* Appropri
2a710 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ate locking meth
2a720 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d  od */.  } aMap[]
2a730 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22   = {.    { "hfs"
2a740 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
2a750 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75  hods },.    { "u
2a760 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
2a770 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2a780 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49   "afpfs",  &afpI
2a790 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2a7a0 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70  { "smbfs",  &afp
2a7b0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2a7c0 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f   { "webdav", &no
2a7d0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  lockIoMethods },
2a7e0 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20  .    { 0, 0 }.  
2a7f0 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
2a800 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
2a810 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  fo;.  struct flo
2a820 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
2a830 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
2a840 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
2a850 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
2a860 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
2a870 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
2a880 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
2a890 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
2a8a0 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
2a8b0 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
2a8c0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2a8d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
2a8e0 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73  fs(filePath, &fs
2a8f0 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20  Info) != -1 ){. 
2a900 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f     if( fsInfo.f_
2a910 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e  flags & MNT_RDON
2a920 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LY ){.      retu
2a930 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2a940 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ods;.    }.    f
2a950 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e  or(i=0; aMap[i].
2a960 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b  zFilesystem; i++
2a970 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
2a980 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
2a990 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  ypename, aMap[i]
2a9a0 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30  .zFilesystem)==0
2a9b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2a9c0 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68  rn aMap[i].pMeth
2a9d0 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ods;.      }.   
2a9e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
2a9f0 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
2aa00 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
2aa10 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20  rs, "nfs"..  ** 
2aa20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  Test byte-range 
2aa30 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
2aa40 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20  (). If the call 
2aa50 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20  succeeds, .  ** 
2aa60 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
2aa70 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
2aa80 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65  orts POSIX style
2aa90 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20   locks. .  */.  
2aaa0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
2aab0 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
2aac0 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
2aad0 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
2aae0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
2aaf0 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
2ab00 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
2ab10 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
2ab20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
2ab30 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
2ab40 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2ab50 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2ab60 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "nfs")==0 ){.   
2ab70 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f     return &nfsIo
2ab80 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65  Methods;.    } e
2ab90 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lse {.      retu
2aba0 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
2abb0 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ds;.    }.  }els
2abc0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64  e{.    return &d
2abd0 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  otlockIoMethods;
2abe0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
2abf0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2ac00 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
2ac10 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
2ac20 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
2ac30 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
2ac40 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
2ac50 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  pl;..#endif /* d
2ac60 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2ac70 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2ac80 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2ac90 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f   */..#if OS_VXWO
2aca0 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
2acb0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2acc0 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
2acd0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
2ace0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
2acf0 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
2ad00 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
2ad10 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
2ad20 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
2ad30 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
2ad40 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
2ad50 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
2ad60 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
2ad70 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
2ad80 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
2ad90 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b  is is for VXWork
2ada0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
2adb0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2adc0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
2add0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2ade0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2adf0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
2ae00 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
2ae10 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
2ae20 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
2ae30 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f          /* the o
2ae40 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
2ae50 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
2ae60 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
2ae70 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
2ae80 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
2ae90 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
2aea0 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
2aeb0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
2aec0 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
2aed0 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
2aee0 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
2aef0 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
2af00 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
2af10 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65  ds;.  }..  /* Te
2af20 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73  st if fcntl() is
2af30 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75   supported and u
2af40 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  se POSIX style l
2af50 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ocks..  ** Other
2af60 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  wise fall back t
2af70 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  o the named sema
2af80 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20  phore method..  
2af90 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
2afa0 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
2afb0 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
2afc0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
2afd0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
2afe0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
2aff0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
2b000 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
2b010 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
2b020 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
2b030 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73  .    return &pos
2b040 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ixIoMethods;.  }
2b050 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2b060 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a   &semIoMethods;.
2b070 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
2b080 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2b090 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73  thods .  *(*cons
2b0a0 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  t autolockIoFind
2b0b0 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
2b0c0 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74  unixFile*) = aut
2b0d0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
2b0e0 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  l;..#endif /* OS
2b0f0 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
2b100 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b110 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
2b120 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79  * An abstract ty
2b130 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72  pe for a pointer
2b140 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68 6f 64   to an IO method
2b150 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
2b160 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e  :.*/.typedef con
2b170 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2b180 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f  thods *(*finder_
2b190 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72  type)(const char
2b1a0 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a  *,unixFile*);...
2b1b0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2b1c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2b200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
2b220 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
2b230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
2b250 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
2b260 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
2b270 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
2b280 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
2b290 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
2b2a0 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ect..*/../*.** I
2b2b0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
2b2c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e  ntents of the un
2b2d0 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2b2e0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
2b2f0 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  Id..*/.static in
2b300 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  t fillInUnixFile
2b310 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2b320 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50  *pVfs,      /* P
2b330 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
2b340 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  ject */.  int h,
2b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b360 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
2b370 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
2b380 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
2b390 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
2b3a0 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
2b3b0 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
2b3c0 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
2b3d0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
2b3e0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2b3f0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2b400 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2b410 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  d */.  int ctrlF
2b420 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
2b430 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55  * Zero or more U
2b440 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73  NIXFILE_* values
2b450 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
2b460 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b470 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
2b480 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
2b490 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
2b4a0 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
2b4b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2b4c0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
2b4d0 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
2b4e0 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70  /* Usually the p
2b4f0 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68  ath zFilename sh
2b500 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65  ould not be a re
2b510 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
2b520 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74   The.  ** except
2b530 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e  ion is when open
2b540 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63  ing the proxy "c
2b550 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75  onch" file in bu
2b560 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69  ilds that.  ** i
2b570 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69  nclude the speci
2b580 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67  al Apple locking
2b590 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69   styles..  */.#i
2b5a0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2b5b0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2b5c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2b5d0 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46  YLE.  assert( zF
2b5e0 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
2b5f0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
2b600 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41  .    || pVfs->pA
2b610 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26  ppData==(void*)&
2b620 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2b630 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65   );.#else.  asse
2b640 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
2b650 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
2b660 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a  =='/' );.#endif.
2b670 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67  .  /* No locking
2b680 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f   occurs in tempo
2b690 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rary files */.  
2b6a0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
2b6b0 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61  e!=0 || (ctrlFla
2b6c0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
2b6d0 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f  LOCK)!=0 );..  O
2b6e0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
2b6f0 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
2b700 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
2b710 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
2b720 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  ew->pVfs = pVfs;
2b730 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d  .  pNew->zPath =
2b740 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e   zFilename;.  pN
2b750 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20  ew->ctrlFlags = 
2b760 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23  (u8)ctrlFlags;.#
2b770 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
2b780 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77  AP_SIZE>0.  pNew
2b790 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
2b7a0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2b7b0 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64  fig.szMmap;.#end
2b7c0 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
2b7d0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63  _uri_boolean(((c
2b7e0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
2b7f0 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65  ILE_URI) ? zFile
2b800 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20  name : 0),.     
2b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b820 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51        "psow", SQ
2b830 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f  LITE_POWERSAFE_O
2b840 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20  VERWRITE) ){.   
2b850 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2b860 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f   |= UNIXFILE_PSO
2b870 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  W;.  }.  if( str
2b880 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  cmp(pVfs->zName,
2b890 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20  "unix-excl")==0 
2b8a0 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
2b8b0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2b8c0 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69  LE_EXCL;.  }..#i
2b8d0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70  f OS_VXWORKS.  p
2b8e0 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72  New->pId = vxwor
2b8f0 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69  ksFindFileId(zFi
2b900 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
2b910 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20  New->pId==0 ){. 
2b920 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2b930 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b  UNIXFILE_NOLOCK;
2b940 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2b950 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
2b960 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c  if..  if( ctrlFl
2b970 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
2b980 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f  OLOCK ){.    pLo
2b990 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
2b9a0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2b9b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
2b9c0 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
2b9d0 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
2b9e0 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
2b9f0 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
2ba00 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2ba10 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2ba20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
2ba30 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
2ba40 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
2ba50 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
2ba60 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
2ba70 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
2ba80 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
2ba90 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
2baa0 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
2bab0 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
2bac0 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
2bad0 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
2bae0 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
2baf0 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
2bb00 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2bb10 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
2bb20 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
2bb30 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
2bb40 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
2bb50 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
2bb60 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2bb70 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2bb80 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2bb90 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
2bba0 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
2bbb0 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
2bbc0 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
2bbd0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
2bbe0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2bbf0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2bc00 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
2bc10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bc20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
2bc30 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66  or occurred in f
2bc40 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20  indInodeInfo(), 
2bc50 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
2bc60 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
2bc70 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
2bc80 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
2bc90 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
2bca0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20  InodeInfo() may 
2bcb0 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
2bcc0 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
2bcd0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2bce0 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
2bcf0 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
2bd00 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
2bd10 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
2bd20 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2bd30 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
2bd40 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
2bd50 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
2bd60 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
2bd70 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
2bd80 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
2bd90 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2bda0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
2bdb0 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
2bdc0 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
2bdd0 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
2bde0 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
2bdf0 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
2be00 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
2be10 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66  dInodeInfo(). If
2be20 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
2be30 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
2be40 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
2be50 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
2be60 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
2be70 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
2be80 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
2be90 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
2bea0 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
2beb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2bec0 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
2bed0 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
2bee0 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
2bef0 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
2bf00 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
2bf10 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
2bf20 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
2bf30 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
2bf40 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
2bf50 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
2bf60 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
2bf70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
2bf80 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
2bf90 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
2bfa0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2bfb0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2bfc0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d  NE__);.      h =
2bfd0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75   -1;.    }.    u
2bfe0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2bff0 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
2c000 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2c010 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2c020 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c  (__APPLE__).  el
2c030 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2c040 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65  tyle == &afpIoMe
2c050 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2c060 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  AFP locking uses
2c070 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2c080 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2c090 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2c0a0 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
2c0b0 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  ngContext..    *
2c0c0 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67  /.    afpLocking
2c0d0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
2c0e0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2c0f0 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
2c100 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2c110 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
2c120 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d  ;.    if( pCtx==
2c130 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2c140 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2c160 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20  * NB: zFilename 
2c170 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69  exists and remai
2c180 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ns valid until t
2c190 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  he file is close
2c1a0 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72  d.      ** accor
2c1b0 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d  ding to requirem
2c1c0 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20  ent F11141.  So 
2c1d0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2c1e0 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a  o make a.      *
2c1f0 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  * copy of the fi
2c200 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  lename. */.     
2c210 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
2c220 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
2c230 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20   pCtx->reserved 
2c240 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64  = 0;.      srand
2c250 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75  omdev();.      u
2c260 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2c270 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64  .      rc = find
2c280 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
2c290 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
2c2a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2c2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c2c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c2d0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2c2e0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72  text);.        r
2c2f0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2c300 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2c310 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a          h = -1;.
2c320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e        }.      un
2c330 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  ixLeaveMutex(); 
2c340 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20         .    }.  
2c350 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65  }.#endif..  else
2c360 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
2c370 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  le == &dotlockIo
2c380 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2c390 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
2c3a0 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
2c3b0 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
2c3c0 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
2c3d0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f  in.    ** the do
2c3e0 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
2c3f0 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext .    */.    
2c400 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b  char *zLockFile;
2c410 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61  .    int nFilena
2c420 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  me;.    assert( 
2c430 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a  zFilename!=0 );.
2c440 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20      nFilename = 
2c450 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c  (int)strlen(zFil
2c460 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20  ename) + 6;.    
2c470 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
2c480 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
2c490 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  oc(nFilename);. 
2c4a0 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65     if( zLockFile
2c4b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2c4c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2c4d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c4e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c4f0 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f  f(nFilename, zLo
2c500 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54  ckFile, "%s" DOT
2c510 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69  LOCK_SUFFIX, zFi
2c520 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  lename);.    }. 
2c530 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2c540 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46  Context = zLockF
2c550 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  ile;.  }..#if OS
2c560 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20  _VXWORKS.  else 
2c570 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2c580 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f  e == &semIoMetho
2c590 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d  ds ){.    /* Nam
2c5a0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
2c5b0 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2c5c0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2c5d0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
2c5e0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
2c5f0 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   semLockingConte
2c600 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  xt.    */.    un
2c610 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2c620 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2c630 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2c640 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2c650 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
2c660 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70  _OK) && (pNew->p
2c670 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c  Inode->pSem==NUL
2c680 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  L) ){.      char
2c690 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65   *zSemName = pNe
2c6a0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2c6b0 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
2c6c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2c6d0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
2c6e0 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
2c6f0 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20   "/%s.sem",.    
2c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c710 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43     pNew->pId->zC
2c720 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
2c730 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a       for( n=1; z
2c740 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20  SemName[n]; n++ 
2c750 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  ).        if( zS
2c760 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29  emName[n]=='/' )
2c770 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27   zSemName[n] = '
2c780 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  _';.      pNew->
2c790 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73  pInode->pSem = s
2c7a0 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65  em_open(zSemName
2c7b0 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c  , O_CREAT, 0666,
2c7c0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
2c7d0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2c7e0 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20  m == SEM_FAILED 
2c7f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2c800 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c810 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
2c820 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20  de->aSemName[0] 
2c830 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a  = '\0';.      }.
2c840 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
2c850 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
2c860 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 74 6f 72  #endif.  .  stor
2c870 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c  eLastErrno(pNew,
2c880 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f   0);.#if OS_VXWO
2c890 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
2c8a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2c8b0 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
2c8c0 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2c8d0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68  __LINE__);.    h
2c8e0 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c   = -1;.    osUnl
2c8f0 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
2c900 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2c910 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2c920 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64  DELETE;.  }.#end
2c930 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
2c940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2c950 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
2c960 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2c970 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
2c980 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
2c990 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
2c9a0 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
2c9b0 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76  unter(+1);.    v
2c9c0 65 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77  erifyDbFile(pNew
2c9d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2c9e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2c9f0 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
2ca00 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77  a directory in w
2ca10 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70  hich to put temp
2ca20 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20  orary files..** 
2ca30 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74  If no suitable t
2ca40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69  emporary file di
2ca50 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66  rectory can be f
2ca60 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ound, return NUL
2ca70 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
2ca80 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
2ca90 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a  pFileDir(void){.
2caa0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
2cab0 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
2cac0 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
2cad0 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
2cae0 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
2caf0 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
2cb00 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
2cb10 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
2cb20 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
2cb30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2cb40 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
2cb50 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
2cb60 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
2cb70 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
2cb80 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2cb90 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
2cba0 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
2cbb0 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  1] = getenv("SQL
2cbc0 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20  ITE_TMPDIR");.  
2cbd0 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29  if( !azDirs[2] )
2cbe0 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74   azDirs[2] = get
2cbf0 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
2cc00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2cc10 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
2cc20 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
2cc30 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
2cc40 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
2cc50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2cc60 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72   if( osStat(zDir
2cc70 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
2cc80 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
2cc90 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
2cca0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2ccb0 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a    if( osAccess(z
2ccc0 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  Dir, 07) ) conti
2ccd0 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  nue;.    break;.
2cce0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69    }.  return zDi
2ccf0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
2cd00 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
2cd10 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
2cd20 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
2cd30 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
2cd40 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
2cd50 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
2cd60 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
2cd70 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
2cd80 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2cd90 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
2cda0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
2cdb0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
2cdc0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
2cdd0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
2cde0 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b  ned char zChars[
2cdf0 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
2ce00 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
2ce10 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
2ce20 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
2ce30 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
2ce40 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e  56789";.  unsign
2ce50 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  ed int i, j;.  c
2ce60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
2ce70 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
2ce80 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
2ce90 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
2cea0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
2ceb0 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
2cec0 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
2ced0 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
2cee0 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
2cef0 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
2cf00 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
2cf10 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d  ing. .  */.  Sim
2cf20 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2cf30 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2cf40 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75  R );..  zDir = u
2cf50 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29  nixTempFileDir()
2cf60 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20  ;.  if( zDir==0 
2cf70 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20  ) zDir = ".";.. 
2cf80 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2cf90 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
2cfa0 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
2cfb0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
2cfc0 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
2cfd0 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
2cfe0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2cff0 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
2d000 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
2d010 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
2d020 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
2d030 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a 65  ) + 18) >= (size
2d040 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
2d050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2d060 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
2d070 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2d080 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75  ntf(nBuf-18, zBu
2d090 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
2d0a0 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
2d0b0 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
2d0c0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
2d0d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
2d0e0 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
2d0f0 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
2d100 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
2d110 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
2d120 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
2d130 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
2d140 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
2d150 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
2d160 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
2d170 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a  uf[j] = 0;.    z
2d180 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20  Buf[j+1] = 0;.  
2d190 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73  }while( osAccess
2d1a0 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
2d1b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d1c0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
2d1d0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2d1e0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2d1f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
2d200 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61  * Routine to tra
2d210 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c  nsform a unixFil
2d220 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c  e into a proxy-l
2d230 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e  ocking unixFile.
2d240 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2d250 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d  on in the proxy-
2d260 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62  lock division, b
2d270 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f  ut used by unixO
2d280 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49  pen().** if SQLI
2d290 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2d2a0 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e  LOCKING is defin
2d2b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2d2c0 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
2d2d0 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
2d2e0 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  e*, const char*)
2d2f0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
2d300 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  Search for an un
2d310 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
2d320 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  ptor that was op
2d330 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ened on the data
2d340 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e  base .** file (n
2d350 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  ot a journal or 
2d360 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
2d370 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20  ile) identified 
2d380 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a  by pathname.** z
2d390 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45  Path with SQLITE
2d3a0 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
2d3b0 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70  matching those p
2d3c0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2d3d0 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
2d3e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2d3f0 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66  ..**.** Such a f
2d400 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
2d410 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61  ay exist if a da
2d420 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2d430 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20  n was closed.** 
2d440 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  but the associat
2d450 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2d460 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  or could not be 
2d470 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73  closed because s
2d480 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c  ome.** other fil
2d490 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
2d4a0 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2d4b0 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  le is holding a 
2d4c0 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65  file-lock..** Re
2d4d0 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20  fer to comments 
2d4e0 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65  in the unixClose
2d4f0 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  () function and 
2d500 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d  the lengthy comm
2d510 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  ent.** describin
2d520 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72  g "Posix Advisor
2d530 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68  y Locking" at th
2d540 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
2d550 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72  file for .** fur
2d560 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c  ther details. Al
2d570 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38  so, ticket #4018
2d580 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69  ..**.** If a sui
2d590 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  table file descr
2d5a0 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  iptor is found, 
2d5b0 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
2d5c0 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ned. If no.** su
2d5d0 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
2d5e0 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d  or is located, -
2d5f0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
2d600 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75  /.static UnixUnu
2d610 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61  sedFd *findReusa
2d620 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72  bleFd(const char
2d630 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
2d640 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65  gs){.  UnixUnuse
2d650 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30  dFd *pUnused = 0
2d660 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  ;..  /* Do not s
2d670 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
2d680 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
2d690 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  tor on vxworks. 
2d6a0 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  Not because.  **
2d6b0 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e   vxworks would n
2d6c0 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  ot benefit from 
2d6d0 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d  the change (it m
2d6e0 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20  ight, we're not 
2d6f0 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20  sure),.  ** but 
2d700 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74  because no way t
2d710 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72  o test it is cur
2d720 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
2d730 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a  . It is better .
2d740 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b    ** not to risk
2d750 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b   breaking vxwork
2d760 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  s support for th
2d770 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61  e sake of such a
2d780 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20  n obscure .  ** 
2d790 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66  feature.  */.#if
2d7a0 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73   !OS_VXWORKS.  s
2d7b0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2d7c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d7d0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f      /* Results o
2d7e0 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f  f stat() call */
2d7f0 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20  ..  /* A stat() 
2d800 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f  call may fail fo
2d810 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e  r various reason
2d820 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  s. If this happe
2d830 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61  ns, it is.  ** a
2d840 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
2d850 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c  at an open() cal
2d860 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  l on the same pa
2d870 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69  th will also fai
2d880 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73  l..  ** For this
2d890 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65   reason, if an e
2d8a0 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
2d8b0 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68  he stat() call h
2d8c0 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ere, it is.  ** 
2d8d0 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69  ignored and -1 i
2d8e0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
2d8f0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20  caller will try 
2d900 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
2d910 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
2d920 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  or on the same p
2d930 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72  ath, fail, and r
2d940 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74  eturn an error t
2d950 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20  o SQLite..  **. 
2d960 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75   ** Even if a su
2d970 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20  bsequent open() 
2d980 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65  call does succee
2d990 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e  d, the consequen
2d9a0 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20  ces of.  ** not 
2d9b0 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20  searching for a 
2d9c0 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65  reusable file de
2d9d0 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74  scriptor are not
2d9e0 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28   dire.  */.  if(
2d9f0 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2da00 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2da10 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
2da20 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69  pInode;..    uni
2da30 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2da40 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64     pInode = inod
2da50 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  eList;.    while
2da60 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e  ( pInode && (pIn
2da70 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21  ode->fileId.dev!
2da80 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20  =sStat.st_dev.  
2da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2daa0 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69     || pInode->fi
2dab0 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e  leId.ino!=sStat.
2dac0 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20  st_ino) ){.     
2dad0 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
2dae0 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  e->pNext;.    }.
2daf0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29      if( pInode )
2db00 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73  {.      UnixUnus
2db10 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20  edFd **pp;.     
2db20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d   for(pp=&pInode-
2db30 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26  >pUnused; *pp &&
2db40 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66   (*pp)->flags!=f
2db50 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29  lags; pp=&((*pp)
2db60 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  ->pNext));.     
2db70 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a   pUnused = *pp;.
2db80 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65        if( pUnuse
2db90 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  d ){.        *pp
2dba0 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78   = pUnused->pNex
2dbb0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2dbc0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
2dbd0 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
2dbe0 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56  f    /* if !OS_V
2dbf0 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75  XWORKS */.  retu
2dc00 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f  rn pUnused;.}../
2dc10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2dc20 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
2dc30 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65  unixOpen() to de
2dc40 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78  termine the unix
2dc50 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
2dc60 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69  to create new fi
2dc70 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20  les with. If no 
2dc80 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
2dc90 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
2dca0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
2dcb0 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65  a value suitable
2dcc0 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20   for passing as 
2dcd0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
2dce0 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73  nt to open(2) is
2dcf0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
2dd00 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20  pMode. If an IO 
2dd10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
2dd20 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2dd30 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
2dd40 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2dd50 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f   of *pMode is no
2dd60 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  t modified..**.*
2dd70 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c  * In most cases,
2dd80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
2dd90 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20  ts *pMode to 0, 
2dda0 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d  which will becom
2ddb0 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69  e.** an indicati
2ddc0 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65  on to robust_ope
2ddd0 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20 74 68  n() to create th
2dde0 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20  e file using.** 
2ddf0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2de00 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
2de10 61 64 6a 75 73 74 65 64 20 62 79 20 74 68 65 20  adjusted by the 
2de20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66  umask..** But if
2de30 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2de40 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20  opened is a WAL 
2de50 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  or regular journ
2de60 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a  al file, then .*
2de70 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2de80 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65  queries the file
2de90 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2dea0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
2deb0 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
2dec0 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
2ded0 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f  le and sets *pMo
2dee0 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  de to this value
2def0 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70  . Whenever .** p
2df00 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64  ossible, WAL and
2df10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61   journal files a
2df20 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  re created using
2df30 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
2df40 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65  sions .** as the
2df50 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
2df60 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2df70 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45   If the SQLITE_E
2df80 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
2df90 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
2dfa0 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f  d, then the.** o
2dfb0 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
2dfc0 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   is unavailable.
2dfd0 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20    But 8_3_NAMES 
2dfe0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
2dff0 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74  .** FAT filesyst
2e000 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69  ems and permissi
2e010 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65  ons do not matte
2e020 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74  r there, so just
2e030 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61   use.** the defa
2e040 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ult permissions.
2e050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2e060 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
2e070 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2e080 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2e090 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2e0a0 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20  file (possibly) 
2e0b0 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f  being created */
2e0c0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0e0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
2e0f0 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65  ed as 4th argume
2e100 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f  nt to xOpen() */
2e110 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
2e120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e130 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
2e140 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66  ssions to open f
2e150 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69  ile with */.  ui
2e160 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20  d_t *pUid,      
2e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e180 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74   OUT: uid to set
2e190 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
2e1a0 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20    gid_t *pGid   
2e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1c0 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f    /* OUT: gid to
2e1d0 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
2e1e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2e1f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2e200 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e210 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d  rn Code */.  *pM
2e220 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64  ode = 0;.  *pUid
2e230 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20   = 0;.  *pGid = 
2e240 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  0;.  if( flags &
2e250 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
2e260 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
2e270 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
2e280 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f     char zDb[MAX_
2e290 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20  PATHNAME+1];    
2e2a0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
2e2b0 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
2e2c0 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20  t nDb;          
2e2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e2e0 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62  umber of valid b
2e2f0 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20  ytes in zDb */. 
2e300 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
2e310 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2e320 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74   /* Output of st
2e330 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65  at() on database
2e340 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   file */..    /*
2e350 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68   zPath is a path
2e360 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75   to a WAL or jou
2e370 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66  rnal file. The f
2e380 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64  ollowing block d
2e390 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68  erives.    ** th
2e3a0 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73  e path to the as
2e3b0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
2e3c0 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74  e file from zPat
2e3d0 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61  h. This block ha
2e3e0 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  ndles.    ** the
2e3f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e   following namin
2e400 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20  g conventions:. 
2e410 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22     **.    **   "
2e420 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2e430 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  rnal".    **   "
2e440 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
2e450 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
2e460 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
2e470 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  NN".    **   "<p
2e480 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e  ath to db>-walNN
2e490 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ".    **.    ** 
2e4a0 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65  where NN is a de
2e4b0 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68  cimal number. Th
2e4c0 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65  e NN naming sche
2e4d0 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  mes are .    ** 
2e4e0 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74  used by the test
2e4f0 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64  _multiplex.c mod
2e500 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ule..    */.    
2e510 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nDb = sqlite3Str
2e520 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31  len30(zPath) - 1
2e530 3b 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ; .#ifdef SQLITE
2e540 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
2e550 53 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62  S.    while( nDb
2e560 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 61  >0 && sqlite3Isa
2e570 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29  lnum(zPath[nDb])
2e580 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66   ) nDb--;.    if
2e590 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74  ( nDb==0 || zPat
2e5a0 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72 65  h[nDb]!='-' ) re
2e5b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e5c0 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
2e5d0 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27   zPath[nDb]!='-'
2e5e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2e5f0 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20  ( nDb>0 );.     
2e600 20 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b 6e   assert( zPath[n
2e610 44 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20  Db]!='\n' );.   
2e620 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a     nDb--;.    }.
2e630 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63 70  #endif.    memcp
2e640 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44  y(zDb, zPath, nD
2e650 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d  b);.    zDb[nDb]
2e660 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66   = '\0';..    if
2e670 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c  ( 0==osStat(zDb,
2e680 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2e690 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74    *pMode = sStat
2e6a0 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b  .st_mode & 0777;
2e6b0 0a 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73  .      *pUid = s
2e6c0 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20  Stat.st_uid;.   
2e6d0 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74     *pGid = sStat
2e6e0 2e 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c  .st_gid;.    }el
2e6f0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2e700 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
2e710 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  T;.    }.  }else
2e720 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
2e730 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
2e740 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70  NCLOSE ){.    *p
2e750 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d  Mode = 0600;.  }
2e760 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e770 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
2e780 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a  file zPath..** .
2e790 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74  ** Previously, t
2e7a0 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79  he SQLite OS lay
2e7b0 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75  er used three fu
2e7c0 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65  nctions in place
2e7d0 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a   of this.** one:
2e7e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
2e7f0 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
2e800 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e();.**     sqli
2e810 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
2e820 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  y();.**     sqli
2e830 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
2e840 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ve();.**.** Thes
2e850 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f  e calls correspo
2e860 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd to the follow
2e870 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
2e880 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
2e890 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29       ReadWrite()
2e8a0 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49   ->     (READWRI
2e8b0 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20  TE | CREATE).** 
2e8c0 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20      ReadOnly()  
2e8d0 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59  ->     (READONLY
2e8e0 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78  ) .**     OpenEx
2e8f0 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45  clusive() -> (RE
2e900 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
2e910 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a   | EXCLUSIVE).**
2e920 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e  .** The old Open
2e930 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65  Exclusive() acce
2e940 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61  pted a boolean a
2e950 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c  rgument - "delFl
2e960 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c  ag". If.** true,
2e970 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f   the file was co
2e980 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61  nfigured to be a
2e990 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
2e9a0 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  eted when the.**
2e9b0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f   file handle clo
2e9c0 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20  sed. To achieve 
2e9d0 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20  the same effect 
2e9e0 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a  using this new .
2e9f0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64  ** interface, ad
2ea00 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c  d the DELETEONCL
2ea10 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73  OSE flag to thos
2ea20 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76  e specified abov
2ea30 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78  e for .** OpenEx
2ea40 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74  clusive()..*/.st
2ea50 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
2ea60 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2ea70 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
2ea80 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72    /* The VFS for
2ea90 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74   which this is t
2eaa0 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20  he xOpen method 
2eab0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2eac0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2ead0 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66    /* Pathname of
2eae0 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e   file to be open
2eaf0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
2eb00 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  file *pFile,    
2eb10 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
2eb20 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
2eb30 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20  e filled in */. 
2eb40 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2eb60 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20   Input flags to 
2eb70 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e  control the open
2eb80 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ing */.  int *pO
2eb90 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
2eba0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2ebb0 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74  flags returned t
2ebc0 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f  o SQLite core */
2ebd0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
2ebe0 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  p = (unixFile *)
2ebf0 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20  pFile;.  int fd 
2ec00 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
2ec10 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
2ec20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72  descriptor retur
2ec30 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f  ned by open() */
2ec40 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
2ec50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ec60 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
2ec70 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a  ss to open() */.
2ec80 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
2ec90 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
2eca0 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
2ecb0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2ecc0 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ece0 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
2ecf0 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
2ed00 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2ed10 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2ed20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2ed30 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2ed40 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d   int ctrlFlags =
2ed50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2ed60 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c  /* UNIXFILE_* fl
2ed70 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73  ags */..  int is
2ed80 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
2ed90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2eda0 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
2edb0 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
2edc0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2edd0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2ede0 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
2edf0 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
2ee00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2ee10 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
2ee20 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
2ee30 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2ee40 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2ee50 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
2ee60 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
2ee70 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2ee80 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ITE);.#if SQLITE
2ee90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2eea0 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75  STYLE.  int isAu
2eeb0 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67  toProxy  = (flag
2eec0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2eed0 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64  AUTOPROXY);.#end
2eee0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
2eef0 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
2ef00 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ef10 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
2ef20 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
2ef30 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2ef40 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
2ef50 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
2ef60 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
2ef70 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
2ef80 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
2ef90 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
2efa0 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
2efb0 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
2efc0 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
2efd0 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
2efe0 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
2eff0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
2f000 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
2f010 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
2f020 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65  syncDir = (isCre
2f030 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
2f040 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f050 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2f060 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
2f070 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2f080 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
2f090 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2f0a0 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
2f0b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
2f0c0 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
2f0d0 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
2f0e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
2f0f0 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
2f100 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
2f110 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
2f120 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
2f130 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
2f140 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
2f150 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
2f160 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+2];.  const c
2f170 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
2f180 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
2f190 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2f1a0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
2f1b0 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
2f1c0 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
2f1d0 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
2f1e0 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
2f1f0 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
2f200 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
2f210 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
2f220 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
2f230 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
2f240 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
2f250 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
2f260 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
2f270 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
2f280 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
2f290 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
2f2a0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
2f2b0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
2f2c0 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
2f2d0 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
2f2e0 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
2f2f0 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
2f300 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
2f310 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
2f320 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
2f330 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
2f340 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
2f350 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
2f360 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
2f370 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
2f380 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
2f390 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
2f3a0 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
2f3b0 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
2f3c0 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
2f3d0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
2f3e0 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
2f3f0 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
2f400 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
2f410 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
2f420 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2f430 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2f440 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2f450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
2f460 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2f470 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2f480 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f490 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
2f4a0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2f4b0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2f4c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2f4d0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
2f4e0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2f4f0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2f500 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2f510 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
2f520 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
2f530 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
2f540 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
2f550 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
2f560 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
2f570 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f580 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
2f590 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f5a0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
2f5b0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
2f5c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f5d0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
2f5e0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2f5f0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
2f600 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2f610 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
2f620 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
2f630 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2f640 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
2f650 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2f660 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
2f670 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
2f680 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2f690 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65  .  );..  /* Dete
2f6a0 63 74 20 61 20 70 69 64 20 63 68 61 6e 67 65 20  ct a pid change 
2f6b0 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 52  and reset the PR
2f6c0 4e 47 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  NG.  There is a 
2f6d0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20  race condition. 
2f6e0 20 2a 2a 20 68 65 72 65 20 73 75 63 68 20 74 68   ** here such th
2f6f0 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  at two or more t
2f700 68 72 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e  hreads all tryin
2f710 67 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  g to open databa
2f720 73 65 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ses at.  ** the 
2f730 73 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67  same instant mig
2f740 68 74 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65  ht all reset the
2f750 20 50 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74   PRNG.  But mult
2f760 69 70 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a  iple resets.  **
2f770 20 61 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20   are harmless.. 
2f780 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d   */.  if( random
2f790 6e 65 73 73 50 69 64 21 3d 6f 73 47 65 74 70 69  nessPid!=osGetpi
2f7a0 64 28 29 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f  d() ){.    rando
2f7b0 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65 74  mnessPid = osGet
2f7c0 70 69 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  pid();.    sqlit
2f7d0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c  e3_randomness(0,
2f7e0 30 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65  0);.  }..  memse
2f7f0 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  t(p, 0, sizeof(u
2f800 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66  nixFile));..  if
2f810 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
2f820 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a  OPEN_MAIN_DB ){.
2f830 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
2f840 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70   *pUnused;.    p
2f850 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
2f860 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66  sableFd(zName, f
2f870 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
2f880 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
2f890 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
2f8a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f8b0 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
2f8c0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
2f8d0 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
2f8e0 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65       if( !pUnuse
2f8f0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
2f900 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2f910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f920 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d      p->pUnused =
2f930 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f   pUnused;..    /
2f940 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
2f950 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d  ames are double-
2f960 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20  zero terminated 
2f970 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
2f980 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68      ** URIs with
2f990 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65   parameters.  He
2f9a0 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c  nce, they can al
2f9b0 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69  ways be passed i
2f9c0 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  nto.    ** sqlit
2f9d0 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
2f9e0 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
2f9f0 74 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  t( (flags & SQLI
2fa00 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20  TE_OPEN_URI) || 
2fa10 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61  zName[strlen(zNa
2fa20 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20  me)+1]==0 );..  
2fa30 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65  }else if( !zName
2fa40 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e   ){.    /* If zN
2fa50 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ame is NULL, the
2fa60 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20   upper layer is 
2fa70 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d  requesting a tem
2fa80 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  p file. */.    a
2fa90 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
2faa0 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20  & !syncDir);.   
2fab0 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d   rc = unixGetTem
2fac0 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41  pname(MAX_PATHNA
2fad0 4d 45 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  ME+2, zTmpname);
2fae0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2faf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fb00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2fb10 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d  .    zName = zTm
2fb20 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  pname;..    /* G
2fb30 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61  enerated tempora
2fb40 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  ry filenames are
2fb50 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a   always double-z
2fb60 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20  ero terminated. 
2fb70 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79     ** for use by
2fb80 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
2fb90 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20  ameter(). */.   
2fba0 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73   assert( zName[s
2fbb0 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
2fbc0 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
2fbd0 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
2fbe0 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73  lue of the flags
2fbf0 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   parameter passe
2fc00 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74  d to POSIX funct
2fc10 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e  ion.  ** open().
2fc20 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63   These must be c
2fc30 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69  alculated even i
2fc40 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20  f open() is not 
2fc50 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20  called, as.  ** 
2fc60 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72  they may be stor
2fc70 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
2fc80 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e  e file handle an
2fc90 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20  d used by the . 
2fca0 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27   ** 'conch file'
2fcb0 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f   locking functio
2fcc0 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f  ns later on.  */
2fcd0 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
2fce0 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  y )  openFlags |
2fcf0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66  = O_RDONLY;.  if
2fd00 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20  ( isReadWrite ) 
2fd10 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
2fd20 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65  DWR;.  if( isCre
2fd30 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61  ate )    openFla
2fd40 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20  gs |= O_CREAT;. 
2fd50 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
2fd60 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
2fd70 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  (O_EXCL|O_NOFOLL
2fd80 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73  OW);.  openFlags
2fd90 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
2fda0 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69  |O_BINARY);..  i
2fdb0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d  f( fd<0 ){.    m
2fdc0 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20  ode_t openMode; 
2fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fde0 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63  Permissions to c
2fdf0 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68 20  reate file with 
2fe00 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64  */.    uid_t uid
2fe10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fe20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20 66       /* Userid f
2fe30 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  or the file */. 
2fe40 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20     gid_t gid;   
2fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe60 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20   /* Groupid for 
2fe70 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
2fe80 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46  rc = findCreateF
2fe90 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66  ileMode(zName, f
2fea0 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c  lags, &openMode,
2feb0 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20   &uid, &gid);.  
2fec0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2fed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2fee0 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64  ert( !p->pUnused
2fef0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2ff00 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
2ff10 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70  OPEN_WAL || eTyp
2ff20 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2ff30 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
2ff40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ff50 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72      }.    fd = r
2ff60 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
2ff70 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
2ff80 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52  nMode);.    OSTR
2ff90 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d  ACE(("OPENX   %-
2ffa0 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64  3d %s 0%o\n", fd
2ffb0 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  , zName, openFla
2ffc0 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64  gs));.    if( fd
2ffd0 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53  <0 && errno!=EIS
2ffe0 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69  DIR && isReadWri
2fff0 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
30000 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  ve ){.      /* F
30010 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  ailed to open th
30020 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f  e file for read/
30030 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72  write access. Tr
30040 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a  y read-only. */.
30050 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
30060 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
30070 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
30080 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
30090 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e    openFlags &= ~
300a0 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29  (O_RDWR|O_CREAT)
300b0 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
300c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
300d0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65  DONLY;.      ope
300e0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
300f0 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64  LY;.      isRead
30100 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  only = 1;.      
30110 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
30120 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
30130 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
30140 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30    }.    if( fd<0
30150 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
30160 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
30170 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
30180 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29  , "open", zName)
30190 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
301a0 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
301b0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
301c0 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e  s process is run
301d0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e 64  ning as root and
301e0 20 69 66 20 63 72 65 61 74 69 6e 67 20 61 20 6e   if creating a n
301f0 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  ew rollback.    
30200 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41  ** journal or WA
30210 4c 20 66 69 6c 65 2c 20 73 65 74 20 74 68 65 20  L file, set the 
30220 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
30230 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20   journal or WAL 
30240 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74 68 65  to be.    ** the
30250 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72 69   same as the ori
30260 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a  ginal database..
30270 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
30280 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
30290 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f  PEN_WAL|SQLITE_O
302a0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
302b0 29 20 29 7b 0a 20 20 20 20 20 20 6f 73 46 63 68  ) ){.      osFch
302c0 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64  own(fd, uid, gid
302d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
302e0 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a  ssert( fd>=0 );.
302f0 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
30300 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  ){.    *pOutFlag
30310 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
30320 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64    if( p->pUnused
30330 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73   ){.    p->pUnus
30340 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20  ed->fd = fd;.   
30350 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61   p->pUnused->fla
30360 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
30370 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
30380 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
30390 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e  S.    zPath = zN
303a0 61 6d 65 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  ame;.#elif defin
303b0 65 64 28 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b  ed(SQLITE_UNLINK
303c0 5f 41 46 54 45 52 5f 43 4c 4f 53 45 29 0a 20 20  _AFTER_CLOSE).  
303d0 20 20 7a 50 61 74 68 20 3d 20 73 71 6c 69 74 65    zPath = sqlite
303e0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
303f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
30400 7a 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20  zPath==0 ){.    
30410 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
30420 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
30430 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
30440 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
30450 7d 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e  }.#else.    osUn
30460 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e  link(zName);.#en
30470 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  dif.  }.#if SQLI
30480 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
30490 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a  G_STYLE.  else{.
304a0 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73      p->openFlags
304b0 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
304c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f  }.#endif..  noLo
304d0 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49  ck = eType!=SQLI
304e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b  TE_OPEN_MAIN_DB;
304f0 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  ..  .#if defined
30500 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53  (__APPLE__) || S
30510 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
30520 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28  KING_STYLE.  if(
30530 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73   fstatfs(fd, &fs
30540 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
30550 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
30560 6f 28 70 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  o(p, errno);.   
30570 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
30580 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
30590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
305a0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
305b0 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
305c0 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20  trncmp("msdos", 
305d0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
305e0 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
305f0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
30600 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
30610 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
30620 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20  MSDOS;.  }.  if 
30630 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65  (0 == strncmp("e
30640 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  xfat", fsInfo.f_
30650 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
30660 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
30670 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
30680 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
30690 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
306a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
306b0 65 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74  et up appropriat
306c0 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20  e ctrlFlags */. 
306d0 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20   if( isDelete ) 
306e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
306f0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
30700 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69  FILE_DELETE;.  i
30710 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
30720 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
30730 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
30740 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28  LE_RDONLY;.  if(
30750 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20   noLock )       
30760 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
30770 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
30780 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73  _NOLOCK;.  if( s
30790 79 6e 63 44 69 72 20 29 20 20 20 20 20 20 20 20  yncDir )        
307a0 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
307b0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
307c0 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c  IRSYNC;.  if( fl
307d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
307e0 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67  N_URI ) ctrlFlag
307f0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52  s |= UNIXFILE_UR
30800 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  I;..#if SQLITE_E
30810 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
30820 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
30830 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
30840 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
30850 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
30860 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
30870 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
30880 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
30890 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
308a0 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
308b0 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
308c0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
308d0 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
308e0 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
308f0 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
30900 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
30910 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
30920 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
30930 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
30940 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
30950 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
30960 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
30970 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
30980 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
30990 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
309a0 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
309b0 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
309c0 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
309d0 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
309e0 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
309f0 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
30a00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
30a10 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
30a20 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
30a30 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69  le(pVfs, fd, pFi
30a40 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46  le, zPath, ctrlF
30a50 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
30a60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30a70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
30a80 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
30a90 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a  xFile((unixFile*
30aa0 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22  )pFile, ":auto:"
30ab0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
30ac0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
30ae0 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c   unixClose to cl
30af0 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75  ean up the resou
30b00 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69  rces added in fi
30b10 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20  llInUnixFile .  
30b20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63          ** and c
30b30 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72  lear all the str
30b40 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e  ucture's referen
30b50 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ces.  Specifical
30b60 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ly, .          *
30b70 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  * pFile->pMethod
30b80 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73  s will be NULL s
30b90 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  o sqlite3OsClose
30ba0 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70   will be a no-op
30bb0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20   .          */. 
30bc0 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f           unixClo
30bd0 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  se(pFile);.     
30be0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30c00 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  }.      goto ope
30c10 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
30c20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
30c30 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
30c40 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
30c50 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74  pFile, zPath, ct
30c60 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f  rlFlags);..open_
30c70 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
30c80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30c90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
30ca0 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20  e(p->pUnused);. 
30cb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
30cc0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  }.../*.** Delete
30cd0 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61   the file at zPa
30ce0 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79  th. If the dirSy
30cf0 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nc argument is t
30d00 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20  rue, fsync().** 
30d10 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66  the directory af
30d20 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ter deleting the
30d30 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
30d40 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28   int unixDelete(
30d50 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
30d60 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20  NotUsed,     /* 
30d70 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
30d80 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65  his as the xDele
30d90 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  te method */.  c
30da0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
30db0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
30dc0 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64   of file to be d
30dd0 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  eleted */.  int 
30de0 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20  dirSync         
30df0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
30e00 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74  , fsync() direct
30e10 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
30e20 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ng file */.){.  
30e30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30e40 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  OK;.  UNUSED_PAR
30e50 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
30e60 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
30e70 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
30e80 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
30e90 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a    if( osUnlink(z
30ea0 50 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  Path)==(-1) ){. 
30eb0 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e     if( errno==EN
30ec0 4f 45 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f  OENT.#if OS_VXWO
30ed0 52 4b 53 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f  RKS.        || o
30ee0 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 30 29  sAccess(zPath,0)
30ef0 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  !=0.#endif.    )
30f00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
30f10 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
30f20 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73  _NOENT;.    }els
30f30 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  e{.      rc = un
30f40 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
30f50 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
30f60 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29  "unlink", zPath)
30f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
30f80 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64  rn rc;.  }.#ifnd
30f90 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
30fa0 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20  E_DIRSYNC.  if( 
30fb0 28 64 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30  (dirSync & 1)!=0
30fc0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
30fd0 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
30fe0 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
30ff0 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &fd);.    if( rc
31000 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
31010 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
31020 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
31030 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20  )==-1 ).#else.  
31040 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
31050 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ) ).#endif.     
31060 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
31070 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
31080 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
31090 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50  YNC, "fsync", zP
310a0 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
310b0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
310c0 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
310d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
310e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
310f0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63  OPEN ){.      rc
31100 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31110 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
31120 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31130 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78  *.** Test the ex
31140 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63  istence of or ac
31150 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
31160 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20   of file zPath. 
31170 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66  The.** test perf
31180 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  ormed depends on
31190 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c   the value of fl
311a0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ags:.**.**     S
311b0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
311c0 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66  STS: Return 1 if
311d0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
311e0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
311f0 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
31200 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
31210 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e   file is read an
31220 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20  d writable..**  
31230 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
31240 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72  _READONLY: Retur
31250 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
31260 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a  is readable..**.
31270 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  ** Otherwise ret
31280 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
31290 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28   int unixAccess(
312a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
312b0 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68  NotUsed,   /* Th
312c0 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  e VFS containing
312d0 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65   this xAccess me
312e0 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
312f0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
31300 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65    /* Path of the
31310 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65   file to examine
31320 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
31330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31340 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74   What do we want
31350 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20   to learn about 
31360 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20  the zPath file? 
31370 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
31380 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
31390 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f  Write result boo
313a0 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  lean here */.){.
313b0 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b    int amode = 0;
313c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
313d0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
313e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
313f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
31400 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
31410 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
31420 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
31430 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
31440 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
31450 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  F_OK;.      brea
31460 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
31470 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
31480 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  ITE:.      amode
31490 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20   = W_OK|R_OK;.  
314a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
314b0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
314c0 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d  S_READ:.      am
314d0 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20  ode = R_OK;.    
314e0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
314f0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
31500 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
31510 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
31520 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
31530 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68   (osAccess(zPath
31540 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20  , amode)==0);.  
31550 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54  if( flags==SQLIT
31560 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
31570 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20  && *pResOut ){. 
31580 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
31590 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f  uf;.    if( 0==o
315a0 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75  sStat(zPath, &bu
315b0 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a  f) && buf.st_siz
315c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==0 ){.      *p
315d0 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  ResOut = 0;.    
315e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
315f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
31600 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
31610 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
31620 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
31630 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20  e. The relative 
31640 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65  path.** is store
31650 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69  d as a nul-termi
31660 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20  nated string in 
31670 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
31680 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74  ed to by.** zPat
31690 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70  h. .**.** zOut p
316a0 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
316b0 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71  r of at least sq
316c0 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
316d0 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28  name bytes .** (
316e0 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41  in this case, MA
316f0 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73  X_PATHNAME bytes
31700 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68  ). The full-path
31710 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a   is written to.*
31720 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65  * this buffer be
31730 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
31740 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
31750 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  ixFullPathname(.
31760 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
31770 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
31780 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
31790 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
317a0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
317b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
317c0 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
317d0 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
317e0 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20   int nOut,      
317f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31800 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
31810 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
31820 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
31830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31840 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
31850 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a  ffer */.){..  /*
31860 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
31870 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
31880 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
31890 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
318a0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
318b0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
318c0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
318d0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
318e0 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
318f0 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
31900 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
31910 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
31920 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
31930 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
31940 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  g directory has 
31950 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20  been unlinked.. 
31960 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
31970 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
31980 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
31990 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d   assert( pVfs->m
319a0 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50  xPathname==MAX_P
319b0 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55  ATHNAME );.  UNU
319c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
319d0 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75  fs);..  zOut[nOu
319e0 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69  t-1] = '\0';.  i
319f0 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27  f( zPath[0]=='/'
31a00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
31a10 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a  snprintf(nOut, z
31a20 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68  Out, "%s", zPath
31a30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
31a40 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66  int nCwd;.    if
31a50 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c  ( osGetcwd(zOut,
31a60 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20   nOut-1)==0 ){. 
31a70 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
31a80 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
31a90 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
31aa0 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b  getcwd", zPath);
31ab0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20  .    }.    nCwd 
31ac0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f  = (int)strlen(zO
31ad0 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
31ae0 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e  _snprintf(nOut-n
31af0 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d  Cwd, &zOut[nCwd]
31b00 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b  , "/%s", zPath);
31b10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
31b20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66  LITE_OK;.}...#if
31b30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31b40 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
31b50 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
31b60 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
31b70 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
31b80 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
31b90 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
31ba0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
31bb0 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
31bc0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
31bd0 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64  ..*/.#include <d
31be0 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76  lfcn.h>.static v
31bf0 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28  oid *unixDlOpen(
31c00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
31c10 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72  Used, const char
31c20 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
31c30 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31c40 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
31c50 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65  urn dlopen(zFile
31c60 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c  name, RTLD_NOW |
31c70 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d   RTLD_GLOBAL);.}
31c80 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ../*.** SQLite c
31c90 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
31ca0 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  on immediately a
31cb0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75  fter a call to u
31cc0 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a  nixDlSym() or.**
31cd0 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61   unixDlOpen() fa
31ce0 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e  ils (returns a n
31cf0 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66  ull pointer). If
31d00 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64   a more detailed
31d10 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
31d20 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
31d30 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  it is written to
31d40 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20   zBufOut. If no 
31d50 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
31d60 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a   is available, z
31d70 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75  BufOut is left u
31d80 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51  nmodified and SQ
31d90 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61  Lite uses a defa
31da0 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73  ult.** error mes
31db0 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sage..*/.static 
31dc0 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72  void unixDlError
31dd0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
31de0 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
31df0 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
31e00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
31e10 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  Err;.  UNUSED_PA
31e20 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
31e30 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
31e40 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64  ex();.  zErr = d
31e50 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  lerror();.  if( 
31e60 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  zErr ){.    sqli
31e70 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
31e80 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22  f, zBufOut, "%s"
31e90 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75  , zErr);.  }.  u
31ea0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
31eb0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
31ec0 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74  *unixDlSym(sqlit
31ed0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
31ee0 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20   void *p, const 
31ef0 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64  char*zSym))(void
31f00 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43  ){.  /* .  ** GC
31f10 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  C with -pedantic
31f20 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61  -errors says tha
31f30 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61  t C90 does not a
31f40 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20  llow a void* to 
31f50 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74  be.  ** cast int
31f60 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  o a pointer to a
31f70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20   function.  And 
31f80 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20  yet the library 
31f90 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a  dlsym() routine.
31fa0 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76    ** returns a v
31fb0 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65  oid* which is re
31fc0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
31fd0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  o a function.  S
31fe0 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a  o how do we.  **
31ff0 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74   use dlsym() wit
32000 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
32010 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  rs?.  **.  ** Va
32020 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69  riable x below i
32030 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
32040 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
32050 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20  unction taking. 
32060 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76   ** parameters v
32070 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63  oid* and const c
32080 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69  har* and returni
32090 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
320a0 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  a function..  **
320b0 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78   We initialize x
320c0 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74   by assigning it
320d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
320e0 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69  e dlsym() functi
320f0 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61  on..  ** (That a
32100 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  ssignment requir
32110 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65  es a cast.)  The
32120 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75  n we call the fu
32130 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a  nction that.  **
32140 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a   x points to.  .
32150 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77    **.  ** This w
32160 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e  ork-around is un
32170 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63  likely to work c
32180 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20  orrectly on any 
32190 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a  system where.  *
321a0 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e  * you really can
321b0 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74  not cast a funct
321c0 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ion pointer into
321d0 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65   void*.  But the
321e0 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f  n, on the.  ** o
321f0 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d  ther hand, dlsym
32200 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  () will not work
32210 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65   on such a syste
32220 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20  m either, so we 
32230 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65  have.  ** not re
32240 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69  ally lost anythi
32250 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20  ng..  */.  void 
32260 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e  (*(*x)(void*,con
32270 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
32280 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32290 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
322a0 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28   x = (void(*(*)(
322b0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
322c0 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b  *))(void))dlsym;
322d0 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70  .  return (*x)(p
322e0 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69  , zSym);.}.stati
322f0 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f  c void unixDlClo
32300 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
32310 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
32320 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
32330 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32340 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28  sed);.  dlclose(
32350 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
32360 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
32370 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
32380 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
32390 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  /.  #define unix
323a0 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
323b0 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20  ine unixDlError 
323c0 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
323d0 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
323e0 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20  ine unixDlClose 
323f0 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
32400 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  Write nBuf bytes
32410 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20   of random data 
32420 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
32430 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a  buffer zBuf..*/.
32440 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
32450 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
32460 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
32470 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
32480 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
32490 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
324a0 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69  d);.  assert((si
324b0 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65  ze_t)nBuf>=(size
324c0 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f  of(time_t)+sizeo
324d0 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20  f(int)));..  /* 
324e0 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69  We have to initi
324f0 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72  alize zBuf to pr
32500 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66  event valgrind f
32510 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20  rom reporting.  
32520 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20  ** errors.  The 
32530 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62  reports issued b
32540 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69  y valgrind are i
32550 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f  ncorrect - we wo
32560 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20  uld.  ** prefer 
32570 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e  that the randomn
32580 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64  ess be increased
32590 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f   by making use o
325a0 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69  f the.  ** unini
325b0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69  tialized space i
325c0 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c  n zBuf - but val
325d0 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e  grind errors ten
325e0 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20  d to worry.  ** 
325f0 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74  some users.  Rat
32600 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20  her than argue, 
32610 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20  it seems easier 
32620 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  just to initiali
32630 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c  ze.  ** the whol
32640 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65  e array and sile
32650 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76  nce valgrind, ev
32660 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
32670 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73   less randomness
32680 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e  .  ** in the ran
32690 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20  dom seed..  **. 
326a0 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67   ** When testing
326b0 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a  , initializing z
326c0 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73  Buf[] to zero is
326d0 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61   all we do.  Tha
326e0 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  t means.  ** tha
326f0 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  t we always use 
32700 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20  the same random 
32710 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e  number sequence.
32720 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65    This makes the
32730 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65  .  ** tests repe
32740 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d  atable..  */.  m
32750 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
32760 42 75 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65  Buf);.  randomne
32770 73 73 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64  ssPid = osGetpid
32780 28 29 3b 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ();  .#if !defin
32790 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
327a0 20 20 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c 20    {.    int fd, 
327b0 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  got;.    fd = ro
327c0 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f  bust_open("/dev/
327d0 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e  urandom", O_RDON
327e0 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LY, 0);.    if( 
327f0 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69  fd<0 ){.      ti
32800 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69  me_t t;.      ti
32810 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65  me(&t);.      me
32820 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73  mcpy(zBuf, &t, s
32830 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20  izeof(t));.     
32840 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
32850 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f  zeof(t)], &rando
32860 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a 65 6f 66  mnessPid, sizeof
32870 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29  (randomnessPid))
32880 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32890 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66  sizeof(t)+sizeof
328a0 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c  (randomnessPid)<
328b0 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b  =(size_t)nBuf );
328c0 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69  .      nBuf = si
328d0 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66  zeof(t) + sizeof
328e0 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b  (randomnessPid);
328f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32900 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65    do{ got = osRe
32910 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
32920 66 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  f); }while( got<
32930 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
32940 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73  R );.      robus
32950 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f  t_close(0, fd, _
32960 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
32970 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
32980 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a  urn nBuf;.}.../*
32990 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
329a0 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
329b0 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
329c0 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
329d0 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
329e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
329f0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65   microseconds we
32a00 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a   want to sleep..
32a10 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
32a20 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
32a30 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
32a40 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61  s of sleep actua
32a50 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  lly.** requested
32a60 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
32a70 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
32a80 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20  ystem, a number 
32a90 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
32aa0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
32ab0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
32ac0 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  rgument, but not
32ad0 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
32ae0 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
32af0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c  tatic int unixSl
32b00 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
32b10 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69  *NotUsed, int mi
32b20 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  croseconds){.#if
32b30 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
32b40 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70  ruct timespec sp
32b50 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d  ;..  sp.tv_sec =
32b60 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20   microseconds / 
32b70 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76  1000000;.  sp.tv
32b80 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65  _nsec = (microse
32b90 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29  conds % 1000000)
32ba0 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73   * 1000;.  nanos
32bb0 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b  leep(&sp, NULL);
32bc0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
32bd0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
32be0 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
32bf0 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  nds;.#elif defin
32c00 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
32c10 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
32c20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63   usleep(microsec
32c30 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
32c40 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
32c50 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
32c60 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65  roseconds;.#else
32c70 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d  .  int seconds =
32c80 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39   (microseconds+9
32c90 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a  99999)/1000000;.
32ca0 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29    sleep(seconds)
32cb0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32cc0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32cd0 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a   return seconds*
32ce0 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  1000000;.#endif.
32cf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
32d00 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
32d10 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
32d20 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
32d30 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
32d40 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
32d50 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
32d60 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
32d70 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
32d80 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
32d90 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
32da0 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
32db0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
32dc0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
32dd0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
32de0 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
32df0 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
32e00 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
32e10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
32e20 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
32e30 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
32e40 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
32e50 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74  ime).  Write int
32e60 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20  o *piNow.** the 
32e70 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
32e80 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
32e90 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d  n Day number tim
32ea0 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20  es 86_400_000.  
32eb0 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  In.** other word
32ec0 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70  s, write into *p
32ed0 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20  iNow the number 
32ee0 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
32ef0 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e  since the Julian
32f00 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f  .** epoch of noo
32f10 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f  n in Greenwich o
32f20 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34  n November 24, 4
32f30 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e  714 B.C accordin
32f40 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c  g to the.** prol
32f50 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20  eptic Gregorian 
32f60 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
32f70 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
32f80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52  rn SQLITE_OK.  R
32f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
32fa0 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61  OR if the time a
32fb0 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e  nd date .** cann
32fc0 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
32fd0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
32fe0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
32ff0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
33000 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  Used, sqlite3_in
33010 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73  t64 *piNow){.  s
33020 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
33030 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
33040 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
33050 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
33060 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20  40000;.  int rc 
33070 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66  = SQLITE_OK;.#if
33080 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54   defined(NO_GETT
33090 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a  OD).  time_t t;.
330a0 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70    time(&t);.  *p
330b0 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33  iNow = ((sqlite3
330c0 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b  _int64)t)*1000 +
330d0 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69   unixEpoch;.#eli
330e0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
330f0 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
33100 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74  Now;.  clock_get
33110 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54  time(CLOCK_REALT
33120 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a  IME, &sNow);.  *
33130 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
33140 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
33150 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
33160 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73  sec + sNow.tv_ns
33170 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73  ec/1000000;.#els
33180 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
33190 61 6c 20 73 4e 6f 77 3b 0a 20 20 69 66 28 20 67  al sNow;.  if( g
331a0 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
331b0 77 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  w, 0)==0 ){.    
331c0 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
331d0 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
331e0 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
331f0 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  _sec + sNow.tv_u
33200 73 65 63 2f 31 30 30 30 3b 0a 20 20 7d 65 6c 73  sec/1000;.  }els
33210 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
33220 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65  TE_ERROR;.  }.#e
33230 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
33240 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
33250 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
33260 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
33270 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
33280 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
33290 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
332a0 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
332b0 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
332c0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
332d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
332e0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
332f0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
33300 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
33310 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
33320 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
33330 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
33340 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
33350 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
33360 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
33370 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
33380 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
33390 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
333a0 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
333b0 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
333c0 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
333d0 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c   *NotUsed, doubl
333e0 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c  e *prNow){.  sql
333f0 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30  ite3_int64 i = 0
33400 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e  ;.  int rc;.  UN
33410 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
33420 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20  otUsed);.  rc = 
33430 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49  unixCurrentTimeI
33440 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a  nt64(0, &i);.  *
33450 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30  prNow = i/864000
33460 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72  00.0;.  return r
33470 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61  c;.}../*.** We a
33480 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73  dded the xGetLas
33490 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20  tError() method 
334a0 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69  with the intenti
334b0 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a  on of providing.
334c0 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65  ** better low-le
334d0 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67  vel error messag
334e0 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e  es when operatin
334f0 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d  g-system problem
33500 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72  s come up.** dur
33510 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61  ing SQLite opera
33520 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61  tion.  But so fa
33530 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20  r, none of that 
33540 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65  has been impleme
33550 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  nted.** in the c
33560 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f  ore.  So this ro
33570 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
33580 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c  alled.  For now,
33590 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a   it is merely.**
335a0 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e   a place-holder.
335b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
335c0 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  nixGetLastError(
335d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
335e0 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
335f0 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65  d2, char *NotUse
33600 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d3){.  UNUSED_PA
33610 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
33620 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
33630 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a  ETER(NotUsed2);.
33640 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
33650 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20  ER(NotUsed3);.  
33660 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
33670 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
33680 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
33690 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
336a0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
336b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336c0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
336d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
33710 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
33720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33760 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
33770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
33780 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67  in Proxy Locking
33790 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
337a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337b0 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  *.**.** Proxy lo
337c0 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72  cking is a "uber
337d0 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22  -locking-method"
337e0 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20   in this sense: 
337f0 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20   It uses the.** 
33800 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65  other locking me
33810 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61  thods on seconda
33820 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20  ry lock files.  
33830 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
33840 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72   a.** meta-layer
33850 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65   over top of the
33860 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
33870 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ng implemented a
33880 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  bove.  For.** th
33890 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
338a0 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
338b0 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79  lements of proxy
338c0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65   locking is defe
338d0 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61  rred.** until la
338e0 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  te in the file (
338f0 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20  here) after all 
33900 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f  of the other I/O
33910 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a   methods have.**
33920 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20   been defined - 
33930 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d  so that the prim
33940 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  itive locking me
33950 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61  thods are availa
33960 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63  ble.** as servic
33970 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20  es to help with 
33980 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
33990 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  on of proxy lock
339a0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a  ing..**.****.**.
339b0 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
339c0 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
339d0 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
339e0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
339f0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
33a00 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
33a10 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
33a20 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
33a30 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
33a40 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
33a50 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
33a60 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
33a70 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
33a80 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
33a90 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
33aa0 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
33ab0 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
33ac0 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
33ad0 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
33ae0 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
33af0 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
33b00 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
33b10 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
33b20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
33b30 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
33b40 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
33b50 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
33b60 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
33b70 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
33b80 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
33b90 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
33ba0 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
33bb0 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
33bc0 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
33bd0 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
33be0 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
33bf0 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
33c00 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
33c10 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
33c20 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
33c30 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
33c40 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
33c50 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
33c60 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
33c70 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
33c80 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
33c90 20 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20    0x40000000.** 
33ca0 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59       RESERVED_BY
33cb0 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30  TE       0x40000
33cc0 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  001.**      SHAR
33cd0 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20  ED_RANGE        
33ce0 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78  0x40000002 -> 0x
33cf0 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54  40000200.**.** T
33d00 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f  his works well o
33d10 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
33d20 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f   system, but sho
33d30 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78  ws a nearly 100x
33d40 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20  .** slowdown in 
33d50 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65  read performance
33d60 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20   on AFP because 
33d70 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64  the AFP client d
33d80 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72  isables.** the r
33d90 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62  ead cache when b
33da0 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
33db0 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e  are present.  En
33dc0 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a  abling the read.
33dd0 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73  ** cache exposes
33de0 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e   a cache coheren
33df0 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20  cy problem that 
33e00 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c  is present on al
33e10 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72  l OS X.** suppor
33e20 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  ted network file
33e30 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61   systems.  NFS a
33e40 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65  nd AFP both obse
33e50 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65  rve the.** close
33e60 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69  -to-open semanti
33e70 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  cs for ensuring 
33e80 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a  cache coherency.
33e90 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73  ** [http://nfs.s
33ea0 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23  ourceforge.net/#
33eb0 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64  faq_a8], which d
33ec0 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76  oes not effectiv
33ed0 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74  ely.** address t
33ee0 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  he requirements 
33ef0 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64  for concurrent d
33f00 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62  atabase access b
33f10 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65  y multiple.** re
33f20 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
33f30 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77  s.** [http://www
33f40 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69  .nabble.com/SQLi
33f50 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d  te-on-NFS-cache-
33f60 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35  coherency-td1565
33f70 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a  5701.html]..**.*
33f80 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65  * To address the
33f90 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64   performance and
33fa0 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
33fb0 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66   issues, proxy f
33fc0 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
33fd0 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64  hanges the way d
33fe0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69  atabase access i
33ff0 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20  s controlled by 
34000 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20  limiting access 
34010 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68  to a.** single h
34020 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e  ost at a time an
34030 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f  d moving file lo
34040 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64  cks off of the d
34050 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
34060 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79  and onto a proxy
34070 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63   file on the loc
34080 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  al file system. 
34090 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67   .**.**.** Using
340a0 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20   proxy locks.** 
340b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
340c0 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a  -.**.** C APIs.*
340d0 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  *.**  sqlite3_fi
340e0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
340f0 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bname, SQLITE_FC
34100 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
34110 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
34120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34130 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
34140 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
34150 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
34160 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
34170 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
34180 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
34190 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
341a0 20 20 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f          &<proxy_
341b0 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a  path>);.**.**.**
341c0 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a   SQL pragmas.**.
341d0 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
341e0 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
341f0 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74  _file=<proxy_pat
34200 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20  h> | :auto:.**  
34210 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
34220 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
34230 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69  e.**.** Specifyi
34240 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e  ng ":auto:" mean
34250 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  s that if there 
34260 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20  is a conch file 
34270 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a  with a matching.
34280 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74  ** host ID in it
34290 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68  , the proxy path
342a0 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
342b0 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  le will be used,
342c0 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20   otherwise.** a 
342d0 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64  proxy path based
342e0 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74   on the user's t
342f0 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20  emp dir.** (via 
34300 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
34310 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
34320 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75  ,...)) will be u
34330 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61  sed and the.** a
34340 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  ctual proxy file
34350 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74   name is generat
34360 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65  ed from the name
34370 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65   and path of the
34380 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
34390 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
343a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72  .**.**       For
343b0 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22   database path "
343c0 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62  /Users/me/foo.db
343d0 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  " .**       The 
343e0 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
343f0 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69  e "<tmpdir>/sqli
34400 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f  teplocks/_Users_
34410 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22  me_foo.db:auto:"
34420 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c  ).**.** Once a l
34430 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e  ock proxy is con
34440 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61  figured for a da
34450 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
34460 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a  n, it can not.**
34470 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77   be removed, how
34480 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73  ever it may be s
34490 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66  witched to a dif
344a0 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74  ferent proxy pat
344b0 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f  h via.** the abo
344c0 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e  ve APIs (assumin
344d0 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  g the conch file
344e0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65   is not being he
344f0 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a  ld by another.**
34500 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70   connection or p
34510 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a  rocess). .**.**.
34520 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63  ** How proxy loc
34530 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d  king works.** --
34540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34550 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  -----.**.** Prox
34560 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72  y file locking r
34570 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20  elies primarily 
34580 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f  on two new suppo
34590 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a  rting files: .**
345a0 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66  .**   *  conch f
345b0 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63  ile to limit acc
345c0 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
345d0 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69  ase file to a si
345e0 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20  ngle host.**    
345f0 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a    at a time.**.*
34600 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c  *   *  proxy fil
34610 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72  e to act as a pr
34620 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69  oxy for the advi
34630 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61  sory locks norma
34640 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65  lly.**      take
34650 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
34660 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63  e.**.** The conc
34670 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20  h file - to use 
34680 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71  a proxy file, sq
34690 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20  lite must first 
346a0 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22  "hold the conch"
346b0 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e  .** by taking an
346c0 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68   sqlite-style sh
346d0 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
346e0 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61   conch file, rea
346f0 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  ding the.** cont
34700 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69  ents and compari
34710 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e  ng the host's un
34720 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65  ique host ID (se
34730 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63  e below) and loc
34740 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20  k.** proxy path 
34750 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75  against the valu
34760 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
34770 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e   conch.  The con
34780 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74  ch file is.** st
34790 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ored in the same
347a0 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
347b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
347c0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  and the file nam
347d0 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65  e.** is patterne
347e0 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61  d after the data
347f0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
34800 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d  s ".<databasenam
34810 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66  e>-conch"..** If
34820 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
34830 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
34840 6f 72 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  or its contents 
34850 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
34860 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
34870 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
34880 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
34890 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
348a0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
348b0 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
348c0 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
348d0 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
348e0 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
348f0 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
34900 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
34910 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
34920 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
34930 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
34940 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
34950 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
34960 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
34970 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
34980 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
34990 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
349a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
349b0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
349c0 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
349d0 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
349e0 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
349f0 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
34a00 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
34a10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
34a20 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
34a30 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
34a40 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
34a50 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
34a60 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
34a70 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
34a80 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
34a90 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
34aa0 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
34ab0 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
34ac0 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
34ad0 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
34ae0 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
34af0 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
34b00 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
34b10 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
34b20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
34b30 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
34b40 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
34b50 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
34b60 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
34b70 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
34b80 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
34b90 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
34ba0 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
34bb0 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
34bc0 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
34bd0 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
34be0 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
34bf0 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
34c00 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
34c10 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
34c20 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
34c30 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
34c40 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
34c50 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
34c60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
34c70 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
34c80 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
34c90 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
34ca0 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
34cb0 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
34cc0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
34cd0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
34ce0 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
34cf0 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
34d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
34d10 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
34d20 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
34d30 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
34d40 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
34d50 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
34d60 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
34d70 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
34d80 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
34d90 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
34da0 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
34db0 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
34dc0 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
34dd0 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
34de0 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
34df0 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
34e00 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
34e10 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
34e20 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
34e30 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
34e40 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
34e50 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
34e60 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
34e70 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
34e80 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
34e90 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
34ea0 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a    LOCKPROXYDIR.*
34eb0 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72  *.**       Overr
34ec0 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  ides the default
34ed0 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20   directory used 
34ee0 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  for lock proxy f
34ef0 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  iles that.**    
34f00 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74     are named aut
34f10 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74  omatically via t
34f20 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74  he ":auto:" sett
34f30 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ing.**.**  SQLIT
34f40 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
34f50 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a  IR_PERMISSIONS.*
34f60 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69  *.**       Permi
34f70 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68  ssions to use wh
34f80 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69  en creating a di
34f90 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72  rectory for stor
34fa0 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
34fb0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
34fc0 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  s, only used whe
34fd0 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69  n LOCKPROXYDIR i
34fe0 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20  s not set..**   
34ff0 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d   .**    .** As m
35000 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20  entioned above, 
35010 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69  when compiled wi
35020 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  th SQLITE_PREFER
35030 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a  _PROXY_LOCKING,.
35040 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  ** setting the e
35050 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
35060 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45  ble SQLITE_FORCE
35070 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74  _PROXY_LOCKING t
35080 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63  o 1 will.** forc
35090 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
350a0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
350b0 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69  very database fi
350c0 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30  le opened, and 0
350d0 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  .** will force a
350e0 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c  utomatic proxy l
350f0 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73  ocking to be dis
35100 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61  abled for all da
35110 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20  tabase.** files 
35120 28 65 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c  (explicitly call
35130 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46  ing the SQLITE_F
35140 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
35150 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
35160 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
35170 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
35180 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
35190 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
351a0 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
351b0 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
351c0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
351d0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
351e0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
351f0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
35200 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
35210 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
35220 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
35230 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
35240 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
35250 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
35260 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
35270 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
35280 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
35290 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
352a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
352b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
352c0 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
352d0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
352e0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
352f0 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  chFile;         
35300 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69  /* Open conch fi
35310 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  le */.  char *co
35320 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20  nchFilePath;    
35330 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
35340 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
35350 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f  /.  unixFile *lo
35360 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20  ckProxy;        
35370 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c   /* Open proxy l
35380 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
35390 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
353a0 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
353b0 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  me of the proxy 
353c0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
353d0 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
353e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
353f0 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
35400 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  file */.  int co
35410 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20  nchHeld;        
35420 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74         /* 1 if t
35430 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64  he conch is held
35440 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73  , -1 if lockless
35450 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73   */.  int nFails
35460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35470 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
35480 63 6f 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69  conch taking fai
35490 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
354a0 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  *oldLockingConte
354b0 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  xt;     /* Origi
354c0 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65  nal lockingconte
354d0 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e  xt to restore on
354e0 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69   close */.  sqli
354f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63  te3_io_methods c
35500 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64  onst *pOldMethod
35510 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
35520 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f  l I/O methods fo
35530 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f  r close */.};../
35540 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  * .** The proxy 
35550 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66  lock file path f
35560 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
35570 61 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69  at dbPath is wri
35580 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c  tten into lPath,
35590 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20   .** which must 
355a0 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20  point to valid, 
355b0 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20  writable memory 
355c0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
355d0 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68   a maxLen length
355e0 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a  .** file path. .
355f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
35600 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63  oxyGetLockPath(c
35610 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
35620 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20  h, char *lPath, 
35630 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a  size_t maxLen){.
35640 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
35650 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b   dbLen;.  int i;
35660 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f  ..#ifdef LOCKPRO
35670 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74  XYDIR.  len = st
35680 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43  rlcpy(lPath, LOC
35690 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65  KPROXYDIR, maxLe
356a0 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65  n);.#else.# ifde
356b0 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  f _CS_DARWIN_USE
356c0 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20  R_TEMP_DIR.  {. 
356d0 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28     if( !confstr(
356e0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
356f0 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c  TEMP_DIR, lPath,
35700 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20   maxLen) ){.    
35710 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
35720 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20  OCKPATH  failed 
35730 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d  %s errno=%d pid=
35740 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
35750 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72        lPath, err
35760 6e 6f 2c 20 6f 73 47 65 74 70 69 64 28 29 29 29  no, osGetpid()))
35770 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
35780 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
35790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
357a0 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
357b0 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c   "sqliteplocks",
357c0 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20   maxLen);    .  
357d0 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d  }.# else.  len =
357e0 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20   strlcpy(lPath, 
357f0 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29  "/tmp/", maxLen)
35800 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  ;.# endif.#endif
35810 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65  ..  if( lPath[le
35820 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  n-1]!='/' ){.   
35830 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
35840 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65  Path, "/", maxLe
35850 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  n);.  }.  .  /* 
35860 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62  transform the db
35870 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75   path to a uniqu
35880 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a  e cache name */.
35890 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73    dbLen = (int)s
358a0 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20  trlen(dbPath);. 
358b0 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c   for( i=0; i<dbL
358c0 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c  en && (i+len+7)<
358d0 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b  (int)maxLen; i++
358e0 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  ){.    char c = 
358f0 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c  dbPath[i];.    l
35900 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63  Path[i+len] = (c
35910 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20  =='/')?'_':c;.  
35920 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d  }.  lPath[i+len]
35930 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74  ='\0';.  strlcat
35940 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  (lPath, ":auto:"
35950 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54  , maxLen);.  OST
35960 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41  RACE(("GETLOCKPA
35970 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
35980 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
35990 2c 20 6c 50 61 74 68 2c 20 6f 73 47 65 74 70 69  , lPath, osGetpi
359a0 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
359b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
359c0 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68   . ** Creates th
359d0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20  e lock file and 
359e0 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65  any missing dire
359f0 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50  ctories in lockP
35a00 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ath. */.static i
35a10 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  nt proxyCreateLo
35a20 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
35a30 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20  r *lockPath){.  
35a40 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68  int i, len;.  ch
35a50 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45  ar buf[MAXPATHLE
35a60 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20  N];.  int start 
35a70 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
35a80 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29  (lockPath!=NULL)
35a90 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
35aa0 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74  eate all the int
35ab0 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74  ermediate direct
35ac0 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d  ories */.  len =
35ad0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63   (int)strlen(loc
35ae0 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d  kPath);.  buf[0]
35af0 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a   = lockPath[0];.
35b00 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65    for( i=1; i<le
35b10 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66  n; i++ ){.    if
35b20 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d  ( lockPath[i] ==
35b30 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61   '/' && (i - sta
35b40 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20  rt > 0) ){.     
35b50 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69   /* only mkdir i
35b60 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e  f leaf dir != ".
35b70 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22  " or "/" or ".."
35b80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d   */.      if( i-
35b90 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74  start>2 || (i-st
35ba0 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74  art==1 && buf[st
35bb0 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
35bc0 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27  uf[start] != '/'
35bd0 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ) .         || (
35be0 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75  i-start==2 && bu
35bf0 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
35c00 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20  && buf[start+1] 
35c10 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  != '.') ){.     
35c20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a     buf[i]='\0';.
35c30 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b          if( osMk
35c40 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
35c50 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
35c60 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
35c70 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
35c80 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
35c90 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
35ca0 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
35cb0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
35cc0 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
35cd0 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
35ce0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
35cf0 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
35d00 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
35d10 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
35d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d30 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
35d40 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
35d50 6f 73 47 65 74 70 69 64 28 29 29 29 3b 0a 20 20  osGetpid()));.  
35d60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
35d70 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20   err;.          
35d80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35d90 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d    }.      start=
35da0 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  i+1;.    }.    b
35db0 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68  uf[i] = lockPath
35dc0 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  [i];.  }.  OSTRA
35dd0 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
35de0 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
35df0 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
35e00 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f 73 47  ", lockPath, osG
35e10 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74  etpid()));.  ret
35e20 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
35e30 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
35e40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
35e50 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
35e60 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
35e70 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
35e80 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
35e90 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
35ea0 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
35eb0 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
35ec0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
35ed0 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
35ee0 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
35ef0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
35f00 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
35f10 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
35f20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
35f30 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
35f40 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
35f50 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
35f60 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
35f70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
35f80 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
35f90 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
35fa0 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
35fb0 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
35fc0 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
35fd0 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
35fe0 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
35ff0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
36000 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
36010 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
36020 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
36030 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
36040 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
36050 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  1;.  unixFile *p
36060 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
36070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
36080 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
36090 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
360a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d   sqlite3_vfs dum
360b0 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72  myVfs;.  int ter
360c0 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  rno = 0;.  UnixU
360d0 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
360e0 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31   = NULL;..  /* 1
360f0 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f  . first try to o
36100 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
36110 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74  ile.  ** 2. if t
36120 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74  hat fails, and t
36130 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69  his is a lock fi
36140 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20  le (not-conch), 
36150 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  try creating.  *
36160 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  * the parent dir
36170 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65  ectories and the
36180 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a  n try again..  *
36190 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 3. if that fai
361a0 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ls, try to open 
361b0 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e  the file read-on
361c0 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73  ly.  ** otherwis
361d0 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69  e return BUSY (i
361e0 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20  f lock file) or 
361f0 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65  CANTOPEN for the
36200 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f   conch file.  */
36210 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e  .  pUnused = fin
36220 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68  dReusableFd(path
36230 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20  , openFlags);.  
36240 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
36250 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
36260 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >fd;.  }else{.  
36270 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
36280 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
36290 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
362a0 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
362b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
362c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
362d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
362e0 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f  0 ){.    fd = ro
362f0 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
36300 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
36310 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
36320 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  o;.    if( fd<0 
36330 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  && errno==ENOENT
36340 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29   && islockfile )
36350 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78  {.      if( prox
36360 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
36370 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f  path) == SQLITE_
36380 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64  OK ){.        fd
36390 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
363a0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
363b0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
363c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
363d0 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67   ){.    openFlag
363e0 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20  s = O_RDONLY;.  
363f0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
36400 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
36410 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72  gs, 0);.    terr
36420 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
36430 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
36440 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65    if( islockfile
36450 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
36460 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
36470 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28    }.    switch (
36480 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20  terrno) {.      
36490 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20  case EACCES:.   
364a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
364b0 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63  TE_PERM;.      c
364c0 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20  ase EIO: .      
364d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
364e0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65  IOERR_LOCK; /* e
364f0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
36500 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20   the conch */.  
36510 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
36520 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
36530 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
36540 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
36550 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c   pNew = (unixFil
36560 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
36570 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  oc(sizeof(*pNew)
36580 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e  );.  if( pNew==N
36590 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
365a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
365b0 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74    goto end_creat
365c0 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d  e_proxy;.  }.  m
365d0 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
365e0 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
365f0 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c  ;.  pNew->openFl
36600 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
36610 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79  .  memset(&dummy
36620 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  Vfs, 0, sizeof(d
36630 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d  ummyVfs));.  dum
36640 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d  myVfs.pAppData =
36650 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63   (void*)&autoloc
36660 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d  kIoFinder;.  dum
36670 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64  myVfs.zName = "d
36680 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64  ummy";.  pUnused
36690 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e  ->fd = fd;.  pUn
366a0 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70  used->flags = op
366b0 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  enFlags;.  pNew-
366c0 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
366d0 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  ed;.  .  rc = fi
366e0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75  llInUnixFile(&du
366f0 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c  mmyVfs, fd, (sql
36700 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
36710 20 70 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28   path, 0);.  if(
36720 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36730 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
36740 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
36750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
36760 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
36770 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63  :    .  robust_c
36780 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f  lose(pNew, fd, _
36790 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69  _LINE__);.  sqli
367a0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
367b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
367c0 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72  Unused);.  retur
367d0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
367e0 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73  SQLITE_TEST./* s
367f0 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
36800 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
36810 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
36820 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69   file paths */.i
36830 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  nt sqlite3_hosti
36840 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  d_num = 0;.#endi
36850 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  f..#define PROXY
36860 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36  _HOSTIDLEN    16
36870 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
36880 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a  host id length *
36890 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73  /../* Not always
368a0 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
368b0 68 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75  headers as it ou
368c0 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74  ght to be */.ext
368d0 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75  ern int gethostu
368e0 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63  uid(uuid_t id, c
368f0 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65  onst struct time
36900 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a  spec *wait);../*
36910 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44   get the host ID
36920 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64   via gethostuuid
36930 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74  (), pHostID must
36940 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f   point to PROXY_
36950 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79  HOSTIDLEN .** by
36960 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20  tes of writable 
36970 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
36980 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f  c int proxyGetHo
36990 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68  stID(unsigned ch
369a0 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
369b0 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73   *pError){.  ass
369c0 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44  ert(PROXY_HOSTID
369d0 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75  LEN == sizeof(uu
369e0 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74  id_t));.  memset
369f0 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f  (pHostID, 0, PRO
36a00 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23  XY_HOSTIDLEN);.#
36a10 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   if defined(__AP
36a20 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f 4d 41  PLE__) && ((__MA
36a30 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d  C_OS_X_VERSION_M
36a40 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20 31 30  IN_REQUIRED > 10
36a50 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20  50) || \.       
36a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a70 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f 4f       (__IPHONE_O
36a80 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  S_VERSION_MIN_RE
36a90 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29 0a  QUIRED > 2000)).
36aa0 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74    {.    struct t
36ab0 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20  imespec timeout 
36ac0 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73  = {1, 0}; /* 1 s
36ad0 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20  ec timeout */.  
36ae0 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69    if( gethostuui
36af0 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65  d(pHostID, &time
36b00 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  out) ){.      in
36b10 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
36b20 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20       if( pError 
36b30 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72  ){.        *pErr
36b40 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20  or = err;.      
36b50 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
36b60 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
36b70 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
36b80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36b90 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a  pError);.#endif.
36ba0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
36bb0 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65  ST.  /* simulate
36bc0 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
36bd0 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
36be0 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
36bf0 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71  aths */.  if( sq
36c00 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
36c10 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73   != 0){.    pHos
36c20 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28  tID[0] = (char)(
36c30 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68  pHostID[0] + (ch
36c40 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74  ar)(sqlite3_host
36c50 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b  id_num & 0xFF));
36c60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
36c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36c80 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  K;.}../* The con
36c90 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  ch file contains
36ca0 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73   the header, hos
36cb0 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t id and lock fi
36cc0 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66  le path. */.#def
36cd0 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56  ine PROXY_CONCHV
36ce0 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d  ERSION 2   /* 1-
36cf0 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d  byte header, 16-
36d00 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61  byte host id, pa
36d10 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
36d20 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20  OXY_HEADERLEN   
36d30 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   1   /* conch fi
36d40 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  le header length
36d50 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
36d60 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28  Y_PATHINDEX    (
36d70 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
36d80 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
36d90 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d  .#define PROXY_M
36da0 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f  AXCONCHLEN  (PRO
36db0 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
36dc0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58  XY_HOSTIDLEN+MAX
36dd0 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a  PATHLEN)../* .**
36de0 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63   Takes an open c
36df0 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65  onch file, copie
36e00 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74  s the contents t
36e10 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64  o a new path and
36e20 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20   then moves .** 
36e30 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65  it back.  The ne
36e40 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65  wly created file
36e50 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  's file descript
36e60 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  or is assigned t
36e70 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66  o the.** conch f
36e80 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
36e90 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72  d finally the or
36ea0 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c  iginal conch fil
36eb0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
36ec0 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74  .** closed.  Ret
36ed0 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63  urns zero if suc
36ee0 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74  cessful..*/.stat
36ef0 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61  ic int proxyBrea
36f00 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  kConchLock(unixF
36f10 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
36f20 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20  _t myHostID){.  
36f30 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36f40 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
36f50 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36f60 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
36f70 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
36f80 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
36f90 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
36fa0 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68  le;.  char tPath
36fb0 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
36fc0 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d  char buf[PROXY_M
36fd0 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63  AXCONCHLEN];.  c
36fe0 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74  har *cPath = pCt
36ff0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
37000 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c  ;.  size_t readL
37010 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  en = 0;.  size_t
37020 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20   pathLen = 0;.  
37030 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20  char errmsg[64] 
37040 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d  = "";.  int fd =
37050 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   -1;.  int rc = 
37060 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  -1;.  UNUSED_PAR
37070 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29  AMETER(myHostID)
37080 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61  ;..  /* create a
37090 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70   new path by rep
370a0 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e  lace the trailin
370b0 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20  g '-conch' with 
370c0 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61  '-break' */.  pa
370d0 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28  thLen = strlcpy(
370e0 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41  tPath, cPath, MA
370f0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28  XPATHLEN);.  if(
37100 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48   pathLen>MAXPATH
37110 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36  LEN || pathLen<6
37120 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63   || .     (strlc
37130 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65  py(&tPath[pathLe
37140 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36  n-5], "break", 6
37150 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73  ) != 5) ){.    s
37160 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
37170 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
37180 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f  rrmsg,"path erro
37190 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
371a0 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67  )pathLen);.    g
371b0 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
371c0 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64  k;.  }.  /* read
371d0 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65   the conch conte
371e0 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20  nt */.  readLen 
371f0 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
37200 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f  ile->h, buf, PRO
37210 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
37220 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65  0);.  if( readLe
37230 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n<PROXY_PATHINDE
37240 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  X ){.    sqlite3
37250 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
37260 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
37270 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e  "read error (len
37280 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c   %d)",(int)readL
37290 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
372a0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
372b0 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f  .  /* write it o
372c0 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72  ut to the tempor
372d0 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a  ary break file *
372e0 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  /.  fd = robust_
372f0 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52  open(tPath, (O_R
37300 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58  DWR|O_CREAT|O_EX
37310 43 4c 29 2c 20 30 29 3b 0a 20 20 69 66 28 20 66  CL), 0);.  if( f
37320 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  d<0 ){.    sqlit
37330 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
37340 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
37350 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c  sg, "create fail
37360 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
37370 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
37380 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
37390 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c  if( osPwrite(fd,
373a0 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30   buf, readLen, 0
373b0 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65  ) != (ssize_t)re
373c0 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  adLen ){.    sql
373d0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
373e0 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
373f0 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69  rmsg, "write fai
37400 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
37410 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
37420 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
37430 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74   if( rename(tPat
37440 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20  h, cPath) ){.   
37450 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
37460 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
37470 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d  , errmsg, "renam
37480 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
37490 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
374a0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
374b0 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
374c0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
374d0 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63  "broke stale loc
374e0 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74  k on %s\n", cPat
374f0 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f  h);.  robust_clo
37500 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46  se(pFile, conchF
37510 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  ile->h, __LINE__
37520 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  );.  conchFile->
37530 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46  h = fd;.  conchF
37540 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  ile->openFlags =
37550 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
37560 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  T;..end_breakloc
37570 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  k:.  if( rc ){. 
37580 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
37590 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 74        osUnlink(t
375a0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f 62  Path);.      rob
375b0 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
375c0 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
375d0 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
375e0 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65  f(stderr, "faile
375f0 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65  d to break stale
37600 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c   lock on %s, %s\
37610 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73  n", cPath, errms
37620 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
37630 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20   rc;.}../* Take 
37640 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
37650 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
37660 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61  file and break a
37670 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74   stale lock if t
37680 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d  he .** host id m
37690 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  atches..*/.stati
376a0 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68  c int proxyConch
376b0 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
376c0 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
376d0 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54  ostID, int lockT
376e0 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  ype){.  proxyLoc
376f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
37700 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
37710 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
37720 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
37730 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  ; .  unixFile *c
37740 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
37750 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e  >conchFile;.  in
37760 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37770 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d  ;.  int nTries =
37780 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d   0;.  struct tim
37790 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69  espec conchModTi
377a0 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28  me;.  .  memset(
377b0 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c 20 30  &conchModTime, 0
377c0 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f  , sizeof(conchMo
377d0 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20 7b 0a  dTime));.  do {.
377e0 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
377f0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
37800 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
37810 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
37820 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69  kType);.    nTri
37830 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72  es ++;.    if( r
37840 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
37850 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
37860 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62  e lock failed (b
37870 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31  usy):.       * 1
37880 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20  st try: get the 
37890 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20  mod time of the 
378a0 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73  conch, wait 0.5s
378b0 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
378c0 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72  .       * 2nd tr
378d0 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d  y: fail if the m
378e0 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20  od time changed 
378f0 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69  or host id is di
37900 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20  fferent, wait . 
37910 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20        *         
37920 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79    10 sec and try
37930 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20   again.       * 
37940 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74  3rd try: break t
37950 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74  he lock unless t
37960 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20  he mod time has 
37970 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20  changed..       
37980 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
37990 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
379a0 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63  if( osFstat(conc
379b0 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  hFile->h, &buf) 
379c0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
379d0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
379e0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20   errno);.       
379f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
37a00 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
37a10 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
37a20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b  if( nTries==1 ){
37a30 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f  .        conchMo
37a40 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d  dTime = buf.st_m
37a50 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20  timespec;.      
37a60 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30 29    usleep(500000)
37a70 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65  ; /* wait 0.5 se
37a80 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
37a90 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20  ck again*/.     
37aa0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
37ab0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
37ac0 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29  sert( nTries>1 )
37ad0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63  ;.      if( conc
37ae0 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20  hModTime.tv_sec 
37af0 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
37b00 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20  pec.tv_sec || . 
37b10 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64          conchMod
37b20 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20  Time.tv_nsec != 
37b30 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
37b40 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20  .tv_nsec ){.    
37b50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37b60 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a  E_BUSY;.      }.
37b70 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
37b80 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a   nTries==2 ){  .
37b90 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42 75          char tBu
37ba0 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
37bb0 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e  LEN];.        in
37bc0 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28  t len = osPread(
37bd0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42  conchFile->h, tB
37be0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
37bf0 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20  CHLEN, 0);.     
37c00 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a     if( len<0 ){.
37c10 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
37c20 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
37c30 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  errno);.        
37c40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37c50 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
37c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
37c70 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48  ( len>PROXY_PATH
37c80 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d  INDEX && tBuf[0]
37c90 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  ==(char)PROXY_CO
37ca0 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20  NCHVERSION){.   
37cb0 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
37cc0 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69  break the lock i
37cd0 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f  f the host id do
37ce0 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20  esn't match */. 
37cf0 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d           if( 0!=
37d00 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f  memcmp(&tBuf[PRO
37d10 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
37d20 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
37d30 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20  OSTIDLEN) ){.   
37d40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
37d50 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
37d60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37d80 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
37d90 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f   the lock on sho
37da0 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72  rt read or a ver
37db0 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f  sion mismatch */
37dc0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
37dd0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
37de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37df0 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30   usleep(10000000
37e00 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65  ); /* wait 10 se
37e10 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
37e20 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ck again */.    
37e30 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20      continue; . 
37e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
37e50 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
37e60 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69  es==3 );.      i
37e70 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b  f( 0==proxyBreak
37e80 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
37e90 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20   myHostID) ){.  
37ea0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
37eb0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
37ec0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c  ( lockType==EXCL
37ed0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
37ee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
37ef0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
37f00 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
37f10 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
37f20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
37f30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37f40 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
37f50 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
37f60 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
37f70 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
37f80 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c  le*)conchFile, l
37f90 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ockType);.      
37fa0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
37fb0 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d  }.  } while( rc=
37fc0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
37fd0 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20  nTries<3 );.  . 
37fe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37ff0 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63  * Takes the conc
38000 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68  h by taking a sh
38010 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65  ared lock and re
38020 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ad the contents 
38030 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f  conch, if .** lo
38040 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55  ckPath is non-NU
38050 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20  LL, the host ID 
38060 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
38070 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20  th must match.  
38080 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50  A NULL .** lockP
38090 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ath means that t
380a0 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74  he lockPath in t
380b0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69  he conch file wi
380c0 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ll be used if th
380d0 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d  e .** host IDs m
380e0 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c  atch, or a new l
380f0 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
38100 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d   generated autom
38110 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64  atically .** and
38120 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
38130 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73  conch file..*/.s
38140 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
38150 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c  akeConch(unixFil
38160 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f  e *pFile){.  pro
38170 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
38180 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
38190 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
381a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
381b0 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28  ntext; .  .  if(
381c0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
381d0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
381e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
381f0 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
38200 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
38210 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
38220 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f  .    uuid_t myHo
38230 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45  stID;.    int pE
38240 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68  rror = 0;.    ch
38250 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59  ar readBuf[PROXY
38260 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
38270 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68     char lockPath
38280 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
38290 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b    char *tempLock
382a0 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Path = NULL;.   
382b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
382c0 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65  _OK;.    int cre
382d0 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20  ateConch = 0;.  
382e0 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63    int hostIdMatc
382f0 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  h = 0;.    int r
38300 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  eadLen = 0;.    
38310 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61  int tryOldLockPa
38320 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  th = 0;.    int 
38330 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
38340 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f   = 0;.    .    O
38350 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e  STRACE(("TAKECON
38360 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  CH  %d for %s pi
38370 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d=%d\n", conchFi
38380 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
38390 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50      (pCtx->lockP
383a0 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d  roxyPath ? pCtx-
383b0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a  >lockProxyPath :
383c0 20 22 3a 61 75 74 6f 3a 22 29 2c 0a 20 20 20 20   ":auto:"),.    
383d0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 70 69           osGetpi
383e0 64 28 29 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d  d()));..    rc =
383f0 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
38400 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72 6f  myHostID, &pErro
38410 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  r);.    if( (rc&
38420 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
38430 45 52 52 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  ERR ){.      sto
38440 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
38450 65 2c 20 70 45 72 72 6f 72 29 3b 0a 20 20 20 20  e, pError);.    
38460 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
38470 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
38480 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
38490 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
384a0 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  tID, SHARED_LOCK
384b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
384c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
384d0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
384e0 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
384f0 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73  /* read the exis
38500 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20  ting conch file 
38510 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d  */.    readLen =
38520 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
38530 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  ixFile*)conchFil
38540 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50  e, 0, readBuf, P
38550 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
38560 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c  );.    if( readL
38570 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  en<0 ){.      /*
38580 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74   I/O error: last
38590 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
385a0 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
385b0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
385c0 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c  (pFile, conchFil
385d0 65 2d 3e 6c 61 73 74 45 72 72 6e