/ Hex Artifact Content
Login

Artifact 86eca42c3d955bebea0082450f978e5633448235f03f86b27a02538bb26e7fff:


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 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
0de0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  # include <sys/p
0df0: 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  aram.h>.#endif /
0e00: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0e10: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
0e20: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0e30: 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f  APPLE__) && ((__
0e40: 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
0e50: 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20  _MIN_REQUIRED > 
0e60: 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20  1050) || \.     
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f        (__IPHONE_
0e90: 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  OS_VERSION_MIN_R
0ea0: 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29  EQUIRED > 2000))
0eb0: 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65 64  .#  if (!defined
0ec0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0ed0: 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54 5f  DED) || (TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29 29  OS_EMBEDDED==0))
0ef0: 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21 64   \.       && (!d
0f00: 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49 50  efined(TARGET_IP
0f10: 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29 20  HONE_SIMULATOR) 
0f20: 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f 4e  || (TARGET_IPHON
0f30: 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29 29  E_SIMULATOR==0))
0f40: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41 56  .#    define HAV
0f50: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
0f60: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61 72  #  else.#    war
0f70: 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75 69  ning "gethostuui
0f80: 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2e  d() is disabled.
0f90: 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ".#  endif.#endi
0fa0: 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  f...#if OS_VXWOR
0fb0: 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  KS.# include <sy
0fc0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63  s/ioctl.h>.# inc
0fd0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c 69  h>.# include <li
0ff0: 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  mits.h>.#endif /
1000: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1010: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1020: 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
1030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1040: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1050: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1060: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41  endif..#ifdef HA
1070: 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75  VE_UTIME.# inclu
1080: 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e  de <utime.h>.#en
1090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
10a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
10b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
10c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
10d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
10e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
10f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1100: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1110: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1120: 73 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 23 69 66  s header..*/.#if
1130: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
1140: 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74  FE.# include <pt
1150: 68 72 65 61 64 2e 68 3e 0a 23 65 6e 64 69 66 0a  hread.h>.#endif.
1160: 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70  ./*.** Default p
1170: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1180: 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66  creating a new f
1190: 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ile.*/.#ifndef S
11a0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
11b0: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  LE_PERMISSIONS.#
11c0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
11d0: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
11e0: 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e  ISSIONS 0644.#en
11f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1200: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1210: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 75 74  hen creating aut
1220: 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a 2f 0a 23  o proxy dir.*/.#
1230: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1240: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
1250: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
1260: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
1270: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
1280: 49 53 53 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e  ISSIONS 0755.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
12a0: 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 74  um supported pat
12b0: 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65  h-length..*/.#de
12c0: 66 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d  fine MAX_PATHNAM
12d0: 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  E 512../*.** Max
12e0: 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 73  imum supported s
12f0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 0a 2a 2f  ymbolic links.*/
1300: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
1310: 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20 31 30 30  MAX_SYMLINKS 100
1320: 0a 0a 2f 2a 20 41 6c 77 61 79 73 20 63 61 73 74  ../* Always cast
1330: 20 74 68 65 20 67 65 74 70 69 64 28 29 20 72 65   the getpid() re
1340: 74 75 72 6e 20 74 79 70 65 20 66 6f 72 20 63 6f  turn type for co
1350: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
1360: 0a 2a 2a 20 6b 65 72 6e 65 6c 20 6d 6f 64 75 6c  .** kernel modul
1370: 65 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 2a  es in VxWorks. *
1380: 2f 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70  /.#define osGetp
1390: 69 64 28 58 29 20 28 70 69 64 5f 74 29 67 65 74  id(X) (pid_t)get
13a0: 70 69 64 28 29 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c  pid()../*.** Onl
13b0: 79 20 73 65 74 20 74 68 65 20 6c 61 73 74 45 72  y set the lastEr
13c0: 72 6e 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  rno if the error
13d0: 20 63 6f 64 65 20 69 73 20 61 20 72 65 61 6c 20   code is a real 
13e0: 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a  error and not .*
13f0: 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63  * a normal expec
1400: 74 65 64 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ted return code 
1410: 6f 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  of SQLITE_BUSY o
1420: 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23  r SQLITE_OK.*/.#
1430: 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45  define IS_LOCK_E
1440: 52 52 4f 52 28 78 29 20 20 28 28 78 20 21 3d 20  RROR(x)  ((x != 
1450: 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 78  SQLITE_OK) && (x
1460: 20 21 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 29   != SQLITE_BUSY)
1470: 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  )../* Forward re
1480: 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65  ferences */.type
1490: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
14a0: 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20 20 20 20  hm unixShm;     
14b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
14c0: 6e 65 63 74 69 6f 6e 20 73 68 61 72 65 64 20 6d  nection shared m
14d0: 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66  emory */.typedef
14e0: 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e   struct unixShmN
14f0: 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b  ode unixShmNode;
1500: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1510: 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65   memory instance
1520: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1530: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
1540: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20   unixInodeInfo; 
1550: 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a    /* An i-node *
1560: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1570: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e   UnixUnusedFd Un
1580: 69 78 55 6e 75 73 65 64 46 64 3b 20 20 20 20 20  ixUnusedFd;     
1590: 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20 66 69 6c  /* An unused fil
15a0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
15b0: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  ./*.** Sometimes
15c0: 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65 20 68  , after a file h
15d0: 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20  andle is closed 
15e0: 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20 66  by SQLite, the f
15f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
1600: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73  * cannot be clos
1610: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
1620: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 2c 20  In these cases, 
1630: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
1640: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
1650: 72 75 63 74 75 72 65 20 61 72 65 20 75 73 65 64  ructure are used
1660: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
1670: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 68  le descriptor wh
1680: 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20  ile waiting for 
1690: 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  an.** opportunit
16a0: 79 20 74 6f 20 65 69 74 68 65 72 20 63 6c 6f 73  y to either clos
16b0: 65 20 6f 72 20 72 65 75 73 65 20 69 74 2e 0a 2a  e or reuse it..*
16c0: 2f 0a 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  /.struct UnixUnu
16d0: 73 65 64 46 64 20 7b 0a 20 20 69 6e 74 20 66 64  sedFd {.  int fd
16e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
1700: 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20  riptor to close 
1710: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20  */.  int flags; 
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1730: 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66 69 6c  * Flags this fil
1740: 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 61 73  e descriptor was
1750: 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a   opened with */.
1760: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1770: 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e  pNext;      /* N
1780: 65 78 74 20 75 6e 75 73 65 64 20 66 69 6c 65 20  ext unused file 
1790: 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 73 61  descriptor on sa
17a0: 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f  me file */.};../
17b0: 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69 6c  *.** The unixFil
17c0: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73  e structure is s
17d0: 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74  ubclass of sqlit
17e0: 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69 63  e3_file specific
17f0: 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20   to the unix.** 
1800: 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1810: 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ons..*/.typedef 
1820: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20  struct unixFile 
1830: 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74  unixFile;.struct
1840: 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73 71   unixFile {.  sq
1850: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1860: 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b   const *pMethod;
1870: 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65 20    /* Always the 
1880: 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  first entry */. 
1890: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
18a0: 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fs;             
18b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
18c0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
18d0: 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  s unixFile */.  
18e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
18f0: 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
1900: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75      /* Info abou
1910: 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20  t locks on this 
1920: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68  inode */.  int h
1930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1950: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
1960: 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67  iptor */.  unsig
1970: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
1980: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ck;            /
1990: 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f  * The type of lo
19a0: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20  ck held on this 
19b0: 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  fd */.  unsigned
19c0: 20 73 68 6f 72 74 20 69 6e 74 20 63 74 72 6c 46   short int ctrlF
19d0: 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20 42  lags;       /* B
19e0: 65 68 61 76 69 6f 72 61 6c 20 62 69 74 73 2e 20  ehavioral bits. 
19f0: 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67   UNIXFILE_* flag
1a00: 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45  s */.  int lastE
1a10: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
1a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a30: 65 20 75 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f  e unix errno fro
1a40: 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72  m last I/O error
1a50: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b   */.  void *lock
1a60: 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20  ingContext;     
1a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
1a80: 6b 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69  king style speci
1a90: 66 69 63 20 73 74 61 74 65 20 2a 2f 0a 20 20 55  fic state */.  U
1aa0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 50 72  nixUnusedFd *pPr
1ab0: 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
1ac0: 3b 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61  ;  /* Pre-alloca
1ad0: 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ted UnixUnusedFd
1ae0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1af0: 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 20 20   *zPath;        
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1b10: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
1b20: 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 53 68 6d  .  unixShm *pShm
1b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b40: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1b50: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
1b60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
1b70: 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20   int szChunk;   
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
1ba0: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
1bb0: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
1bc0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1bd0: 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63  ZE>0.  int nFetc
1be0: 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  hOut;           
1bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c00: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
1c10: 69 6e 67 20 78 46 65 74 63 68 20 72 65 66 73 20  ing xFetch refs 
1c20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1c30: 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20  64 mmapSize;    
1c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62           /* Usab
1c50: 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69  le size of mappi
1c60: 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69 6f 6e  ng at pMapRegion
1c70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1c80: 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75  t64 mmapSizeActu
1c90: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 41 63 74  al;       /* Act
1ca0: 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ual size of mapp
1cb0: 69 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69 6f  ing at pMapRegio
1cc0: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
1cd0: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78  nt64 mmapSizeMax
1ce0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
1cf0: 6e 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d  nfigured FCNTL_M
1d00: 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a  MAP_SIZE value *
1d10: 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65  /.  void *pMapRe
1d20: 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
1d30: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
1d40: 79 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  y mapped region 
1d50: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  */.#endif.  int 
1d60: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 2f 2a 20 44 65 76 69 63 65 20 73 65 63 74 6f 72  /* Device sector
1d90: 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 64   size */.  int d
1da0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1db0: 74 69 63 73 3b 20 20 20 20 20 20 20 20 20 20 2f  tics;          /
1dc0: 2a 20 50 72 65 63 6f 6d 70 75 74 65 64 20 64 65  * Precomputed de
1dd0: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1de0: 74 69 63 73 20 2a 2f 0a 23 69 66 20 53 51 4c 49  tics */.#if SQLI
1df0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1e00: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
1e10: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e30: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1e40: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1e50: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1e60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1e70: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
1e80: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1e90: 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67   unsigned fsFlag
1ea0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1eb0: 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64       /* cached d
1ec0: 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74  etails from stat
1ed0: 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  fs() */.#endif.#
1ee0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ef0: 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55  BLE_SETLK_TIMEOU
1f00: 54 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 42 75  T.  unsigned iBu
1f10: 73 79 54 69 6d 65 6f 75 74 3b 20 20 20 20 20 20  syTimeout;      
1f20: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 69 74 20          /* Wait 
1f30: 74 68 69 73 20 6d 61 6e 79 20 6d 69 6c 6c 69 73  this many millis
1f40: 65 63 20 6f 6e 20 6c 6f 63 6b 73 20 2a 2f 0a 23  ec on locks */.#
1f50: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57  endif.#if OS_VXW
1f60: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
1f70: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
1f80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
1f90: 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a  ique file ID */.
1fa0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1fb0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1fc0: 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f  The next group o
1fd0: 66 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  f variables are 
1fe0: 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20 77 68  used to track wh
1ff0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2000: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
2010: 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62 79 74  n counter in byt
2020: 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61 74 61  es 24-27 of data
2030: 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 75  base files are u
2040: 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e  pdated.  ** when
2050: 65 76 65 72 20 61 6e 79 20 70 61 72 74 20 6f 66  ever any part of
2060: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 68   the database ch
2070: 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73 65 72  anges.  An asser
2080: 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a  tion fault will.
2090: 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20 61 20    ** occur if a 
20a0: 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
20b0: 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75 70 64  without also upd
20c0: 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  ating the transa
20d0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74  ction.  ** count
20e0: 65 72 2e 20 20 54 68 69 73 20 74 65 73 74 20 69  er.  This test i
20f0: 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69 64 20  s made to avoid 
2100: 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d  new problems sim
2110: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
2120: 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64 20 62   one described b
2130: 79 20 74 69 63 6b 65 74 20 23 33 35 38 34 2e 20  y ticket #3584. 
2140: 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  .  */.  unsigned
2150: 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74 72 43   char transCntrC
2160: 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  hng;   /* True i
2170: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
2180: 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65  n counter change
2190: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
21a0: 63 68 61 72 20 64 62 55 70 64 61 74 65 3b 20 20  char dbUpdate;  
21b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
21c0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64 61 74   any part of dat
21d0: 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
21e0: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
21f0: 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72   char inNormalWr
2200: 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  ite;   /* True i
2210: 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72  f in a normal wr
2220: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ite operation */
2230: 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ..#endif..#ifdef
2240: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
2250: 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20  * In test mode, 
2260: 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  increase the siz
2270: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
2280: 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61  ure a bit so tha
2290: 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61  t .  ** it is la
22a0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74  rger than the st
22b0: 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64  ruct CrashFile d
22c0: 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e  efined in test6.
22d0: 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61  c..  */.  char a
22e0: 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e  Padding[32];.#en
22f0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73 20  dif.};../* This 
2300: 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 74  variable holds t
2310: 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 28 70  he process id (p
2320: 69 64 29 20 66 72 6f 6d 20 77 68 65 6e 20 74 68  id) from when th
2330: 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 28 29 0a  e xRandomness().
2340: 2a 2a 20 6d 65 74 68 6f 64 20 77 61 73 20 63 61  ** method was ca
2350: 6c 6c 65 64 2e 20 20 49 66 20 78 4f 70 65 6e 28  lled.  If xOpen(
2360: 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  ) is called from
2370: 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
2380: 63 65 73 73 20 69 64 2c 0a 2a 2a 20 69 6e 64 69  cess id,.** indi
2390: 63 61 74 69 6e 67 20 74 68 61 74 20 61 20 66 6f  cating that a fo
23a0: 72 6b 28 29 20 68 61 73 20 6f 63 63 75 72 72 65  rk() has occurre
23b0: 64 2c 20 74 68 65 20 50 52 4e 47 20 77 69 6c 6c  d, the PRNG will
23c0: 20 62 65 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74   be reset..*/.st
23d0: 61 74 69 63 20 70 69 64 5f 74 20 72 61 6e 64 6f  atic pid_t rando
23e0: 6d 6e 65 73 73 50 69 64 20 3d 20 30 3b 0a 0a 2f  mnessPid = 0;../
23f0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
2400: 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e 69 78  ues for the unix
2410: 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 20 62  File.ctrlFlags b
2420: 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69  itmask:.*/.#defi
2430: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  ne UNIXFILE_EXCL
2440: 20 20 20 20 20 20 20 20 30 78 30 31 20 20 20 20          0x01    
2450: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20   /* Connections 
2460: 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73  from one process
2470: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
2480: 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
2490: 20 20 20 20 20 20 30 78 30 32 20 20 20 20 20 2f        0x02     /
24a0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * Connection is 
24b0: 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  read only */.#de
24c0: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 45  fine UNIXFILE_PE
24d0: 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34 20 20  RSIST_WAL 0x04  
24e0: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
24f0: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66   WAL mode */.#if
2500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2510: 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20 64 65  BLE_DIRSYNC.# de
2520: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
2530: 52 53 59 4e 43 20 20 20 20 30 78 30 38 20 20 20  RSYNC    0x08   
2540: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 73    /* Directory s
2550: 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ync needed */.#e
2560: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  lse.# define UNI
2570: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2580: 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23 64 65   0x00.#endif.#de
2590: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 53  fine UNIXFILE_PS
25a0: 4f 57 20 20 20 20 20 20 20 20 30 78 31 30 20 20  OW        0x10  
25b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
25c0: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
25d0: 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e  RWRITE */.#defin
25e0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  e UNIXFILE_DELET
25f0: 45 20 20 20 20 20 20 30 78 32 30 20 20 20 20 20  E      0x20     
2600: 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f  /* Delete on clo
2610: 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  se */.#define UN
2620: 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20 20 20  IXFILE_URI      
2630: 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a 20 46     0x40     /* F
2640: 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20 68 61  ilename might ha
2650: 76 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ve query paramet
2660: 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ers */.#define U
2670: 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20  NIXFILE_NOLOCK  
2680: 20 20 20 20 30 78 38 30 20 20 20 20 20 2f 2a 20      0x80     /* 
2690: 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  Do no file locki
26a0: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  ng */../*.** Inc
26b0: 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69  lude code that i
26c0: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  s common to all 
26d0: 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a  os_*.c files.*/.
26e0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d  #include "os_com
26f0: 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65  mon.h"../*.** De
2700: 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63  fine various mac
2710: 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73  ros that are mis
2720: 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73  sing from some s
2730: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
2740: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2750: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2760: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2770: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2780: 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f  LE_LFS.# undef O
2790: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
27a0: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
27b0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
27c0: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65   O_NOFOLLOW.# de
27d0: 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20  fine O_NOFOLLOW 
27e0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
27f0: 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69   O_BINARY.# defi
2800: 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65  ne O_BINARY 0.#e
2810: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
2820: 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72  threadid macro r
2830: 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74  esolves to the t
2840: 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30  hread-id or to 0
2850: 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74  .  Used for.** t
2860: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
2870: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
2880: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
2890: 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65  AFE.#define thre
28a0: 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c  adid pthread_sel
28b0: 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  f().#else.#defin
28c0: 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e  e threadid 0.#en
28d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f  dif../*.** HAVE_
28e0: 4d 52 45 4d 41 50 20 64 65 66 61 75 6c 74 73 20  MREMAP defaults 
28f0: 74 6f 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75 78  to true on Linux
2900: 20 61 6e 64 20 66 61 6c 73 65 20 65 76 65 72 79   and false every
2910: 77 68 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23  where else..*/.#
2920: 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56 45  if !defined(HAVE
2930: 5f 4d 52 45 4d 41 50 29 0a 23 20 69 66 20 64 65  _MREMAP).# if de
2940: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
2950: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 47 4e 55   && defined(_GNU
2960: 5f 53 4f 55 52 43 45 29 0a 23 20 20 64 65 66 69  _SOURCE).#  defi
2970: 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 31  ne HAVE_MREMAP 1
2980: 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  .# else.#  defin
2990: 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 30 0a  e HAVE_MREMAP 0.
29a0: 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  # endif.#endif..
29b0: 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63 69 74 6c 79  /*.** Explicitly
29c0: 20 63 61 6c 6c 20 74 68 65 20 36 34 2d 62 69 74   call the 64-bit
29d0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 6c 73 65 65   version of lsee
29e0: 6b 28 29 20 6f 6e 20 41 6e 64 72 6f 69 64 2e 20  k() on Android. 
29f0: 4f 74 68 65 72 77 69 73 65 2c 20 6c 73 65 65 6b  Otherwise, lseek
2a00: 28 29 0a 2a 2a 20 69 73 20 74 68 65 20 33 32 2d  ().** is the 32-
2a10: 62 69 74 20 76 65 72 73 69 6f 6e 2c 20 65 76 65  bit version, eve
2a20: 6e 20 69 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45  n if _FILE_OFFSE
2a30: 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65 66  T_BITS=64 is def
2a40: 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ined..*/.#ifdef 
2a50: 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 23 20 64 65  __ANDROID__.# de
2a60: 66 69 6e 65 20 6c 73 65 65 6b 20 6c 73 65 65 6b  fine lseek lseek
2a70: 36 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  64.#endif..#ifde
2a80: 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a  f __linux__./*.*
2a90: 2a 20 4c 69 6e 75 78 2d 73 70 65 63 69 66 69 63  * Linux-specific
2aa0: 20 49 4f 43 54 4c 20 6d 61 67 69 63 20 6e 75 6d   IOCTL magic num
2ab0: 62 65 72 73 20 75 73 65 64 20 66 6f 72 20 63 6f  bers used for co
2ac0: 6e 74 72 6f 6c 6c 69 6e 67 20 46 32 46 53 0a 2a  ntrolling F2FS.*
2ad0: 2f 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49  /.#define F2FS_I
2ae0: 4f 43 54 4c 5f 4d 41 47 49 43 20 20 20 20 20 20  OCTL_MAGIC      
2af0: 20 20 30 78 66 35 0a 23 64 65 66 69 6e 65 20 46    0xf5.#define F
2b00: 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f 41 54  2FS_IOC_START_AT
2b10: 4f 4d 49 43 5f 57 52 49 54 45 20 20 20 20 20 5f  OMIC_WRITE     _
2b20: 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41  IO(F2FS_IOCTL_MA
2b30: 47 49 43 2c 20 31 29 0a 23 64 65 66 69 6e 65 20  GIC, 1).#define 
2b40: 46 32 46 53 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f  F2FS_IOC_COMMIT_
2b50: 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 20 20 20  ATOMIC_WRITE    
2b60: 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d  _IO(F2FS_IOCTL_M
2b70: 41 47 49 43 2c 20 32 29 0a 23 64 65 66 69 6e 65  AGIC, 2).#define
2b80: 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f   F2FS_IOC_START_
2b90: 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54 45 20 20  VOLATILE_WRITE  
2ba0: 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c 5f   _IO(F2FS_IOCTL_
2bb0: 4d 41 47 49 43 2c 20 33 29 0a 23 64 65 66 69 6e  MAGIC, 3).#defin
2bc0: 65 20 46 32 46 53 5f 49 4f 43 5f 41 42 4f 52 54  e F2FS_IOC_ABORT
2bd0: 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54 45 20  _VOLATILE_WRITE 
2be0: 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c    _IO(F2FS_IOCTL
2bf0: 5f 4d 41 47 49 43 2c 20 35 29 0a 23 64 65 66 69  _MAGIC, 5).#defi
2c00: 6e 65 20 46 32 46 53 5f 49 4f 43 5f 47 45 54 5f  ne F2FS_IOC_GET_
2c10: 46 45 41 54 55 52 45 53 20 20 20 20 20 20 20 20  FEATURES        
2c20: 20 20 20 5f 49 4f 52 28 46 32 46 53 5f 49 4f 43     _IOR(F2FS_IOC
2c30: 54 4c 5f 4d 41 47 49 43 2c 20 31 32 2c 20 75 33  TL_MAGIC, 12, u3
2c40: 32 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f  2).#define F2FS_
2c50: 46 45 41 54 55 52 45 5f 41 54 4f 4d 49 43 5f 57  FEATURE_ATOMIC_W
2c60: 52 49 54 45 20 30 78 30 30 30 34 0a 23 65 6e 64  RITE 0x0004.#end
2c70: 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20  if /* __linux__ 
2c80: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65  */.../*.** Diffe
2c90: 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d  rent Unix system
2ca0: 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29  s declare open()
2cb0: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61   in different wa
2cc0: 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a  ys.  Same use.**
2cd0: 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72   open(const char
2ce0: 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20  *,int,mode_t).  
2cf0: 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28  Others use open(
2d00: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
2d10: 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66  ...)..** The dif
2d20: 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72  ference is impor
2d30: 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20  tant when using 
2d40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2d50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
2d60: 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20   The safest way 
2d70: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  to deal with the
2d80: 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61   problem is to a
2d90: 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77  lways use this w
2da0: 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20  rapper.** which 
2db0: 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73  always has the s
2dc0: 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64  ame well-defined
2dd0: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
2de0: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f  tatic int posixO
2df0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
2e00: 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  zFile, int flags
2e10: 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72  , int mode){.  r
2e20: 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65  eturn open(zFile
2e30: 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a  , flags, mode);.
2e40: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2e50: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2e60: 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
2e70: 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ory(const char*,
2e80: 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69   int*);.static i
2e90: 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65 73 69  nt unixGetpagesi
2ea0: 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a  ze(void);../*.**
2eb0: 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c   Many system cal
2ec0: 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20  ls are accessed 
2ed0: 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d  through pointer-
2ee0: 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20  to-functions so 
2ef0: 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79  that.** they may
2f00: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61   be overridden a
2f10: 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63  t runtime to fac
2f20: 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e  ilitate fault in
2f30: 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a  jection during.*
2f40: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61  * testing and sa
2f50: 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66  ndboxing.  The f
2f60: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
2f70: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61  olds the names a
2f80: 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74  nd pointers.** t
2f90: 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62  o all overrideab
2fa0: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  le system calls.
2fb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
2fc0: 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b  t unix_syscall {
2fd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2fe0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
2ff0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3000: 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20  system call */. 
3010: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3020: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
3030: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
3040: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
3050: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
3060: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
3070: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
3080: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
3090: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
30a0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
30b0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
30c0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
30d0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
30e0: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
30f0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3100: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
3110: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
3120: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
3130: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3140: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
3150: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3160: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
3170: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
3180: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
3190: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
31a0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
31b0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
31c0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
31d0: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
31e0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
31f0: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
3200: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
3210: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
3220: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3230: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
3240: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
3250: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
3260: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
3270: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
3280: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
3290: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
32a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
32b0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
32c0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
32d0: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
32e0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
32f0: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
3300: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
3310: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
3320: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
3330: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
3340: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
3350: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
3360: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
3370: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
3380: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
3390: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
33a0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
33b0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
33c0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
33d0: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
33e0: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
33f0: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
3400: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
3410: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
3420: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
3430: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
3440: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
3450: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
3460: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
3470: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
3480: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
3490: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
34a0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
34b0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
34c0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
34d0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
34e0: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
34f0: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
3500: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
3510: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
3520: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3530: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
3540: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3550: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
3560: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
3570: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
3580: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
3590: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
35a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35b0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
35c0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
35d0: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
35e0: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
35f0: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
3600: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
3610: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3620: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
3630: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
3640: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
3650: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3660: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
3670: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
3680: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3690: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
36a0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
36b0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
36c0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
36d0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
36e0: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
36f0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3700: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3710: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3720: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3730: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3740: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3750: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3760: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
3770: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
3780: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
3790: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
37a0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
37b0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
37c0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
37d0: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
37e0: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
37f0: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3800: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3810: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3820: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3830: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 28  fine osPread64 (
3840: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
3850: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
3860: 36 34 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  64_t))aSyscall[1
3870: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
3880: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
3890: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
38a0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
38b0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
38c0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
38d0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
38e0: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
38f0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3900: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3910: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3920: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3930: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3940: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3950: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3960: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
3970: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
3980: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
3990: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
39a0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
39b0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
39c0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
39d0: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
39e0: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
39f0: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3a00: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3a10: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3a20: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3a30: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3a40: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3a50: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3a60: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3a70: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
3a80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3a90: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
3aa0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3ab0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3ac0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3ad0: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3ae0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3af0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3b00: 65 5f 74 2c 6f 66 66 36 34 5f 74 29 29 5c 0a 20  e_t,off64_t))\. 
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e     aSyscall[13].
3b30: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3b40: 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28  fchmod",       (
3b50: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3b60: 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20  ptr)fchmod,     
3b70: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3b80: 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28  ne osFchmod    (
3b90: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65  (int(*)(int,mode
3ba0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d  _t))aSyscall[14]
3bb0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3bc0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53  defined(HAVE_POS
3bd0: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26  IX_FALLOCATE) &&
3be0: 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c   HAVE_POSIX_FALL
3bf0: 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f  OCATE.  { "fallo
3c00: 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74  cate",    (sqlit
3c10: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3c20: 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20  osix_fallocate, 
3c30: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3c40: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
3c50: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3c60: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3c70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3c80: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c  if.#define osFal
3c90: 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  locate ((int(*)(
3ca0: 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29  int,off_t,off_t)
3cb0: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
3cc0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e  urrent)..  { "un
3cd0: 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71  link",       (sq
3ce0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3cf0: 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20  r)unlink,       
3d00: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3d10: 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69   osUnlink    ((i
3d20: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3d30: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e  *))aSyscall[16].
3d40: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3d50: 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20  openDirectory", 
3d60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3d70: 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65  all_ptr)openDire
3d80: 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c  ctory,      0 },
3d90: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44  .#define osOpenD
3da0: 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a  irectory ((int(*
3db0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
3dc0: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  t*))aSyscall[17]
3dd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3de0: 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20  "mkdir",        
3df0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3e00: 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20  _ptr)mkdir,     
3e10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69        0 },.#defi
3e20: 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28  ne osMkdir     (
3e30: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3e40: 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73  ar*,mode_t))aSys
3e50: 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e  call[18].pCurren
3e60: 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c  t)..  { "rmdir",
3e70: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3e80: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64  _syscall_ptr)rmd
3e90: 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  ir,           0 
3ea0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64  },.#define osRmd
3eb0: 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ir     ((int(*)(
3ec0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79  const char*))aSy
3ed0: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
3ee0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3ef0: 28 48 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20  (HAVE_FCHOWN).  
3f00: 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20 20  { "fchown",     
3f10: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3f20: 6c 6c 5f 70 74 72 29 66 63 68 6f 77 6e 2c 20 20  ll_ptr)fchown,  
3f30: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3f40: 73 65 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c  se.  { "fchown",
3f50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3f60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3f80: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3f90: 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69   osFchown    ((i
3fa0: 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c  nt(*)(int,uid_t,
3fb0: 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  gid_t))aSyscall[
3fc0: 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  20].pCurrent)..#
3fd0: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
3fe0: 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 67 65 74  FCHOWN).  { "get
3ff0: 65 75 69 64 22 2c 20 20 20 20 20 20 28 73 71 6c  euid",      (sql
4000: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4010: 29 67 65 74 65 75 69 64 2c 20 20 20 20 20 20 20  )geteuid,       
4020: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4030: 20 22 67 65 74 65 75 69 64 22 2c 20 20 20 20 20   "geteuid",     
4040: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4050: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
4060: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4070: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  if.#define osGet
4080: 65 75 69 64 20 20 20 28 28 75 69 64 5f 74 28 2a  euid   ((uid_t(*
4090: 29 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c  )(void))aSyscall
40a0: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
40b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
40c0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
40d0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
40e0: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61  _SIZE>0.  { "mma
40f0: 70 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  p",         (sql
4100: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4110: 29 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  )mmap,          
4120: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4130: 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20   "mmap",        
4140: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4150: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
4160: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4170: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61  if.#define osMma
4180: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
4190: 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e  d*,size_t,int,in
41a0: 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  t,int,off_t))aSy
41b0: 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65  scall[22].pCurre
41c0: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
41d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
41e0: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
41f0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
4200: 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20   "munmap",      
4210: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4220: 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20  l_ptr)munmap,   
4230: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4240: 65 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20  e.  { "munmap", 
4250: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
4260: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
4270: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4280: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4290: 6f 73 4d 75 6e 6d 61 70 20 28 28 69 6e 74 28 2a  osMunmap ((int(*
42a0: 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29  )(void*,size_t))
42b0: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
42c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45  rrent)..#if HAVE
42d0: 5f 4d 52 45 4d 41 50 20 26 26 20 28 21 64 65 66  _MREMAP && (!def
42e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
42f0: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
4300: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29  MAX_MMAP_SIZE>0)
4310: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
4320: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
4330: 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70  scall_ptr)mremap
4340: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
4350: 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61  #else.  { "mrema
4360: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
4370: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
4380: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4390: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
43a0: 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76  ine osMremap ((v
43b0: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
43c0: 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c  ze_t,size_t,int,
43d0: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 34  ...))aSyscall[24
43e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
43f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4400: 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
4410: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
4420: 5a 45 3e 30 0a 20 20 7b 20 22 67 65 74 70 61 67  ZE>0.  { "getpag
4430: 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65  esize",  (sqlite
4440: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e  3_syscall_ptr)un
4450: 69 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20 30  ixGetpagesize, 0
4460: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 67   },.#else.  { "g
4470: 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73  etpagesize",  (s
4480: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
4490: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  tr)0,           
44a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
44b0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61 67  #define osGetpag
44c0: 65 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28 76  esize ((int(*)(v
44d0: 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 35  oid))aSyscall[25
44e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
44f0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45   defined(HAVE_RE
4500: 41 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72 65 61  ADLINK).  { "rea
4510: 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c  dlink",     (sql
4520: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4530: 29 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20 20  )readlink,      
4540: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4550: 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20 20   "readlink",    
4560: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4570: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
4580: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4590: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  if.#define osRea
45a0: 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74 28  dlink ((ssize_t(
45b0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  *)(const char*,c
45c0: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
45d0: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
45e0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
45f0: 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20 7b  (HAVE_LSTAT).  {
4600: 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20   "lstat",       
4610: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
4620: 6c 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20 20 20  ll_ptr)lstat,   
4630: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4640: 65 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c 20 20  e.  { "lstat",  
4650: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
4660: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
4670: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4680: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4690: 6f 73 4c 73 74 61 74 20 20 20 20 20 20 28 28 69  osLstat      ((i
46a0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
46b0: 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  *,struct stat*))
46c0: 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75  aSyscall[27].pCu
46d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
46e0: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26  ned(__linux__) &
46f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4700: 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
4710: 4f 4d 49 43 5f 57 52 49 54 45 29 0a 23 20 69 66  OMIC_WRITE).# if
4720: 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a  def __ANDROID__.
4730: 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 28 73 71    { "ioctl", (sq
4740: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4750: 72 29 28 69 6e 74 28 2a 29 28 69 6e 74 2c 20 69  r)(int(*)(int, i
4760: 6e 74 2c 20 2e 2e 2e 29 29 69 6f 63 74 6c 2c 20  nt, ...))ioctl, 
4770: 30 20 7d 2c 0a 23 20 65 6c 73 65 0a 20 20 7b 20  0 },.# else.  { 
4780: 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20 20  "ioctl",        
4790: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
47a0: 6c 5f 70 74 72 29 69 6f 63 74 6c 2c 20 20 20 20  l_ptr)ioctl,    
47b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 20 65 6e 64        0 },.# end
47c0: 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20 22 69 6f  if.#else.  { "io
47d0: 63 74 6c 22 2c 20 20 20 20 20 20 20 20 20 28 73  ctl",         (s
47e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
47f0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  tr)0,           
4800: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
4810: 64 65 66 69 6e 65 20 6f 73 49 6f 63 74 6c 20 28  define osIoctl (
4820: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c  (int(*)(int,int,
4830: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 38  ...))aSyscall[28
4840: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20  ].pCurrent)..}; 
4850: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
4860: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
4870: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a 2f 2a 0a  m calls */.../*.
4880: 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  ** On some syste
4890: 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68  ms, calls to fch
48a0: 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67  own() will trigg
48b0: 65 72 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  er a message in 
48c0: 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f  a security.** lo
48d0: 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66  g if they come f
48e0: 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f  rom non-root pro
48f0: 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69  cesses.  So avoi
4900: 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e  d calling fchown
4910: 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20  () if.** we are 
4920: 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72  not running as r
4930: 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oot..*/.static i
4940: 6e 74 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28  nt robustFchown(
4950: 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75 69  int fd, uid_t ui
4960: 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a 23  d, gid_t gid){.#
4970: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
4980: 46 43 48 4f 57 4e 29 0a 20 20 72 65 74 75 72 6e  FCHOWN).  return
4990: 20 6f 73 47 65 74 65 75 69 64 28 29 20 3f 20 30   osGeteuid() ? 0
49a0: 20 3a 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c 75   : osFchown(fd,u
49b0: 69 64 2c 67 69 64 29 3b 0a 23 65 6c 73 65 0a 20  id,gid);.#else. 
49c0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
49d0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  f.}../*.** This 
49e0: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
49f0: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
4a00: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
4a10: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
4a20: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
4a30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4a40: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
4a50: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
4a60: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
4a70: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
4a80: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
4a90: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
4aa0: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
4ab0: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
4ac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4ad0: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
4ae0: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
4af0: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
4b00: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
4b10: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
4b20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4b30: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
4b40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
4b50: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
4b60: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
4b70: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
4b80: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
4b90: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
4ba0: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
4bb0: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
4bc0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
4bd0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
4be0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
4bf0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
4c00: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
4c10: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
4c20: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
4c30: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
4c40: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
4c50: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
4c60: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
4c70: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
4c80: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4c90: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
4ca0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
4cb0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
4cc0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
4cd0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4ce0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
4cf0: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
4d00: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
4d10: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4d20: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
4d30: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4d40: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
4d50: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
4d60: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
4d70: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
4d80: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
4d90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
4da0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
4db0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
4dc0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
4dd0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
4de0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4df0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4e00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
4e10: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4e20: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
4e30: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
4e40: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
4e50: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4e60: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
4e70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4e80: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
4e90: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
4ea0: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
4eb0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4ec0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
4ed0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
4ee0: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
4ef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4f00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4f10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4f20: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4f30: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
4f40: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
4f50: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
4f60: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
4f70: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
4f80: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
4f90: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
4fa0: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
4fb0: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
4fc0: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
4fd0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
4fe0: 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74  _ptr unixGetSyst
4ff0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
5000: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
5010: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5020: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
5030: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
5040: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
5050: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
5060: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
5070: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
5080: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
5090: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
50a0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
50b0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
50c0: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
50d0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
50e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
50f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5100: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
5110: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
5120: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
5130: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
5140: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
5150: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
5160: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
5170: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
5180: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
5190: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
51a0: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
51b0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
51c0: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
51d0: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
51e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
51f0: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
5200: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
5210: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5220: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
5230: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
5240: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
5250: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
5260: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
5270: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
5280: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
5290: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
52a0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
52b0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
52c0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
52d0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
52e0: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
52f0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
5300: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
5310: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
5320: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
5330: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5340: 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65 70 74 20  * Do not accept 
5350: 61 6e 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  any file descrip
5360: 74 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 74 68  tor less than th
5370: 69 73 20 76 61 6c 75 65 2c 20 69 6e 20 6f 72 64  is value, in ord
5380: 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 6f  er to avoid.** o
5390: 70 65 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  pening database 
53a0: 66 69 6c 65 20 75 73 69 6e 67 20 66 69 6c 65 20  file using file 
53b0: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
53c0: 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73   are commonly us
53d0: 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74 61 6e 64  ed for .** stand
53e0: 61 72 64 20 69 6e 70 75 74 2c 20 6f 75 74 70 75  ard input, outpu
53f0: 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e 0a 2a 2f  t, and error..*/
5400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5410: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
5420: 43 52 49 50 54 4f 52 0a 23 20 64 65 66 69 6e 65  CRIPTOR.# define
5430: 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f   SQLITE_MINIMUM_
5440: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
5450: 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  3.#endif../*.** 
5460: 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e 20 20  Invoke open().  
5470: 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65 20 74  Do so multiple t
5480: 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74 20 65  imes, until it e
5490: 69 74 68 65 72 20 73 75 63 63 65 65 64 73 20 6f  ither succeeds o
54a0: 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f 72 20 73  r.** fails for s
54b0: 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68 65 72  ome reason other
54c0: 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a   than EINTR..**.
54d0: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 63  ** If the file c
54e0: 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22 6d 22  reation mode "m"
54f0: 20 69 73 20 30 20 74 68 65 6e 20 73 65 74 20 69   is 0 then set i
5500: 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  t to the default
5510: 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65 2e 20   for.** SQLite. 
5520: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
5530: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
5540: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
5550: 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34  (normally.** 064
5560: 34 29 20 61 73 20 6d 6f 64 69 66 69 65 64 20 62  4) as modified b
5570: 79 20 74 68 65 20 73 79 73 74 65 6d 20 75 6d 61  y the system uma
5580: 73 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e 6f 74  sk.  If m is not
5590: 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65   0, then.** make
55a0: 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69   the file creati
55b0: 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78 61 63 74  on mode be exact
55c0: 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20 74 68  ly m ignoring th
55d0: 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e umask..**.** T
55e0: 68 65 20 6d 20 70 61 72 61 6d 65 74 65 72 20 77  he m parameter w
55f0: 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  ill be non-zero 
5600: 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65 61 74 69  only when creati
5610: 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61  ng -wal, -journa
5620: 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d 20 66  l,.** and -shm f
5630: 69 6c 65 73 2e 20 20 57 65 20 77 61 6e 74 20 74  iles.  We want t
5640: 68 6f 73 65 20 66 69 6c 65 73 20 74 6f 20 68 61  hose files to ha
5650: 76 65 20 2a 65 78 61 63 74 6c 79 2a 20 74 68 65  ve *exactly* the
5660: 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69 73 73   same.** permiss
5670: 69 6f 6e 73 20 61 73 20 74 68 65 69 72 20 6f 72  ions as their or
5680: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2c  iginal database,
5690: 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 62   unadulterated b
56a0: 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20  y the umask..** 
56b0: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 69 66 20  In that way, if 
56c0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
56d0: 69 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f 72 20  is -rw-rw-rw or 
56e0: 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64 20 61  -rw-rw-r-, and a
56f0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
5700: 63 72 61 73 68 65 73 20 61 6e 64 20 6c 65 61 76  crashes and leav
5710: 65 73 20 62 65 68 69 6e 64 20 68 6f 74 20 6a 6f  es behind hot jo
5720: 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61 6e 79  urnals, then any
5730: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74  .** process that
5740: 20 69 73 20 61 62 6c 65 20 74 6f 20 77 72 69 74   is able to writ
5750: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
5760: 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20 61  e will also be a
5770: 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f 76 65  ble to.** recove
5780: 72 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  r the hot journa
5790: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
57a0: 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f  t robust_open(co
57b0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
57c0: 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20   f, mode_t m){. 
57d0: 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f 64 65 5f   int fd;.  mode_
57e0: 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a 20 53  t m2 = m ? m : S
57f0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
5800: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a  LE_PERMISSIONS;.
5810: 20 20 77 68 69 6c 65 28 31 29 7b 0a 23 69 66 20    while(1){.#if 
5820: 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45  defined(O_CLOEXE
5830: 43 29 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  C).    fd = osOp
5840: 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45 58 45 43  en(z,f|O_CLOEXEC
5850: 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ,m2);.#else.    
5860: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c  fd = osOpen(z,f,
5870: 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  m2);.#endif.    
5880: 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
5890: 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e    if( errno==EIN
58a0: 54 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TR ) continue;. 
58b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
58c0: 7d 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 53 51  }.    if( fd>=SQ
58d0: 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c  LITE_MINIMUM_FIL
58e0: 45 5f 44 45 53 43 52 49 50 54 4f 52 20 29 20 62  E_DESCRIPTOR ) b
58f0: 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  reak;.    osClos
5900: 65 28 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(fd);.    sqlit
5910: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
5920: 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20 20 20 20  RNING, .        
5930: 20 20 20 20 20 20 20 20 22 61 74 74 65 6d 70 74          "attempt
5940: 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20   to open \"%s\" 
5950: 61 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  as file descript
5960: 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64 29 3b 0a  or %d", z, fd);.
5970: 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a 20 20 20      fd = -1;.   
5980: 20 69 66 28 20 6f 73 4f 70 65 6e 28 22 2f 64 65   if( osOpen("/de
5990: 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d 29 3c 30  v/null", f, m)<0
59a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
59b0: 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
59c0: 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20   if( m!=0 ){.   
59d0: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
59e0: 74 61 74 62 75 66 3b 0a 20 20 20 20 20 20 69 66  tatbuf;.      if
59f0: 28 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  ( osFstat(fd, &s
5a00: 74 61 74 62 75 66 29 3d 3d 30 20 0a 20 20 20 20  tatbuf)==0 .    
5a10: 20 20 20 26 26 20 73 74 61 74 62 75 66 2e 73 74     && statbuf.st
5a20: 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20 20 20 20  _size==0.       
5a30: 26 26 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  && (statbuf.st_m
5a40: 6f 64 65 26 30 37 37 37 29 21 3d 6d 20 0a 20 20  ode&0777)!=m .  
5a50: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f      ){.        o
5a60: 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d 29 3b 0a  sFchmod(fd, m);.
5a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
5a80: 66 20 64 65 66 69 6e 65 64 28 46 44 5f 43 4c 4f  f defined(FD_CLO
5a90: 45 58 45 43 29 20 26 26 20 28 21 64 65 66 69 6e  EXEC) && (!defin
5aa0: 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 20 7c 7c  ed(O_CLOEXEC) ||
5ab0: 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30 29 0a 20   O_CLOEXEC==0). 
5ac0: 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46     osFcntl(fd, F
5ad0: 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
5ae0: 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
5af0: 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
5b00: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
5b10: 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn fd;.}../*.** 
5b20: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
5b30: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
5b40: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
5b50: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
5b60: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
5b70: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
5b80: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
5b90: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
5ba0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
5bb0: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
5bc0: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
5bd0: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
5be0: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
5bf0: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
5c00: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
5c10: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
5c20: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
5c30: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
5c40: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
5c50: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
5c60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
5c70: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
5c80: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
5c90: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
5ca0: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
5cb0: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
5cc0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
5cd0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
5ce0: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
5cf0: 29 0a 2a 2a 0a 2a 2a 20 54 6f 20 70 72 65 76 65  ).**.** To preve
5d00: 6e 74 20 64 65 61 64 6c 6f 63 6b 2c 20 74 68 65  nt deadlock, the
5d10: 20 67 6c 6f 62 61 6c 20 75 6e 69 78 42 69 67 4c   global unixBigL
5d20: 6f 63 6b 20 6d 75 73 74 20 6d 75 73 74 20 62 65  ock must must be
5d30: 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 62 65 66   acquired.** bef
5d40: 6f 72 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ore the unixInod
5d50: 65 49 6e 66 6f 2e 70 4c 6f 63 6b 4d 75 74 65 78  eInfo.pLockMutex
5d60: 20 6d 75 74 65 78 2c 20 69 66 20 62 6f 74 68 20   mutex, if both 
5d70: 61 72 65 20 68 65 6c 64 2e 20 20 49 74 20 69 73  are held.  It is
5d80: 0a 2a 2a 20 4f 4b 20 74 6f 20 67 65 74 20 74 68  .** OK to get th
5d90: 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20 77 69 74  e pLockMutex wit
5da0: 68 6f 75 74 20 68 6f 6c 64 69 6e 67 20 75 6e 69  hout holding uni
5db0: 78 42 69 67 4c 6f 63 6b 20 66 69 72 73 74 2c 20  xBigLock first, 
5dc0: 62 75 74 20 69 66 0a 2a 2a 20 74 68 61 74 20 68  but if.** that h
5dd0: 61 70 70 65 6e 73 2c 20 74 68 65 20 75 6e 69 78  appens, the unix
5de0: 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78 20 6d 75  BigLock mutex mu
5df0: 73 74 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72  st not be acquir
5e00: 65 64 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  ed until after.*
5e10: 2a 20 70 4c 6f 63 6b 4d 75 74 65 78 20 69 73 20  * pLockMutex is 
5e20: 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
5e30: 20 20 20 20 20 4f 4b 3a 20 20 20 20 20 65 6e 74       OK:     ent
5e40: 65 72 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 2c  er(unixBigLock),
5e50: 20 20 65 6e 74 65 72 28 70 4c 6f 63 6b 49 6e 66    enter(pLockInf
5e60: 6f 29 0a 2a 2a 20 20 20 20 20 20 4f 4b 3a 20 20  o).**      OK:  
5e70: 20 20 20 65 6e 74 65 72 28 75 6e 69 78 42 69 67     enter(unixBig
5e80: 4c 6f 63 6b 29 0a 2a 2a 20 20 20 20 20 20 4f 4b  Lock).**      OK
5e90: 3a 20 20 20 20 20 65 6e 74 65 72 28 70 4c 6f 63  :     enter(pLoc
5ea0: 6b 49 6e 66 6f 29 0a 2a 2a 20 20 20 45 52 52 4f  kInfo).**   ERRO
5eb0: 52 3a 20 20 20 20 20 65 6e 74 65 72 28 70 4c 6f  R:     enter(pLo
5ec0: 63 6b 49 6e 66 6f 29 2c 20 65 6e 74 65 72 28 75  ckInfo), enter(u
5ed0: 6e 69 78 42 69 67 4c 6f 63 6b 29 0a 2a 2f 0a 73  nixBigLock).*/.s
5ee0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 75  tatic sqlite3_mu
5ef0: 74 65 78 20 2a 75 6e 69 78 42 69 67 4c 6f 63 6b  tex *unixBigLock
5f00: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f 69   = 0;.static voi
5f10: 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  d unixEnterMutex
5f20: 28 76 6f 69 64 29 7b 0a 20 20 61 73 73 65 72 74  (void){.  assert
5f30: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5f40: 6e 6f 74 68 65 6c 64 28 75 6e 69 78 42 69 67 4c  notheld(unixBigL
5f50: 6f 63 6b 29 20 29 3b 20 20 2f 2a 20 4e 6f 74 20  ock) );  /* Not 
5f60: 61 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65  a recursive mute
5f70: 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  x */.  sqlite3_m
5f80: 75 74 65 78 5f 65 6e 74 65 72 28 75 6e 69 78 42  utex_enter(unixB
5f90: 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 73 74 61 74 69  igLock);.}.stati
5fa0: 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65  c void unixLeave
5fb0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 61  Mutex(void){.  a
5fc0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5fd0: 75 74 65 78 5f 68 65 6c 64 28 75 6e 69 78 42 69  utex_held(unixBi
5fe0: 67 4c 6f 63 6b 29 20 29 3b 0a 20 20 73 71 6c 69  gLock) );.  sqli
5ff0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6000: 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a  unixBigLock);.}.
6010: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
6020: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75  BUG.static int u
6030: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  nixMutexHeld(voi
6040: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
6050: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6060: 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d  (unixBigLock);.}
6070: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
6080: 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f   SQLITE_HAVE_OS_
6090: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  TRACE./*.** Help
60a0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
60b0: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
60c0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
60d0: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
60e0: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
60f0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
6100: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
6110: 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  n of the supplie
6120: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63  d.** integer loc
6130: 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69  k-type..*/.stati
6140: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
6150: 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69  FileLock(int eFi
6160: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63  leLock){.  switc
6170: 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  h( eFileLock ){.
6180: 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b      case NO_LOCK
6190: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
61a0: 0a 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44  .    case SHARED
61b0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
61c0: 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65  HARED";.    case
61d0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
61e0: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
61f0: 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44  ";.    case PEND
6200: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
6210: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20   "PENDING";.    
6220: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
6230: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
6240: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
6250: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
6260: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
6270: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
6280: 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75  E./*.** Print ou
6290: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
62a0: 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20  out all locking 
62b0: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
62c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
62d0: 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62  s used for troub
62e0: 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73  leshooting locks
62f0: 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65   on multithreade
6300: 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20  d.** platforms. 
6310: 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69   Enable by compi
6320: 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44  ling with the -D
6330: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
6340: 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  E.** command-lin
6350: 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20  e option on the 
6360: 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20  compiler.  This 
6370: 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  code is normally
6380: 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a  .** turned off..
6390: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
63a0: 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20  ckTrace(int fd, 
63b0: 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66  int op, struct f
63c0: 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72  lock *p){.  char
63d0: 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70   *zOpName, *zTyp
63e0: 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e  e;.  int s;.  in
63f0: 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  t savedErrno;.  
6400: 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20  if( op==F_GETLK 
6410: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
6420: 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "GETLK";.  }els
6430: 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c  e if( op==F_SETL
6440: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
6450: 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "SETLK";.  }e
6460: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46  lse{.    s = osF
6470: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
6480: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
6490: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
64a0: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
64b0: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
64c0: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
64d0: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
64e0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
64f0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
6500: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
6510: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
6520: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
6530: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
6540: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
6550: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
6560: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
6570: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6580: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
6590: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
65a0: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
65b0: 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28  ;.  s = osFcntl(
65c0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61  fd, op, p);.  sa
65d0: 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  vedErrno = errno
65e0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
65f0: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64  Printf("fcntl %d
6600: 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20   %d %s %s %d %d 
6610: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74  %d %d\n",.     t
6620: 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70  hreadid, fd, zOp
6630: 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e  Name, zType, (in
6640: 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69  t)p->l_start, (i
6650: 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20  nt)p->l_len,.   
6660: 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c    (int)p->l_pid,
6670: 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d   s);.  if( s==(-
6680: 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c  1) && op==F_SETL
6690: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
66a0: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
66b0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
66c0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
66d0: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
66e0: 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c   *p;.    osFcntl
66f0: 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  (fd, F_GETLK, &l
6700: 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c  2);.    if( l2.l
6710: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
6720: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
6730: 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "RDLCK";.    }el
6740: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
6750: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
6760: 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43     zType = "WRLC
6770: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
6780: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( l2.l_type==F_U
6790: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  NLCK ){.      zT
67a0: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
67b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
67c0: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20  assert( 0 );.   
67d0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
67e0: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
67f0: 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a  -failure-reason:
6800: 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %s %d %d %d\n",
6810: 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28  .       zType, (
6820: 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20  int)l2.l_start, 
6830: 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28  (int)l2.l_len, (
6840: 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20  int)l2.l_pid);. 
6850: 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76   }.  errno = sav
6860: 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72  edErrno;.  retur
6870: 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73  n s;.}.#undef os
6880: 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73  Fcntl.#define os
6890: 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a  Fcntl lockTrace.
68a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
68b0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a  _LOCK_TRACE */..
68c0: 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75  /*.** Retry ftru
68d0: 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68  ncate() calls th
68e0: 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45  at fail due to E
68f0: 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  INTR.**.** All c
6900: 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74  alls to ftruncat
6910: 65 28 29 20 77 69 74 68 69 6e 20 74 68 69 73 20  e() within this 
6920: 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d  file should be m
6930: 61 64 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  ade through.** t
6940: 68 69 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e  his wrapper.  On
6950: 20 74 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61   the Android pla
6960: 74 66 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67  tform, bypassing
6970: 20 74 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77   the logic below
6980: 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  .** could lead t
6990: 6f 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  o a corrupt data
69a0: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
69b0: 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  int robust_ftrun
69c0: 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69  cate(int h, sqli
69d0: 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20  te3_int64 sz){. 
69e0: 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20   int rc;.#ifdef 
69f0: 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a  __ANDROID__.  /*
6a00: 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72   On Android, ftr
6a10: 75 6e 63 61 74 65 28 29 20 61 6c 77 61 79 73 20  uncate() always 
6a20: 75 73 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73  uses 32-bit offs
6a30: 65 74 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20  ets, even if .  
6a40: 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ** _FILE_OFFSET_
6a50: 42 49 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e  BITS=64 is defin
6a60: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ed. This means i
6a70: 74 20 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61  t is unsafe to a
6a80: 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74  ttempt to.  ** t
6a90: 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
6aa0: 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65  o any size large
6ab0: 72 20 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c  r than 2GiB. Sil
6ac0: 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79  ently ignore any
6ad0: 0a 20 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d  .  ** such attem
6ae0: 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73  pts.  */.  if( s
6af0: 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  z>(sqlite3_int64
6b00: 29 30 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20  )0x7FFFFFFF ){. 
6b10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6b20: 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  K;.  }else.#endi
6b30: 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46  f.  do{ rc = osF
6b40: 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20  truncate(h,sz); 
6b50: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
6b60: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
6b70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6b80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6b90: 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20  ne translates a 
6ba0: 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65  standard POSIX e
6bb0: 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73  rrno code into s
6bc0: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66  omething.** usef
6bd0: 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  ul to the client
6be0: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
6bf0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65   functions.  Spe
6c00: 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73  cifically, it is
6c10: 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  .** intended to 
6c20: 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69  translate a vari
6c30: 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69  ety of "try agai
6c40: 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53  n" errors into S
6c50: 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e  QLITE_BUSY.** an
6c60: 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  d a variety of "
6c70: 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65  please close the
6c80: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6c90: 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74   NOW" errors int
6ca0: 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  o .** SQLITE_IOE
6cb0: 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73  RR.** .** Errors
6cc0: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
6cd0: 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c  zation of locks,
6ce0: 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20   or file system 
6cf0: 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b  support for lock
6d00: 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e  s,.** should han
6d10: 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54  dle ENOLCK, ENOT
6d20: 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20  SUP, EOPNOTSUPP 
6d30: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
6d40: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
6d50: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
6d60: 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72  ror(int posixErr
6d70: 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f  or, int sqliteIO
6d80: 45 72 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28  Err) {.  assert(
6d90: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
6da0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
6db0: 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  CK) || .        
6dc0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
6dd0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
6de0: 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20  NLOCK) || .     
6df0: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6e00: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6e10: 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20  R_RDLOCK) ||.   
6e20: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
6e30: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6e40: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
6e50: 44 4c 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74  DLOCK) );.  swit
6e60: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
6e70: 7b 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a  {.  case EACCES:
6e80: 20 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a   .  case EAGAIN:
6e90: 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55  .  case ETIMEDOU
6ea0: 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a  T:.  case EBUSY:
6eb0: 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20  .  case EINTR:. 
6ec0: 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a   case ENOLCK:  .
6ed0: 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46      /* random NF
6ee0: 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75  S retry error, u
6ef0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
6f00: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
6f10: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
6f20: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
6f30: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
6f40: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
6f50: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
6f60: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a  LITE_BUSY;.    .
6f70: 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20    case EPERM: . 
6f80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6f90: 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65  _PERM;.    .  de
6fa0: 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75  fault: .    retu
6fb0: 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a  rn sqliteIOErr;.
6fc0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a    }.}.../*******
6fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7010: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
7020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
7030: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
7040: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
7050: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
7060: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e  *******.**.** On
7070: 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f   most versions o
7080: 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67  f unix, we can g
7090: 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66  et a unique ID f
70a0: 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e  or a file by con
70b0: 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68  catenating.** th
70c0: 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20  e device number 
70d0: 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  and the inode nu
70e0: 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20  mber.  But this 
70f0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
7100: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20   VxWorks..** On 
7110: 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75  VxWorks, a uniqu
7120: 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62  e file id must b
7130: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  e based on the c
7140: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
7150: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  e..**.** A point
7160: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
7170: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
7180: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
7190: 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   be used as a.**
71a0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
71b0: 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63  in VxWorks.  Eac
71c0: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
71d0: 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  is structure con
71e0: 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20  tains.** a copy 
71f0: 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  of the canonical
7200: 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72   filename.  Ther
7210: 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65  e is also a refe
7220: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a  rence count.  .*
7230: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20  * The structure 
7240: 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65  is reclaimed whe
7250: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7260: 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64  pointers to it d
7270: 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e  rops to.** zero.
7280: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
7290: 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79   never very many
72a0: 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f   files open at o
72b0: 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b  ne time and look
72c0: 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  ups are not.** a
72d0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69   performance-cri
72e0: 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69  tical path, so i
72f0: 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
7300: 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20  to put these.** 
7310: 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20  structures on a 
7320: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
7330: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7340: 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20  leId {.  struct 
7350: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7360: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
7370: 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  n a list of them
7380: 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   all */.  int nR
7390: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
73a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
73b0: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
73c0: 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  to this one */. 
73d0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
73f0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
7400: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d  zCanonicalName[]
7410: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
7420: 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  r *zCanonicalNam
7430: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  e;         /* Ca
7440: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
7450: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56   */.};..#if OS_V
7460: 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c  XWORKS./* .** Al
7470: 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d  l unique filenam
7480: 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61  es are held on a
7490: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61   linked list hea
74a0: 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76  ded by this.** v
74b0: 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74  ariable:.*/.stat
74c0: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
74d0: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
74e0: 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  FileList = 0;../
74f0: 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20  *.** Simplify a 
7500: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74  filename into it
7510: 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d  s canonical form
7520: 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  .** by making th
7530: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
7540: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65  ges:.**.**  * re
7550: 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c  moving any trail
7560: 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74  ing and duplicat
7570: 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  e /.**  * conver
7580: 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20  t /./ into just 
7590: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
75a0: 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69  /A/../ where A i
75b0: 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d  s any simple nam
75c0: 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  e into just /.**
75d0: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
75e0: 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20  made in-place.  
75f0: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e  Return the new n
7600: 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a  ame length..**.*
7610: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  * The original f
7620: 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b  ilename is in z[
7630: 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e  0..n-1].  Return
7640: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
7650: 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  * characters in 
7660: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e  the simplified n
7670: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
7680: 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69  nt vxworksSimpli
7690: 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20  fyName(char *z, 
76a0: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c  int n){.  int i,
76b0: 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31   j;.  while( n>1
76c0: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
76d0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28  ){ n--; }.  for(
76e0: 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
76f0: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
7700: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
7710: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63   z[i+1]=='/' ) c
7720: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
7730: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
7740: 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+2<n && z[i+2
7750: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
7760: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
7770: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7780: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
7790: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33  i+1]=='.' && i+3
77a0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e  <n && z[i+2]=='.
77b0: 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27  ' && z[i+3]=='/'
77c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
77d0: 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d  e( j>0 && z[j-1]
77e0: 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
77f0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20          if( j>0 
7800: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
7810: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
7820: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7830: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
7840: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d  j++] = z[i];.  }
7850: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72  .  z[j] = 0;.  r
7860: 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn j;.}../*.*
7870: 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20  * Find a unique 
7880: 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20  file ID for the 
7890: 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70  given absolute p
78a0: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
78b0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
78c0: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
78d0: 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  Id object.  This
78e0: 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20   pointer is the 
78f0: 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49  unique.** file I
7900: 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65  D..**.** The nRe
7910: 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76  f field of the v
7920: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
7930: 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ect is increment
7940: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
7950: 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72   object is retur
7960: 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f  ned.  A new vxwo
7970: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
7980: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
7990: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
79a0: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e  global list if n
79b0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
79c0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
79d0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
79e0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
79f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
7a00: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7a10: 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c   *vxworksFindFil
7a20: 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eId(const char *
7a30: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a  zAbsoluteName){.
7a40: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
7a50: 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20  FileId *pNew;   
7a60: 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20        /* search 
7a70: 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65  key and new file
7a80: 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   ID */.  struct 
7a90: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7aa0: 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20  Candidate;   /* 
7ab0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
7ac0: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
7ad0: 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  Ds */.  int n;  
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7b00: 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75  ength of zAbsolu
7b10: 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f  teName string */
7b20: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73  ..  assert( zAbs
7b30: 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f  oluteName[0]=='/
7b40: 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  ' );.  n = (int)
7b50: 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65  strlen(zAbsolute
7b60: 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Name);.  pNew = 
7b70: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
7b80: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
7b90: 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28  + (n+1) );.  if(
7ba0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
7bb0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61  n 0;.  pNew->zCa
7bc0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63  nonicalName = (c
7bd0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
7be0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43   memcpy(pNew->zC
7bf0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41  anonicalName, zA
7c00: 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31  bsoluteName, n+1
7c10: 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73  );.  n = vxworks
7c20: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65  SimplifyName(pNe
7c30: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7c40: 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  e, n);..  /* Sea
7c50: 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
7c60: 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d  ing entry that m
7c70: 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f  atching the cano
7c80: 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a  nical name..  **
7c90: 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65   If found, incre
7ca0: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
7cb0: 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74  ce count and ret
7cc0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
7cd0: 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69  .  ** the existi
7ce0: 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f  ng file ID..  */
7cf0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
7d00: 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64  x();.  for(pCand
7d10: 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c  idate=vxworksFil
7d20: 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74  eList; pCandidat
7d30: 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43  e; pCandidate=pC
7d40: 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29  andidate->pNext)
7d50: 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69  {.    if( pCandi
7d60: 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a  date->nName==n .
7d70: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
7d80: 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f  Candidate->zCano
7d90: 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d  nicalName, pNew-
7da0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7db0: 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20   n)==0.    ){.  
7dc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7dd0: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  e(pNew);.       
7de0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66  pCandidate->nRef
7df0: 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c  ++;.       unixL
7e00: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
7e10: 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64      return pCand
7e20: 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  idate;.    }.  }
7e30: 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20  ..  /* No match 
7e40: 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77  was found.  We w
7e50: 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66  ill make a new f
7e60: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77  ile ID */.  pNew
7e70: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e  ->nRef = 1;.  pN
7e80: 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20  ew->nName = n;. 
7e90: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76   pNew->pNext = v
7ea0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a  xworksFileList;.
7eb0: 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73    vxworksFileLis
7ec0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78  t = pNew;.  unix
7ed0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
7ee0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
7ef0: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
7f00: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
7f10: 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73  unt on a vxworks
7f20: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
7f30: 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  Free.** the obje
7f40: 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ct when the refe
7f50: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
7f60: 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  hes zero..*/.sta
7f70: 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73  tic void vxworks
7f80: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74  ReleaseFileId(st
7f90: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7fa0: 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  Id *pId){.  unix
7fb0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
7fc0: 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65  assert( pId->nRe
7fd0: 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52  f>0 );.  pId->nR
7fe0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d  ef--;.  if( pId-
7ff0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
8000: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
8010: 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66  leId **pp;.    f
8020: 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69  or(pp=&vxworksFi
8030: 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a  leList; *pp && *
8040: 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28  pp!=pId; pp = &(
8050: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d  (*pp)->pNext)){}
8060: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
8070: 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70  ==pId );.    *pp
8080: 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20   = pId->pNext;. 
8090: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
80a0: 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  pId);.  }.  unix
80b0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
80c0: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
80d0: 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORKS */./*******
80e0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
80f0: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
8100: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
8110: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
8120: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
8130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8170: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
8180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
81d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81e0: 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69  ***** Posix Advi
81f0: 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  sory Locking ***
8200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
8220: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
8230: 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  ocks are broken 
8240: 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49  by design.  ANSI
8250: 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39   STD 1003.1 (199
8260: 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e  6).** section 6.
8270: 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20  5.2.2 lines 483 
8280: 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63  through 490 spec
8290: 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20  ify that when a 
82a0: 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20  process.** sets 
82b0: 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b  or clears a lock
82c0: 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  , that operation
82d0: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70   overrides any p
82e0: 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a  rior locks set.*
82f0: 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  * by the same pr
8300: 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20  ocess.  It does 
8310: 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73  not explicitly s
8320: 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20  ay so, but this 
8330: 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20  implies.** that 
8340: 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63  it overrides loc
8350: 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61  ks set by the sa
8360: 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67  me process using
8370: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
8380: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
8390: 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20    Consider this 
83a0: 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a  test case:.**.**
83b0: 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d         int fd1 =
83c0: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c   open("./file1",
83d0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
83e0: 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20   0644);.**      
83f0: 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28   int fd2 = open(
8400: 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57  "./file2", O_RDW
8410: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
8420: 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ;.**.** Suppose 
8430: 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69  ./file1 and ./fi
8440: 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74  le2 are really t
8450: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65  he same file (be
8460: 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20  cause.** one is 
8470: 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c  a hard or symbol
8480: 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f  ic link to the o
8490: 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f  ther) then if yo
84a0: 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c  u set.** an excl
84b0: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64  usive lock on fd
84c0: 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67  1, then try to g
84d0: 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
84e0: 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20  lock.** on fd2, 
84f0: 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75  it works.  I wou
8500: 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64  ld have expected
8510: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b   the second lock
8520: 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63   to.** fail sinc
8530: 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65  e there was alre
8540: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ady a lock on th
8550: 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64  e file due to fd
8560: 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f  1..** But not so
8570: 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f  .  Since both lo
8580: 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68  cks came from th
8590: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20  e same process, 
85a0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76  the.** second ov
85b0: 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73  errides the firs
85c0: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
85d0: 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66  hey were on diff
85e0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
85f0: 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
8600: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69   on different fi
8610: 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  le names..**.** 
8620: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
8630: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
8640: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
8650: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
8660: 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f  cess.** among co
8670: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
8680: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
8690: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
86a0: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
86b0: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
86c0: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
86d0: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
86e0: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
86f0: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
8700: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
8710: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
8720: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
8730: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
8740: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
8750: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
8760: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
8770: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
8780: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
8790: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
87a0: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
87b0: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
87c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
87d0: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
87e0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
87f0: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
8800: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
8810: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
8820: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
8830: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
8840: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
8850: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
8860: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
8870: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
8880: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
8890: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
88a0: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
88b0: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
88c0: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
88d0: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
88e0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
88f0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
8900: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
8910: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
8920: 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68  **.** (Aside: Th
8930: 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e  e use of inode n
8940: 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65  umbers as unique
8950: 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f   IDs does not wo
8960: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
8970: 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77  * For VxWorks, w
8980: 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68  e have to use th
8990: 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e  e alternative un
89a0: 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62  ique ID system b
89b0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e  ased on.** canon
89c0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e  ical filename an
89d0: 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  d implemented in
89e0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69   the previous di
89f0: 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54  vision.).**.** T
8a00: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
8a10: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f  structure for PO
8a20: 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  SIX is no longer
8a30: 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72   just an integer
8a40: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
8a50: 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20  tor.  It is now 
8a60: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
8a70: 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67   holds the integ
8a80: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
8a90: 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e  iptor and a poin
8aa0: 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75  ter to a structu
8ab0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
8ac0: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  s the internal.*
8ad0: 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63  * locks on the c
8ae0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f  orresponding ino
8af0: 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  de.  There is on
8b00: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
8b10: 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65  ure.** per inode
8b20: 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65  , so if the same
8b30: 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64   inode is opened
8b40: 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69   twice, both uni
8b50: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73  xFile structures
8b60: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
8b70: 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74   same locking st
8b80: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f  ructure.  The lo
8b90: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
8ba0: 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72  keeps.** a refer
8bb0: 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77  ence count (so w
8bc0: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e  e will know when
8bd0: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61   to delete it) a
8be0: 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69  nd a "cnt".** fi
8bf0: 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75  eld that tells u
8c00: 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c  s its internal l
8c10: 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74  ock status.  cnt
8c20: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ==0 means the.**
8c30: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
8c40: 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e  d.  cnt==-1 mean
8c50: 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61  s the file has a
8c60: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
8c70: 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73  ..** cnt>0 means
8c80: 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73   there are cnt s
8c90: 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74  hared locks on t
8ca0: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  he file..**.** A
8cb0: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ny attempt to lo
8cc0: 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66  ck or unlock a f
8cd0: 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73  ile first checks
8ce0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   the locking.** 
8cf0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
8d00: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
8d10: 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f  all is only invo
8d20: 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a  ked to set a .**
8d30: 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74   POSIX lock if t
8d40: 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  he internal lock
8d50: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
8d60: 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a  itions between.*
8d70: 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61  * a locked and a
8d80: 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65  n unlocked state
8d90: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74  ..**.** But wait
8da0: 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74  :  there are yet
8db0: 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77   more problems w
8dc0: 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f  ith POSIX adviso
8dd0: 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ry locks..**.** 
8de0: 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66  If you close a f
8df0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
8e00: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  hat points to a 
8e10: 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f  file that has lo
8e20: 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b  cks,.** all lock
8e30: 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  s on that file t
8e40: 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79  hat are owned by
8e50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
8e60: 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65  cess are.** rele
8e70: 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61  ased.  To work a
8e80: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
8e90: 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f  em, each unixIno
8ea0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  deInfo object.**
8eb0: 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75   maintains a cou
8ec0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
8ed0: 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   of pending lock
8ee0: 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a  s on tha inode..
8ef0: 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  ** When an attem
8f00: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
8f10: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
8f20: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
8f30: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
8f40: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
8f50: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
8f60: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
8f70: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
8f80: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
8f90: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
8fa0: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
8fb0: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
8fc0: 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49  ar..** The unixI
8fd0: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
8fe0: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
8ff0: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
9000: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
9010: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
9020: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
9030: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
9040: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
9050: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
9060: 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74  ..**.** Yet anot
9070: 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69  her problem:  Li
9080: 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f  nuxThreads do no
9090: 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68  t play well with
90a0: 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a   posix locks..**
90b0: 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76  .** Many older v
90c0: 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78  ersions of linux
90d0: 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68   use the LinuxTh
90e0: 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68  reads library wh
90f0: 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f  ich is.** not po
9100: 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20  six compliant.  
9110: 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61  Under LinuxThrea
9120: 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  ds, a lock creat
9130: 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20  ed by thread.** 
9140: 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  A cannot be modi
9150: 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64  fied or overridd
9160: 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  en by a differen
9170: 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  t thread B..** O
9180: 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e  nly thread A can
9190: 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b   modify the lock
91a0: 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76  .  Locking behav
91b0: 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a  ior is correct.*
91c0: 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74  * if the appliat
91d0: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77  ion uses the new
91e0: 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20  er Native Posix 
91f0: 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28  Thread Library (
9200: 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75  NPTL).** on linu
9210: 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20  x - with NPTL a 
9220: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
9230: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
9240: 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69  rride locks.** i
9250: 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74  n thread B.  But
9260: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
9270: 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   to know at comp
9280: 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a  ile-time which.*
9290: 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72  * threading libr
92a0: 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  ary is being use
92b0: 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  d.  So there is 
92c0: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
92d0: 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t.** compile-tim
92e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
92f0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
9300: 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20  erride locks on 
9310: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65  thread B..** One
9320: 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e   has to do a run
9330: 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64  -time check to d
9340: 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61  iscover the beha
9350: 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63  vior of the.** c
9360: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a  urrent process..
9370: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
9380: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e  d to support Lin
9390: 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20  uxThreads.  But 
93a0: 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75  support for Linu
93b0: 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20  xThreads.** was 
93c0: 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e  dropped beginnin
93d0: 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33  g with version 3
93e0: 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69  .7.0.  SQLite wi
93f0: 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69  ll still work wi
9400: 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61  th.** LinuxThrea
9410: 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74  ds provided that
9420: 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (1) there is no
9430: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
9440: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65  onnection .** pe
9450: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
9460: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
9470: 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61  ess and (2) data
9480: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
9490: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20  .** do not move 
94a0: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a  across threads..
94b0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
94c0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
94d0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
94e0: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
94f0: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
9500: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
9510: 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  r unixInodeInfo 
9520: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63  object..*/.struc
9530: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20  t unixFileId {. 
9540: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9560: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
9570: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
9580: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
9590: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a  FileId *pId;  /*
95a0: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
95b0: 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a  for vxworks. */.
95c0: 23 65 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72  #else.  /* We ar
95d0: 65 20 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65  e told that some
95e0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64   versions of And
95f0: 72 6f 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62  roid contain a b
9600: 75 67 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a  ug that.  ** siz
9610: 65 73 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79  es ino_t at only
9620: 20 33 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64   32-bits instead
9630: 20 6f 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65   of 64-bits. (Se
9640: 65 0a 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61  e.  ** https://a
9650: 6e 64 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f  ndroid-review.go
9660: 6f 67 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23  oglesource.com/#
9670: 2f 63 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74  /c/115351/3/dist
9680: 2f 73 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a  /sqlite3.c).  **
9690: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
96a0: 74 68 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c  this, always all
96b0: 6f 63 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f  ocate 64-bits fo
96c0: 72 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  r the inode numb
96d0: 65 72 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d  er.  .  ** On sm
96e0: 61 6c 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61  all machines tha
96f0: 74 20 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62  t only have 32-b
9700: 69 74 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20  it inodes, this 
9710: 77 61 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a  wastes 4 bytes,.
9720: 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68    ** but that sh
9730: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69  ould not be a bi
9740: 67 20 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20  g deal. */.  /* 
9750: 57 41 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b  WAS:  ino_t ino;
9760: 20 20 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b     */.  u64 ino;
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62     /* Inode numb
9790: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
97a0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
97b0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
97c0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
97d0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
97e0: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
97f0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c  e..**.** A singl
9800: 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65  e inode can have
9810: 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64   multiple file d
9820: 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65  escriptors, so e
9830: 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  ach unixFile.** 
9840: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
9850: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
9860: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
9870: 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  his object and t
9880: 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65  his.** object ke
9890: 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  eps a count of t
98a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69  he number of uni
98b0: 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74  xFile pointing t
98c0: 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4d 75 74 65  o it..**.** Mute
98d0: 78 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  x rules:.**.**  
98e0: 28 31 29 20 4f 6e 6c 79 20 74 68 65 20 70 4c 6f  (1) Only the pLo
98f0: 63 6b 4d 75 74 65 78 20 6d 75 74 65 78 20 6d 75  ckMutex mutex mu
9900: 73 74 20 62 65 20 68 65 6c 64 20 69 6e 20 6f 72  st be held in or
9910: 64 65 72 20 74 6f 20 72 65 61 64 20 6f 72 20 77  der to read or w
9920: 72 69 74 65 0a 2a 2a 20 20 20 20 20 20 61 6e 79  rite.**      any
9930: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
9940: 66 69 65 6c 64 73 3a 0a 2a 2a 20 20 20 20 20 20  fields:.**      
9950: 20 20 20 20 6e 53 68 61 72 65 64 2c 20 6e 4c 6f      nShared, nLo
9960: 63 6b 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 62  ck, eFileLock, b
9970: 50 72 6f 63 65 73 73 4c 6f 63 6b 2c 20 70 55 6e  ProcessLock, pUn
9980: 75 73 65 64 0a 2a 2a 0a 2a 2a 20 20 28 32 29 20  used.**.**  (2) 
9990: 57 68 65 6e 20 6e 52 65 66 3e 30 2c 20 74 68 65  When nRef>0, the
99a0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
99b0: 66 69 65 6c 64 73 20 61 72 65 20 75 6e 63 68 61  fields are uncha
99c0: 6e 67 69 6e 67 20 61 6e 64 20 63 61 6e 0a 2a 2a  nging and can.**
99d0: 20 20 20 20 20 20 62 65 20 72 65 61 64 20 28 62        be read (b
99e0: 75 74 20 6e 6f 74 20 77 72 69 74 74 65 6e 29 20  ut not written) 
99f0: 77 69 74 68 6f 75 74 20 68 6f 6c 64 69 6e 67 20  without holding 
9a00: 61 6e 79 20 6d 75 74 65 78 3a 0a 2a 2a 20 20 20  any mutex:.**   
9a10: 20 20 20 20 20 20 20 66 69 6c 65 49 64 2c 20 70         fileId, p
9a20: 4c 6f 63 6b 4d 75 74 65 78 0a 2a 2a 0a 2a 2a 20  LockMutex.**.** 
9a30: 20 28 33 29 20 57 69 74 68 20 74 68 65 20 65 78   (3) With the ex
9a40: 63 65 70 74 69 6f 6e 73 20 61 62 6f 76 65 2c 20  ceptions above, 
9a50: 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 6d  all the fields m
9a60: 61 79 20 6f 6e 6c 79 20 62 65 20 72 65 61 64 0a  ay only be read.
9a70: 2a 2a 20 20 20 20 20 20 6f 72 20 77 72 69 74 74  **      or writt
9a80: 65 6e 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  en while holding
9a90: 20 74 68 65 20 67 6c 6f 62 61 6c 20 75 6e 69 78   the global unix
9aa0: 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78 2e 0a 2a  BigLock mutex..*
9ab0: 2a 0a 2a 2a 20 44 65 61 64 6c 6f 63 6b 20 70 72  *.** Deadlock pr
9ac0: 65 76 65 6e 74 69 6f 6e 3a 20 20 54 68 65 20 67  evention:  The g
9ad0: 6c 6f 62 61 6c 20 75 6e 69 78 42 69 67 4c 6f 63  lobal unixBigLoc
9ae0: 6b 20 6d 75 74 65 78 20 6d 61 79 20 6e 6f 74 0a  k mutex may not.
9af0: 2a 2a 20 62 65 20 61 63 71 75 69 72 65 64 20 77  ** be acquired w
9b00: 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
9b10: 20 70 4c 6f 63 6b 4d 75 74 65 78 20 6d 75 74 65   pLockMutex mute
9b20: 78 2e 20 20 49 66 20 62 6f 74 68 20 75 6e 69 78  x.  If both unix
9b30: 42 69 67 4c 6f 63 6b 0a 2a 2a 20 61 6e 64 20 70  BigLock.** and p
9b40: 4c 6f 63 6b 4d 75 74 65 78 20 61 72 65 20 6e 65  LockMutex are ne
9b50: 65 64 65 64 2c 20 74 68 65 6e 20 75 6e 69 78 42  eded, then unixB
9b60: 69 67 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 61  igLock must be a
9b70: 63 71 75 69 72 65 64 20 66 69 72 73 74 2e 0a 2a  cquired first..*
9b80: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f  /.struct unixIno
9b90: 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  deInfo {.  struc
9ba0: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
9bb0: 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  eId;       /* Th
9bc0: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
9bd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
9be0: 2a 70 4c 6f 63 6b 4d 75 74 65 78 3b 20 20 20 20  *pLockMutex;    
9bf0: 20 20 2f 2a 20 48 6f 6c 64 20 74 68 69 73 20 6d    /* Hold this m
9c00: 75 74 65 78 20 66 6f 72 2e 2e 2e 20 2a 2f 0a 20  utex for... */. 
9c10: 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20   int nShared;   
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9c40: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
9c50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  d */.  int nLock
9c60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9c80: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
9c90: 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a  g file locks */.
9ca0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9cb0: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
9cc0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
9cd0: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
9ce0: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
9cf0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9d00: 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20   bProcessLock;  
9d10: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75       /* An exclu
9d20: 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63  sive process loc
9d30: 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 55  k is held */.  U
9d40: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
9d50: 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  used;           
9d60: 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20   /* Unused file 
9d70: 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63  descriptors to c
9d80: 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  lose */.  int nR
9d90: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
9da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9db0: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
9dc0: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
9dd0: 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  e */.  unixShmNo
9de0: 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
9df0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
9e00: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
9e10: 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f  ed with this ino
9e20: 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  de */.  unixInod
9e30: 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20  eInfo *pNext;   
9e40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
9e50: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
9e60: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Info objects */.
9e70: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9e80: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
9e90: 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75    /*    .... dou
9ea0: 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69  bly linked */.#i
9eb0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9ec0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
9ed0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
9ee0: 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20  ng sharedByte;  
9ef0: 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c  /* for AFP simul
9f00: 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b  ated shared lock
9f10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
9f20: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f  S_VXWORKS.  sem_
9f30: 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20  t *pSem;        
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9f50: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
9f60: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
9f70: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
9f80: 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d  NAME+2];  /* Nam
9f90: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
9fa0: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ore */.#endif.#i
9fb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 41 52  fdef SQLITE_SHAR
9fc0: 45 44 5f 4d 41 50 50 49 4e 47 0a 20 20 73 71 6c  ED_MAPPING.  sql
9fd0: 69 74 65 33 5f 69 6e 74 36 34 20 6e 53 68 61 72  ite3_int64 nShar
9fe0: 65 64 4d 61 70 70 69 6e 67 3b 20 20 20 2f 2a 20  edMapping;   /* 
9ff0: 53 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72  Size of mapped r
a000: 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a  egion in bytes *
a010: 2f 0a 20 20 76 6f 69 64 20 2a 70 53 68 61 72 65  /.  void *pShare
a020: 64 4d 61 70 70 69 6e 67 3b 20 20 20 20 20 20 20  dMapping;       
a030: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
a040: 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23  pped region */.#
a050: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
a060: 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75  A lists of all u
a070: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
a080: 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 4d 75 73 74  ects..**.** Must
a090: 20 68 6f 6c 64 20 75 6e 69 78 42 69 67 4c 6f 63   hold unixBigLoc
a0a0: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  k in order to re
a0b0: 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 69 73  ad or write this
a0c0: 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74   variable..*/.st
a0d0: 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e  atic unixInodeIn
a0e0: 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20  fo *inodeList = 
a0f0: 30 3b 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49  0;  /* All unixI
a100: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
a110: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a120: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
a130: 72 75 65 20 69 66 20 74 68 65 20 69 6e 6f 64 65  rue if the inode
a140: 20 6d 75 74 65 78 20 28 6f 6e 20 74 68 65 20 75   mutex (on the u
a150: 6e 69 78 46 69 6c 65 2e 70 46 69 6c 65 4d 75 74  nixFile.pFileMut
a160: 65 78 20 66 69 65 6c 64 29 20 69 73 20 68 65 6c  ex field) is hel
a170: 64 2c 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 20 54 68  d, or not..** Th
a180: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
a190: 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
a1a0: 73 73 65 72 74 28 29 20 74 6f 20 68 65 6c 70 20  ssert() to help 
a1b0: 76 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 6d  verify correct m
a1c0: 75 74 65 78 0a 2a 2a 20 75 73 61 67 65 2e 0a 2a  utex.** usage..*
a1d0: 2f 0a 69 6e 74 20 75 6e 69 78 46 69 6c 65 4d 75  /.int unixFileMu
a1e0: 74 65 78 48 65 6c 64 28 75 6e 69 78 46 69 6c 65  texHeld(unixFile
a1f0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65   *pFile){.  asse
a200: 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
a210: 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  e );.  return sq
a220: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a230: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  (pFile->pInode->
a240: 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 7d 0a 69  pLockMutex);.}.i
a250: 6e 74 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78  nt unixFileMutex
a260: 4e 6f 74 68 65 6c 64 28 75 6e 69 78 46 69 6c 65  Notheld(unixFile
a270: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65   *pFile){.  asse
a280: 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
a290: 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  e );.  return sq
a2a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
a2b0: 65 6c 64 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  eld(pFile->pInod
a2c0: 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a  e->pLockMutex);.
a2d0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 0a  }.#endif../*.**.
a2e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a2f0: 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41   - unixLogErrorA
a300: 74 4c 69 6e 65 28 29 2c 20 69 73 20 6f 6e 6c 79  tLine(), is only
a310: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
a320: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e   the macro.** un
a330: 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  ixLogError()..**
a340: 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  .** It is invoke
a350: 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  d after an error
a360: 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53   occurs in an OS
a370: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72   function and er
a380: 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  rno has been.** 
a390: 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d  set. It logs a m
a3a0: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
a3b0: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
a3c0: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
a3d0: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
a3e0: 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73  rno and, if poss
a3f0: 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d  ible, the human-
a400: 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c  readable equival
a410: 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  ent from strerro
a420: 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72  r() or.** strerr
a430: 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  or_r()..**.** Th
a440: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
a450: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
a460: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
a470: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
a480: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
a490: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
a4a0: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
a4b0: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
a4c0: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a  TE_CANTOPEN). .*
a4d0: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
a4e0: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
a4f0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
a500: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
a510: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
a520: 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e  led (e.g. "unlin
a530: 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20  k", "open") and 
a540: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
a550: 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c  ile-system path,
a560: 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  .** if any..*/.#
a570: 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72  define unixLogEr
a580: 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75  ror(a,b,c)     u
a590: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
a5a0: 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f  e(a,b,c,__LINE__
a5b0: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ).static int uni
a5c0: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
a5d0: 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20  .  int errcode, 
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72     /* SQLite err
a600: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  or code */.  con
a610: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20  st char *zFunc, 
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a630: 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74  Name of OS funct
a640: 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20  ion that failed 
a650: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
a660: 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
a670: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74       /* File pat
a680: 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  h associated wit
a690: 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74  h error */.  int
a6a0: 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20   iLine          
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6c0: 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62  Source line numb
a6d0: 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f  er where error o
a6e0: 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20  ccurred */.){.  
a6f0: 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20  char *zErr;     
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a710: 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20  /* Message from 
a720: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71  strerror() or eq
a730: 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e  uivalent */.  in
a740: 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t iErrno = errno
a750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a760: 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65   Saved syscall e
a770: 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a  rror number */..
a780: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
a790: 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65  not a threadsafe
a7a0: 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54   build (SQLITE_T
a7b0: 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74  HREADSAFE==0), t
a7c0: 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65  hen use.  ** the
a7d0: 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63   strerror() func
a7e0: 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74  tion to obtain t
a7f0: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
a800: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  e error message.
a810: 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20    ** equivalent 
a820: 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77  to errno. Otherw
a830: 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ise, use strerro
a840: 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66  r_r()..  */ .#if
a850: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
a860: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41  FE && defined(HA
a870: 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20  VE_STRERROR_R). 
a880: 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a   char aErr[80];.
a890: 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30    memset(aErr, 0
a8a0: 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b  , sizeof(aErr));
a8b0: 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a  .  zErr = aErr;.
a8c0: 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f  .  /* If STRERRO
a8d0: 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20  R_R_CHAR_P (set 
a8e0: 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69  by autoconf scri
a8f0: 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e  pts) or __USE_GN
a900: 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20  U is defined,.  
a910: 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  ** assume that t
a920: 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64  he system provid
a930: 65 73 20 74 68 65 20 47 4e 55 20 76 65 72 73 69  es the GNU versi
a940: 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72  on of strerror_r
a950: 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74  () that.  ** ret
a960: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
a970: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
a980: 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  ining the error 
a990: 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f  message. That po
a9a0: 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20  inter .  ** may 
a9b0: 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c  point to aErr[],
a9c0: 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74   or it may point
a9d0: 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20   to some static 
a9e0: 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72  storage somewher
a9f0: 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  e. .  ** Otherwi
aa00: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
aa10: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
aa20: 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65  des the POSIX ve
aa30: 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73  rsion of .  ** s
aa40: 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69  trerror_r(), whi
aa50: 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73  ch always writes
aa60: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
aa70: 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20  e into aErr[].. 
aa80: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
aa90: 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  code incorrectly
aaa0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
aab0: 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65   is the POSIX ve
aac0: 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20  rsion that is.  
aad0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ** available, th
aae0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
aaf0: 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e  will often be an
ab00: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e   empty string. N
ab10: 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70  ot a.  ** huge p
ab20: 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63  roblem. Incorrec
ab30: 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74  tly concluding t
ab40: 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73  hat the GNU vers
ab50: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
ab60: 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61   .  ** could lea
ab70: 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20  d to a segfault 
ab80: 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66  though..  */.#if
ab90: 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f   defined(STRERRO
aba0: 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64  R_R_CHAR_P) || d
abb0: 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55  efined(__USE_GNU
abc0: 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e  ).  zErr = .# en
abd0: 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72  dif.  strerror_r
abe0: 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73  (iErrno, aErr, s
abf0: 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a  izeof(aErr)-1);.
ac00: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48  .#elif SQLITE_TH
ac10: 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68  READSAFE.  /* Th
ac20: 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61  is is a threadsa
ac30: 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74  fe build, but st
ac40: 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f  rerror_r() is no
ac50: 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a  t available. */.
ac60: 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c    zErr = "";.#el
ac70: 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65  se.  /* Non-thre
ac80: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73  adsafe build, us
ac90: 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f  e strerror(). */
aca0: 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72  .  zErr = strerr
acb0: 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64  or(iErrno);.#end
acc0: 69 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d  if..  if( zPath=
acd0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
ace0: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65  .  sqlite3_log(e
acf0: 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f  rrcode,.      "o
ad00: 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64  s_unix.c:%d: (%d
ad10: 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a  ) %s(%s) - %s",.
ad20: 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72        iLine, iEr
ad30: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
ad40: 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20  h, zErr.  );..  
ad50: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
ad60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ad70: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ad80: 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
ad90: 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61  e that close() a
ada0: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72  lmost always wor
adb0: 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20  ks, since it is 
adc0: 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72  only in a.** ver
add0: 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69  y sick applicati
ade0: 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20  on or on a very 
adf0: 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68  sick platform th
ae00: 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c  at it might fail
ae10: 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20  ..** If it does 
ae20: 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61  fail, simply lea
ae30: 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  k the file descr
ae40: 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f  iptor, but do lo
ae50: 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a  g the.** error..
ae60: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
ae70: 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  it is not safe t
ae80: 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20  o retry close() 
ae90: 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63  after EINTR sinc
aea0: 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65  e the.** file de
aeb0: 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68  scriptor might h
aec0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
aed0: 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68   reused by anoth
aee0: 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f  er thread..** So
aef0: 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74   we don't even t
af00: 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ry to recover fr
af10: 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75  om an EINTR.  Ju
af20: 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72  st log the error
af30: 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e  .** and move on.
af40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
af50: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69  robust_close(uni
af60: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  xFile *pFile, in
af70: 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29  t h, int lineno)
af80: 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28  {.  if( osClose(
af90: 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f  h) ){.    unixLo
afa0: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c  gErrorAtLine(SQL
afb0: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
afc0: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20   "close",.      
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afe0: 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e   pFile ? pFile->
aff0: 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e  zPath : 0, linen
b000: 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
b010: 20 53 65 74 20 74 68 65 20 70 46 69 6c 65 2d 3e   Set the pFile->
b020: 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20 74  lastErrno.  Do t
b030: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
b040: 69 6e 65 20 61 73 20 74 68 61 74 20 70 72 6f 76  ine as that prov
b050: 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76 65 6e  ides.** a conven
b060: 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65  ient place to se
b070: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a  t a breakpoint..
b080: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
b090: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e  toreLastErrno(un
b0a0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
b0b0: 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46 69  nt error){.  pFi
b0c0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b0d0: 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  error;.}../*.** 
b0e0: 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64  Close all file d
b0f0: 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d  escriptors accum
b100: 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69  uated in the uni
b110: 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75  xInodeInfo->pUnu
b120: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74  sed list..*/ .st
b130: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50  atic void closeP
b140: 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69  endingFds(unixFi
b150: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
b160: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
b170: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
b180: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
b190: 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e  dFd *p;.  UnixUn
b1a0: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20  usedFd *pNext;. 
b1b0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c   assert( unixFil
b1c0: 65 4d 75 74 65 78 48 65 6c 64 28 70 46 69 6c 65  eMutexHeld(pFile
b1d0: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e  ) );.  for(p=pIn
b1e0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b  ode->pUnused; p;
b1f0: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
b200: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
b210: 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
b220: 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20  e(pFile, p->fd, 
b230: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73  __LINE__);.    s
b240: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
b250: 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55    }.  pInode->pU
b260: 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
b270: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
b280: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
b290: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
b2a0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
b2b0: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a  ndInodeInfo()..*
b2c0: 2a 0a 2a 2a 20 54 68 65 20 67 6c 6f 62 61 6c 20  *.** The global 
b2d0: 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
b2e0: 6c 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ld when this rou
b2f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
b300: 62 75 74 20 74 68 65 20 6d 75 74 65 78 0a 2a 2a  but the mutex.**
b310: 20 6f 6e 20 74 68 65 20 69 6e 6f 64 65 20 62 65   on the inode be
b320: 69 6e 67 20 64 65 6c 65 74 65 64 20 6d 75 73 74  ing deleted must
b330: 20 4e 4f 54 20 62 65 20 68 65 6c 64 2e 0a 2a 2f   NOT be held..*/
b340: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
b350: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e  easeInodeInfo(un
b360: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
b370: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
b380: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
b390: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
b3a0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
b3b0: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
b3c0: 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74  unixFileMutexNot
b3d0: 68 65 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a 20  held(pFile) );. 
b3e0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f   if( ALWAYS(pIno
b3f0: 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  de) ){.    pInod
b400: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  e->nRef--;.    i
b410: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d  f( pInode->nRef=
b420: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
b430: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  rt( pInode->pShm
b440: 4e 6f 64 65 3d 3d 30 20 29 3b 0a 23 69 66 64 65  Node==0 );.#ifde
b450: 66 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44 5f  f SQLITE_SHARED_
b460: 4d 41 50 50 49 4e 47 0a 20 20 20 20 20 20 69 66  MAPPING.      if
b470: 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65  ( pInode->pShare
b480: 64 4d 61 70 70 69 6e 67 20 29 7b 0a 20 20 20 20  dMapping ){.    
b490: 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 49 6e      osMunmap(pIn
b4a0: 6f 64 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70  ode->pSharedMapp
b4b0: 69 6e 67 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ing, pInode->nSh
b4c0: 61 72 65 64 4d 61 70 70 69 6e 67 29 3b 0a 20 20  aredMapping);.  
b4d0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 53        pInode->pS
b4e0: 68 61 72 65 64 4d 61 70 70 69 6e 67 20 3d 20 30  haredMapping = 0
b4f0: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
b500: 2d 3e 6e 53 68 61 72 65 64 4d 61 70 70 69 6e 67  ->nSharedMapping
b510: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
b520: 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74  ndif.      sqlit
b530: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
b540: 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
b550: 78 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50  x);.      closeP
b560: 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
b570: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
b580: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f  mutex_leave(pIno
b590: 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b  de->pLockMutex);
b5a0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
b5b0: 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  e->pPrev ){.    
b5c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
b5d0: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
b5e0: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
b5f0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
b600: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  v->pNext = pInod
b610: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
b620: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
b630: 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74  ssert( inodeList
b640: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
b650: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
b660: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
b670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b680: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29   pInode->pNext )
b690: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b6a0: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d  ( pInode->pNext-
b6b0: 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29  >pPrev==pInode )
b6c0: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
b6d0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
b6e0: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a   pInode->pPrev;.
b6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
b700: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
b710: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
b720: 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
b730: 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29  te3_free(pInode)
b740: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
b750: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
b760: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
b770: 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f  cate the unixIno
b780: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  deInfo object th
b790: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
b7a0: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
b7b0: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
b7c0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
b7d0: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
b7e0: 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74  turn value might
b7f0: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
b800: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
b810: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
b820: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 6d 75 73  global mutex mus
b830: 74 20 68 65 6c 64 20 77 68 65 6e 20 63 61 6c 6c  t held when call
b840: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
b850: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
b860: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
b870: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
b880: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64  tic int findInod
b890: 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c  eInfo(.  unixFil
b8a0: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
b8b0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
b8c0: 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64  file with file d
b8d0: 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20  esc used in the 
b8e0: 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  key */.  unixIno
b8f0: 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65  deInfo **ppInode
b900: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
b910: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
b920: 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20  nfo object here 
b930: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d         /* System
b960: 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64   call return cod
b970: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  e */.  int fd;  
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
b9a0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
b9b0: 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75   pFile */.  stru
b9c0: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
b9d0: 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  leId;      /* Lo
b9e0: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
b9f0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
ba00: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
ba10: 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
ba20: 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
ba30: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
ba40: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
ba50: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b  nfo *pInode = 0;
ba60: 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74       /* Candidat
ba70: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
ba80: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73  object */..  ass
ba90: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
baa0: 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65  ld() );..  /* Ge
bab0: 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f  t low-level info
bac0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
bad0: 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63  e file that we c
bae0: 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  an used to.  ** 
baf0: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20  create a unique 
bb00: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c  name for the fil
bb10: 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70  e..  */.  fd = p
bb20: 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20  File->h;.  rc = 
bb30: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
bb40: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
bb50: 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  =0 ){.    storeL
bb60: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
bb70: 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64 65 66 69  errno);.#if defi
bb80: 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57 29 20 26  ned(EOVERFLOW) &
bb90: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
bba0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29 0a 20 20  _DISABLE_LFS).  
bbb0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
bbc0: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
bbd0: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
bbe0: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
bbf0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bc00: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
bc10: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
bc20: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
bc30: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
bc40: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
bc50: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
bc60: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
bc70: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
bc80: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
bc90: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
bca0: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
bcb0: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
bcc0: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
bcd0: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
bce0: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
bcf0: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
bd00: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
bd10: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
bd20: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
bd30: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
bd40: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
bd50: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
bd60: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
bd70: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
bd80: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
bd90: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
bda0: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
bdb0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
bdc0: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
bdd0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
bde0: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
bdf0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
be00: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
be10: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
be20: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
be30: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
be40: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
be50: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
be60: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
be70: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
be80: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
be90: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
bea0: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
beb0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
bec0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
bed0: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
bee0: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
bef0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
bf00: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
bf10: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
bf20: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
bf30: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
bf40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bf50: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
bf60: 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
bf70: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
bf80: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
bf90: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
bfa0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
bfb0: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
bfc0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
bfd0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
bfe0: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65  ..  memset(&file
bff0: 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69  Id, 0, sizeof(fi
c000: 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64  leId));.  fileId
c010: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
c020: 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58  t_dev;.#if OS_VX
c030: 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70  WORKS.  fileId.p
c040: 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b  Id = pFile->pId;
c050: 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e  .#else.  fileId.
c060: 69 6e 6f 20 3d 20 28 75 36 34 29 73 74 61 74 62  ino = (u64)statb
c070: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69  uf.st_ino;.#endi
c080: 66 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  f.  assert( unix
c090: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
c0a0: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
c0b0: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
c0c0: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
c0d0: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
c0e0: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
c0f0: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
c100: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
c110: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
c120: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
c130: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
c140: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
c150: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
c160: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
c170: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
c180: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
c190: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
c1a0: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
c1b0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
c1c0: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
c1d0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
c1e0: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
c1f0: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 69 66  fileId));.    if
c200: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
c210: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
c220: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
c230: 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 73  ->pLockMutex = s
c240: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
c250: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
c260: 46 41 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28  FAST);.      if(
c270: 20 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75   pInode->pLockMu
c280: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
c290: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c2a0: 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  Inode);.        
c2b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c2c0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
c2d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 6f  }.    }.    pIno
c2e0: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
c2f0: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
c300: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 20  texHeld() );.   
c310: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
c320: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
c330: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
c340: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
c350: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
c360: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
c370: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
c380: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
c390: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
c3a0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
c3b0: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
c3c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c3d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
c3e0: 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69 6c  urn TRUE if pFil
c3f0: 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61 6d  e has been renam
c400: 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20 73  ed or unlinked s
c410: 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72 73  ince it was firs
c420: 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61  t opened..*/.sta
c430: 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73 4d  tic int fileHasM
c440: 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  oved(unixFile *p
c450: 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56 58  File){.#if OS_VX
c460: 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 70  WORKS.  return p
c470: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
c480: 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d 70  && pFile->pId!=p
c490: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69  File->pInode->fi
c4a0: 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65 0a  leId.pId;.#else.
c4b0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
c4c0: 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c  f;.  return pFil
c4d0: 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a  e->pInode!=0 &&.
c4e0: 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70 46        (osStat(pF
c4f0: 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75 66  ile->zPath, &buf
c500: 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c  )!=0 .         |
c510: 7c 20 28 75 36 34 29 62 75 66 2e 73 74 5f 69 6e  | (u64)buf.st_in
c520: 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  o!=pFile->pInode
c530: 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a 23  ->fileId.ino);.#
c540: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
c550: 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69 6c 65  Check a unixFile
c560: 20 74 68 61 74 20 69 73 20 61 20 64 61 74 61 62   that is a datab
c570: 61 73 65 2e 20 20 56 65 72 69 66 79 20 74 68 65  ase.  Verify the
c580: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
c590: 2a 20 28 31 29 20 54 68 65 72 65 20 69 73 20 65  * (1) There is e
c5a0: 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72 64 20  xactly one hard 
c5b0: 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  link on the file
c5c0: 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69 6c 65  .** (2) The file
c5d0: 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f 6c   is not a symbol
c5e0: 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20 54  ic link.** (3) T
c5f0: 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  he file has not 
c600: 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20  been renamed or 
c610: 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49  unlinked.**.** I
c620: 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67  ssue sqlite3_log
c630: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
c640: 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20 69 66  ...) messages if
c650: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f 74   anything is not
c660: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
c670: 63 20 76 6f 69 64 20 76 65 72 69 66 79 44 62 46  c void verifyDbF
c680: 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
c690: 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73  ile){.  struct s
c6a0: 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74 20 72  tat buf;.  int r
c6b0: 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 73 65 20 76  c;..  /* These v
c6c0: 65 72 69 66 69 63 61 74 69 6f 6e 73 20 6f 63 63  erifications occ
c6d0: 75 72 73 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  urs for the main
c6e0: 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 2a   database only *
c6f0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  /.  if( pFile->c
c700: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
c710: 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 20 72 65 74  ILE_NOLOCK ) ret
c720: 75 72 6e 3b 0a 0a 20 20 72 63 20 3d 20 6f 73 46  urn;..  rc = osF
c730: 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
c740: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
c750: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c760: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
c770: 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74  ING, "cannot fst
c780: 61 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20  at db file %s", 
c790: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
c7a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
c7b0: 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e   if( buf.st_nlin
c7c0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  k==0 ){.    sqli
c7d0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
c7e0: 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e  ARNING, "file un
c7f0: 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65  linked while ope
c800: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
c810: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
c820: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66  n;.  }.  if( buf
c830: 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20  .st_nlink>1 ){. 
c840: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
c850: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
c860: 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74  multiple links t
c870: 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69  o file: %s", pFi
c880: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
c890: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
c8a0: 28 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70  ( fileHasMoved(p
c8b0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  File) ){.    sql
c8c0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c8d0: 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72  WARNING, "file r
c8e0: 65 6e 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65  enamed while ope
c8f0: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
c900: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
c910: 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n;.  }.}.../*.**
c920: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
c930: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
c940: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
c950: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
c960: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
c970: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
c980: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
c990: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
c9a0: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
c9b0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
c9c0: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
c9d0: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
c9e0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
c9f0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
ca00: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
ca10: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
ca20: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
ca30: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
ca40: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
ca50: 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73  int unixCheckRes
ca60: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
ca70: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
ca80: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
ca90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
caa0: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
cab0: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
cac0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
cad0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
cae0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
caf0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
cb00: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
cb10: 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  K; );..  assert(
cb20: 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
cb30: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
cb40: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
cb50: 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  K );.  sqlite3_m
cb60: 75 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65  utex_enter(pFile
cb70: 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  ->pInode->pLockM
cb80: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  utex);..  /* Che
cb90: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
cba0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
cbb0: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
cbc0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
cbd0: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
cbe0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
cbf0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
cc00: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
cc10: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
cc20: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
cc30: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
cc40: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
cc50: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
cc60: 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49  ed && !pFile->pI
cc70: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
cc80: 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ck ){.    struct
cc90: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
cca0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
ccb0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
ccc0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
ccd0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
cce0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
ccf0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
cd00: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
cd10: 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  if( osFcntl(pFil
cd20: 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  e->h, F_GETLK, &
cd30: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72  lock) ){.      r
cd40: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
cd50: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
cd60: 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  CK;.      storeL
cd70: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
cd80: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 20 65 6c  errno);.    } el
cd90: 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
cda0: 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe!=F_UNLCK ){. 
cdb0: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
cdc0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  1;.    }.  }.#en
cdd0: 64 69 66 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  dif.  .  sqlite3
cde0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 46 69  _mutex_leave(pFi
cdf0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  le->pInode->pLoc
ce00: 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  kMutex);.  OSTRA
ce10: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
ce20: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
ce30: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
ce40: 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
ce50: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
ce60: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
ce70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
ce80: 74 20 61 20 70 6f 73 69 78 2d 61 64 76 69 73 6f  t a posix-adviso
ce90: 72 79 2d 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ry-lock..**.** T
cea0: 68 65 72 65 20 61 72 65 20 74 77 6f 20 76 65 72  here are two ver
ceb0: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 72 6f  sions of this ro
cec0: 75 74 69 6e 65 2e 20 20 49 66 20 63 6f 6d 70 69  utine.  If compi
ced0: 6c 65 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49  led with.** SQLI
cee0: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f  TE_ENABLE_SETLK_
cef0: 54 49 4d 45 4f 55 54 20 74 68 65 6e 20 74 68 65  TIMEOUT then the
cf00: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6e 20   routine has an 
cf10: 65 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 0a  extra parameter.
cf20: 2a 2a 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  ** which is a po
cf30: 69 6e 74 65 72 20 74 6f 20 61 20 75 6e 69 78 46  inter to a unixF
cf40: 69 6c 65 2e 20 20 49 66 20 74 68 65 20 75 6e 69  ile.  If the uni
cf50: 78 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65  xFile->iBusyTime
cf60: 6f 75 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  out.** value is 
cf70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
cf80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
cf90: 6c 6c 69 73 65 63 6f 6e 64 73 20 74 6f 20 77 61  lliseconds to wa
cfa0: 69 74 20 62 65 66 6f 72 65 0a 2a 2a 20 66 61 69  it before.** fai
cfb0: 6c 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e 20 20  ling the lock.  
cfc0: 54 68 65 20 69 42 75 73 79 54 69 6d 65 6f 75 74  The iBusyTimeout
cfd0: 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73   value is always
cfe0: 20 72 65 73 65 74 20 62 61 63 6b 20 74 6f 0a 2a   reset back to.*
cff0: 2a 20 7a 65 72 6f 20 6f 6e 20 65 61 63 68 20 63  * zero on each c
d000: 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  all..**.** If SQ
d010: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c  LITE_ENABLE_SETL
d020: 4b 5f 54 49 4d 45 4f 55 54 20 69 73 20 6e 6f 74  K_TIMEOUT is not
d030: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 64   defined, then d
d040: 6f 20 61 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67  o a non-blocking
d050: 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 73  .** attempt to s
d060: 65 74 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  et the lock..*/.
d070: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
d080: 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45  NABLE_SETLK_TIME
d090: 4f 55 54 0a 23 20 64 65 66 69 6e 65 20 6f 73 53  OUT.# define osS
d0a0: 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79 4c  etPosixAdvisoryL
d0b0: 6f 63 6b 28 68 2c 78 2c 74 29 20 6f 73 46 63 6e  ock(h,x,t) osFcn
d0c0: 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c 78 29 0a  tl(h,F_SETLK,x).
d0d0: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74  #else.static int
d0e0: 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73   osSetPosixAdvis
d0f0: 6f 72 79 4c 6f 63 6b 28 0a 20 20 69 6e 74 20 68  oryLock(.  int h
d100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d110: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
d120: 63 72 69 70 74 6f 72 20 6f 6e 20 77 68 69 63 68  criptor on which
d130: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 6c 6f 63   to take the loc
d140: 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c  k */.  struct fl
d150: 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20 20 2f 2a 20  ock *pLock,  /* 
d160: 54 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  The description 
d170: 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  of the lock */. 
d180: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
d190: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
d1a0: 75 72 65 20 68 6f 6c 64 69 6e 67 20 74 69 6d 65  ure holding time
d1b0: 6f 75 74 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  out value */.){.
d1c0: 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 46 63 6e    int rc = osFcn
d1d0: 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c 70 4c 6f  tl(h,F_SETLK,pLo
d1e0: 63 6b 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  ck);.  while( rc
d1f0: 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 69 42 75  <0 && pFile->iBu
d200: 73 79 54 69 6d 65 6f 75 74 3e 30 20 29 7b 0a 20  syTimeout>0 ){. 
d210: 20 20 20 2f 2a 20 4f 6e 20 73 79 73 74 65 6d 73     /* On systems
d220: 20 74 68 61 74 20 73 75 70 70 6f 72 74 20 73 6f   that support so
d230: 6d 65 20 6b 69 6e 64 20 6f 66 20 62 6c 6f 63 6b  me kind of block
d240: 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 20 77 69  ing file lock wi
d250: 74 68 20 61 20 74 69 6d 65 6f 75 74 2c 0a 20 20  th a timeout,.  
d260: 20 20 2a 2a 20 6d 61 6b 65 20 61 70 70 72 6f 70    ** make approp
d270: 72 69 61 74 65 20 63 68 61 6e 67 65 73 20 68 65  riate changes he
d280: 72 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 61  re to invoke tha
d290: 74 20 62 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 20  t blocking file 
d2a0: 6c 6f 63 6b 2e 20 20 4f 6e 0a 20 20 20 20 2a 2a  lock.  On.    **
d2b0: 20 67 65 6e 65 72 69 63 20 70 6f 73 69 78 2c 20   generic posix, 
d2c0: 68 6f 77 65 76 65 72 2c 20 74 68 65 72 65 20 69  however, there i
d2d0: 73 20 6e 6f 20 73 75 63 68 20 41 50 49 2e 20 20  s no such API.  
d2e0: 53 6f 20 77 65 20 73 69 6d 70 6c 79 20 74 72 79  So we simply try
d2f0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   the.    ** lock
d300: 20 6f 6e 63 65 20 65 76 65 72 79 20 6d 69 6c 6c   once every mill
d310: 69 73 65 63 6f 6e 64 20 75 6e 74 69 6c 20 65 69  isecond until ei
d320: 74 68 65 72 20 74 68 65 20 74 69 6d 65 6f 75 74  ther the timeout
d330: 20 65 78 70 69 72 65 73 2c 20 6f 72 20 75 6e 74   expires, or unt
d340: 69 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  il.    ** the lo
d350: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 2e 20  ck is obtained. 
d360: 2a 2f 0a 20 20 20 20 75 73 6c 65 65 70 28 31 30  */.    usleep(10
d370: 30 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73  00);.    rc = os
d380: 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c  Fcntl(h,F_SETLK,
d390: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 70 46 69 6c  pLock);.    pFil
d3a0: 65 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 2d  e->iBusyTimeout-
d3b0: 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  -;.  }.  return 
d3c0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
d3d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
d3e0: 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 2a 2f 0a 0a  TLK_TIMEOUT */..
d3f0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
d400: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
d410: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
d420: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
d430: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
d440: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
d450: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
d460: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
d470: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
d480: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
d490: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
d4a0: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
d4b0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
d4c0: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
d4d0: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
d4e0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
d4f0: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
d500: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
d510: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
d520: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
d530: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
d540: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
d550: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
d560: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
d570: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
d580: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
d590: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
d5a0: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
d5b0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
d5c0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
d5d0: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
d5e0: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
d5f0: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
d600: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
d610: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
d620: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
d630: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d640: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
d650: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
d660: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
d670: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
d680: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
d690: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
d6a0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
d6b0: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
d6c0: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
d6d0: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
d6e0: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
d6f0: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
d700: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
d710: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
d720: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
d730: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
d740: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
d750: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
d760: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
d770: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
d780: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
d790: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
d7a0: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
d7b0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d7c0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
d7d0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
d7e0: 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
d7f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d800: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 49 6e  3_mutex_held(pIn
d810: 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29  ode->pLockMutex)
d820: 20 29 3b 0a 20 20 69 66 28 20 28 70 46 69 6c 65   );.  if( (pFile
d830: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 28 55  ->ctrlFlags & (U
d840: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 7c 55 4e 49  NIXFILE_EXCL|UNI
d850: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d  XFILE_RDONLY))==
d860: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 29 7b  UNIXFILE_EXCL ){
d870: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
d880: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
d890: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
d8a0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
d8b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
d8c0: 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  e->nLock==0 );. 
d8d0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
d8e0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
d8f0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
d900: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
d910: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
d920: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
d930: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  ;.      lock.l_t
d940: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
d950: 20 20 20 20 20 72 63 20 3d 20 6f 73 53 65 74 50       rc = osSetP
d960: 6f 73 69 78 41 64 76 69 73 6f 72 79 4c 6f 63 6b  osixAdvisoryLock
d970: 28 70 46 69 6c 65 2d 3e 68 2c 20 26 6c 6f 63 6b  (pFile->h, &lock
d980: 2c 20 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , pFile);.      
d990: 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72  if( rc<0 ) retur
d9a0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f  n rc;.      pIno
d9b0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
d9c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f   = 1;.      pIno
d9d0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
d9e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
d9f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
da00: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  lse{.    rc = os
da10: 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79  SetPosixAdvisory
da20: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 70  Lock(pFile->h, p
da30: 4c 6f 63 6b 2c 20 70 46 69 6c 65 29 3b 0a 20 20  Lock, pFile);.  
da40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
da50: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
da60: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
da70: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
da80: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
da90: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
daa0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
dab0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
dac0: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
dad0: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
dae0: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
daf0: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
db00: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
db10: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
db20: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
db30: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
db40: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
db50: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
db60: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
db70: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
db80: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
db90: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
dba0: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
dbb0: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
dbc0: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
dbd0: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
dbe0: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
dbf0: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
dc00: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
dc10: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
dc20: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
dc30: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
dc40: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
dc50: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
dc60: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
dc70: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
dc80: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
dc90: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
dca0: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
dcb0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
dcc0: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
dcd0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
dce0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
dcf0: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
dd00: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
dd10: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
dd20: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
dd30: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
dd40: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
dd50: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
dd60: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
dd70: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
dd80: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
dd90: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
dda0: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a  eFileLock){.  /*
ddb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
ddc0: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
ddd0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
dde0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
ddf0: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
de00: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
de10: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
de20: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
de30: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
de40: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
de50: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
de60: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
de70: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
de80: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
de90: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
dea0: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
deb0: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
dec0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
ded0: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
dee0: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
def0: 74 69 62 6c 65 20 77 69 74 68 20 57 69 6e 64 6f  tible with Windo
df00: 77 73 39 35 20 73 79 73 74 65 6d 73 20 73 69 6d  ws95 systems sim
df10: 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a  ultaneously.  **
df20: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
df30: 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
df40: 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20  e, in case that 
df50: 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64  is ever required
df60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62  ..  **.  ** Symb
df70: 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f  ols defined in o
df80: 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68  s.h indentify th
df90: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
dfa0: 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76   and the 'reserv
dfb0: 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65  ed.  ** byte', e
dfc0: 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73  ach single bytes
dfd0: 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f   at well known o
dfe0: 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20  ffsets, and the 
dff0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
e000: 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67  * range', a rang
e010: 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61  e of 510 bytes a
e020: 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f  t a well known o
e030: 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ffset..  **.  **
e040: 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41   To obtain a SHA
e050: 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64  RED lock, a read
e060: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
e070: 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  d on the 'pendin
e080: 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49  g.  ** byte'.  I
e090: 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73  f this is succes
e0a0: 73 66 75 6c 2c 20 27 73 68 61 72 65 64 20 62 79  sful, 'shared by
e0b0: 74 65 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  te range' is rea
e0c0: 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a 2a 20 61 6e  d-locked.  ** an
e0d0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
e0e0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
e0f0: 20 72 65 6c 65 61 73 65 64 2e 20 20 28 4c 65 67   released.  (Leg
e100: 61 63 79 20 6e 6f 74 65 3a 20 20 57 68 65 6e 0a  acy note:  When.
e110: 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 61 73 20    ** SQLite was 
e120: 66 69 72 73 74 20 64 65 76 65 6c 6f 70 65 64 2c  first developed,
e130: 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65   Windows95 syste
e140: 6d 73 20 77 65 72 65 20 73 74 69 6c 6c 20 76 65  ms were still ve
e150: 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 2a 2a 20  ry common,.  ** 
e160: 61 6e 64 20 57 69 64 6e 6f 77 73 39 35 20 6c 61  and Widnows95 la
e170: 63 6b 73 20 61 20 73 68 61 72 65 64 2d 6c 6f 63  cks a shared-loc
e180: 6b 20 63 61 70 61 62 69 6c 69 74 79 2e 20 20 53  k capability.  S
e190: 6f 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 2c 20  o on Windows95, 
e1a0: 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20 72 61  a.  ** single ra
e1b0: 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 20  ndomly selected 
e1c0: 62 79 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  by from the 'sha
e1d0: 72 65 64 20 62 79 74 65 20 72 61 6e 67 65 27 20  red byte range' 
e1e0: 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2a 20  is locked..  ** 
e1f0: 57 69 6e 64 6f 77 73 39 35 20 69 73 20 6e 6f 77  Windows95 is now
e200: 20 70 72 65 74 74 79 20 6d 75 63 68 20 65 78 74   pretty much ext
e210: 69 6e 63 74 2c 20 62 75 74 20 74 68 69 73 20 77  inct, but this w
e220: 6f 72 6b 2d 61 72 6f 75 6e 64 20 66 6f 72 20 74  ork-around for t
e230: 68 65 0a 20 20 2a 2a 20 6c 61 63 6b 20 6f 66 20  he.  ** lack of 
e240: 73 68 61 72 65 64 2d 6c 6f 63 6b 73 20 6f 6e 20  shared-locks on 
e250: 57 69 6e 64 6f 77 73 39 35 20 6c 69 76 65 73 20  Windows95 lives 
e260: 6f 6e 2c 20 66 6f 72 20 62 61 63 6b 77 61 72 64  on, for backward
e270: 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 69  s.  ** compatibi
e280: 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a  lity.).  **.  **
e290: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
e2a0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
e2b0: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
e2c0: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
e2d0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
e2e0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
e2f0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
e300: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
e310: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
e320: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
e330: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
e340: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
e350: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
e360: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
e370: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
e380: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
e390: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
e3a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
e3b0: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
e3c0: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
e3d0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
e3e0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
e3f0: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
e400: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
e410: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
e420: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
e430: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
e440: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
e450: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
e460: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
e470: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
e480: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
e490: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
e4a0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
e4b0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
e4c0: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
e4d0: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
e4e0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
e4f0: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
e500: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
e510: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
e520: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
e530: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
e540: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
e550: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
e560: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
e570: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
e580: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
e590: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
e5a0: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
e5b0: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
e5c0: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
e5d0: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
e5e0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
e5f0: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
e600: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
e610: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
e620: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
e630: 62 61 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 6e  base. .  */.  in
e640: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e650: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
e660: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
e670: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
e680: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
e690: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
e6a0: 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  k;.  int tErrno 
e6b0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
e6c0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
e6d0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
e6e0: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
e6f0: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
e700: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
e710: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
e720: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
e730: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
e740: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
e750: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
e760: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e770: 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  k), pFile->pInod
e780: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
e790: 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
e7a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
e7b0: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
e7c0: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
e7d0: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
e7e0: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
e7f0: 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
e800: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
e810: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
e820: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
e830: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e840: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
e850: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
e860: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
e870: 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
e880: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
e890: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
e8a0: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
e8b0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
e8c0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
e8d0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
e8e0: 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
e8f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e900: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
e910: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
e920: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
e930: 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20  rect..  **  (1) 
e940: 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
e950: 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
e960: 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
e970: 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
e980: 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
e990: 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
e9a0: 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
e9b0: 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
e9c0: 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
e9d0: 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
e9e0: 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
e9f0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
ea00: 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
ea10: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
ea20: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
ea30: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
ea40: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
ea50: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
ea60: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
ea70: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
ea80: 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
ea90: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
eaa0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
eab0: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
eac0: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
ead0: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
eae0: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
eaf0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
eb00: 20 20 2a 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20    */.  pInode = 
eb10: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
eb20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
eb30: 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  nter(pInode->pLo
eb40: 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ckMutex);..  /* 
eb50: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
eb60: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
eb70: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
eb80: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
eb90: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
eba0: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
ebb0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
ebc0: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
ebd0: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
ebe0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
ebf0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
ec00: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
ec10: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
ec20: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
ec30: 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
ec40: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
ec50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
ec60: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
ec70: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
ec80: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
ec90: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
eca0: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
ecb0: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
ecc0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
ecd0: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
ece0: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
ecf0: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
ed00: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
ed10: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
ed20: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
ed30: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
ed40: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
ed50: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
ed60: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
ed70: 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
ed80: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
ed90: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
eda0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
edb0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
edc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
edd0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
ede0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
edf0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
ee00: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
ee10: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
ee20: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
ee30: 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
ee40: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
ee50: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
ee60: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
ee70: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
ee80: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
ee90: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
eea0: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
eeb0: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
eec0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
eed0: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
eee0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
eef0: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
ef00: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
ef10: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
ef20: 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
ef30: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ef40: 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
ef50: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ef60: 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
ef70: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
ef80: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
ef90: 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
efa0: 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
efb0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
efc0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
efd0: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
efe0: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
eff0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
f000: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
f010: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f020: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
f030: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
f040: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
f050: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
f060: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
f070: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
f080: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
f090: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
f0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
f0b0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
f0c0: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
f0d0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
f0e0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
f0f0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
f100: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
f110: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
f120: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
f130: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
f140: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
f150: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
f160: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
f170: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
f180: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
f190: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
f1a0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
f1b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f1c0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f1d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
f1e0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
f1f0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20   );..    /* Now 
f200: 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
f210: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
f220: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
f230: 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  IRST;.    lock.l
f240: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
f250: 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  ZE;.    if( unix
f260: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
f270: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
f280: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
f290: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f2a0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
f2b0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
f2c0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
f2d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
f2e0: 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
f2f0: 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
f300: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
f310: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
f320: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
f330: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b  n = 1L;.    lock
f340: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f350: 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  K;.    if( unixF
f360: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f370: 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c  lock) && rc==SQL
f380: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f390: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
f3a0: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
f3b0: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
f3c0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
f3d0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
f3e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
f3f0: 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  K; .    }..    i
f400: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
f410: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
f420: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  SY ){.        st
f430: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
f440: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
f450: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
f460: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65  end_lock;.    }e
f470: 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
f480: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
f490: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
f4a0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
f4b0: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
f4c0: 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
f4d0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
f4e0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
f4f0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
f500: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
f510: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
f520: 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
f530: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
f540: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
f550: 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61  n this.    ** sa
f560: 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
f570: 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
f580: 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
f590: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
f5a0: 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
f5b0: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
f5c0: 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
f5d0: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
f5e0: 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
f5f0: 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
f600: 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
f610: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
f620: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
f630: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
f640: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
f650: 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
f660: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63  eLock );.    loc
f670: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
f680: 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  CK;..    assert(
f690: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
f6a0: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  RVED_LOCK || eFi
f6b0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
f6c0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66  E_LOCK );.    if
f6d0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ( eFileLock==RES
f6e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
f6f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f700: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
f710: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
f720: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c  en = 1L;.    }el
f730: 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  se{.      lock.l
f740: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
f750: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
f760: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
f770: 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _SIZE;.    }..  
f780: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f790: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f7a0: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
f7b0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
f7c0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
f7d0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
f7e0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
f7f0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
f800: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f810: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
f820: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
f830: 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
f840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f850: 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .  ..#ifdef SQLI
f860: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65  TE_DEBUG.  /* Se
f870: 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  t up the transac
f880: 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61  tion-counter cha
f890: 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61  nge checking fla
f8a0: 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61  gs when.  ** tra
f8b0: 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
f8c0: 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45  a SHARED to a RE
f8d0: 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68  SERVED lock.  Th
f8e0: 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72  e change.  ** fr
f8f0: 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  om SHARED to RES
f900: 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20  ERVED marks the 
f910: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e  beginning of a n
f920: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65  ormal.  ** write
f930: 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20   operation (not 
f940: 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  a hot journal ro
f950: 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20  llback)..  */.  
f960: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f970: 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65  K.   && pFile->e
f980: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
f990: 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c  _LOCK.   && eFil
f9a0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
f9b0: 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46  LOCK.  ){.    pF
f9c0: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
f9d0: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ng = 0;.    pFil
f9e0: 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  e->dbUpdate = 0;
f9f0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
fa00: 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20  rmalWrite = 1;. 
fa10: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66   }.#endif...  if
fa20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fa30: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
fa40: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
fa50: 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
fa60: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
fa70: 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
fa80: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
fa90: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
faa0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
fab0: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
fac0: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
fad0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
fae0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
faf0: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c  .end_lock:.  sql
fb00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fb10: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
fb20: 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
fb30: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
fb40: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
fb50: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
fb60: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
fb70: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
fb80: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
fb90: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
fba0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
fbb0: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
fbc0: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
fbd0: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
fbe0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
fbf0: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
fc00: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
fc10: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
fc20: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
fc30: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
fc40: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
fc50: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
fc60: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
fc70: 3d 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c  = pFile->pPreall
fc80: 6f 63 61 74 65 64 55 6e 75 73 65 64 3b 0a 20 20  ocatedUnused;.  
fc90: 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65  assert( unixFile
fca0: 4d 75 74 65 78 48 65 6c 64 28 70 46 69 6c 65 29  MutexHeld(pFile)
fcb0: 20 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   );.  p->pNext =
fcc0: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
fcd0: 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  ;.  pInode->pUnu
fce0: 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65  sed = p;.  pFile
fcf0: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c  ->h = -1;.  pFil
fd00: 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  e->pPreallocated
fd10: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
fd20: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
fd30: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
fd40: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
fd50: 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
fd60: 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
fd70: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
fd80: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
fd90: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
fda0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
fdb0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
fdc0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
fdd0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
fde0: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
fdf0: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
fe00: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
fe10: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a  s a no-op..** .*
fe20: 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e  * If handleNFSUn
fe30: 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68  lock is true, th
fe40: 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e  en on downgradin
fe50: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c  g an EXCLUSIVE_L
fe60: 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a  OCK to SHARED.**
fe70: 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20   the byte range 
fe80: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
fe90: 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20  2 parts and the 
fea0: 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e  first part is un
feb0: 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73  locked then.** s
fec0: 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63  et to a read loc
fed0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65  k, then the othe
fee0: 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79  r part is simply
fef0: 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73   unlocked.  This
ff00: 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e   works .** aroun
ff10: 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e  d a bug in BSD N
ff20: 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73  FS lockd (also s
ff30: 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30  een on MacOSX 10
ff40: 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20  .3+) that fails 
ff50: 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  to .** remove th
ff60: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
ff70: 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20  a region when a 
ff80: 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
ff90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ffa0: 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69  posixUnlock(sqli
ffb0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
ffc0: 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74  t eFileLock, int
ffd0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
ffe0: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
fff0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10000 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
10010 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
10020 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
10030 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
10040 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
10050 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
10060 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
10070 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
10080 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  d,%d) pid=%d (un
10090 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
100a0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
100b0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
100c0 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
100d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
100e0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
100f0 68 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47  hared,.      osG
10100 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61  etpid(0)));..  a
10110 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
10120 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
10130 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
10140 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
10150 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
10160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10170 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
10180 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71 6c 69  ->pInode;.  sqli
10190 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
101a0 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
101b0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ex);.  assert( p
101c0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
101d0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
101e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
101f0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
10200 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
10210 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
10220 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23  >eFileLock );..#
10230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
10240 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
10250 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
10260 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
10270 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
10280 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
10290 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
102a0 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
102b0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
102c0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
102d0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
102e0 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
102f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10300 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
10310 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
10320 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
10330 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
10340 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
10350 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
10360 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
10370 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
10380 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
10390 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
103a0 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
103b0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
103c0 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
103d0 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
103e0 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
103f0 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
10400 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
10410 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65      */.    pFile
10420 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
10430 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
10440 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   /* downgrading 
10450 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
10460 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73   on NFS involves
10470 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72   clearing the wr
10480 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  ite lock.    ** 
10490 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68  before establish
104a0 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b  ing the readlock
104b0 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61   - to avoid a ra
104c0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20  ce condition we 
104d0 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a  downgrade.    **
104e0 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62   the lock in 2 b
104f0 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70  locks, so that p
10500 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
10510 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64   will be covered
10520 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72   by a .    ** wr
10530 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74  ite lock until t
10540 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72  he rest is cover
10550 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63  ed by a read loc
10560 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20  k:.    **  1:   
10570 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20  [WWWWW].    **  
10580 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20  2:   [....W].   
10590 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57   **  3:   [RRRRW
105a0 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b  ].    **  4:   [
105b0 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20  RRRR.].    */.  
105c0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
105d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
105e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41  #if !defined(__A
105f0 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49  PPLE__) || !SQLI
10600 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
10610 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76  G_STYLE.      (v
10620 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  oid)handleNFSUnl
10630 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ock;.      asser
10640 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  t( handleNFSUnlo
10650 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ck==0 );.#endif.
10660 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
10670 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
10680 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
10690 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
106a0 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
106b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  ){.        int t
106c0 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
106d0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
106e0 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63  de from system c
106f0 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  all errors */.  
10700 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53        off_t divS
10710 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  ize = SHARED_SIZ
10720 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  E - 1;.        .
10730 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
10740 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
10750 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
10760 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
10770 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10780 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
10790 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
107a0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
107b0 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
107c0 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
107d0 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
107e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
107f0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
10800 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10810 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10820 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  ;.          stor
10830 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
10840 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
10850 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
10860 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
10870 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
10880 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
10890 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
108a0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
108b0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
108c0 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
108d0 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
108e0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
108f0 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
10900 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
10910 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
10920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
10930 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
10940 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10950 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10960 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10970 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
10980 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
10990 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
109a0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
109b0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
109c0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
109d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
109e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
109f0 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
10a00 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
10a10 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
10a20 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
10a30 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
10a40 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
10a50 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
10a60 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
10a70 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
10a80 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
10a90 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
10aa0 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
10ab0 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
10ac0 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
10ad0 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
10ae0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
10af0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
10b00 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
10b10 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
10b20 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
10b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
10b40 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
10b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
10b60 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  lse.#endif /* de
10b70 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
10b80 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
10b90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
10ba0 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
10bb0 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
10bc0 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
10bd0 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
10be0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
10bf0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
10c00 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
10c10 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10c20 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
10c30 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  E;.        if( u
10c40 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
10c50 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
10c60 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
10c70 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ory, the call to
10c80 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20   unixFileLock() 
10c90 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61  cannot fail beca
10ca0 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  use another.    
10cb0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
10cc0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69   is holding an i
10cd0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b  ncompatible lock
10ce0 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68  . If it does, th
10cf0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
10d00 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
10d10 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  the other proces
10d20 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
10d30 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20  ng the locking. 
10d40 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74           ** prot
10d50 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61  ocol. If this ha
10d60 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  ppens, return SQ
10d70 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
10d80 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20  K. Returning.   
10d90 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
10da0 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66  _BUSY would conf
10db0 75 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61  use the upper la
10dc0 79 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65  yer (in practice
10dd0 20 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20   it causes .    
10de0 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65        ** an asse
10df0 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20  rt to fail). */ 
10e00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10e10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
10e20 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  OCK;.          s
10e30 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
10e40 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
10e50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
10e60 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
10e70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10e80 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
10e90 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c  = F_UNLCK;.    l
10ea0 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
10eb0 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
10ec0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
10ed0 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
10ee0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20  ck.l_len = 2L;  
10ef0 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f  assert( PENDING_
10f00 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44  BYTE+1==RESERVED
10f10 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28  _BYTE );.    if(
10f20 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
10f30 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
10f40 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
10f50 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
10f60 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
10f70 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
10f80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
10f90 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  CK;.      storeL
10fa0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
10fb0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f  errno);.      go
10fc0 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
10fd0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
10fe0 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
10ff0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72  K ){.    /* Decr
11000 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
11010 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
11020 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
11030 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
11040 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
11050 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
11060 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
11070 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
11080 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
11090 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  k..    */.    pI
110a0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
110b0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
110c0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
110d0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
110e0 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
110f0 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
11100 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
11110 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
11120 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
11130 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
11140 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
11150 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
11160 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
11170 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
11180 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11190 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
111a0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
111b0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
111c0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
111d0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  rrno);.        p
111e0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
111f0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
11200 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
11210 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
11220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11230 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
11240 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63  the count of loc
11250 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  ks against this 
11260 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e  same file.  When
11270 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e   the.    ** coun
11280 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20  t reaches zero, 
11290 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20  close any other 
112a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
112b0 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20   whose close.   
112c0 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64   ** was deferred
112d0 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73   because of outs
112e0 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20  tanding locks.. 
112f0 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
11300 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61  ->nLock--;.    a
11310 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
11320 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
11330 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
11340 3d 3d 30 20 29 20 63 6c 6f 73 65 50 65 6e 64 69  ==0 ) closePendi
11350 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
11360 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  }..end_unlock:. 
11370 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11380 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  eave(pInode->pLo
11390 63 6b 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ckMutex);.  if( 
113a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
113b0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
113c0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
113d0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
113e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
113f0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
11400 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
11410 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
11420 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
11430 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
11440 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
11450 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
11460 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
11470 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
11480 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
11490 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
114a0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
114b0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
114c0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
114d0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
114e0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
114f0 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
11500 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
11510 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69  t eFileLock){.#i
11520 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
11530 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72  P_SIZE>0.  asser
11540 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
11550 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75  ARED_LOCK || ((u
11560 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e  nixFile *)id)->n
11570 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23  FetchOut==0 );.#
11580 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
11590 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
115a0 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
115b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
115c0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
115d0 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
115e0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
115f0 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74  , i64 nByte);.st
11600 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
11610 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
11620 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a   *pFd);.#endif..
11630 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
11640 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
11650 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
11660 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
11670 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
11680 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
11690 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
116a0 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
116b0 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
116c0 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
116d0 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
116e0 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
116f0 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
11700 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
11710 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
11720 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
11730 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
11740 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
11750 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
11760 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
11770 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
11780 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
11790 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
117a0 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
117b0 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
117c0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
117d0 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
117e0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
117f0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11800 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23  (unixFile*)id;.#
11810 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
11820 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
11830 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
11840 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
11850 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
11860 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
11870 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
11880 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
11890 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
118a0 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
118b0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
118c0 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  d ){.    if( pFi
118d0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
118e0 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
118f0 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
11900 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
11910 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
11920 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
11930 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
11940 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
11950 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
11960 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
11970 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41   SQLITE_UNLINK_A
11980 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28  FTER_CLOSE.  if(
11990 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
119a0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
119b0 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c  ETE ){.    osUnl
119c0 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ink(pFile->zPath
119d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
119e0 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46  ree(*(char**)&pF
119f0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
11a00 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
11a10 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
11a20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
11a30 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
11a40 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
11a50 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
11a60 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
11a70 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
11a80 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
11a90 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
11aa0 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
11ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11ac0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
11ad0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
11ae0 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
11af0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
11b00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11b10 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
11b20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11b30 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e  xFile *)id;.  un
11b40 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
11b50 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
11b60 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ode;..  assert( 
11b70 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 76  pInode!=0 );.  v
11b80 65 72 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c  erifyDbFile(pFil
11b90 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  e);.  unixUnlock
11ba0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
11bb0 20 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c   assert( unixFil
11bc0 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 46  eMutexNotheld(pF
11bd0 69 6c 65 29 20 29 3b 0a 20 20 75 6e 69 78 45 6e  ile) );.  unixEn
11be0 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
11bf0 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
11c00 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
11c10 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
11c20 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
11c30 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
11c40 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
11c50 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
11c60 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
11c70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
11c80 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
11c90 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
11ca0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
11cb0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  Lock==0 );.  sql
11cc0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
11cd0 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
11ce0 74 65 78 29 3b 0a 20 20 69 66 28 20 70 49 6e 6f  tex);.  if( pIno
11cf0 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
11d00 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
11d10 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
11d20 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
11d30 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
11d40 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
11d50 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
11d60 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
11d70 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
11d80 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
11d90 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
11da0 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  r to pInode->pUn
11db0 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77  used list.  It w
11dc0 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
11dd0 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20  ally closed .   
11de0 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
11df0 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
11e00 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65  d..    */.    se
11e10 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
11e20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11e30 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49 6e  _mutex_leave(pIn
11e40 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29  ode->pLockMutex)
11e50 3b 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  ;.  releaseInode
11e60 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72  Info(pFile);.  r
11e70 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
11e80 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
11e90 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
11ea0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
11eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
11ec0 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
11ed0 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
11ee0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
11ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
11f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
11f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
11fc0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
11fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
11ff0 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
12000 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
12010 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
12020 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
12030 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
12040 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
12050 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
12060 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
12070 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
12080 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
12090 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
120a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
120b0 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
120c0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
120d0 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
120e0 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
120f0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
12100 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
12110 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
12120 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
12130 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
12140 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
12150 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
12160 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
12170 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
12180 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
12190 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
121a0 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
121b0 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
121c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
121d0 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
121e0 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
121f0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
12200 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
12210 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
12220 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
12230 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
12240 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
12250 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
12260 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
12270 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
12280 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
12290 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
122a0 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
122b0 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
122c0 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
122d0 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
122e0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
122f0 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
12300 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
12310 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12320 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
12330 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
12340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12350 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
12360 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
12370 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
12380 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
12390 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
123a0 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
123b0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
123c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
123d0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
123e0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
123f0 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
12400 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
12410 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
12420 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
12430 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12440 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12450 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
12460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
12470 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
12480 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 23 69  3_file *id) {.#i
12490 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 41 52  fdef SQLITE_SHAR
124a0 45 44 5f 4d 41 50 50 49 4e 47 0a 20 20 75 6e 69  ED_MAPPING.  uni
124b0 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e  xFile *pFd = (un
124c0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
124d0 28 20 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 7b  ( pFd->pInode ){
124e0 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
124f0 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61  tex();.    relea
12500 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 64 29  seInodeInfo(pFd)
12510 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
12520 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
12530 69 66 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73  if.  return clos
12540 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
12550 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
12560 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
12570 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70  e no-op lock imp
12580 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
12590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
125b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125f0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12640 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
12660 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b  in dot-file Lock
12670 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74  **.**.** The dot
126a0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  file locking imp
126b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
126c0 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
126d0 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a  f separate lock.
126e0 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79  ** files (really
126f0 20 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f   a directory) to
12700 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
12710 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
12720 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20    This works.** 
12730 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76  on just about ev
12740 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
12750 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
12760 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
12770 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
12780 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
12790 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
127a0 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
127b0 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
127c0 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
127d0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
127e0 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
127f0 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
12800 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
12810 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
12820 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
12830 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
12840 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
12850 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
12860 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
12870 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
12880 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
12890 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
128a0 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
128b0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
128c0 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
128d0 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
128e0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
128f0 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
12900 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
12910 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
12920 72 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72  reating a subdir
12930 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61  ectory in the sa
12940 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a  me directory as.
12950 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
12960 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
12970 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
12980 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
12990 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
129a0 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61  e existence of a
129b0 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
129c0 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
129d0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
129e0 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79  other.** lock ty
129f0 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
12a00 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
12a10 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
12a20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
12a30 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
12a40 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
12a50 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
12a60 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
12a70 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
12a80 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a  ock directory..*
12a90 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
12aa0 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
12ab0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12ac0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
12ad0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
12ae0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
12af0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
12b00 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
12b10 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
12b20 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
12b30 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
12b40 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
12b50 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
12b60 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
12b70 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
12b80 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
12b90 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
12ba0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
12bb0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
12bc0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
12bd0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
12be0 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
12bf0 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
12c00 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
12c10 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
12c20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
12c30 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
12c40 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
12c50 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
12c60 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
12c70 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
12c80 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
12c90 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
12ca0 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
12cb0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
12cc0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
12cd0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12ce0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
12cf0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
12d00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
12d10 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
12d20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12d30 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12d40 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
12d50 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
12d60 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
12d70 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
12d80 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
12d90 65 20 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20  e );.  reserved 
12da0 3d 20 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73  = osAccess((cons
12db0 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
12dc0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30  ockingContext, 0
12dd0 29 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28  )==0;.  OSTRACE(
12de0 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
12df0 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b  d %d %d (dotlock
12e00 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12e10 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
12e20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
12e30 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
12e40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
12e50 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
12e60 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
12e70 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
12e80 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
12e90 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
12ea0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
12eb0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
12ec0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
12ed0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
12ee0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
12ef0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
12f00 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
12f10 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12f20 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12f30 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12f40 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12f50 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12f60 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12f70 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12f80 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12f90 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
12fa0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
12fb0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
12fc0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
12fd0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
12fe0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
12ff0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
13000 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
13010 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
13020 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
13030 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
13040 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
13050 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
13060 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
13070 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
13080 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
13090 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
130a0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
130b0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
130c0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
130d0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
130e0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
130f0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
13100 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
13110 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
13120 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
13130 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
13140 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
13150 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
13160 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69   level..**.** Wi
13170 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  th dotfile locki
13180 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e  ng, we really on
13190 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65  ly support state
131a0 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e   (4): EXCLUSIVE.
131b0 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b  .** But we track
131c0 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69   the other locki
131d0 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e  ng levels intern
131e0 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ally..*/.static 
131f0 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28  int dotlockLock(
13200 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13210 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
13220 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
13230 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13240 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  *)id;.  char *zL
13250 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
13260 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
13270 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72  Context;.  int r
13280 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
13290 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65  .  /* If we have
132a0 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
132b0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c  the lock file al
132c0 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41  ready exists.  A
132d0 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
132e0 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20  to do is adjust 
132f0 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  our internal rec
13300 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ord of the lock 
13310 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  level..  */.  if
13320 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13330 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ck > NO_LOCK ){.
13340 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13350 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
13360 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ;.    /* Always 
13370 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73  update the times
13380 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20  tamp on the old 
13390 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48  file */.#ifdef H
133a0 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74  AVE_UTIME.    ut
133b0 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  ime(zLockFile, N
133c0 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ULL);.#else.    
133d0 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
133e0 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
133f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13400 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
13410 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
13420 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63  ive lock */.  rc
13430 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b   = osMkdir(zLock
13440 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69  File, 0777);.  i
13450 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f  f( rc<0 ){.    /
13460 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * failed to open
13470 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b  /create the lock
13480 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20   directory */.  
13490 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
134a0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45  rrno;.    if( EE
134b0 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29  XIST == tErrno )
134c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
134d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20  ITE_BUSY;.    } 
134e0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20  else {.      rc 
134f0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13500 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13510 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13520 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
13530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
13540 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  Y ){.        sto
13550 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
13560 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
13570 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
13580 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20  turn rc;.  } .  
13590 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
135a0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
135b0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
135c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
135d0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
135e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
135f0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
13600 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13610 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
13620 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
13630 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
13640 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
13650 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13660 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
13670 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13680 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
13690 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
136a0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
136b0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
136c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
136d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
136e0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68   no-op..**.** Wh
136f0 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  en the locking l
13700 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f  evel reaches NO_
13710 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65  LOCK, delete the
13720 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73   lock file..*/.s
13730 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
13740 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
13750 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
13760 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
13770 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13780 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
13790 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
137a0 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
137b0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
137c0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
137d0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
137e0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
137f0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
13800 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29  pid=%d (dotlock)
13810 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
13820 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
13830 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
13840 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
13850 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
13860 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
13870 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
13880 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
13890 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
138a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
138b0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
138c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
138d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64  ;.  }..  /* To d
138e0 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72  owngrade to shar
138f0 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74  ed, simply updat
13900 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e  e our internal n
13910 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  otion of the.  *
13920 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e  * lock state.  N
13930 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77  o need to mess w
13940 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ith the file on 
13950 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
13960 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
13970 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  ED_LOCK ){.    p
13980 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13990 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
139a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
139b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
139c0 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
139d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
139e0 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
139f0 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
13a00 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
13a10 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73  OCK );.  rc = os
13a20 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29  Rmdir(zLockFile)
13a30 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a  ;.  if( rc<0 ){.
13a40 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
13a50 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
13a60 74 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29  tErrno==ENOENT )
13a70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13a80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
13a90 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
13aa0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
13ab0 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  K;.      storeLa
13ac0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
13ad0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
13ae0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
13af0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
13b00 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
13b10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13b20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
13b30 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65  se a file.  Make
13b40 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68   sure the lock h
13b50 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  as been released
13b60 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e   before closing.
13b70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
13b80 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  otlockClose(sqli
13b90 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
13ba0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13bb0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13bc0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  d;.  assert( id!
13bd0 3d 30 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55  =0 );.  dotlockU
13be0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
13bf0 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  K);.  sqlite3_fr
13c00 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
13c10 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74  gContext);.  ret
13c20 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
13c30 65 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  e(id);.}./******
13c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
13c50 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65   of the dot-file
13c60 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
13c70 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
13c80 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cd0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
13ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d40 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b  **** Begin flock
13d50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
13d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
13d80 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20  Use the flock() 
13d90 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64  system call to d
13da0 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  o file locking..
13db0 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  **.** flock() lo
13dc0 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
13dd0 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  t-file locking i
13de0 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f  n that the vario
13df0 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e  us.** fine-grain
13e00 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
13e10 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c  supported by SQL
13e20 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65  ite are collapse
13e30 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  d into.** a sing
13e40 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  le exclusive loc
13e50 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
13e60 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  ds, SHARED, RESE
13e70 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e  RVED, and.** PEN
13e80 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74  DING locks are t
13e90 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73  he same thing as
13ea0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
13eb0 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73  ck.  SQLite.** s
13ec0 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20  till works when 
13ed0 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74  you do this, but
13ee0 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20   concurrency is 
13ef0 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a  reduced since.**
13f00 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   only a single p
13f10 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65  rocess can be re
13f20 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
13f30 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a  se at a time..**
13f40 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65  .** Omit this se
13f50 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ction if SQLITE_
13f60 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
13f70 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f  TYLE is turned o
13f80 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ff.*/.#if SQLITE
13f90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
13fa0 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  STYLE../*.** Ret
13fb0 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73  ry flock() calls
13fc0 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20   that fail with 
13fd0 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20  EINTR.*/.#ifdef 
13fe0 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74  EINTR.static int
13ff0 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e   robust_flock(in
14000 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  t fd, int op){. 
14010 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72   int rc;.  do{ r
14020 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29  c = flock(fd,op)
14030 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
14040 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
14050 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14060 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
14070 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62  robust_flock(a,b
14080 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e  ) flock(a,b).#en
14090 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  dif.     ../*.**
140a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
140b0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
140c0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
140d0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
140e0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
140f0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
14100 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
14110 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
14120 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
14130 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
14140 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
14150 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
14160 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
14170 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
14180 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
14190 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
141a0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
141b0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
141c0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
141d0 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
141e0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
141f0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14200 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
14210 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14220 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
14230 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
14240 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14250 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
14260 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
14270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14280 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
14290 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
142a0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
142b0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
142c0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
142d0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
142e0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
142f0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
14300 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
14310 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
14320 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
14330 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
14340 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
14350 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
14360 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
14370 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74  ed ){.    /* att
14380 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
14390 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
143a0 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
143b0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
143c0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
143d0 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
143e0 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
143f0 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
14400 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
14410 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
14420 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
14430 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
14440 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
14450 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
14460 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
14470 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
14480 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
14490 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
144a0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
144b0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
144c0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
144d0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  rno);.        rc
144e0 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = lrc;.      }.
144f0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
14500 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
14510 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
14520 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
14530 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
14540 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
14550 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
14560 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
14570 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
14580 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
14590 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
145a0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
145b0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
145c0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
145d0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
145e0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
145f0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
14600 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
14610 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
14620 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63  K %d %d %d (floc
14630 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
14640 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
14650 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14660 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
14670 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
14680 72 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51  rc & 0xff) == SQ
14690 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
146a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
146b0 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31  ;.    reserved=1
146c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
146d0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
146e0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
146f0 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  */.  *pResOut = 
14700 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
14710 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14720 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
14730 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
14740 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
14750 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
14760 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
14770 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
14780 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
14790 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
147a0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
147b0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
147c0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
147d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
147e0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
147f0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
14800 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
14810 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
14820 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
14830 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
14840 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
14850 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
14860 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
14870 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
14880 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
14890 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
148a0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
148b0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
148c0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
148d0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
148e0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
148f0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
14900 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
14910 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
14920 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
14930 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
14940 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
14950 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
14960 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14970 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
14980 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
14990 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
149a0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
149b0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
149c0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
149d0 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20  ** flock() only 
149e0 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
149f0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
14a00 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
14a10 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
14a20 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
14a30 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
14a40 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
14a50 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
14a60 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
14a70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
14a80 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
14a90 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
14aa0 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
14ab0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
14ac0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
14ad0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
14ae0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
14af0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
14b00 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
14b10 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
14b20 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
14b30 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28  c int flockLock(
14b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14b50 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14b60 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
14b70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
14b80 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14b90 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
14ba0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14bb0 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
14bc0 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
14bd0 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
14be0 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
14bf0 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
14c00 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
14c10 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
14c20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
14c30 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
14c40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14c50 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
14c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14c70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
14c80 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
14c90 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20  lock */.  .  if 
14ca0 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46  (robust_flock(pF
14cb0 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
14cc0 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20  | LOCK_NB)) {.  
14cd0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
14ce0 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64  rrno;.    /* did
14cf0 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
14d00 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20   busy */.    rc 
14d10 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
14d20 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
14d30 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
14d40 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
14d50 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
14d60 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
14d70 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
14d80 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
14d90 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f    } else {.    /
14da0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
14db0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
14dc0 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c  n ok */.    pFil
14dd0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14de0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  FileLock;.  }.  
14df0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
14e00 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63    %d %s %s (floc
14e10 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
14e20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
14e30 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20  eLock), .       
14e40 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
14e50 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
14e60 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ed"));.#ifdef SQ
14e70 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
14e80 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
14e90 69 66 28 20 28 72 63 20 26 20 30 78 66 66 29 20  if( (rc & 0xff) 
14ea0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
14eb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14ec0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e  TE_BUSY;.  }.#en
14ed0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
14ee0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
14ef0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75  ERRORS */.  retu
14f00 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
14f10 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
14f20 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
14f30 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
14f40 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
14f50 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
14f60 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
14f70 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
14f80 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
14f90 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14fa0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
14fb0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
14fc0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
14fd0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
14fe0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
14ff0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
15000 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
15010 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
15020 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15030 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
15040 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
15050 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
15060 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
15070 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
15080 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
15090 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
150a0 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d=%d (flock)\n",
150b0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
150c0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
150d0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
150e0 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  k, osGetpid(0)))
150f0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
15100 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
15110 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
15120 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
15130 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
15140 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
15150 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
15160 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15170 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
15180 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
15190 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
151a0 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
151b0 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
151c0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
151d0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
151e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
151f0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
15200 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15210 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
15220 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
15230 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f  */.  if( robust_
15240 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
15250 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64  LOCK_UN) ){.#ifd
15260 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
15270 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
15280 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  RS.    return SQ
15290 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20  LITE_OK;.#endif 
152a0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
152b0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
152c0 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  RS */.    return
152d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
152e0 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LOCK;.  }else{. 
152f0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15300 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
15310 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15320 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
15330 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
15340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
15350 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
15360 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61  _file *id) {.  a
15370 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
15380 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
15390 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65  , NO_LOCK);.  re
153a0 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
153b0 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69  le(id);.}..#endi
153c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
153d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
153e0 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
153f0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
15400 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
15410 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
15420 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
15430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15440 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15490 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
154a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154e0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
154f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
15500 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
15510 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
15520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15530 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
15540 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
15550 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
15560 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
15570 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
15580 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
15590 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
155a0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
155b0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
155c0 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
155d0 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
155e0 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
155f0 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
15600 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
15610 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
15620 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
15630 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
15640 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
15650 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
15660 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
15670 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
15680 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
15690 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
156a0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
156b0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
156c0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
156d0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
156e0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
156f0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
15700 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
15710 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
15720 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
15730 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
15740 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
15750 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
15760 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
15770 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
15780 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
15790 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
157a0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
157b0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
157c0 20 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65   int semXCheckRe
157d0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
157e0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
157f0 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
15800 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15810 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
15820 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
15830 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15840 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
15850 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
15860 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15870 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
15880 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
15890 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
158a0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
158b0 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
158c0 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
158d0 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
158e0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
158f0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
15900 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
15910 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
15920 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
15930 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
15940 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
15950 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
15960 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53  ){.    sem_t *pS
15970 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
15980 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69  de->pSem;..    i
15990 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
159a0 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
159b0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
159c0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
159d0 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
159e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
159f0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
15a00 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
15a10 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
15a20 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
15a30 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  K);.        stor
15a40 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
15a50 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
15a60 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
15a70 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
15a80 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
15a90 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
15aa0 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
15ab0 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
15ac0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
15ad0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
15ae0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
15af0 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
15b00 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
15b10 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
15b20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
15b30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
15b40 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
15b50 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
15b60 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
15b70 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
15b80 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
15b90 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
15ba0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15bb0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
15bc0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
15bd0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
15be0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
15bf0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
15c00 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
15c10 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
15c20 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
15c30 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
15c40 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
15c50 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
15c60 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
15c70 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
15c80 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
15c90 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
15ca0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
15cb0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
15cc0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
15cd0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
15ce0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
15cf0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
15d00 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
15d10 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
15d20 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
15d30 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
15d40 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
15d50 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
15d60 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
15d70 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
15d80 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
15d90 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
15da0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
15db0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
15dc0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
15dd0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
15de0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
15df0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
15e00 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
15e10 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
15e20 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
15e30 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
15e40 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
15e50 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
15e60 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
15e70 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  ks only really s
15e80 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
15e90 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
15ea0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
15eb0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
15ec0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
15ed0 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
15ee0 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
15ef0 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
15f00 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
15f10 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
15f20 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
15f30 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
15f40 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
15f50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
15f60 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
15f70 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
15f80 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
15f90 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
15fa0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
15fb0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
15fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
15fd0 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  mXLock(sqlite3_f
15fe0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
15ff0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
16000 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
16010 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
16020 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
16030 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
16040 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
16050 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
16060 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
16070 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
16080 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
16090 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
160a0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
160b0 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
160c0 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
160d0 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
160e0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
160f0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
16100 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ck;.    rc = SQL
16110 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
16120 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
16130 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20   }.  .  /* lock 
16140 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75  semaphore now bu
16150 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20  t bail out when 
16160 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20  already locked. 
16170 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79  */.  if( sem_try
16180 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
16190 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
161a0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
161b0 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
161c0 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c   }..  /* got it,
161d0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
161e0 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
161f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16200 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a  k = eFileLock;..
16210 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
16220 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16230 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
16240 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
16250 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16260 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
16270 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
16280 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
16290 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
162a0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
162b0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
162c0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
162d0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
162e0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
162f0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
16300 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
16310 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
16320 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
16330 61 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c  atic int semXUnl
16340 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
16350 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
16360 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
16370 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16380 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
16390 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
163a0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a  >pInode->pSem;..
163b0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
163c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  );.  assert( pSe
163d0 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  m );.  OSTRACE((
163e0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
163f0 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65  as %d pid=%d (se
16400 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
16410 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
16420 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
16430 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69  ileLock, osGetpi
16440 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74  d(0)));.  assert
16450 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
16460 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
16470 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
16480 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
16490 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
164a0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
164b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
164c0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
164d0 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
164e0 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
164f0 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
16500 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
16510 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
16520 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
16530 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16540 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
16550 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16560 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
16570 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c  * no, really unl
16580 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  ock. */.  if ( s
16590 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d  em_post(pSem)==-
165a0 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
165b0 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
165c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
165d0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
165e0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
165f0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
16600 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
16610 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
16620 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
16630 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
16640 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  no);.    }.    r
16650 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
16660 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16670 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
16680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16690 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
166a0 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
166b0 74 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73  tic int semXClos
166c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
166d0 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
166e0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
166f0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16700 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55  e*)id;.    semXU
16710 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
16720 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
16730 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 61 73 73  pFile );.    ass
16740 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74  ert( unixFileMut
16750 65 78 4e 6f 74 68 65 6c 64 28 70 46 69 6c 65 29  exNotheld(pFile)
16760 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   );.    unixEnte
16770 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  rMutex();.    re
16780 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
16790 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  File);.    unixL
167a0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
167b0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
167c0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
167d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
167e0 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
167f0 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
16800 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
16810 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
16820 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
16830 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
16840 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
16850 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
16860 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
16870 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
16880 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
16890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
168a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
168b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
168c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
168d0 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
168e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
168f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16920 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
16930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16940 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
16950 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
16960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16970 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
16980 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
16990 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
169a0 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
169b0 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
169c0 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
169d0 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
169e0 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
169f0 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
16a00 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
16a10 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
16a20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
16a30 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
16a40 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
16a50 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
16a60 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16a70 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
16a80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
16a90 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
16aa0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
16ab0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
16ac0 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
16ad0 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
16ae0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16af0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16b00 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
16b10 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
16b20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
16b30 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
16b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
16b50 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
16b60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16b70 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
16b80 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
16b90 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
16ba0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
16bb0 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
16bc0 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
16bd0 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
16be0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
16bf0 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
16c00 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
16c10 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
16c20 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
16c30 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
16c40 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
16c50 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
16c60 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
16c70 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
16c80 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
16c90 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
16ca0 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
16cb0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
16cc0 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
16cd0 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
16ce0 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
16cf0 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
16d00 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
16d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
16d30 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
16d40 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
16d50 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
16d60 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
16d70 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
16d80 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
16d90 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
16da0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
16db0 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
16dc0 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
16dd0 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
16de0 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
16df0 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
16e00 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
16e10 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
16e20 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
16e30 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
16e40 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
16e50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
16e60 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
16e70 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16e80 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
16e90 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
16ea0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
16eb0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
16ec0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
16ed0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
16ee0 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
16ef0 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
16f00 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
16f10 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
16f20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
16f30 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
16f40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16f50 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
16f60 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
16f70 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
16f80 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
16f90 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
16fa0 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
16fb0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
16fc0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
16fd0 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
16fe0 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
16ff0 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
17000 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
17010 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
17020 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
17030 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
17040 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
17050 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
17060 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
17070 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
17080 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
17090 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
170a0 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
170b0 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
170c0 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
170d0 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
170e0 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
170f0 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
17100 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
17110 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
17120 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
17130 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
17140 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
17150 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
17160 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
17170 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
17180 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
17190 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
171a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
171b0 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
171c0 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
171d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
171e0 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
171f0 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
17200 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
17210 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
17220 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
17230 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17250 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
17260 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
17270 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
17280 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
17290 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
172a0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
172b0 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
172c0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
172d0 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
172e0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
172f0 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
17300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
17310 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
17320 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
17340 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
17350 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
17360 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
17370 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
17380 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
17390 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
173a0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
173b0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
173c0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
173d0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
173e0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
173f0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
17400 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
17410 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
17420 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
17430 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
17440 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
17450 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
17460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
17470 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
17480 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
17490 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
174a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
174b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
174c0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
174d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
174e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
174f0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
17500 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
17510 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
17520 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
17530 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
17540 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
17550 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
17560 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
17570 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
17580 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
17590 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
175a0 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
175b0 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
175c0 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
175d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
175e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
175f0 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d  tex_enter(pFile-
17600 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  >pInode->pLockMu
17610 74 65 78 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b  tex);.  /* Check
17620 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
17630 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
17640 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
17650 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
17660 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17670 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
17680 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
17690 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
176a0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
176b0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
176c0 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
176d0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
176e0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
176f0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
17700 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
17710 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17720 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17730 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
17740 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
17750 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
17760 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
17770 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
17780 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
17790 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
177a0 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
177b0 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
177c0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
177d0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66  /.      lrc = af
177e0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
177f0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17800 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
17810 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  1, 0);.    } els
17820 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
17830 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
17840 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
17850 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
17860 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
17870 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
17880 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
17890 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
178a0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63   ){.      rc=lrc
178b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
178c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
178d0 65 61 76 65 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  eave(pFile->pIno
178e0 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b  de->pLockMutex);
178f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
17900 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
17910 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
17920 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
17930 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
17940 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
17950 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17960 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
17970 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
17980 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
17990 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
179a0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
179b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
179c0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
179d0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
179e0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
179f0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
17a00 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
17a10 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
17a20 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
17a30 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
17a40 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
17a50 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
17a60 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
17a70 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
17a80 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
17a90 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
17aa0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
17ab0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
17ac0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
17ad0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
17ae0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
17af0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
17b00 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
17b10 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
17b20 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
17b30 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
17b40 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
17b50 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
17b60 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
17b70 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
17b80 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
17b90 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
17ba0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
17bb0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
17bc0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
17bd0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
17be0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
17bf0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
17c00 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
17c10 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
17c20 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
17c30 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
17c40 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
17c50 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
17c60 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
17c70 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
17c80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17c90 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
17ca0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
17cb0 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
17cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17cd0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
17ce0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
17cf0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
17d00 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
17d10 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
17d20 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
17d30 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
17d40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
17d50 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
17d60 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
17d70 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
17d80 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
17d90 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
17da0 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
17db0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
17dc0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
17dd0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
17de0 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
17df0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
17e00 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
17e10 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
17e20 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
17e30 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47  e->nShared , osG
17e40 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f  etpid(0)));..  /
17e50 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
17e60 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
17e70 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
17e80 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
17e90 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
17ea0 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
17eb0 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
17ec0 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
17ed0 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
17ee0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
17ef0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
17f00 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
17f10 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17f20 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
17f30 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
17f40 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
17f50 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
17f60 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17f70 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
17f80 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
17f90 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
17fa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17fb0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
17fc0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
17fd0 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
17fe0 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
17ff0 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
18000 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
18010 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
18020 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
18030 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
18040 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
18050 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
18060 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
18070 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
18080 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
18090 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
180a0 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
180b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
180c0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
180d0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
180e0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
180f0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
18100 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
18110 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
18120 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
18130 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
18140 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18150 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
18160 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
18170 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
18180 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
18190 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
181a0 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
181b0 2a 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  */.  pInode = pF
181c0 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73  ile->pInode;.  s
181d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
181e0 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  er(pInode->pLock
181f0 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  Mutex);..  /* If
18200 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
18210 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
18220 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
18230 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
18240 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
18250 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
18260 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
18270 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
18280 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
18290 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
182a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
182b0 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
182c0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
182d0 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
182e0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
182f0 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
18300 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
18310 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
18320 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
18330 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
18340 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
18350 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
18360 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
18370 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
18380 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
18390 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
183a0 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
183b0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
183c0 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
183d0 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
183e0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
183f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
18400 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
18410 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18420 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
18430 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
18440 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
18450 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
18460 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18470 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18480 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
18490 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
184a0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
184b0 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
184c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
184d0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
184e0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
184f0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
18500 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
18510 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
18520 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
18530 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
18540 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
18550 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
18560 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
18570 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
18580 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
18590 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
185a0 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
185b0 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
185c0 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
185d0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
185e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
185f0 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
18600 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18610 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
18620 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
18630 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
18640 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
18650 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
18660 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18670 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
18680 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
18690 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
186a0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
186b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
186c0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
186d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
186e0 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
186f0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
18700 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
18710 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
18720 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
18730 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
18740 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
18750 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
18760 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
18770 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
18780 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
18790 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67  no = 0;.    long
187a0 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
187b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
187c0 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
187d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
187e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
187f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
18800 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
18810 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
18820 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
18830 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
18840 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
18850 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
18860 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
18870 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
18880 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
18890 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
188a0 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
188b0 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
188c0 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
188d0 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
188e0 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
188f0 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
18900 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
18910 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18920 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
18930 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
18940 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
18950 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
18960 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
18970 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
18980 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
18990 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
189a0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
189b0 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
189c0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
189d0 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
189e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
189f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
18a00 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
18a10 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
18a20 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
18a30 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73  rc1) ) {.      s
18a40 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
18a50 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b  ile, lrc1Errno);
18a60 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
18a70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
18a80 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
18a90 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
18aa0 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
18ab0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
18ac0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
18ad0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
18ae0 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
18af0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
18b00 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
18b10 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
18b20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
18b30 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
18b40 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
18b50 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
18b60 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18b70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
18b80 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
18b90 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
18ba0 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
18bb0 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
18bc0 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
18bd0 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
18be0 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
18bf0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
18c00 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
18c10 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
18c20 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
18c30 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
18c40 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
18c50 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
18c60 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
18c70 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
18c80 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
18c90 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
18ca0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
18cb0 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
18cc0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
18cd0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
18ce0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
18cf0 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
18d00 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
18d10 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
18d20 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
18d30 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
18d40 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
18d50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
18d60 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
18d70 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
18d80 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
18d90 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
18da0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
18db0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18dc0 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
18dd0 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
18de0 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
18df0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
18e00 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
18e10 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
18e20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
18e30 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
18e40 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
18e50 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
18e60 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
18e70 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
18e80 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
18e90 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
18ea0 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
18eb0 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
18ec0 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
18ed0 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
18ee0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
18ef0 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
18f00 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
18f10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18f20 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
18f30 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18f40 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18f50 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
18f80 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
18f90 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
18fa0 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
18fb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
18fc0 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
18fd0 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
18fe0 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
18ff0 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
19000 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
19010 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
19020 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
19030 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19050 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
19060 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
19070 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
19080 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
19090 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
190a0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
190d0 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
190e0 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
190f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
19100 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
19110 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
19120 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
19130 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
19140 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
19150 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
19160 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
19170 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
19180 64 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c  d & 0xff) == SQL
19190 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69  ITE_IOERR) ? fai
191a0 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20  led2 : .        
191b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
191c0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
191d0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
191e0 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  _lock;.        }
191f0 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
19200 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
19210 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
19220 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
19230 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
19240 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
19250 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
19260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19270 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19280 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
19290 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
192a0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
192b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
192c0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
192d0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
192e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
192f0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
19300 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
19310 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
19320 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
19330 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69  end_lock:.  sqli
19340 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19350 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
19360 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
19370 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
19380 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  s (afp)\n", pFil
19390 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
193a0 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
193b0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
193c0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
193d0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
193e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
193f0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
19400 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
19410 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
19420 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
19430 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
19440 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
19450 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
19460 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
19470 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
19480 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
19490 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
194a0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
194b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
194c0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
194d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
194e0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
194f0 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71  int afpUnlock(sq
19500 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
19510 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
19520 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19530 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
19540 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
19550 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
19560 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
19570 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
19580 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
19590 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
195a0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
195b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
195c0 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20   int skipShared 
195d0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
195e0 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20  TE_TEST.  int h 
195f0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64  = pFile->h;.#end
19600 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
19610 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
19620 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
19630 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
19640 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
19650 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
19660 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
19670 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19680 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
19690 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
196a0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
196b0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  ed,.           o
196c0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20  sGetpid(0)));.. 
196d0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
196e0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
196f0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
19700 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
19710 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
19720 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19730 7d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  }.  pInode = pFi
19740 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71  le->pInode;.  sq
19750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
19760 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  r(pInode->pLockM
19770 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
19780 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
19790 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
197a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
197b0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
197c0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
197d0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
197e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
197f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
19800 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
19810 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19820 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
19830 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
19840 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
19850 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
19860 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
19870 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
19880 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
19890 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
198a0 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
198b0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
198c0 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
198d0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
198e0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
198f0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
19900 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
19910 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19920 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
19930 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
19940 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
19950 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
19960 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
19970 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
19980 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
19990 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
199a0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
199b0 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
199c0 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
199d0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
199e0 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
199f0 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
19a00 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
19a10 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
19a20 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
19a30 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
19a40 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
19a50 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
19a60 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
19a70 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
19a80 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
19a90 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
19aa0 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
19ab0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
19ac0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
19ad0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
19ae0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
19af0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
19b00 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
19b10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
19b20 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
19b30 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
19b40 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
19b50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19b60 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
19b70 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
19b80 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
19b90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
19ba0 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
19bb0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
19bc0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
19bd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
19be0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
19bf0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
19c00 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
19c10 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
19c20 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
19c30 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
19c40 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
19c50 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
19c60 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
19c70 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
19c80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
19c90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19ca0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
19cb0 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
19cc0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
19cd0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
19ce0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
19cf0 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
19d00 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
19d10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19d20 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
19d30 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
19d40 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
19d50 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
19d60 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
19d70 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
19d80 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
19d90 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
19da0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
19db0 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
19dc0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
19dd0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
19de0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
19df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
19e00 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
19e10 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
19e20 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
19e30 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
19e40 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
19e50 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
19e60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19e70 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
19e80 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
19e90 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
19ea0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
19eb0 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
19ec0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
19ed0 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
19ee0 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
19ef0 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
19f00 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
19f10 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
19f20 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
19f30 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
19f40 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
19f50 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
19f60 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
19f70 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
19f80 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
19f90 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
19fa0 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
19fb0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
19fc0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
19fd0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
19fe0 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
19ff0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1a000 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1a010 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
1a020 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
1a030 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1a040 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1a050 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
1a060 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
1a070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1a080 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
1a090 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1a0a0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
1a0b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
1a0c0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
1a0d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a0e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a0f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1a100 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
1a110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1a120 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
1a130 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
1a140 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 20 63  de->nLock==0 ) c
1a150 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
1a160 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
1a170 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .  .  sqlite3_mu
1a180 74 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65  tex_leave(pInode
1a190 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20  ->pLockMutex);. 
1a1a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a1b0 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
1a1c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
1a1d0 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65  leLock;.  }.  re
1a1e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a1f0 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
1a200 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
1a210 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
1a220 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
1a230 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71   int afpClose(sq
1a240 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
1a250 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a260 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
1a270 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1a280 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
1a290 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
1a2a0 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
1a2b0 5f 4c 4f 43 4b 29 3b 0a 20 20 61 73 73 65 72 74  _LOCK);.  assert
1a2c0 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e  ( unixFileMutexN
1a2d0 6f 74 68 65 6c 64 28 70 46 69 6c 65 29 20 29 3b  otheld(pFile) );
1a2e0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1a2f0 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x();.  if( pFile
1a300 2d 3e 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ->pInode ){.    
1a310 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
1a320 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
1a330 49 6e 6f 64 65 3b 0a 20 20 20 20 73 71 6c 69 74  Inode;.    sqlit
1a340 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1a350 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
1a360 78 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  x);.    if( pIno
1a370 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
1a380 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1a390 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
1a3a0 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
1a3b0 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
1a3c0 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
1a3d0 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
1a3e0 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
1a3f0 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
1a400 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
1a410 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
1a420 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
1a430 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
1a440 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
1a450 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
1a460 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
1a470 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
1a480 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
1a490 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
1a4a0 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
1a4b0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1a4c0 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e  x_leave(pInode->
1a4d0 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 7d  pLockMutex);.  }
1a4e0 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
1a4f0 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73 71  nfo(pFile);.  sq
1a500 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
1a510 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
1a520 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  );.  rc = closeU
1a530 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75  nixFile(id);.  u
1a540 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1a550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a560 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1a570 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1a580 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1a590 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1a5a0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
1a5b0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
1a5c0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1a5d0 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
1a5e0 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
1a5f0 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
1a600 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
1a610 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
1a620 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
1a630 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
1a640 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
1a650 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
1a660 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
1a670 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
1a680 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1a690 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
1a6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
1a6b0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
1a6c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
1a6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6e0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1a6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a730 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
1a740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a780 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1a790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7a0 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
1a7b0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
1a7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7d0 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
1a7e0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1a7f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1a800 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
1a810 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
1a820 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
1a830 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
1a840 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
1a850 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
1a860 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
1a870 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
1a880 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
1a890 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
1a8a0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
1a8b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1a8c0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
1a8d0 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
1a8e0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
1a8f0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
1a900 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
1a910 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
1a920 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
1a930 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
1a940 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
1a950 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
1a960 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
1a970 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
1a980 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1a990 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1a9a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1a9b0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
1a9c0 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
1a9d0 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
1a9e0 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
1a9f0 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
1aa00 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
1aa10 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
1aa20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
1aa30 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
1aa40 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
1aa50 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
1aa60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa70 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
1aa80 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
1aa90 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
1aaa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1aab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
1ab00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1ab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
1ab60 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
1ab70 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
1ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
1aba0 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
1abb0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
1abc0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
1abd0 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
1abe0 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
1abf0 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
1ac00 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
1ac10 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
1ac20 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
1ac30 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
1ac40 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
1ac50 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
1ac60 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
1ac70 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
1ac80 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
1ac90 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
1aca0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
1acb0 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
1acc0 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
1acd0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
1ace0 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1acf0 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
1ad00 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1ad10 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
1ad20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
1ad30 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
1ad40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1ad50 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
1ad60 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
1ad70 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
1ad80 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
1ad90 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
1ada0 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
1adb0 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
1adc0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
1add0 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
1ade0 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
1adf0 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
1ae00 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
1ae10 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
1ae20 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
1ae30 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62  ** in any form b
1ae40 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
1ae50 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
1ae60 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
1ae70 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
1ae80 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
1ae90 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f   #2681..**.** To
1aea0 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1aeb0 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1aec0 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64  on a failed read
1aed0 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
1aee0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
1aef0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1af00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1af10 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
1af20 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
1af30 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76  _int64 offset, v
1af40 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
1af50 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
1af60 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b    int prior = 0;
1af70 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
1af80 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
1af90 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1afa0 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
1afb0 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
1afc0 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73  MER_START;.  ass
1afd0 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30  ert( cnt==(cnt&0
1afe0 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73  x1ffff) );.  ass
1aff0 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a  ert( id->h>2 );.
1b000 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65    do{.#if define
1b010 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20  d(USE_PREAD).   
1b020 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69   got = osPread(i
1b030 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
1b040 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
1b050 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
1b060 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66  ot = -1 );.#elif
1b070 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1b080 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20  AD64).    got = 
1b090 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  osPread64(id->h,
1b0a0 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
1b0b0 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  et);.    Simulat
1b0c0 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
1b0d0 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  -1 );.#else.    
1b0e0 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
1b0f0 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
1b100 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
1b110 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1b120 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 2d 31 20   newOffset = -1 
1b130 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  );.    if( newOf
1b140 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  fset<0 ){.      
1b150 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
1b160 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72  unixFile*)id, er
1b170 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rno);.      retu
1b180 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1b190 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64   got = osRead(id
1b1a0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
1b1b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1b1c0 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b  got==cnt ) break
1b1d0 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20  ;.    if( got<0 
1b1e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
1b1f0 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74  no==EINTR ){ got
1b200 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20   = 1; continue; 
1b210 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20  }.      prior = 
1b220 30 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  0;.      storeLa
1b230 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
1b240 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a  e*)id,  errno);.
1b250 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b260 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30   }else if( got>0
1b270 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d   ){.      cnt -=
1b280 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73   got;.      offs
1b290 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20  et += got;.     
1b2a0 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20   prior += got;. 
1b2b0 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69       pBuf = (voi
1b2c0 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a  d*)(got + (char*
1b2d0 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20  )pBuf);.    }.  
1b2e0 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b  }while( got>0 );
1b2f0 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
1b300 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20  OSTRACE(("READ  
1b310 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
1b320 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20   %llu\n",.      
1b330 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74        id->h, got
1b340 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70  +prior, offset-p
1b350 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50  rior, TIMER_ELAP
1b360 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
1b370 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a  got+prior;.}../*
1b380 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
1b390 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
1b3a0 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
1b3b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
1b3c0 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
1b3d0 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
1b3e0 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
1b3f0 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
1b400 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
1b410 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1b420 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
1b430 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69  file *id, .  voi
1b440 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1b450 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1b460 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20  nt64 offset.){. 
1b470 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1b480 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1b490 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  d;.  int got;.  
1b4a0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1b4b0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
1b4c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
1b4d0 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1b4e0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1b4f0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1b500 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1b510 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1b520 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1b530 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1b540 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1b550 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1b560 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1b570 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1b580 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  File->pPrealloca
1b590 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  tedUnused==0.   
1b5a0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
1b5b0 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
1b5c0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1b5d0 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
1b5e0 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
1b5f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1b600 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1b610 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1b620 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20  ch of this read 
1b630 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
1b640 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
1b650 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
1b660 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
1b670 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
1b680 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
1b690 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
1b6a0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1b6b0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1b6c0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1b6d0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
1b6e0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
1b6f0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1b700 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b  )[offset], amt);
1b710 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b720 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1b730 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1b740 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1b750 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1b760 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
1b770 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
1b780 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1b790 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  offset], nCopy);
1b7a0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1b7b0 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1b7c0 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1b7d0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1b7e0 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1b7f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1b800 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
1b810 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
1b820 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
1b830 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
1b840 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b850 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
1b860 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
1b870 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1b880 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
1b890 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1b8a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
1b8b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1b8c0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1b8d0 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f  ile, 0);   /* no
1b8e0 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1b8f0 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
1b900 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
1b910 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
1b920 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
1b930 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
1b940 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
1b950 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
1b960 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b970 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
1b980 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
1b990 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66  pt to seek the f
1b9a0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
1b9b0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
1b9c0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a  st argument to.*
1b9d0 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65  * absolute offse
1b9e0 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74  t iOff, then att
1b9f0 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42  empt to write nB
1ba00 75 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  uf bytes of data
1ba10 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f   from.** pBuf to
1ba20 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72   it. If an error
1ba30 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1ba40 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72  -1 and set *piEr
1ba50 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rno. Otherwise, 
1ba60 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61  .** return the a
1ba70 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ctual number of 
1ba80 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77  bytes written (w
1ba90 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73  hich may be less
1baa0 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a   than.** nBuf)..
1bab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1bac0 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20  ekAndWriteFd(.  
1bad0 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20  int fd,         
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1bb00 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  or to write to *
1bb10 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20  /.  i64 iOff,   
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73      /* File offs
1bb40 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  et to begin writ
1bb50 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73  ing at */.  cons
1bb60 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1bb80 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
1bb90 69 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65  is buffer to the
1bba0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
1bbb0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1bbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1bbd0 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75  ze of buffer pBu
1bbe0 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  f in bytes */.  
1bbf0 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20  int *piErrno    
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75  /* OUT: Error nu
1bc20 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63  mber if error oc
1bc30 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  curs */.){.  int
1bc40 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc60 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1bc70 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  y system call */
1bc80 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66  ..  assert( nBuf
1bc90 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29  ==(nBuf&0x1ffff)
1bca0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64   );.  assert( fd
1bcb0 3e 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >2 );.  assert( 
1bcc0 70 69 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20 20  piErrno!=0 );.  
1bcd0 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b  nBuf &= 0x1ffff;
1bce0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1bcf0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
1bd00 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63  _PREAD).  do{ rc
1bd10 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65   = (int)osPwrite
1bd20 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c  (fd, pBuf, nBuf,
1bd30 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20   iOff); }while( 
1bd40 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1bd50 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65  INTR );.#elif de
1bd60 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1bd70 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69  4).  do{ rc = (i
1bd80 6e 74 29 6f 73 50 77 72 69 74 65 36 34 28 66 64  nt)osPwrite64(fd
1bd90 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1bda0 66 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30  ff);}while( rc<0
1bdb0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1bdc0 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20  );.#else.  do{. 
1bdd0 20 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c     i64 iSeek = l
1bde0 73 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53  seek(fd, iOff, S
1bdf0 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
1be00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69  mulateIOError( i
1be10 53 65 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20 20  Seek = -1 );.   
1be20 20 69 66 28 20 69 53 65 65 6b 3c 30 20 29 7b 0a   if( iSeek<0 ){.
1be30 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1be40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1be50 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69  }.    rc = osWri
1be60 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75  te(fd, pBuf, nBu
1be70 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  f);.  }while( rc
1be80 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1be90 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  TR );.#endif..  
1bea0 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54  TIMER_END;.  OST
1beb0 52 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25  RACE(("WRITE   %
1bec0 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
1bed0 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69  lu\n", fd, rc, i
1bee0 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  Off, TIMER_ELAPS
1bef0 45 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c  ED));..  if( rc<
1bf00 30 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65  0 ) *piErrno = e
1bf10 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72  rrno;.  return r
1bf20 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  c;.}.../*.** See
1bf30 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
1bf40 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68  in id->offset th
1bf50 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65  en read cnt byte
1bf60 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20  s into pBuf..** 
1bf70 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1bf80 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
1bf90 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74  lly read.  Updat
1bfa0 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a  e the offset..**
1bfb0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
1bfc0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
1bfd0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
1bfe0 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74  d write the last
1bff0 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
1c000 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
1c010 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1c020 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1c030 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  te(unixFile *id,
1c040 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e   i64 offset, con
1c050 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
1c060 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72  nt cnt){.  retur
1c070 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  n seekAndWriteFd
1c080 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
1c090 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e  pBuf, cnt, &id->
1c0a0 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a  lastErrno);.}...
1c0b0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1c0c0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
1c0d0 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
1c0e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1c0f0 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
1c100 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1c110 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
1c120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1c130 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
1c140 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
1c150 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1c160 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
1c170 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1c180 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78  ffset .){.  unix
1c190 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1c1a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1c1b0 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
1c1c0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1c1d0 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
1c1e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1c1f0 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
1c200 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
1c210 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
1c220 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
1c230 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
1c240 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
1c250 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
1c260 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
1c270 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
1c280 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
1c290 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
1c2a0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
1c2b0 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
1c2c0 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
1c2d0 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
1c2e0 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
1c2f0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1c300 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c310 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1c320 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1c330 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1c340 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1c350 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
1c360 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1c370 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1c380 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1c390 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
1c3a0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1c3b0 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
1c3c0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1c3d0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
1c3e0 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
1c3f0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1c400 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
1c410 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
1c420 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
1c430 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
1c440 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1c450 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
1c460 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
1c470 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1c480 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
1c490 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
1c4a0 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
1c4b0 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
1c4c0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1c4d0 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
1c4e0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1c4f0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1c500 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
1c510 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
1c520 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
1c530 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1c540 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1c550 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
1c560 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
1c570 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
1c580 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
1c590 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1c5a0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1c5b0 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
1c5c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1c5d0 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
1c5e0 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
1c5f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
1c600 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1c610 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
1c620 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) && SQLITE_MAX_
1c630 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1c640 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1c650 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
1c660 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1c670 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1c680 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1c690 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1c6a0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1c6b0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1c6c0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1c6d0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1c6e0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1c6f0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1c700 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1c710 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1c720 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1c730 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
1c740 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c750 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1c760 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1c770 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1c780 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1c790 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1c7a0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1c7b0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1c7c0 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
1c7d0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1c7e0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1c7f0 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1c800 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1c810 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1c820 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1c830 0a 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f  . .  while( (wro
1c840 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1c850 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1c860 20 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74   pBuf, amt))<amt
1c870 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20   && wrote>0 ){. 
1c880 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
1c890 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
1c8a0 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
1c8b0 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
1c8c0 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
1c8d0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
1c8e0 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
1c8f0 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
1c900 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
1c910 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
1c920 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72  );..  if( amt>wr
1c930 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ote ){.    if( w
1c940 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1c950 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1c960 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1c970 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1c980 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1c990 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c9a0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1c9b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c9c0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1c9d0 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e  (pFile, 0); /* n
1c9e0 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
1c9f0 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
1ca00 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
1ca10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1ca20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1ca30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1ca40 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
1ca50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
1ca60 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
1ca70 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
1ca80 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
1ca90 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
1caa0 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
1cab0 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
1cac0 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
1cad0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
1cae0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
1caf0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1cb00 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
1cb10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
1cb20 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
1cb30 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
1cb40 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
1cb50 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
1cb60 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
1cb70 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
1cb80 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
1cb90 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c  the (slightly sl
1cba0 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29  ower).** fsync()
1cbb0 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  . If you know th
1cbc0 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
1cbd0 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
1cbe0 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
1cbf0 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
1cc00 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
1cc10 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
1cc20 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46  sync or -DHAVE_F
1cc30 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20  DATASYNC.*/.#if 
1cc40 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79  !defined(fdatasy
1cc50 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41  nc) && !HAVE_FDA
1cc60 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  TASYNC.# define 
1cc70 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1cc80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1cc90 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1cca0 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1ccb0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1ccc0 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1ccd0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1cce0 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1ccf0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1cd00 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1cd10 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1cd20 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1cd30 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1cd40 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1cd50 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1cd60 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1cd70 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1cd80 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1cd90 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1cda0 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
1cdb0 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
1cdc0 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
1cdd0 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
1cde0 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
1cdf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
1ce00 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
1ce10 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
1ce20 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
1ce30 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
1ce40 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
1ce50 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
1ce60 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
1ce70 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
1ce80 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
1ce90 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
1cea0 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
1ceb0 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
1cec0 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
1ced0 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
1cee0 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
1cef0 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
1cf00 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
1cf10 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
1cf20 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
1cf30 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
1cf40 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
1cf50 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
1cf60 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
1cf70 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
1cf80 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
1cf90 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
1cfa0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1cfb0 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
1cfc0 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
1cfd0 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
1cfe0 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
1cff0 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
1d000 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
1d010 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
1d020 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
1d030 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
1d040 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
1d050 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
1d060 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
1d070 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1d080 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
1d090 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
1d0a0 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
1d0b0 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
1d0c0 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
1d0d0 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
1d0e0 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
1d0f0 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
1d100 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
1d110 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
1d120 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
1d130 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
1d140 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1d150 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
1d160 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
1d170 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
1d180 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
1d190 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
1d1a0 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
1d1b0 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
1d1c0 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
1d1d0 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
1d1e0 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
1d1f0 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
1d200 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
1d210 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
1d220 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
1d230 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
1d240 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
1d250 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
1d260 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
1d270 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
1d280 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1d290 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
1d2a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
1d2b0 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
1d2c0 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
1d2d0 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
1d2e0 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
1d2f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
1d300 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
1d310 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
1d320 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
1d330 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
1d340 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
1d350 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
1d360 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
1d370 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
1d380 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
1d390 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
1d3a0 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
1d3b0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1d3c0 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
1d3d0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1d3e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d3f0 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1d400 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d410 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1d420 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1d430 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1d440 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1d450 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
1d460 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1d470 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1d480 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1d490 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
1d4a0 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
1d4b0 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
1d4c0 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
1d4d0 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
1d4e0 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
1d4f0 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
1d500 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
1d510 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
1d520 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
1d530 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
1d540 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
1d550 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1d560 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
1d570 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
1d580 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1d590 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
1d5a0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
1d5b0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
1d5c0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
1d5d0 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1d5e0 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
1d5f0 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
1d600 2d 6f 70 2e 20 20 42 75 74 20 67 6f 20 61 68 65  -op.  But go ahe
1d610 61 64 20 61 6e 64 20 63 61 6c 6c 20 66 73 74 61  ad and call fsta
1d620 74 28 29 20 74 6f 20 76 61 6c 69 64 61 74 65 20  t() to validate 
1d630 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65  the file.  ** de
1d640 73 63 72 69 70 74 6f 72 20 61 73 20 77 65 20 6e  scriptor as we n
1d650 65 65 64 20 61 20 6d 65 74 68 6f 64 20 74 6f 20  eed a method to 
1d660 70 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75 72  provoke a failur
1d670 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63 6f  e during.  ** co
1d680 76 65 72 61 74 65 20 74 65 73 74 69 6e 67 2e 0a  verate testing..
1d690 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1d6a0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a 20  TE_NO_SYNC.  {. 
1d6b0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
1d6c0 75 66 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  uf;.    rc = osF
1d6d0 73 74 61 74 28 66 64 2c 20 26 62 75 66 29 3b 0a  stat(fd, &buf);.
1d6e0 20 20 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f 46    }.#elif HAVE_F
1d6f0 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
1d700 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
1d710 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  c = osFcntl(fd, 
1d720 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
1d730 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1d740 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
1d750 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
1d760 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
1d770 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
1d780 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
1d790 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
1d7a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
1d7b0 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
1d7c0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
1d7d0 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
1d7e0 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
1d7f0 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
1d800 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
1d810 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
1d820 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
1d830 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
1d840 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
1d850 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
1d860 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
1d870 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
1d880 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
1d890 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
1d8a0 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
1d8b0 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
1d8c0 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
1d8d0 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
1d8e0 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
1d8f0 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
1d900 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1d910 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
1d920 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
1d930 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
1d940 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
1d950 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
1d960 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
1d970 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
1d980 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
1d990 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
1d9a0 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
1d9b0 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
1d9c0 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
1d9d0 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
1d9e0 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1d9f0 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
1da00 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
1da10 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1da20 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
1da30 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
1da40 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
1da50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1da60 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
1da70 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
1da80 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
1da90 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1daa0 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
1dab0 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
1dac0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
1dad0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1dae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1daf0 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1db00 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1db10 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1db20 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1db30 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1db40 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1db50 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1db60 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1db70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1db80 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1db90 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1dba0 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1dbb0 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1dbc0 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1dbd0 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1dbe0 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1dbf0 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1dc00 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1dc10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1dc20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79  is used for only
1dc30 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a   one thing - to.
1dc40 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72  ** fsync() a dir
1dc50 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73  ectory to make s
1dc60 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ure file creatio
1dc70 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65  n and deletion e
1dc80 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75  vents.** are flu
1dc90 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53  shed to disk.  S
1dca0 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e  uch fsyncs are n
1dcb0 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77  ot needed on new
1dcc0 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67  er.** journaling
1dcd0 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75   filesystems, bu
1dce0 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  t are required o
1dcf0 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74  n older filesyst
1dd00 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
1dd10 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f  routine can be o
1dd20 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
1dd30 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20  the xSetSysCall 
1dd40 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
1dd50 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
1dd60 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69  rride this routi
1dd70 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  ne was added in 
1dd80 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a  support of the.*
1dd90 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  * chromium sandb
1dda0 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64  ox.  Opening a d
1ddb0 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65  irectory is a se
1ddc0 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20  curity risk (we 
1ddd0 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20  are.** told) so 
1dde0 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69  making it overri
1ddf0 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68  deable allows th
1de00 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  e chromium sandb
1de10 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65  ox to.** replace
1de20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1de30 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  th a harmless no
1de40 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68  -op.  To make th
1de50 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20  is routine.** a 
1de60 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69  no-op, replace i
1de70 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68  t with a stub th
1de80 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  at returns SQLIT
1de90 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a  E_OK but leaves.
1dea0 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61  ** *pFd set to a
1deb0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1dec0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1ded0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1dee0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
1def0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1df00 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
1df10 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1df20 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
1df30 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1df40 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
1df50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1df60 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
1df70 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
1df80 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
1df90 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
1dfa0 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
1dfb0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1dfc0 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
1dfd0 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
1dfe0 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
1dff0 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
1e000 69 72 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26 26  irname); ii>0 &&
1e010 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
1e020 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
1e030 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
1e040 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
1e050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1e060 66 28 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21 3d  f( zDirname[0]!=
1e070 27 2f 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b 30  '/' ) zDirname[0
1e080 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44 69  ] = '.';.    zDi
1e090 72 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20 20  rname[1] = 0;.  
1e0a0 7d 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  }.  fd = robust_
1e0b0 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f  open(zDirname, O
1e0c0 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59  _RDONLY|O_BINARY
1e0d0 2c 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d  , 0);.  if( fd>=
1e0e0 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
1e0f0 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
1e100 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
1e110 61 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 46  ame));.  }.  *pF
1e120 64 20 3d 20 66 64 3b 0a 20 20 69 66 28 20 66 64  d = fd;.  if( fd
1e130 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=0 ) return SQL
1e140 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
1e150 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1e160 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
1e170 50 54 2c 20 22 6f 70 65 6e 44 69 72 65 63 74 6f  PT, "openDirecto
1e180 72 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a  ry", zDirname);.
1e190 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1e1a0 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
1e1b0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
1e1c0 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
1e1d0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1e1e0 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
1e1f0 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
1e200 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
1e210 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
1e220 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
1e230 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
1e240 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
1e250 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
1e260 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
1e270 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
1e280 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
1e290 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
1e2a0 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
1e2b0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
1e2c0 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
1e2d0 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
1e2e0 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
1e2f0 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
1e300 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
1e310 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
1e320 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
1e330 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
1e340 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
1e350 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
1e360 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1e370 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
1e380 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
1e390 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
1e3a0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
1e3b0 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
1e3c0 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
1e3d0 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
1e3e0 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
1e3f0 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
1e400 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
1e410 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
1e420 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e430 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
1e440 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
1e450 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
1e460 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1e470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e480 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
1e490 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
1e4a0 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
1e4b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1e4c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1e4d0 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
1e4e0 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
1e4f0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
1e500 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
1e510 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
1e520 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1e530 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
1e540 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
1e550 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1e560 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
1e570 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
1e580 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
1e590 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
1e5a0 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
1e5b0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1e5c0 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
1e5d0 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
1e5e0 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
1e5f0 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
1e600 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
1e610 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
1e620 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
1e630 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
1e640 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1e650 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
1e660 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1e670 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
1e680 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
1e690 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1e6a0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1e6b0 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
1e6c0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
1e6d0 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70  c = full_fsync(p
1e6e0 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73  File->h, isFulls
1e6f0 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29  ync, isDataOnly)
1e700 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1e710 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1e720 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f  f( rc ){.    sto
1e730 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1e740 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  e, errno);.    r
1e750 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1e760 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1e770 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79  FSYNC, "full_fsy
1e780 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  nc", pFile->zPat
1e790 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  h);.  }..  /* Al
1e7a0 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72  so fsync the dir
1e7b0 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
1e7c0 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68  g the file if th
1e7d0 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20  e DIRSYNC flag. 
1e7e0 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69   ** is set.  Thi
1e7f0 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20  s is a one-time 
1e800 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e  occurrence.  Man
1e810 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70  y systems (examp
1e820 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61  les: AIX).  ** a
1e830 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79  re unable to fsy
1e840 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  nc a directory, 
1e850 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73  so ignore errors
1e860 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20   on the fsync.. 
1e870 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
1e880 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
1e890 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b  XFILE_DIRSYNC ){
1e8a0 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a  .    int dirfd;.
1e8b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49      OSTRACE(("DI
1e8c0 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66  RSYNC %s (have_f
1e8d0 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c  ullfsync=%d full
1e8e0 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69  sync=%d)\n", pFi
1e8f0 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20  le->zPath,.     
1e900 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c         HAVE_FULL
1e910 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e  FSYNC, isFullsyn
1e920 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c));.    rc = os
1e930 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46  OpenDirectory(pF
1e940 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72  ile->zPath, &dir
1e950 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fd);.    if( rc=
1e960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e970 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64      full_fsync(d
1e980 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  irfd, 0, 0);.   
1e990 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
1e9a0 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f  pFile, dirfd, __
1e9b0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c  LINE__);.    }el
1e9c0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1e9d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
1e9e0 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72  TOPEN );.      r
1e9f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ea00 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1ea10 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e  ctrlFlags &= ~UN
1ea20 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a  IXFILE_DIRSYNC;.
1ea30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ea40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1ea50 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
1ea60 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
1ea70 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
1ea80 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
1ea90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1eaa0 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75   i64 nByte){.  u
1eab0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1eac0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1ead0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
1eae0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1eaf0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1eb00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1eb10 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b  OERR_TRUNCATE );
1eb20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
1eb30 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
1eb40 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
1eb50 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
1eb60 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
1eb70 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
1eb80 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
1eb90 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
1eba0 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
1ebb0 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
1ebc0 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
1ebd0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
1ebe0 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
1ebf0 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
1ec00 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
1ec10 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1ec20 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  nk>0 ){.    nByt
1ec30 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
1ec40 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
1ec50 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
1ec60 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
1ec70 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  nk;.  }..  rc = 
1ec80 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1ec90 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65  (pFile->h, nByte
1eca0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1ecb0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1ecc0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
1ecd0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1ece0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1ecf0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1ed00 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1ed10 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
1ed20 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
1ed30 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1ed40 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1ed50 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
1ed60 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
1ed70 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
1ed80 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
1ed90 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1eda0 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1edb0 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1edc0 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
1edd0 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1ede0 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
1edf0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1ee00 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
1ee10 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
1ee20 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
1ee30 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1ee40 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
1ee50 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
1ee60 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
1ee70 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
1ee80 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
1ee90 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
1eea0 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
1eeb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
1eec0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1eed0 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29  te && nByte==0 )
1eee0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74  {.      pFile->t
1eef0 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1ef00 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1ef10 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1ef20 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f  MAP_SIZE>0.    /
1ef30 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
1ef40 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64  s just truncated
1ef50 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c   to a size small
1ef60 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
1ef70 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70  ently.    ** map
1ef80 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75  ped region, redu
1ef90 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1efa0 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73   mapping size as
1efb0 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69   well. SQLite wi
1efc0 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65  ll.    ** use re
1efd0 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29  ad() and write()
1efe0 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20   to access data 
1eff0 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e  beyond this poin
1f000 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20  t from now on.  
1f010 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1f020 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61  nByte<pFile->mma
1f030 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  pSize ){.      p
1f040 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
1f050 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65   nByte;.    }.#e
1f060 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e  ndif..    return
1f070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1f080 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
1f090 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
1f0a0 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
1f0b0 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
1f0c0 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a   int unixFileSiz
1f0d0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1f0e0 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
1f0f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72  .  int rc;.  str
1f100 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
1f110 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1f120 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75  rc = osFstat(((u
1f130 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
1f140 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
1f150 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1f160 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
1f170 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
1f180 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1f190 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  id, errno);.    
1f1a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1f1b0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20  ERR_FSTAT;.  }. 
1f1c0 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74   *pSize = buf.st
1f1d0 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65  _size;..  /* Whe
1f1e0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f  n opening a zero
1f1f0 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20  -size database, 
1f200 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  the findInodeInf
1f210 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20  o() procedure.  
1f220 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67  ** writes a sing
1f230 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61  le byte into tha
1f240 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  t file in order 
1f250 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
1f260 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65   bug.  ** in the
1f270 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65   OS-X msdos file
1f280 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65  system.  In orde
1f290 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
1f2a0 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20  ems with upper. 
1f2b0 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e   ** layers, we n
1f2c0 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  eed to report th
1f2d0 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20  is file size as 
1f2e0 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68  zero even though
1f2f0 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c   it is.  ** real
1f300 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23  ly 1.   Ticket #
1f310 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3260..  */.  if(
1f320 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53   *pSize==1 ) *pS
1f330 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74  ize = 0;...  ret
1f340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f350 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1f360 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1f370 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1f380 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61  PPLE__)./*.** Ha
1f390 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d  ndler for proxy-
1f3a0 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e  locking file-con
1f3b0 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66  trol verbs.  Def
1f3c0 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68  ined below in th
1f3d0 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f  e.** proxying lo
1f3e0 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a  cking division..
1f3f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
1f400 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
1f410 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1f420 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1f430 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
1f440 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f450 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51  to handle the SQ
1f460 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1f470 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f  HINT .** file-co
1f480 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e  ntrol operation.
1f490 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61    Enlarge the da
1f4a0 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73  tabase to nBytes
1f4b0 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75   in size.** (rou
1f4c0 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e  nded up to the n
1f4d0 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e  ext chunk-size).
1f4e0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1f4f0 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  e is already.** 
1f500 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72  nBytes or larger
1f510 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1f520 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1f530 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69  atic int fcntlSi
1f540 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20  zeHint(unixFile 
1f550 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74  *pFile, i64 nByt
1f560 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e){.  if( pFile-
1f570 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
1f580 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20    i64 nSize;    
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65  /* Required file
1f5b0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
1f5c0 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20  uct stat buf;   
1f5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1f5e0 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72  ed to hold retur
1f5f0 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61  n values of fsta
1f600 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69  t() */.   .    i
1f610 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65  f( osFstat(pFile
1f620 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20  ->h, &buf) ){.  
1f630 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f640 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1f650 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20     }..    nSize 
1f660 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d  = ((nByte+pFile-
1f670 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46  >szChunk-1) / pF
1f680 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1f690 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1f6a0 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69      if( nSize>(i
1f6b0 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  64)buf.st_size )
1f6c0 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  {..#if defined(H
1f6d0 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1f6e0 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53  ATE) && HAVE_POS
1f6f0 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20  IX_FALLOCATE.   
1f700 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62     /* The code b
1f710 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67  elow is handling
1f720 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1f730 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65  e of osFallocate
1f740 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  () .      ** cor
1f750 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61  rectly. posix_fa
1f760 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66  llocate() is def
1f770 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73  ined to "returns
1f780 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
1f790 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61  , .      ** or a
1f7a0 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f  n error number o
1f7b0 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65  n  failure". See
1f7c0 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72   the manpage for
1f7d0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1f7e0 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
1f7f0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72    do{.        er
1f800 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28  r = osFallocate(
1f810 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74  pFile->h, buf.st
1f820 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66  _size, nSize-buf
1f830 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20  .st_size);.     
1f840 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49   }while( err==EI
1f850 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28  NTR );.      if(
1f860 20 65 72 72 20 26 26 20 65 72 72 21 3d 45 49 4e   err && err!=EIN
1f870 56 41 4c 20 29 20 72 65 74 75 72 6e 20 53 51 4c  VAL ) return SQL
1f880 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1f890 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
1f8a0 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
1f8b0 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
1f8c0 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
1f8d0 69 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20  it. Write a .   
1f8e0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
1f8f0 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79  e to the last by
1f900 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1f910 20 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69   that falls enti
1f920 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69  rely.      ** wi
1f930 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65  thin the extende
1f940 64 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20  d region. Then, 
1f950 69 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73  if required, a s
1f960 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20  ingle byte.     
1f970 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e   ** at offset (n
1f980 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20  Size-1), to set 
1f990 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f9a0 66 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a  file correctly..
1f9b0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
1f9c0 20 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e   a similar techn
1f9d0 69 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65  ique to that use
1f9e0 64 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79  d by glibc on sy
1f9f0 73 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74  stems.      ** t
1fa00 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
1fa10 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65  a real fallocate
1fa20 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  () call..      *
1fa30 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
1fa40 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
1fa50 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
1fa60 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
1fa70 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74  .      int nWrit
1fa80 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1fa90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1faa0 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  bytes written by
1fab0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
1fac0 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
1fad0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1fae0 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
1faf0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
1fb00 0a 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  ..      iWrite =
1fb10 20 28 62 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42   (buf.st_size/nB
1fb20 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20  lk)*nBlk + nBlk 
1fb30 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
1fb40 74 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73  t( iWrite>=buf.s
1fb50 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  t_size );.      
1fb60 61 73 73 65 72 74 28 20 28 28 69 57 72 69 74 65  assert( ((iWrite
1fb70 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a  +1)%nBlk)==0 );.
1fb80 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f        for(/*no-o
1fb90 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a  p*/; iWrite<nSiz
1fba0 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65  e+nBlk-1; iWrite
1fbb0 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  +=nBlk ){.      
1fbc0 20 20 69 66 28 20 69 57 72 69 74 65 3e 3d 6e 53    if( iWrite>=nS
1fbd0 69 7a 65 20 29 20 69 57 72 69 74 65 20 3d 20 6e  ize ) iWrite = n
1fbe0 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 20 20  Size - 1;.      
1fbf0 20 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41    nWrite = seekA
1fc00 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69  ndWrite(pFile, i
1fc10 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20  Write, "", 1);. 
1fc20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74         if( nWrit
1fc30 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  e!=1 ) return SQ
1fc40 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1fc50 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1fc60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20  .    }.  }..#if 
1fc70 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1fc80 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69  SIZE>0.  if( pFi
1fc90 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  le->mmapSizeMax>
1fca0 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65  0 && nByte>pFile
1fcb0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1fcc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
1fcd0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1fce0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  <=0 ){.      if(
1fcf0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1fd00 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  e(pFile->h, nByt
1fd10 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  e) ){.        st
1fd20 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1fd30 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
1fd40 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1fd50 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1fd60 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1fd70 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1fd80 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1fd90 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
1fda0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
1fdb0 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1fdc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1fdd0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1fde0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1fdf0 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
1fe00 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61  s initially nega
1fe10 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
1fe20 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
1fe30 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
1fe40 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
1fe50 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
1fe60 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
1fe70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
1fe80 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
1fe90 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
1fea0 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
1feb0 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
1fec0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1fed0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1fee0 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69   unixModeBit(uni
1fef0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  xFile *pFile, un
1ff00 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
1ff10 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
1ff20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
1ff30 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
1ff40 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
1ff50 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
1ff60 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
1ff70 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
1ff80 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
1ff90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1ffa0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1ffb0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
1ffc0 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1ffd0 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
1ffe0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
1fff0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
20000 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a  har *zBuf);../*.
20010 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** Information a
20020 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e  nd control of an
20030 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
20040 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20050 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
20060 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
20070 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
20080 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69  *pArg){.  unixFi
20090 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
200a0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69  xFile*)id;.  swi
200b0 74 63 68 28 20 6f 70 20 29 7b 0a 23 69 66 20 64  tch( op ){.#if d
200c0 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
200d0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
200e0 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
200f0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20  _ATOMIC_WRITE). 
20100 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
20110 43 4e 54 4c 5f 42 45 47 49 4e 5f 41 54 4f 4d 49  CNTL_BEGIN_ATOMI
20120 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  C_WRITE: {.     
20130 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74   int rc = osIoct
20140 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53  l(pFile->h, F2FS
20150 5f 49 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49  _IOC_START_ATOMI
20160 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20  C_WRITE);.      
20170 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
20180 54 45 5f 49 4f 45 52 52 5f 42 45 47 49 4e 5f 41  TE_IOERR_BEGIN_A
20190 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f  TOMIC : SQLITE_O
201a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
201b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
201c0 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49  OMMIT_ATOMIC_WRI
201d0 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  TE: {.      int 
201e0 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69  rc = osIoctl(pFi
201f0 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f  le->h, F2FS_IOC_
20200 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52  COMMIT_ATOMIC_WR
20210 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ITE);.      retu
20220 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49  rn rc ? SQLITE_I
20230 4f 45 52 52 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d  OERR_COMMIT_ATOM
20240 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  IC : SQLITE_OK;.
20250 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
20260 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 4f 4c 4c  QLITE_FCNTL_ROLL
20270 42 41 43 4b 5f 41 54 4f 4d 49 43 5f 57 52 49 54  BACK_ATOMIC_WRIT
20280 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  E: {.      int r
20290 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c  c = osIoctl(pFil
202a0 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 41  e->h, F2FS_IOC_A
202b0 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  BORT_VOLATILE_WR
202c0 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ITE);.      retu
202d0 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49  rn rc ? SQLITE_I
202e0 4f 45 52 52 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54  OERR_ROLLBACK_AT
202f0 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OMIC : SQLITE_OK
20300 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
20310 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53  * __linux__ && S
20320 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
20330 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  CH_ATOMIC_WRITE 
20340 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  */..    case SQL
20350 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
20360 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
20370 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
20380 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  ->eFileLock;.   
20390 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
203a0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
203b0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
203c0 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
203d0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
203e0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
203f0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
20400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
20410 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
20420 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
20430 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
20440 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
20450 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
20460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20470 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
20480 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
20490 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
204a0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
204b0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
204c0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
204d0 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48   rc = fcntlSizeH
204e0 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34  int(pFile, *(i64
204f0 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20   *)pArg);.      
20500 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
20510 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
20520 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20530 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20540 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
20550 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  AL: {.      unix
20560 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
20570 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
20580 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
20590 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
205a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
205b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
205c0 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
205d0 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
205e0 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70     unixModeBit(p
205f0 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50  File, UNIXFILE_P
20600 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
20610 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
20620 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
20630 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20640 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
20650 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
20660 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
20670 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
20680 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
20690 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
206a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
206b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
206c0 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
206d0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ME: {.      char
206e0 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74   *zTFile = sqlit
206f0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69  e3_malloc64( pFi
20700 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
20710 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66  name );.      if
20720 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20  ( zTFile ){.    
20730 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e      unixGetTempn
20740 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d  ame(pFile->pVfs-
20750 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46  >mxPathname, zTF
20760 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28  ile);.        *(
20770 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54  char**)pArg = zT
20780 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  File;.      }.  
20790 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
207a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
207b0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
207c0 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20  L_HAS_MOVED: {. 
207d0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
207e0 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28   = fileHasMoved(
207f0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65  pFile);.      re
20800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20810 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
20820 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b  ITE_ENABLE_SETLK
20830 5f 54 49 4d 45 4f 55 54 0a 20 20 20 20 63 61 73  _TIMEOUT.    cas
20840 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
20850 4f 43 4b 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20  OCK_TIMEOUT: {. 
20860 20 20 20 20 20 70 46 69 6c 65 2d 3e 69 42 75 73       pFile->iBus
20870 79 54 69 6d 65 6f 75 74 20 3d 20 2a 28 69 6e 74  yTimeout = *(int
20880 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
20890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
208a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
208b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
208c0 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65  _SIZE>0.    case
208d0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
208e0 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
208f0 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20   i64 newLimit = 
20900 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  *(i64*)pArg;.   
20910 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
20920 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28  TE_OK;.      if(
20930 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65   newLimit>sqlite
20940 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
20950 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Mmap ){.        
20960 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  newLimit = sqlit
20970 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
20980 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 0a  xMmap;.      }..
20990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
209a0 75 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74 20 6d  ue of newLimit m
209b0 61 79 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ay be eventually
209c0 20 63 61 73 74 20 74 6f 20 28 73 69 7a 65 5f 74   cast to (size_t
209d0 29 20 61 6e 64 20 70 61 73 73 65 64 0a 20 20 20  ) and passed.   
209e0 20 20 20 2a 2a 20 74 6f 20 6d 6d 61 70 28 29 2e     ** to mmap().
209f0 20 52 65 73 74 72 69 63 74 20 69 74 73 20 76 61   Restrict its va
20a00 6c 75 65 20 74 6f 20 32 47 42 20 69 66 20 28 73  lue to 2GB if (s
20a10 69 7a 65 5f 74 29 20 69 73 20 6e 6f 74 20 61 74  ize_t) is not at
20a20 20 6c 65 61 73 74 20 61 0a 20 20 20 20 20 20 2a   least a.      *
20a30 2a 20 36 34 2d 62 69 74 20 74 79 70 65 2e 20 2a  * 64-bit type. *
20a40 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  /.      if( newL
20a50 69 6d 69 74 3e 30 20 26 26 20 73 69 7a 65 6f 66  imit>0 && sizeof
20a60 28 73 69 7a 65 5f 74 29 3c 38 20 29 7b 0a 20 20  (size_t)<8 ){.  
20a70 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
20a80 20 28 6e 65 77 4c 69 6d 69 74 20 26 20 30 78 37   (newLimit & 0x7
20a90 46 46 46 46 46 46 46 29 3b 0a 20 20 20 20 20 20  FFFFFFF);.      
20aa0 7d 0a 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29  }..      *(i64*)
20ab0 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  pArg = pFile->mm
20ac0 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20  apSizeMax;.     
20ad0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
20ae0 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46   && newLimit!=pF
20af0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
20b00 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63   && pFile->nFetc
20b10 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  hOut==0 ){.     
20b20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
20b30 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74  zeMax = newLimit
20b40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20b50 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a 20  SHARED_MAPPING. 
20b60 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
20b70 2d 3e 70 49 6e 6f 64 65 3d 3d 30 20 29 0a 23 65  ->pInode==0 ).#e
20b80 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
20b90 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
20ba0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
20bb0 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
20bc0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
20bd0 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65  rc = unixMapfile
20be0 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20  (pFile, -1);.   
20bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20c00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20c10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
20c20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20c30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
20c40 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
20c50 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
20c60 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
20c70 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
20c80 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
20c90 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
20ca0 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
20cb0 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
20cc0 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
20cd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
20ce0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
20cf0 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
20d00 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
20d10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
20d20 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
20d30 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
20d40 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
20d50 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
20d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20d70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
20d80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
20d90 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
20da0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
20db0 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
20dc0 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43  TE_FCNTL_SET_LOC
20dd0 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20  KPROXYFILE:.    
20de0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
20df0 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_GET_LOCKPROXYF
20e00 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ILE: {.      ret
20e10 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  urn proxyFileCon
20e20 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29  trol(id,op,pArg)
20e30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
20e40 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
20e50 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
20e60 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
20e70 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  __) */.  }.  ret
20e80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
20e90 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  UND;.}../*.** If
20ea0 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65   pFd->sectorSize
20eb0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65   is non-zero whe
20ec0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
20ed0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
20ee0 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68   a.** no-op. Oth
20ef0 65 72 77 69 73 65 2c 20 74 68 65 20 76 61 6c 75  erwise, the valu
20f00 65 73 20 6f 66 20 70 46 64 2d 3e 73 65 63 74 6f  es of pFd->secto
20f10 72 53 69 7a 65 20 61 6e 64 20 0a 2a 2a 20 70 46  rSize and .** pF
20f20 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  d->deviceCharact
20f30 65 72 69 73 74 69 63 73 20 61 72 65 20 73 65 74  eristics are set
20f40 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
20f50 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a  e file-system .*
20f60 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
20f70 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  s. .**.** There 
20f80 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
20f90 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
20fa0 6e 2e 20 4f 6e 65 20 66 6f 72 20 51 4e 58 20 61  n. One for QNX a
20fb0 6e 64 20 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a  nd one for all.*
20fc0 2a 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e  * other systems.
20fd0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e  .*/.#ifndef __QN
20fe0 58 4e 54 4f 5f 5f 0a 73 74 61 74 69 63 20 76 6f  XNTO__.static vo
20ff0 69 64 20 73 65 74 44 65 76 69 63 65 43 68 61 72  id setDeviceChar
21000 61 63 74 65 72 69 73 74 69 63 73 28 75 6e 69 78  acteristics(unix
21010 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73  File *pFd){.  as
21020 73 65 72 74 28 20 70 46 64 2d 3e 64 65 76 69 63  sert( pFd->devic
21030 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21040 3d 3d 30 20 7c 7c 20 70 46 64 2d 3e 73 65 63 74  ==0 || pFd->sect
21050 6f 72 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 69  orSize!=0 );.  i
21060 66 28 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69  f( pFd->sectorSi
21070 7a 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66  ze==0 ){.#if def
21080 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
21090 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
210a0 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
210b0 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 20  TOMIC_WRITE).   
210c0 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 75 33   int res;.    u3
210d0 32 20 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  2 f = 0;..    /*
210e0 20 43 68 65 63 6b 20 66 6f 72 20 73 75 70 70 6f   Check for suppo
210f0 72 74 20 66 6f 72 20 46 32 46 53 20 61 74 6f 6d  rt for F2FS atom
21100 69 63 20 62 61 74 63 68 20 77 72 69 74 65 73 2e  ic batch writes.
21110 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 6f 73   */.    res = os
21120 49 6f 63 74 6c 28 70 46 64 2d 3e 68 2c 20 46 32  Ioctl(pFd->h, F2
21130 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54 55  FS_IOC_GET_FEATU
21140 52 45 53 2c 20 26 66 29 3b 0a 20 20 20 20 69 66  RES, &f);.    if
21150 28 20 72 65 73 3d 3d 30 20 26 26 20 28 66 20 26  ( res==0 && (f &
21160 20 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54   F2FS_FEATURE_AT
21170 4f 4d 49 43 5f 57 52 49 54 45 29 20 29 7b 0a 20  OMIC_WRITE) ){. 
21180 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65       pFd->device
21190 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
211a0 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  = SQLITE_IOCAP_B
211b0 41 54 43 48 5f 41 54 4f 4d 49 43 3b 0a 20 20 20  ATCH_ATOMIC;.   
211c0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c   }.#endif /* __l
211d0 69 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45  inux__ && SQLITE
211e0 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
211f0 4f 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20  OMIC_WRITE */.. 
21200 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 50 4f     /* Set the PO
21210 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
21220 45 20 66 6c 61 67 20 69 66 20 72 65 71 75 65 73  E flag if reques
21230 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
21240 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  pFd->ctrlFlags &
21250 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29   UNIXFILE_PSOW )
21260 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 64 65 76  {.      pFd->dev
21270 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21280 63 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43  cs |= SQLITE_IOC
21290 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
212a0 52 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 0a 20  RWRITE;.    }.. 
212b0 20 20 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69     pFd->sectorSi
212c0 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
212d0 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
212e0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e  .  }.}.#else.#in
212f0 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f  clude <sys/dcmd_
21300 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  blk.h>.#include 
21310 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a  <sys/statvfs.h>.
21320 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 44  static void setD
21330 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
21340 74 69 63 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  tics(unixFile *p
21350 46 69 6c 65 29 7b 0a 20 20 69 66 28 20 70 46 69  File){.  if( pFi
21360 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
21370 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  = 0 ){.    struc
21380 74 20 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f  t statvfs fsInfo
21390 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a  ;.       .    /*
213a0 20 53 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f   Set defaults fo
213b0 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20  r non-supported 
213c0 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20  filesystems */. 
213d0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
213e0 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
213f0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
21400 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  E;.    pFile->de
21410 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
21420 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ics = 0;.    if(
21430 20 66 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d   fstatvfs(pFile-
21440 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  >h, &fsInfo) == 
21450 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74  -1 ) {.      ret
21460 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  urn;.    }..    
21470 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
21480 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
21490 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20  tmp") ) {.      
214a0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
214b0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
214c0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
214d0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
214e0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
214f0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
21500 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f  OMIC4K |       /
21510 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79  * All ram filesy
21520 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
21530 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
21540 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
21550 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
21560 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
21570 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
21580 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
215b0 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
215c0 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
215d0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
215e0 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
215f0 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
21600 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
21610 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
21640 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
21650 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
21660 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
21670 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rstr(fsInfo.f_ba
21680 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20  setype, "etfs") 
21690 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
216a0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
216b0 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
216c0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
216d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
216e0 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66  =.        /* etf
216f0 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77  s cluster size w
21700 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
21710 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69   */.        (pFi
21720 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
21730 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
21740 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c  CAP_ATOMIC512) |
21750 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
21760 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
21770 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
21780 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
21790 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
217d0 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
217e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
217f0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
21800 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
21810 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
21820 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
21860 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
21870 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
21880 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
21890 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
218a0 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20  "qnx6") ){.     
218b0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
218c0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
218d0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
218e0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
218f0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
21900 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
21910 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20  TOMIC |         
21920 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65  /* All filesyste
21930 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
21940 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
21950 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
21960 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
21970 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
21980 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
21990 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
219c0 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
219d0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
219e0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
219f0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
21a00 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
21a10 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
21a20 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
21a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
21a50 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
21a60 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
21a70 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63   }else if( !strc
21a80 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
21a90 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b  type, "qnx4") ){
21aa0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
21ab0 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
21ac0 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
21ad0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
21ae0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
21af0 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20          /* full 
21b00 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63  bitset of atomic
21b10 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f  s from max secto
21b20 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c  r size and small
21b30 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  er */.        ((
21b40 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
21b50 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
21b60 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
21b70 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20  ) << 1) - 2 |.  
21b80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
21b90 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
21ba0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
21bb0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
21bc0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bf0 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
21c00 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
21c10 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
21c20 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66  if( strstr(fsInf
21c30 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64  o.f_basetype, "d
21c40 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  os") ){.      pF
21c50 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
21c60 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
21c70 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
21c80 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
21c90 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f  tics =.        /
21ca0 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66  * full bitset of
21cb0 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61   atomics from ma
21cc0 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e  x sector size an
21cd0 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  d smaller */.   
21ce0 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65       ((pFile->se
21cf0 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a  ctorSize / 512 *
21d00 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
21d10 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d  OMIC512) << 1) -
21d20 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c   2 |.        SQL
21d30 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
21d40 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
21d50 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
21d60 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
21d70 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
21da0 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
21db0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
21dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
21dd0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
21de0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
21df0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
21e00 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20  P_ATOMIC512 |   
21e10 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65     /* blocks are
21e20 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
21e30 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
21e40 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
21e50 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
21e60 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
21e70 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ea0 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
21eb0 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
21ec0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
21ed0 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76  /* Last chance v
21ee0 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66  erification.  If
21ef0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
21f00 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c   isn't a multipl
21f10 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68  e of 512.  ** th
21f20 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69  en it isn't vali
21f30 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  d.*/.  if( pFile
21f40 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35  ->sectorSize % 5
21f50 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70  12 != 0 ){.    p
21f60 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
21f70 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b  acteristics = 0;
21f80 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
21f90 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
21fa0 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
21fb0 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  IZE;.  }.}.#endi
21fc0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
21fd0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
21fe0 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
21ff0 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
22000 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
22010 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
22020 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
22030 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
22040 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
22050 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
22060 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
22070 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
22080 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
22090 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
220a0 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
220b0 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
220c0 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
220d0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
220e0 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
220f0 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
22100 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
22110 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
22120 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
22130 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
22140 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
22150 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
22160 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
22170 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
22180 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
22190 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
221a0 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61 72  .  setDeviceChar
221b0 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64 29  acteristics(pFd)
221c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e  ;.  return pFd->
221d0 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f  sectorSize;.}../
221e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
221f0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
22200 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
22210 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
22220 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f  VFS is set up to
22230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22240 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
22250 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61  VERWRITE by defa
22260 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ult..** However,
22270 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20   that choice is 
22280 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69  controversial si
22290 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20  nce technically 
222a0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
222b0 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f  * file system do
222c0 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72  es not always pr
222d0 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20  ovide powersafe 
222e0 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e  overwrites.  (In
222f0 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
22300 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c   after a power-l
22310 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73  oss event, parts
22320 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61   of the file tha
22330 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20  t were never.** 
22340 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e  written might en
22350 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72  d up being alter
22360 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e  ed.)  However, n
22370 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72  on-PSOW behavior
22380 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72   is very,.** ver
22390 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73  y rare.  And ass
223a0 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65  erting PSOW make
223b0 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74  s a large reduct
223c0 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e  ion in the amoun
223d0 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64  t.** of required
223e0 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c   I/O for journal
223f0 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74  ing, since a lot
22400 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65   of padding is e
22410 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48  liminated..**  H
22420 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45  ence, while POWE
22430 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
22440 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
22450 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c  , there is a fil
22460 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61  e-control.** ava
22470 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
22480 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75  t off and URI qu
22490 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76  ery parameter av
224a0 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
224b0 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  it off..*/.stati
224c0 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
224d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
224e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
224f0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
22500 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
22510 69 64 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43  id;.  setDeviceC
22520 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
22530 46 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  Fd);.  return pF
22540 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  d->deviceCharact
22550 65 72 69 73 74 69 63 73 3b 0a 7d 0a 0a 23 69 66  eristics;.}..#if
22560 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22570 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
22580 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
22590 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ZE>0../*.** Retu
225a0 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70 61  rn the system pa
225b0 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
225c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
225d0 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
225e0 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74  d directly by ot
225f0 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73  her code in this
22600 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65   file. .** Inste
22610 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65  ad, it should be
22620 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72   called via macr
22630 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  o osGetpagesize(
22640 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
22650 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65   unixGetpagesize
22660 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56  (void){.#if OS_V
22670 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
22680 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69  1024;.#elif defi
22690 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29  ned(_BSD_SOURCE)
226a0 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61 67  .  return getpag
226b0 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20  esize();.#else. 
226c0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73   return (int)sys
226d0 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a  conf(_SC_PAGESIZ
226e0 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65  E);.#endif.}..#e
226f0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
22700 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
22710 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
22720 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
22730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22740 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f  MIT_WAL../*.** O
22750 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
22760 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65  present an share
22770 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  d memory buffer.
22780 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75    .**.** When mu
22790 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
227a0 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
227b0 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c   same wal-index,
227c0 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20   each thread.** 
227d0 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78  has its own unix
227e0 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  Shm object, but 
227f0 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74  they all point t
22800 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
22810 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75  nce.** of this u
22820 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
22830 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
22840 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64  ds, each wal-ind
22850 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  ex is opened.** 
22860 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
22870 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ocess..**.** Eac
22880 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  h unixShmNode ob
22890 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  ject is connecte
228a0 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e  d to a single un
228b0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
228c0 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ct..** We could 
228d0 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62  coalesce this ob
228e0 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e  ject into unixIn
228f0 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61  odeInfo, but tha
22900 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20  t would mean.** 
22910 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20  every open file 
22920 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
22930 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
22940 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
22950 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69   most.** open fi
22960 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20  les) would have 
22970 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20  to carry around 
22980 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72  this extra infor
22990 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74  mation.  So.** t
229a0 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
229b0 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
229c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
229d0 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
229e0 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65  bject.** and the
229f0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
22a00 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f  ect is created o
22a10 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e  nly when needed.
22a20 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  .**.** unixMutex
22a30 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
22a40 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
22a50 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
22a60 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
22a70 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
22a80 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
22a90 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
22aa0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
22ab0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
22ac0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
22ad0 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
22ae0 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
22af0 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
22b00 20 20 20 68 53 68 6d 0a 2a 2a 20 20 20 20 20 20     hShm.**      
22b10 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
22b20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
22b30 64 65 2e 70 53 68 6d 4d 75 74 65 78 20 6d 75 73  de.pShmMutex mus
22b40 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69  t be held or uni
22b50 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
22b60 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65   and.** unixMute
22b70 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20  xHeld() is true 
22b80 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20  when reading or 
22b90 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65  writing any othe
22ba0 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68  r field.** in th
22bb0 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
22bc0 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e  .struct unixShmN
22bd0 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ode {.  unixInod
22be0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
22bf0 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49     /* unixInodeI
22c00 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68  nfo that owns th
22c10 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20  is SHM node */. 
22c20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
22c30 70 53 68 6d 4d 75 74 65 78 3b 20 20 2f 2a 20 4d  pShmMutex;  /* M
22c40 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
22c50 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
22c60 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
22c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
22c80 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65  me of the mmappe
22c90 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
22ca0 68 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  hShm;           
22cb0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
22cc0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
22cd0 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
22ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22cf0 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
22d00 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
22d10 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e  */.  u16 nRegion
22d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22d30 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
22d40 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75   apRegion */.  u
22d50 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20  8 isReadonly;   
22d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
22d70 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e if read-only *
22d80 2f 0a 20 20 75 38 20 69 73 55 6e 6c 6f 63 6b 65  /.  u8 isUnlocke
22d90 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
22da0 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 44 4d 53  * True if no DMS
22db0 20 6c 6f 63 6b 20 68 65 6c 64 20 2a 2f 0a 20 20   lock held */.  
22dc0 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b  char **apRegion;
22dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22de0 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68  ray of mapped sh
22df0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
22e00 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
22e10 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
22e20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22e30 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
22e40 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
22e50 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  s */.  unixShm *
22e60 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
22e70 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d    /* All unixShm
22e80 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
22e90 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66  g to this */.#if
22ea0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
22eb0 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ed0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
22ee0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
22ef0 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b  .  u8 sharedMask
22f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22f10 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
22f20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
22f30 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
22f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
22f50 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69  xt available uni
22f60 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  xShm.id value */
22f70 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
22f80 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
22f90 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
22fa0 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
22fb0 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
22fc0 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
22fd0 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
22fe0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
22ff0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
23000 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
23010 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
23020 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
23030 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
23040 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
23050 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 53 68  *    unixShm.pSh
23060 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 75 6e 69 78  mNode.**    unix
23070 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
23080 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
23090 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
230a0 68 65 20 75 6e 69 78 53 68 6d 2e 70 53 68 6d 4e  he unixShm.pShmN
230b0 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 20 6d  ode->pShmMutex m
230c0 75 73 74 0a 2a 2a 20 62 65 20 68 65 6c 64 20 77  ust.** be held w
230d0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
230e0 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
230f0 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
23100 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78  unixShm {.  unix
23110 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
23120 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  e;     /* The un
23130 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d  derlying unixShm
23140 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
23150 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b   unixShm *pNext;
23160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23170 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68  ext unixShm with
23180 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68   the same unixSh
23190 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
231a0 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
231b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
231c0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69   holding the uni
231d0 78 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75  xShmNode->pShmMu
231e0 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20  tex */.  u8 id; 
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23200 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
23210 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
23220 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e  hin its unixShmN
23230 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  ode */.  u16 sha
23240 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
23250 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
23260 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
23270 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
23280 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
23290 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
232a0 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
232b0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
232c0 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
232d0 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
232e0 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53  ine UNIX_SHM_BAS
232f0 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
23300 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
23310 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
23320 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
23330 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  ine UNIX_SHM_DMS
23340 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41      (UNIX_SHM_BA
23350 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
23360 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
23370 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
23380 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64  * Apply posix ad
23390 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
233a0 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20   all bytes from 
233b0 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73  ofst through ofs
233c0 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  t+n-1..**.** Loc
233d0 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20  ks block if the 
233e0 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20  mask is exactly 
233f0 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61  UNIX_SHM_C and a
23400 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a  re non-blocking.
23410 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
23420 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
23430 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
23440 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
23450 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ,       /* Open 
23460 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
23470 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20  e WAL file */.  
23480 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
23490 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43         /* F_UNLC
234a0 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46  K, F_RDLCK, or F
234b0 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
234c0 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
234d0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
234e0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
234f0 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  range */.  int n
23500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23510 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
23520 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
23530 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
23540 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41   *pShmNode; /* A
23550 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
23560 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
23570 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
23580 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
23590 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  f;        /* The
235a0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
235b0 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
235c0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
235d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
235e0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
235f0 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20  m fcntl() */..  
23600 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
23610 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
23620 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
23630 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
23640 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  */.  pShmNode = 
23650 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
23660 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72  ShmNode;.  asser
23670 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
23680 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  f==0 || sqlite3_
23690 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e  mutex_held(pShmN
236a0 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 20  ode->pShmMutex) 
236b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
236c0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 7c 7c  mNode->nRef>0 ||
236d0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
236e0 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64   );..  /* Shared
236f0 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61   locks never spa
23700 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
23710 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  byte */.  assert
23720 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79  ( n==1 || lockTy
23730 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a  pe!=F_RDLCK );..
23740 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77    /* Locks are w
23750 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20  ithin range */. 
23760 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26   assert( n>=1 &&
23770 20 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e   n<=SQLITE_SHM_N
23780 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  LOCK );..  if( p
23790 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30  ShmNode->hShm>=0
237a0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   ){.    /* Initi
237b0 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
237c0 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
237d0 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c      f.l_type = l
237e0 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c  ockType;.    f.l
237f0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
23800 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72  ET;.    f.l_star
23810 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e  t = ofst;.    f.
23820 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 20 20 20 20 72  l_len = n;.    r
23830 63 20 3d 20 6f 73 53 65 74 50 6f 73 69 78 41 64  c = osSetPosixAd
23840 76 69 73 6f 72 79 4c 6f 63 6b 28 70 53 68 6d 4e  visoryLock(pShmN
23850 6f 64 65 2d 3e 68 53 68 6d 2c 20 26 66 2c 20 70  ode->hShm, &f, p
23860 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  File);.    rc = 
23870 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c  (rc!=(-1)) ? SQL
23880 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
23890 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BUSY;.  }..  /* 
238a0 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61  Update the globa
238b0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64  l lock state and
238c0 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e   do debug tracin
238d0 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
238e0 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36  TE_DEBUG.  { u16
238f0 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45   mask;.  OSTRACE
23900 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b  (("SHM-LOCK "));
23910 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33  .  mask = ofst>3
23920 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28 31 3c  1 ? 0xffff : (1<
23930 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
23940 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63  <ofst);.  if( rc
23950 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23960 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
23970 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
23980 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
23990 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
239a0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
239b0 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
239c0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
239d0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
239e0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
239f0 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
23a00 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
23a10 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
23a20 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  ad-lock %d ok", 
23a30 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
23a40 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
23a50 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
23a60 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
23a70 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
23a80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23a90 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
23aa0 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
23ab0 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
23ac0 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  te-lock %d ok", 
23ad0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
23ae0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
23af0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
23b00 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
23b10 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
23b20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
23b30 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
23b40 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
23b50 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
23b60 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
23b70 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  st));.    }else 
23b80 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
23b90 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
23ba0 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
23bb0 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ck failed"));.  
23bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
23bd0 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
23be0 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
23bf0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
23c00 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  e-lock %d failed
23c10 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
23c20 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
23c30 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25  " - afterwards %
23c40 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
23c50 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
23c60 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53  ->sharedMask, pS
23c70 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
23c80 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ));.  }.#endif..
23c90 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20    return rc;    
23ca0 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65      .}../*.** Re
23cb0 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d  turn the minimum
23cc0 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b 42 20   number of 32KB 
23cd0 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68 61 74  shm regions that
23ce0 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70 70 65   should be mappe
23cf0 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20  d at.** a time, 
23d00 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 65 61  assuming that ea
23d10 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  ch mapping must 
23d20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  be an integer mu
23d30 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a  ltiple of the.**
23d40 20 63 75 72 72 65 6e 74 20 73 79 73 74 65 6d 20   current system 
23d50 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page-size..**.**
23d60 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
23d70 73 20 31 2e 20 54 68 65 20 65 78 63 65 70 74 69  s 1. The excepti
23d80 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65 20 73  on seems to be s
23d90 79 73 74 65 6d 73 20 74 68 61 74 20 61 72 65 20  ystems that are 
23da0 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f  configured.** to
23db0 20 75 73 65 20 36 34 4b 42 20 70 61 67 65 73 20   use 64KB pages 
23dc0 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 65  - in this case e
23dd0 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  ach mapping must
23de0 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73 74 20   cover at least 
23df0 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f  two.** shm regio
23e00 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
23e10 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  t unixShmRegionP
23e20 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20 69  erMap(void){.  i
23e30 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30  nt shmsz = 32*10
23e40 32 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  24;            /
23e50 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a  * SHM region siz
23e60 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
23e70 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  = osGetpagesize(
23e80 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 70  );   /* System p
23e90 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73  age size */.  as
23ea0 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31 29 26  sert( ((pgsz-1)&
23eb0 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a  pgsz)==0 );   /*
23ec0 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   Page size must 
23ed0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
23ee0 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c 73 68  */.  if( pgsz<sh
23ef0 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  msz ) return 1;.
23f00 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f 73 68    return pgsz/sh
23f10 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75  msz;.}../*.** Pu
23f20 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
23f30 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
23f40 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
23f50 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
23f60 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
23f70 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
23f80 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
23f90 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
23fa0 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
23fb0 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
23fc0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
23fd0 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
23fe0 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
23ff0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
24000 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
24010 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
24020 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
24030 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
24040 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
24050 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 52 65  && ALWAYS(p->nRe
24060 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  f==0) ){.    int
24070 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
24080 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
24090 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p();.    int i;.
240a0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
240b0 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f  Inode==pFd->pIno
240c0 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  de );.    sqlite
240d0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
240e0 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20 20 20  pShmMutex);.    
240f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
24100 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65  egion; i+=nShmPe
24110 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28  rMap){.      if(
24120 20 70 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b 0a 20   p->hShm>=0 ){. 
24130 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28         osMunmap(
24140 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20  p->apRegion[i], 
24150 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  p->szRegion);.  
24160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24170 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24180 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b  p->apRegion[i]);
24190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
241a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
241b0 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20  p->apRegion);.  
241c0 20 20 69 66 28 20 70 2d 3e 68 53 68 6d 3e 3d 30    if( p->hShm>=0
241d0 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
241e0 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68  _close(pFd, p->h
241f0 53 68 6d 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  Shm, __LINE__);.
24200 20 20 20 20 20 20 70 2d 3e 68 53 68 6d 20 3d 20        p->hShm = 
24210 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  -1;.    }.    p-
24220 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
24230 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
24240 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
24250 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4d 53  }../*.** The DMS
24260 20 6c 6f 63 6b 20 68 61 73 20 6e 6f 74 20 79 65   lock has not ye
24270 74 20 62 65 65 6e 20 74 61 6b 65 6e 20 6f 6e 20  t been taken on 
24280 73 68 6d 20 66 69 6c 65 20 70 53 68 6d 4e 6f 64  shm file pShmNod
24290 65 2e 20 41 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  e. Attempt to.**
242a0 20 74 61 6b 65 20 69 74 20 6e 6f 77 2e 20 52 65   take it now. Re
242b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
242c0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
242d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
242e0 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
242f0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
24300 20 44 4d 53 20 63 61 6e 6e 6f 74 20 62 65 20 6c   DMS cannot be l
24310 6f 63 6b 65 64 20 62 65 63 61 75 73 65 20 74 68  ocked because th
24320 69 73 20 69 73 20 61 20 72 65 61 64 6f 6e 6c 79  is is a readonly
24330 5f 73 68 6d 3d 31 20 0a 2a 2a 20 63 6f 6e 6e 65  _shm=1 .** conne
24340 63 74 69 6f 6e 20 61 6e 64 20 6e 6f 20 6f 74 68  ction and no oth
24350 65 72 20 70 72 6f 63 65 73 73 20 61 6c 72 65 61  er process alrea
24360 64 79 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 2c  dy holds a lock,
24370 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
24380 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49  E_READONLY_CANTI
24390 4e 49 54 20 61 6e 64 20 73 65 74 20 70 53 68 6d  NIT and set pShm
243a0 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64  Node->isUnlocked
243b0 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  =1..*/.static in
243c0 74 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64  t unixLockShared
243d0 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20  Memory(unixFile 
243e0 2a 70 44 62 46 64 2c 20 75 6e 69 78 53 68 6d 4e  *pDbFd, unixShmN
243f0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 29 7b 0a  ode *pShmNode){.
24400 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
24410 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
24420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
24430 20 55 73 65 20 46 5f 47 45 54 4c 4b 20 74 6f 20   Use F_GETLK to 
24440 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c 6f  determine the lo
24450 63 6b 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  cks other proces
24460 73 65 73 20 61 72 65 20 68 6f 6c 64 69 6e 67 0a  ses are holding.
24470 20 20 2a 2a 20 6f 6e 20 74 68 65 20 44 4d 53 20    ** on the DMS 
24480 62 79 74 65 2e 20 49 66 20 69 74 20 69 6e 64 69  byte. If it indi
24490 63 61 74 65 73 20 74 68 61 74 20 61 6e 6f 74 68  cates that anoth
244a0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
244b0 6c 64 69 6e 67 0a 20 20 2a 2a 20 61 20 53 48 41  lding.  ** a SHA
244c0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  RED lock, then t
244d0 68 69 73 20 70 72 6f 63 65 73 73 20 6d 61 79 20  his process may 
244e0 61 6c 73 6f 20 74 61 6b 65 20 61 20 53 48 41 52  also take a SHAR
244f0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  ED lock.  ** and
24500 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 6f 70   proceed with op
24510 65 6e 69 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20  ening the *-shm 
24520 66 69 6c 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  file. .  **.  **
24530 20 4f 72 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72   Or, if no other
24540 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
24550 69 6e 67 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ing any lock, th
24560 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 0a  en this process.
24570 20 20 2a 2a 20 69 73 20 74 68 65 20 66 69 72 73    ** is the firs
24580 74 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20 49 6e  t to open it. In
24590 20 74 68 69 73 20 63 61 73 65 20 74 61 6b 65 20   this case take 
245a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
245b0 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 44 4d  k on the.  ** DM
245c0 53 20 62 79 74 65 20 61 6e 64 20 74 72 75 6e 63  S byte and trunc
245d0 61 74 65 20 74 68 65 20 2a 2d 73 68 6d 20 66 69  ate the *-shm fi
245e0 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
245f0 20 69 6e 20 73 69 7a 65 2e 20 54 68 65 6e 0a 20   in size. Then. 
24600 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 20 74 6f   ** downgrade to
24610 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
24620 6e 20 74 68 65 20 44 4d 53 20 62 79 74 65 2e 0a  n the DMS byte..
24630 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 6f    **.  ** If ano
24640 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
24650 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
24660 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
24670 20 44 4d 53 20 62 79 74 65 2c 0a 20 20 2a 2a 20   DMS byte,.  ** 
24680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
24690 53 59 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  SY to the caller
246a0 20 28 69 74 20 77 69 6c 6c 20 74 72 79 20 61 67   (it will try ag
246b0 61 69 6e 29 2e 20 41 6e 20 65 61 72 6c 69 65 72  ain). An earlier
246c0 0a 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  .  ** version of
246d0 20 74 68 69 73 20 63 6f 64 65 20 61 74 74 65 6d   this code attem
246e0 70 74 65 64 20 74 68 65 20 53 48 41 52 45 44 20  pted the SHARED 
246f0 6c 6f 63 6b 20 61 74 20 74 68 69 73 20 70 6f 69  lock at this poi
24700 6e 74 2e 20 42 75 74 0a 20 20 2a 2a 20 74 68 69  nt. But.  ** thi
24710 73 20 69 6e 74 72 6f 64 75 63 65 64 20 61 20 73  s introduced a s
24720 75 62 74 6c 65 20 72 61 63 65 20 63 6f 6e 64 69  ubtle race condi
24730 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 70 72 6f  tion: if the pro
24740 63 65 73 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a  cess holding.  *
24750 2a 20 45 58 43 4c 55 53 49 56 45 20 66 61 69 6c  * EXCLUSIVE fail
24760 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  ed just before t
24770 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 2a 2d  runcating the *-
24780 73 68 6d 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  shm file, then t
24790 68 69 73 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  his.  ** process
247a0 20 6d 69 67 68 74 20 6f 70 65 6e 20 61 6e 64 20   might open and 
247b0 75 73 65 20 74 68 65 20 2a 2d 73 68 6d 20 66 69  use the *-shm fi
247c0 6c 65 20 77 69 74 68 6f 75 74 20 74 72 75 6e 63  le without trunc
247d0 61 74 69 6e 67 20 69 74 2e 0a 20 20 2a 2a 20 41  ating it..  ** A
247e0 6e 64 20 69 66 20 74 68 65 20 2a 2d 73 68 6d 20  nd if the *-shm 
247f0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f  file has been co
24800 72 72 75 70 74 65 64 20 62 79 20 61 20 70 6f 77  rrupted by a pow
24810 65 72 20 66 61 69 6c 75 72 65 20 6f 72 0a 20 20  er failure or.  
24820 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68 2c  ** system crash,
24830 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 74   the database it
24840 73 65 6c 66 20 6d 61 79 20 61 6c 73 6f 20 62 65  self may also be
24850 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 20 2a  come corrupt.  *
24860 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63  /.  lock.l_whenc
24870 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
24880 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 55  lock.l_start = U
24890 4e 49 58 5f 53 48 4d 5f 44 4d 53 3b 0a 20 20 6c  NIX_SHM_DMS;.  l
248a0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
248b0 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
248c0 5f 57 52 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _WRLCK;.  if( os
248d0 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fcntl(pShmNode->
248e0 68 53 68 6d 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  hShm, F_GETLK, &
248f0 6c 6f 63 6b 29 21 3d 30 20 29 20 7b 0a 20 20 20  lock)!=0 ) {.   
24900 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
24910 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65  RR_LOCK;.  }else
24920 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
24930 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
24940 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
24950 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20  sReadonly ){.   
24960 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55     pShmNode->isU
24970 6e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20  nlocked = 1;.   
24980 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
24990 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54  EADONLY_CANTINIT
249a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
249b0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
249c0 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
249d0 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
249e0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
249f0 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63    /* The first c
24a00 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 74 74  onnection to att
24a10 61 63 68 20 6d 75 73 74 20 74 72 75 6e 63 61 74  ach must truncat
24a20 65 20 74 68 65 20 2d 73 68 6d 20 66 69 6c 65 2e  e the -shm file.
24a30 20 20 57 65 0a 20 20 20 20 20 20 2a 2a 20 74 72    We.      ** tr
24a40 75 6e 63 61 74 65 20 74 6f 20 33 20 62 79 74 65  uncate to 3 byte
24a50 73 20 28 61 6e 20 61 72 62 69 74 72 61 72 79 20  s (an arbitrary 
24a60 73 6d 61 6c 6c 20 6e 75 6d 62 65 72 2c 20 6c 65  small number, le
24a70 73 73 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20  ss than the.    
24a80 20 20 2a 2a 20 2d 73 68 6d 20 68 65 61 64 65 72    ** -shm header
24a90 20 73 69 7a 65 29 20 72 61 74 68 65 72 20 74 68   size) rather th
24aa0 61 6e 20 30 20 61 73 20 61 20 73 79 73 74 65 6d  an 0 as a system
24ab0 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2c 20   debugging aid, 
24ac0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 68 65 6c 70  to.      ** help
24ad0 20 64 65 74 65 63 74 20 69 66 20 61 20 2d 73 68   detect if a -sh
24ae0 6d 20 66 69 6c 65 20 74 72 75 6e 63 61 74 69 6f  m file truncatio
24af0 6e 20 69 73 20 6c 65 67 69 74 69 6d 61 74 65 20  n is legitimate 
24b00 6f 72 20 69 73 20 74 68 65 20 77 6f 72 6b 0a 20  or is the work. 
24b10 20 20 20 20 20 2a 2a 20 6f 72 20 61 20 72 6f 67       ** or a rog
24b20 75 65 20 70 72 6f 63 65 73 73 2e 20 2a 2f 0a 20  ue process. */. 
24b30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
24b40 49 54 45 5f 4f 4b 20 26 26 20 72 6f 62 75 73 74  ITE_OK && robust
24b50 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
24b60 6f 64 65 2d 3e 68 53 68 6d 2c 20 33 29 20 29 7b  ode->hShm, 3) ){
24b70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
24b80 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
24b90 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
24ba0 22 66 74 72 75 6e 63 61 74 65 22 2c 70 53 68 6d  "ftruncate",pShm
24bb0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
24bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24bd0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
24be0 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
24bf0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
24c00 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
24c10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24c20 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
24c30 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46  ( lock.l_type==F
24c40 5f 55 4e 4c 43 4b 20 7c 7c 20 6c 6f 63 6b 2e 6c  _UNLCK || lock.l
24c50 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
24c60 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53  ;.    rc = unixS
24c70 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
24c80 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49  Fd, F_RDLCK, UNI
24c90 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
24ca0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
24cc0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
24cd0 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
24ce0 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  th open database
24cf0 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a   file pDbFd.  .*
24d00 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
24d10 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
24d20 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69   uses mmapped fi
24d30 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  les..**.** The f
24d40 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ile used to impl
24d50 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d  ement shared-mem
24d60 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61  ory is in the sa
24d70 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  me directory.** 
24d80 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
24d90 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61  base file and ha
24da0 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
24db0 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
24dc0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74  base.** file wit
24dd0 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66  h the "-shm" suf
24de0 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20  fix added.  For 
24df0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
24e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
24e10 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31   is "/home/user1
24e20 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e  /config.db" then
24e30 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69   the file that i
24e40 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d  s created and mm
24e50 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61  apped.** for sha
24e60 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
24e70 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65  be called "/home
24e80 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
24e90 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  -shm".  .**.** A
24ea0 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20  nother approach 
24eb0 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c  to is to use fil
24ec0 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f  es in /dev/shm o
24ed0 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e  r /dev/tmp or an
24ee0 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74  .** some other t
24ef0 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20  mpfs mount. But 
24f00 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64  if a file in a d
24f10 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f  ifferent directo
24f20 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  ry.** from the d
24f30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
24f40 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65  used, then diffe
24f50 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d  ring access perm
24f60 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20  issions.** or a 
24f70 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63  chroot() might c
24f80 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65  ause two differe
24f90 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20  nt processes on 
24fa0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61  the same.** data
24fb0 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75  base to end up u
24fc0 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66  sing different f
24fd0 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20  iles for shared 
24fe0 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61  memory - .** mea
24ff0 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20  ning that their 
25000 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74  memory would not
25010 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65   really be share
25020 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  d - resulting.**
25030 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72   in database cor
25040 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74  ruption.  Nevert
25050 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70  heless, this tmp
25060 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a  fs file usage.**
25070 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20   can be enabled 
25080 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
25090 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53  using -DSQLITE_S
250a0 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64  HM_DIRECTORY="/d
250b0 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68  ev/shm".** or th
250c0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54  e equivalent.  T
250d0 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51  he use of the SQ
250e0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
250f0 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  RY compile-time.
25100 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74  ** option result
25110 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  s in an incompat
25120 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51  ible build of SQ
25130 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66  Lite;  builds of
25140 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20   SQLite.** that 
25150 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53  with differing S
25160 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
25170 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74  ORY settings att
25180 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a  empt to use the.
25190 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  ** same database
251a0 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
251b0 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65  e time, database
251c0 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
251d0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
251e0 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48  t. The SQLITE_SH
251f0 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
25200 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
25210 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a  is considered.**
25220 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61   "unsupported" a
25230 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69  nd may go away i
25240 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74  n a future SQLit
25250 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a  e release..**.**
25260 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
25270 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
25280 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
25290 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
252a0 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
252b0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
252c0 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
252d0 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
252e0 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
252f0 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
25300 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
25310 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
25320 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
25330 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eared..**.** If 
25340 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
25350 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46  abase file (pDbF
25360 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  d) is using the 
25370 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a  "unix-excl" VFS.
25380 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
25390 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  at an exclusive 
253a0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
253b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
253c0 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f  e and.** that no
253d0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
253e0 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61   are able to rea
253f0 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64  d or write the d
25400 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20  atabase.  In.** 
25410 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f  that case, we do
25420 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64   not really need
25430 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
25440 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   No shared memor
25450 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65  y.** file is cre
25460 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65  ated.  The share
25470 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
25480 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20   simulated with 
25490 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  heap memory..*/.
254a0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
254b0 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
254c0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29  unixFile *pDbFd)
254d0 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
254e0 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
254f0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
25500 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
25510 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
25520 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
25530 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75  Node;   /* The u
25540 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
25550 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
25560 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
25570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25580 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
25590 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
255a0 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
255b0 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20  /* The inode of 
255c0 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  fd */.  char *zS
255d0 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
255e0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
255f0 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d  ile used for SHM
25600 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69   */.  int nShmFi
25610 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
25620 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
25630 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d   the SHM filenam
25640 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
25650 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
25660 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  ce for the new u
25670 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a  nixShm object. *
25680 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  /.  p = sqlite3_
25690 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
256a0 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
256b0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
256c0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
256d0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
256e0 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73  zeof(*p));.  ass
256f0 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
25700 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
25710 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 75  ck to see if a u
25720 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
25730 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
25740 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73 74  . Reuse an exist
25750 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20  ing.  ** one if 
25760 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20  present. Create 
25770 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
25780 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 61  essary..  */.  a
25790 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d  ssert( unixFileM
257a0 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 44 62 46  utexNotheld(pDbF
257b0 64 29 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  d) );.  unixEnte
257c0 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
257d0 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
257e0 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  de;.  pShmNode =
257f0 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
25800 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  e;.  if( pShmNod
25810 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  e==0 ){.    stru
25820 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25840 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66  * fstat() info f
25850 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
25860 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
25870 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
25880 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
25890 2a 7a 42 61 73 65 50 61 74 68 20 3d 20 70 44 62  *zBasePath = pDb
258a0 46 64 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69  Fd->zPath;.#endi
258b0 66 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66  f..    /* Call f
258c0 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65  stat() to figure
258d0 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73   out the permiss
258e0 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61  ions on the data
258f0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20  base file. If.  
25900 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d    ** a new *-shm
25910 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
25920 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c  , an attempt wil
25930 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65  l be made to cre
25940 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69  ate it.    ** wi
25950 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  th the same perm
25960 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a  issions..    */.
25970 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
25980 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
25990 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
259a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
259b0 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
259c0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
259d0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
259e0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
259f0 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
25a00 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
25a10 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
25a20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
25a30 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
25a40 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   + (int)strlen(z
25a50 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64 69  BasePath);.#endi
25a60 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
25a70 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
25a80 34 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  4( sizeof(*pShmN
25a90 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
25aa0 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
25ab0 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
25ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25ad0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
25ae0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
25af0 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  err;.    }.    m
25b00 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20  emset(pShmNode, 
25b10 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  0, sizeof(*pShmN
25b20 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d  ode)+nShmFilenam
25b30 65 29 3b 0a 20 20 20 20 7a 53 68 6d 20 3d 20 70  e);.    zShm = p
25b40 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
25b50 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68  me = (char*)&pSh
25b60 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66  mNode[1];.#ifdef
25b70 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
25b80 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65  CTORY.    sqlite
25b90 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
25ba0 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 0a  ilename, zShm, .
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bc0 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f       SQLITE_SHM_
25bd0 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69  DIRECTORY "/sqli
25be0 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20  te-shm-%x-%x",. 
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c00 20 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73      (u32)sStat.s
25c10 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61  t_ino, (u32)sSta
25c20 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65  t.st_dev);.#else
25c30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
25c40 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
25c50 6d 65 2c 20 7a 53 68 6d 2c 20 22 25 73 2d 73 68  me, zShm, "%s-sh
25c60 6d 22 2c 20 7a 42 61 73 65 50 61 74 68 29 3b 0a  m", zBasePath);.
25c70 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
25c80 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
25c90 61 74 68 2c 20 7a 53 68 6d 29 3b 0a 23 65 6e 64  ath, zShm);.#end
25ca0 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
25cb0 3e 68 53 68 6d 20 3d 20 2d 31 3b 0a 20 20 20 20  >hShm = -1;.    
25cc0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
25cd0 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
25ce0 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
25cf0 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64  ->pInode = pDbFd
25d00 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 66  ->pInode;.    if
25d10 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
25d20 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
25d30 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   ){.      pShmNo
25d40 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 20 3d 20  de->pShmMutex = 
25d50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
25d60 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
25d70 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 69 66  _FAST);.      if
25d80 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d  ( pShmNode->pShm
25d90 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Mutex==0 ){.    
25da0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25db0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
25dc0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
25dd0 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  n_err;.      }. 
25de0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
25df0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
25e00 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ck==0 ){.      i
25e10 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 75 72  f( 0==sqlite3_ur
25e20 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d  i_boolean(pDbFd-
25e30 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c  >zPath, "readonl
25e40 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20  y_shm", 0) ){.  
25e50 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
25e60 68 53 68 6d 20 3d 20 72 6f 62 75 73 74 5f 6f 70  hShm = robust_op
25e70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 57 52 7c  en(zShm, O_RDWR|
25e80 4f 5f 43 52 45 41 54 2c 28 73 53 74 61 74 2e 73  O_CREAT,(sStat.s
25e90 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20  t_mode&0777));. 
25ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
25eb0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3c   pShmNode->hShm<
25ec0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  0 ){.        pSh
25ed0 6d 4e 6f 64 65 2d 3e 68 53 68 6d 20 3d 20 72 6f  mNode->hShm = ro
25ee0 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20  bust_open(zShm, 
25ef0 4f 5f 52 44 4f 4e 4c 59 2c 20 28 73 53 74 61 74  O_RDONLY, (sStat
25f00 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b  .st_mode&0777));
25f10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 68  .        if( pSh
25f20 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3c 30 20 29 7b  mNode->hShm<0 ){
25f30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25f40 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
25f50 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
25f60 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 29  T, "open", zShm)
25f70 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
25f80 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
25f90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25fa0 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
25fb0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
25fc0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
25fd0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
25fe0 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c  running as root,
25ff0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
26000 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20  the SHM file.   
26010 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62     ** is owned b
26020 79 20 74 68 65 20 73 61 6d 65 20 75 73 65 72 20  y the same user 
26030 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72  that owns the or
26040 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e  iginal database.
26050 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20    Otherwise,.   
26060 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
26070 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f  al owner will no
26080 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e  t be able to con
26090 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nect..      */. 
260a0 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77       robustFchow
260b0 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d  n(pShmNode->hShm
260c0 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20  , sStat.st_uid, 
260d0 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 0a  sStat.st_gid);..
260e0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
260f0 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  ockSharedMemory(
26100 70 44 62 46 64 2c 20 70 53 68 6d 4e 6f 64 65 29  pDbFd, pShmNode)
26110 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
26120 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
26130 3d 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  =SQLITE_READONLY
26140 5f 43 41 4e 54 49 4e 49 54 20 29 20 67 6f 74 6f  _CANTINIT ) goto
26150 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
26160 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
26170 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
26180 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
26190 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  f the unixShmNod
261a0 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
261b0 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
261c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
261d0 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
261e0 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
261f0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
26200 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
26210 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
26220 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
26230 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
26240 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
26250 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
26260 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
26270 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
26280 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
26290 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
262a0 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
262b0 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
262c0 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
262d0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f  truct unixShm) o
262e0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
262f0 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
26300 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
26310 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
26320 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
26330 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
26340 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
26350 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
26360 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
26370 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
26380 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
26390 67 20 74 68 65 0a 20 20 2a 2a 20 70 53 68 6d 4e  g the.  ** pShmN
263a0 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 2e 0a  ode->pShmMutex..
263b0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
263c0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
263d0 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b  ode->pShmMutex);
263e0 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
263f0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
26400 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
26410 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
26420 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
26430 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65  hmNode->pShmMute
26440 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
26450 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
26460 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
26470 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
26480 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
26490 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
264a0 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
264b0 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
264c0 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
264d0 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
264e0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
264f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26500 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26510 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
26520 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
26530 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
26540 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
26550 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
26560 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
26570 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
26580 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
26590 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
265a0 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
265b0 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
265c0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
265d0 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
265e0 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
265f0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
26600 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
26610 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
26620 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
26630 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
26640 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
26650 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
26660 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
26670 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
26680 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
26690 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
266a0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
266b0 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
266c0 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
266d0 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
266e0 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
266f0 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
26700 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
26710 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
26720 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
26730 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
26740 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
26750 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
26760 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
26770 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
26780 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
26790 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
267a0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
267b0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
267c0 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
267d0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
267e0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
267f0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
26800 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
26810 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
26820 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
26830 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
26840 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
26850 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
26860 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
26870 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
26880 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
26890 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
268a0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
268b0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
268c0 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
268d0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
268e0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
268f0 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
26900 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
26910 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26930 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
26940 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
26950 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
26960 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
26970 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
26980 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
269b0 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
269c0 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
269d0 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
269e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
269f0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
26a00 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
26a10 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
26a20 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
26a30 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
26a40 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
26a50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26a60 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50  _OK;.  int nShmP
26a70 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
26a80 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
26a90 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b   int nReqRegion;
26aa0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
26ab0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
26ac0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
26ad0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
26ae0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
26af0 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
26b00 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
26b10 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
26b20 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
26b30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
26b40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
26b50 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
26b60 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
26b70 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
26b80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
26b90 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68  er(pShmNode->pSh
26ba0 6d 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70  mMutex);.  if( p
26bb0 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63  ShmNode->isUnloc
26bc0 6b 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ked ){.    rc = 
26bd0 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65  unixLockSharedMe
26be0 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53 68 6d  mory(pDbFd, pShm
26bf0 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Node);.    if( r
26c00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
26c10 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
26c20 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69  .    pShmNode->i
26c30 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20  sUnlocked = 0;. 
26c40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52   }.  assert( szR
26c50 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
26c60 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
26c70 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
26c80 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
26c90 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
26ca0 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
26cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
26cc0 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20 7c 7c  Node->hShm>=0 ||
26cd0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
26ce0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20  bProcessLock==1 
26cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
26d00 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3c 30 20 7c 7c  mNode->hShm<0 ||
26d10 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
26d20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
26d30 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  );..  /* Minimum
26d40 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f   number of regio
26d50 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 62  ns required to b
26d60 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e  e mapped. */.  n
26d70 52 65 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52  ReqRegion = ((iR
26d80 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70  egion+nShmPerMap
26d90 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20  ) / nShmPerMap) 
26da0 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20  * nShmPerMap;.. 
26db0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
26dc0 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f  Region<nReqRegio
26dd0 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
26de0 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
26df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26e00 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72  ew apRegion[] ar
26e10 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
26e20 42 79 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f  Byte = nReqRegio
26e30 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a  n*szRegion;   /*
26e40 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
26e50 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
26e60 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
26e70 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
26e80 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79        /* Used by
26e90 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20   fstat() */..   
26ea0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67   pShmNode->szReg
26eb0 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a  ion = szRegion;.
26ec0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
26ed0 65 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20  e->hShm>=0 ){.  
26ee0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
26ef0 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
26f00 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
26f10 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
26f20 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
26f30 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
26f40 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
26f50 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
26f60 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
26f70 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
26f80 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
26f90 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
26fa0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
26fb0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
26fc0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
26fd0 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c 20 26 73  hmNode->hShm, &s
26fe0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stat) ){.       
26ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
27000 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20  RR_SHMSIZE;.    
27010 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
27020 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
27030 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74  .      if( sStat
27040 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29  .st_size<nByte )
27050 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
27060 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
27070 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
27080 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74  t exist. If bExt
27090 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20  end is set to.  
270a0 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20        ** false, 
270b0 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
270c0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
270d0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
270e0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
270f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
27100 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b 0a 20  f( !bExtend ){. 
27110 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
27120 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
27130 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
27140 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
27150 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74 72  if bExtend is tr
27160 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65 20 66  ue, extend the f
27170 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62 79 0a  ile. Do this by.
27180 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74 69          ** writi
27190 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
271a0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 65   to the end of e
271b0 61 63 68 20 28 4f 53 29 20 70 61 67 65 20 62 65  ach (OS) page be
271c0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
271d0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65  llocated or exte
271e0 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c  nded. Technicall
271f0 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20  y, we need only 
27200 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20 20  write to the.   
27210 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70 61 67       ** last pag
27220 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 78  e in order to ex
27230 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 42  tend the file. B
27240 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6c  ut writing to al
27250 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a  l new.        **
27260 20 70 61 67 65 73 20 66 6f 72 63 65 73 20 74 68   pages forces th
27270 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65  e OS to allocate
27280 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c   them immediatel
27290 79 2c 20 77 68 69 63 68 20 72 65 64 75 63 65 73  y, which reduces
272a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
272b0 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47 42 55  chances of SIGBU
272c0 53 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  S while accessin
272d0 67 20 74 68 65 20 6d 61 70 70 65 64 20 72 65 67  g the mapped reg
272e0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20  ion later on..  
272f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27300 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20   else{.         
27310 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
27320 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20  t pgsz = 4096;. 
27330 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 67           int iPg
27340 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
27350 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c 61 73  Write to the las
27360 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20 6e  t byte of each n
27370 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f  ewly allocated o
27380 72 20 65 78 74 65 6e 64 65 64 20 70 61 67 65 20  r extended page 
27390 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
273a0 65 72 74 28 20 28 6e 42 79 74 65 20 25 20 70 67  ert( (nByte % pg
273b0 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sz)==0 );.      
273c0 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73 53 74      for(iPg=(sSt
273d0 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29  at.st_size/pgsz)
273e0 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70 67 73  ; iPg<(nByte/pgs
273f0 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  z); iPg++){.    
27400 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
27410 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
27420 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  f( seekAndWriteF
27430 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d  d(pShmNode->hShm
27440 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73  , iPg*pgsz + pgs
27450 7a 2d 31 2c 22 22 2c 31 2c 26 78 29 21 3d 31 20  z-1,"",1,&x)!=1 
27460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27470 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
27480 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  le = pShmNode->z
27490 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
274a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
274b0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
274c0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
274d0 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b  "write", zFile);
274e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
274f0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
27500 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27510 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27520 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27530 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
27540 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
27550 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
27560 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
27570 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
27580 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68  .    apNew = (ch
27590 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  ar **)sqlite3_re
275a0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
275b0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
275c0 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69  n, nReqRegion*si
275d0 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20  zeof(char *).   
275e0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e   );.    if( !apN
275f0 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
27600 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
27610 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
27620 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
27630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
27640 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d  Node->apRegion =
27650 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c   apNew;.    whil
27660 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  e( pShmNode->nRe
27670 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20  gion<nReqRegion 
27680 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 61  ){.      int nMa
27690 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68  p = szRegion*nSh
276a0 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 20 20 69  mPerMap;.      i
276b0 6e 74 20 69 3b 0a 20 20 20 20 20 20 76 6f 69 64  nt i;.      void
276c0 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66   *pMem;.      if
276d0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d  ( pShmNode->hShm
276e0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  >=0 ){.        p
276f0 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  Mem = osMmap(0, 
27700 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20  nMap,.          
27710 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
27720 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45  adonly ? PROT_RE
27730 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50  AD : PROT_READ|P
27740 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20  ROT_WRITE, .    
27750 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52          MAP_SHAR
27760 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53  ED, pShmNode->hS
27770 68 6d 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36  hm, szRegion*(i6
27780 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  4)pShmNode->nReg
27790 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ion.        );. 
277a0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
277b0 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
277c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
277d0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
277e0 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
277f0 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65  "mmap", pShmNode
27800 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
27810 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
27820 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
27830 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
27840 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
27850 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
27860 28 6e 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  (nMap);.        
27870 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20  if( pMem==0 ){. 
27880 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
27890 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
278a0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
278b0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
278c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
278d0 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 6e  emset(pMem, 0, n
278e0 4d 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Map);.      }.. 
278f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
27900 6e 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29  nShmPerMap; i++)
27910 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  {.        pShmNo
27920 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68  de->apRegion[pSh
27930 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69  mNode->nRegion+i
27940 5d 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65  ] = &((char*)pMe
27950 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a  m)[szRegion*i];.
27960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
27970 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20  hmNode->nRegion 
27980 2b 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  += nShmPerMap;. 
27990 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
279a0 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
279b0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
279c0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70  Region ){.    *p
279d0 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70  p = pShmNode->ap
279e0 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b  Region[iRegion];
279f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
27a00 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
27a10 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
27a20 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c  donly && rc==SQL
27a30 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
27a40 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
27a50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
27a60 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 70  eave(pShmNode->p
27a70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ShmMutex);.  ret
27a80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27a90 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
27aa0 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
27ab0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
27ac0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  nt..**.** Note t
27ad0 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  hat the relation
27ae0 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41  ship between SHA
27af0 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56  REd and EXCLUSIV
27b00 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74  E locks is a lit
27b10 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  tle.** different
27b20 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f   here than in po
27b30 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63  six.  In xShmLoc
27b40 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20  k(), one can go 
27b50 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a  from unlocked.**
27b60 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62   to shared and b
27b70 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f  ack or from unlo
27b80 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  cked to exclusiv
27b90 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74  e and back.  But
27ba0 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20   one may.** not 
27bb0 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74  go from shared t
27bc0 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66  o exclusive or f
27bd0 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f  rom exclusive to
27be0 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74   shared..*/.stat
27bf0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f  ic int unixShmLo
27c00 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
27c10 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
27c20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
27c30 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
27c40 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
27c50 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
27c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27c70 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
27c80 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
27c90 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
27ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
27cc0 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
27cd0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
27ce0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
27cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
27d00 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
27d10 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  lock */.){.  uni
27d20 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
27d30 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20  unixFile*)fd;   
27d40 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
27d50 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
27d60 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78  memory */.  unix
27d70 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
27d80 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
27d90 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
27da0 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
27db0 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ked */.  unixShm
27dc0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27de0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
27df0 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
27e00 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
27e10 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
27e20 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68  pShmNode;  /* Th
27e30 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c  e underlying fil
27e40 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  e iNode */.  int
27e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e70 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
27e80 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27eb0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
27ec0 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
27ed0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
27ee0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
27ef0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
27f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
27f10 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
27f20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
27f30 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
27f40 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
27f50 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
27f60 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
27f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
27f80 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
27f90 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
27fa0 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
27fb0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
27fc0 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
27fd0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
27fe0 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
27ff0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
28000 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
28010 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
28020 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
28030 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
28040 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
28050 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
28060 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
28070 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
28080 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
28090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
280a0 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20  hmNode->hShm>=0 
280b0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
280c0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
280d0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
280e0 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3c 30 20  ShmNode->hShm<0 
280f0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
28100 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
28110 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
28120 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
28130 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65  1<<ofst);.  asse
28140 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
28150 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
28160 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
28170 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53  ter(pShmNode->pS
28180 68 6d 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  hmMutex);.  if( 
28190 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
281a0 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
281b0 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30   u16 allMask = 0
281c0 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63  ; /* Mask of loc
281d0 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
281e0 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
281f0 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e  ee if any siblin
28200 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d  gs hold this sam
28210 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f  e lock */.    fo
28220 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
28230 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
28240 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
28250 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
28260 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
28270 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
28280 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
28290 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
282a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  ==0 );.      all
282b0 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
282c0 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
282d0 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65     /* Unlock the
282e0 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
282f0 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  cks */.    if( (
28300 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d  mask & allMask)=
28310 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
28320 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
28330 63 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e 4c 43  ck(pDbFd, F_UNLC
28340 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
28350 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
28360 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
28370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28380 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
28390 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
283a0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
283b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
283c0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
283d0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
283e0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
283f0 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
28400 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
28410 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
28420 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
28430 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
28440 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
28450 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
28460 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
28470 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
28480 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
28490 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
284a0 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
284b0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
284c0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
284d0 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
284e0 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
284f0 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
28500 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
28510 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
28520 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
28530 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
28540 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
28550 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
28560 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
28570 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
28580 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28590 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
285a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
285b0 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
285c0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
285d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
285e0 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
285f0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
28600 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
28610 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
28620 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28630 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
28640 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
28650 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
28660 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
28670 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
28680 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
28690 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
286a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
286b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
286c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
286d0 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
286e0 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
286f0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
28700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28710 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
28720 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
28730 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
28740 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
28750 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
28760 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
28770 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
28780 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
28790 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
287a0 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
287b0 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
287c0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
287d0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
287e0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
287f0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
28800 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
28810 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
28820 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
28830 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
28840 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
28850 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28860 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
28870 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
28880 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
28890 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
288a0 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
288b0 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
288c0 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
288d0 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
288e0 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
288f0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
28900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28910 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
28920 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
28930 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _WRLCK, ofst+UNI
28940 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
28950 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28970 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
28980 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
28990 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
289a0 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
289b0 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
289c0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
289d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
289e0 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78  mNode->pShmMutex
289f0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
28a00 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64  HM-LOCK shmid-%d
28a10 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33  , pid-%d got %03
28a20 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20  x,%03x\n",.     
28a30 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 6f 73 47        p->id, osG
28a40 65 74 70 69 64 28 30 29 2c 20 70 2d 3e 73 68 61  etpid(0), p->sha
28a50 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
28a60 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e  Mask));.  return
28a70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
28a80 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
28a90 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
28aa0 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
28ab0 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
28ac0 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
28ad0 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
28ae0 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
28af0 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
28b00 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
28b10 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
28b20 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
28b30 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
28b40 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  id unixShmBarrie
28b50 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
28b60 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20  e *fd           
28b70 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
28b80 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
28b90 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
28ba0 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
28bb0 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
28bc0 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61 72  sqlite3MemoryBar
28bd0 72 69 65 72 28 29 3b 20 20 20 20 20 20 20 20 20  rier();         
28be0 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69  /* compiler-defi
28bf0 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  ned memory barri
28c00 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
28c10 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c  fd->pMethods->xL
28c20 6f 63 6b 3d 3d 6e 6f 6c 6f 63 6b 4c 6f 63 6b 20  ock==nolockLock 
28c30 0a 20 20 20 20 20 20 20 7c 7c 20 75 6e 69 78 46  .       || unixF
28c40 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28  ileMutexNotheld(
28c50 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 29 20 0a  (unixFile*)fd) .
28c60 20 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72    );.  unixEnter
28c70 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20  Mutex();        
28c80 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d         /* Also m
28c90 75 74 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64  utex, for redund
28ca0 61 6e 63 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65  ancy */.  unixLe
28cb0 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
28cc0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
28cd0 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
28ce0 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
28cf0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
28d00 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
28d10 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
28d20 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
28d30 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20  re is no shared 
28d40 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
28d50 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65  d with the conne
28d60 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a  ction then this.
28d70 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  ** routine is a 
28d80 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a  harmless no-op..
28d90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
28da0 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  ixShmUnmap(.  sq
28db0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28dd0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
28de0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
28df0 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
28e00 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
28e10 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61     /* Delete sha
28e20 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72  red-memory if tr
28e30 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  ue */.){.  unixS
28e40 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
28e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28e60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
28e70 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75  be closed */.  u
28e80 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
28e90 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
28ea0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
28eb0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
28ec0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ile */.  unixShm
28ed0 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
28ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
28ef0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
28f00 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
28f10 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
28f20 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20  pDbFd;          
28f30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
28f40 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
28f50 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46   file */..  pDbF
28f60 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
28f70 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
28f80 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
28f90 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
28fa0 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
28fb0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
28fc0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
28fd0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
28fe0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
28ff0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
29000 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
29010 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f  ->pInode );..  /
29020 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  * Remove connect
29030 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73  ion p from the s
29040 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  et of connection
29050 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  s associated.  *
29060 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20  * with pShmNode 
29070 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
29080 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
29090 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20  e->pShmMutex);. 
290a0 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64   for(pp=&pShmNod
290b0 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
290c0 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
290d0 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
290e0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
290f0 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
29100 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71  ection p */.  sq
29110 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
29120 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30   pDbFd->pShm = 0
29130 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
29140 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
29150 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 0a 20  ->pShmMutex);.. 
29160 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
29170 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
29180 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
29190 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
291a0 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
291b0 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
291c0 20 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c   assert( unixFil
291d0 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 44  eMutexNotheld(pD
291e0 62 46 64 29 20 29 3b 0a 20 20 75 6e 69 78 45 6e  bFd) );.  unixEn
291f0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
29200 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
29210 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
29220 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
29230 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
29240 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef==0 ){.    if(
29250 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70   deleteFlag && p
29260 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30  ShmNode->hShm>=0
29270 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
29280 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  nk(pShmNode->zFi
29290 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  lename);.    }. 
292a0 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28     unixShmPurge(
292b0 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  pDbFd);.  }.  un
292c0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
292d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
292e0 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23  _OK;.}...#else.#
292f0 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d   define unixShmM
29300 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
29310 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20  e unixShmLock   
29320 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
29330 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
29340 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d  efine unixShmUnm
29350 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
29360 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
29370 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66  OMIT_WAL */..#if
29380 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
29390 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66  _SIZE>0./*.** If
293a0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
293b0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20   memory mapped, 
293c0 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a  unmap file pFd..
293d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
293e0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69  nixUnmapfile(uni
293f0 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61  xFile *pFd){.  a
29400 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
29410 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 69 66 64  chOut==0 );.#ifd
29420 65 66 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44  ef SQLITE_SHARED
29430 5f 4d 41 50 50 49 4e 47 0a 20 20 69 66 28 20 70  _MAPPING.  if( p
29440 46 64 2d 3e 70 49 6e 6f 64 65 20 29 20 72 65 74  Fd->pInode ) ret
29450 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  urn;.#endif.  if
29460 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
29470 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61  n ){.    osMunma
29480 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  p(pFd->pMapRegio
29490 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  n, pFd->mmapSize
294a0 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64  Actual);.    pFd
294b0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
294c0 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
294d0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64  ize = 0;.    pFd
294e0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
294f0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
29500 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
29510 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
29520 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
29530 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66   maintained by f
29540 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74  ile .** descript
29550 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62  or pFd to nNew b
29560 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69  ytes. Any existi
29570 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69  ng mapping is di
29580 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  scarded..**.** I
29590 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
295a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
295b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
295c0 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ariables:.**.** 
295d0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70        unixFile.p
295e0 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20  MapRegion.**    
295f0 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70     unixFile.mmap
29600 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e  Size.**       un
29610 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41  ixFile.mmapSizeA
29620 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75  ctual.**.** If u
29630 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20  nsuccessful, an 
29640 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
29650 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69   logged via sqli
29660 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a  te3_log() and.**
29670 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69 61   the three varia
29680 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a  bles above are z
29690 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63  eroed. In this c
296a0 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c  ase SQLite shoul
296b0 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63  d.** continue ac
296c0 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61  cessing the data
296d0 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 78  base using the x
296e0 52 65 61 64 28 29 20 61 6e 64 20 78 57 72 69 74  Read() and xWrit
296f0 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a  e().** methods..
29700 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
29710 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20  nixRemapfile(.  
29720 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20  unixFile *pFd,  
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29740 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
29750 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  or object */.  i
29760 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20  64 nNew         
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29780 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70 70 69  * Required mappi
29790 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20  ng size */.){.  
297a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
297b0 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74   = "mmap";.  int
297c0 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20   h = pFd->h;    
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297e0 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
297f0 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20  ptor open on db 
29800 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f  file */.  u8 *pO
29810 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d  rig = (u8 *)pFd-
29820 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f  >pMapRegion;   /
29830 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
29840 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e  rent file mappin
29850 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67  g */.  i64 nOrig
29860 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
29870 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53  Actual;     /* S
29880 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67  ize of pOrig reg
29890 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ion in bytes */.
298a0 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20    u8 *pNew = 0; 
298b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69         /* Locati
298d0 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e  on of new mappin
298e0 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  g */.  int flags
298f0 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20   = PROT_READ;   
29900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29910 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
29920 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73  mmap() */..  ass
29930 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
29940 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Out==0 );.  asse
29950 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d  rt( nNew>pFd->mm
29960 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  apSize );.  asse
29970 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d  rt( nNew<=pFd->m
29980 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20  mapSizeMax );.  
29990 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29  assert( nNew>0 )
299a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ;.  assert( pFd-
299b0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e  >mmapSizeActual>
299c0 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
299d0 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f  ;.  assert( MAP_
299e0 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69  FAILED!=0 );..#i
299f0 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50  fdef SQLITE_MMAP
29a00 5f 52 45 41 44 57 52 49 54 45 0a 20 20 69 66 28  _READWRITE.  if(
29a10 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73   (pFd->ctrlFlags
29a20 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e   & UNIXFILE_RDON
29a30 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c  LY)==0 ) flags |
29a40 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65  = PROT_WRITE;.#e
29a50 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72 69  ndif..  if( pOri
29a60 67 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52  g ){.#if HAVE_MR
29a70 45 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65  EMAP.    i64 nRe
29a80 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  use = pFd->mmapS
29a90 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63  ize;.#else.    c
29aa0 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61  onst int szSyspa
29ab0 67 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69  ge = osGetpagesi
29ac0 7a 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52  ze();.    i64 nR
29ad0 65 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61  euse = (pFd->mma
29ae0 70 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70  pSize & ~(szSysp
29af0 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  age-1));.#endif.
29b00 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26      u8 *pReq = &
29b10 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a  pOrig[nReuse];..
29b20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79      /* Unmap any
29b30 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78   pages of the ex
29b40 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74  isting mapping t
29b50 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  hat cannot be re
29b60 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  used. */.    if(
29b70 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29   nReuse!=nOrig )
29b80 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70  {.      osMunmap
29b90 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65  (pReq, nOrig-nRe
29ba0 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  use);.    }..#if
29bb0 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20   HAVE_MREMAP.   
29bc0 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70   pNew = osMremap
29bd0 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20  (pOrig, nReuse, 
29be0 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59  nNew, MREMAP_MAY
29bf0 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20  MOVE);.    zErr 
29c00 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73  = "mremap";.#els
29c10 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  e.    pNew = osM
29c20 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e  map(pReq, nNew-n
29c30 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41  Reuse, flags, MA
29c40 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65  P_SHARED, h, nRe
29c50 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  use);.    if( pN
29c60 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew!=MAP_FAILED )
29c70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  {.      if( pNew
29c80 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20  !=pReq ){.      
29c90 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c    osMunmap(pNew,
29ca0 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b   nNew - nReuse);
29cb0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
29cc0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
29cd0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
29ce0 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Orig;.      }.  
29cf0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
29d00 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74  /* The attempt t
29d10 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69  o extend the exi
29d20 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61  sting mapping fa
29d30 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a  iled. Free it. *
29d40 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  /.    if( pNew==
29d50 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e  MAP_FAILED || pN
29d60 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  ew==0 ){.      o
29d70 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e  sMunmap(pOrig, n
29d80 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Reuse);.    }.  
29d90 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20  }..  /* If pNew 
29da0 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74  is still NULL, t
29db0 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ry to create an 
29dc0 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70  entirely new map
29dd0 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ping. */.  if( p
29de0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  New==0 ){.    pN
29df0 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e  ew = osMmap(0, n
29e00 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f  New, flags, MAP_
29e10 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20  SHARED, h, 0);. 
29e20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   }..  if( pNew==
29e30 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
29e40 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
29e50 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e  nNew = 0;.    un
29e60 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
29e70 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d  E_OK, zErr, pFd-
29e80 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a  >zPath);..    /*
29e90 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61   If the mmap() a
29ea0 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73  bove failed, ass
29eb0 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62  ume that all sub
29ec0 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63  sequent mmap() c
29ed0 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  alls.    ** will
29ee0 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74   probably fail t
29ef0 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f  oo. Fall back to
29f00 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72   using xRead/xWr
29f10 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a  ite exclusively.
29f20 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63      ** in this c
29f30 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64  ase.  */.    pFd
29f40 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
29f50 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d  0;.  }.  pFd->pM
29f60 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64  apRegion = (void
29f70 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e   *)pNew;.  pFd->
29f80 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e  mmapSize = pFd->
29f90 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
29fa0 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nNew;.}../*.** 
29fb0 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65  Memory map or re
29fc0 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65  map the file ope
29fd0 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63  ned by file-desc
29fe0 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74  riptor pFd (if t
29ff0 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c  he file.** is al
2a000 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68  ready mapped, th
2a010 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
2a020 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  ng is replaced b
2a030 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20  y the new). Or, 
2a040 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72  if .** there alr
2a050 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61  eady exists a ma
2a060 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66  pping for this f
2a070 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
2a080 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74  re still .** out
2a090 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28  standing xFetch(
2a0a0 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  ) references to 
2a0b0 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  it, this functio
2a0c0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2a0d0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
2a0e0 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65   nByte is non-ne
2a0f0 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20  gative, then it 
2a100 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  is the requested
2a110 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65   size of .** the
2a120 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61   mapping to crea
2a130 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  te. Otherwise, i
2a140 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20  f nByte is less 
2a150 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
2a160 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
2a170 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69  d size is the si
2a180 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
2a190 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75  n disk. The actu
2a1a0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  al size of the.*
2a1b0 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e  * created mappin
2a1c0 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  g is either the 
2a1d0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
2a1e0 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66  r the value conf
2a1f0 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67  igured .** using
2a200 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
2a210 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65  AP_LIMIT, whiche
2a220 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a  ver is smaller..
2a230 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2a240 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
2a250 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  o error occurs (
2a260 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70  even if the mapp
2a270 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65  ing is not.** re
2a280 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73  created as a res
2a290 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ult of outstandi
2a2a0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f  ng references) o
2a2b0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
2a2c0 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77  r.** code otherw
2a2d0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
2a2e0 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75  nt unixMapfile(u
2a2f0 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36  nixFile *pFd, i6
2a300 34 20 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65 72  4 nMap){.  asser
2a310 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46  t( nMap>=0 || pF
2a320 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
2a330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  );.  assert( nMa
2a340 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61  p>0 || (pFd->mma
2a350 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d  pSize==0 && pFd-
2a360 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20  >pMapRegion==0) 
2a370 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  );.  if( pFd->nF
2a380 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
2a390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
2a3a0 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
2a3b0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
2a3c0 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
2a3d0 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
2a3e0 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
2a3f0 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
2a400 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62  t(pFd->h, &statb
2a410 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  uf) ){.      ret
2a420 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2a430 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
2a440 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66    nMap = statbuf
2a450 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20  .st_size;.  }.  
2a460 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
2a470 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
2a480 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
2a490 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 23  pSizeMax;.  }..#
2a4a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 41  ifdef SQLITE_SHA
2a4b0 52 45 44 5f 4d 41 50 50 49 4e 47 0a 20 20 69 66  RED_MAPPING.  if
2a4c0 28 20 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 7b  ( pFd->pInode ){
2a4d0 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
2a4e0 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 64  fo *pInode = pFd
2a4f0 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 66  ->pInode;.    if
2a500 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
2a510 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
2a520 45 5f 4f 4b 3b 0a 20 20 20 20 75 6e 69 78 45 6e  E_OK;.    unixEn
2a530 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2a540 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 61  if( pInode->pSha
2a550 72 65 64 4d 61 70 70 69 6e 67 3d 3d 30 20 29 7b  redMapping==0 ){
2a560 0a 20 20 20 20 20 20 75 38 20 2a 70 4e 65 77 20  .      u8 *pNew 
2a570 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70  = osMmap(0, nMap
2a580 2c 20 50 52 4f 54 5f 52 45 41 44 2c 20 4d 41 50  , PROT_READ, MAP
2a590 5f 53 48 41 52 45 44 2c 20 70 46 64 2d 3e 68 2c  _SHARED, pFd->h,
2a5a0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
2a5b0 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  New==MAP_FAILED 
2a5c0 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 4c  ){.        unixL
2a5d0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f  ogError(SQLITE_O
2a5e0 4b 2c 20 22 6d 6d 61 70 22 2c 20 70 46 64 2d 3e  K, "mmap", pFd->
2a5f0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
2a600 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
2a610 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
2a620 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  e{.        pInod
2a630 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70 69 6e  e->pSharedMappin
2a640 67 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  g = pNew;.      
2a650 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
2a660 64 4d 61 70 70 69 6e 67 20 3d 20 6e 4d 61 70 3b  dMapping = nMap;
2a670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a680 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69     pFd->pMapRegi
2a690 6f 6e 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68  on = pInode->pSh
2a6a0 61 72 65 64 4d 61 70 70 69 6e 67 3b 0a 20 20 20  aredMapping;.   
2a6b0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
2a6c0 74 75 61 6c 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  tual = pFd->mmap
2a6d0 53 69 7a 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 6e  Size = pInode->n
2a6e0 53 68 61 72 65 64 4d 61 70 70 69 6e 67 3b 0a 20  SharedMapping;. 
2a6f0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2a700 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  x();.    return 
2a710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23  SQLITE_OK;.  }.#
2a720 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
2a730 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d   nMap>0 || (pFd-
2a740 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20  >mmapSize==0 && 
2a750 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
2a760 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 6e 4d 61  =0) );.  if( nMa
2a770 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  p!=pFd->mmapSize
2a780 20 29 7b 0a 20 20 20 20 75 6e 69 78 52 65 6d 61   ){.    unixRema
2a790 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d 61 70 29  pfile(pFd, nMap)
2a7a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2a7b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
2a7c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
2a7d0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
2a7e0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69  ../*.** If possi
2a7f0 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  ble, return a po
2a800 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69  inter to a mappi
2a810 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74  ng of file fd st
2a820 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74  arting at offset
2a830 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61  .** iOff. The ma
2a840 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61  pping must be va
2a850 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74  lid for at least
2a860 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a   nAmt bytes..**.
2a870 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69  ** If such a poi
2a880 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61  nter can be obta
2a890 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69  ined, store it i
2a8a0 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e  n *pp and return
2a8b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
2a8c0 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  r, if one cannot
2a8d0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2a8e0 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f  curs, set *pp to
2a8f0 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51   0 and return SQ
2a900 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61  LITE_OK..** Fina
2a910 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
2a920 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74   does occur, ret
2a930 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
2a940 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69  ror code. The fi
2a950 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  nal.** value of 
2a960 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64  *pp is undefined
2a970 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
2a980 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
2a990 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72  ction does retur
2a9a0 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65  n a pointer, the
2a9b0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65   caller must eve
2a9c0 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65  ntually .** rele
2a9d0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
2a9e0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69  e by calling uni
2a9f0 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73  xUnfetch()..*/.s
2aa00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 65  tatic int unixFe
2aa10 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
2aa20 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
2aa30 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
2aa40 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *pp){.#if SQLITE
2aa50 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
2aa60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
2aa70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66   = (unixFile *)f
2aa80 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
2aa90 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
2aaa0 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  file */.#endif. 
2aab0 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53   *pp = 0;..#if S
2aac0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
2aad0 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d  IZE>0.  if( pFd-
2aae0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29  >mmapSizeMax>0 )
2aaf0 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70  {.    if( pFd->p
2ab00 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a  MapRegion==0 ){.
2ab10 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 75        int rc = u
2ab20 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64 2c 20  nixMapfile(pFd, 
2ab30 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  -1);.      if( r
2ab40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2ab50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2ab60 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61      if( pFd->mma
2ab70 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41  pSize >= iOff+nA
2ab80 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20  mt ){.      *pp 
2ab90 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  = &((u8 *)pFd->p
2aba0 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
2abb0 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65  ;.      pFd->nFe
2abc0 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a  tchOut++;.    }.
2abd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2abe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2abf0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ../*.** If the t
2ac00 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
2ac10 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
2ac20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2ac30 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66  leases a .** ref
2ac40 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20  erence obtained 
2ac50 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
2ac60 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28  ll to unixFetch(
2ac70 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
2ac80 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
2ac90 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2aca0 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
2acb0 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
2acc0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
2acd0 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
2ace0 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46  sed to the unixF
2acf0 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f  etch() invocatio
2ad00 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  n. .**.** Or, if
2ad10 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
2ad20 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
2ad30 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2ad40 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
2ad50 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68  .** to inform th
2ad60 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74  e VFS layer that
2ad70 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50  , according to P
2ad80 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69  OSIX, any existi
2ad90 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d  ng mapping .** m
2ada0 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69  ay now be invali
2adb0 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  d and should be 
2adc0 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61  unmapped..*/.sta
2add0 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 66 65  tic int unixUnfe
2ade0 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
2adf0 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
2ae00 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51  void *p){.#if SQ
2ae10 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
2ae20 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20  ZE>0.  unixFile 
2ae30 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  *pFd = (unixFile
2ae40 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20   *)fd;   /* The 
2ae50 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
2ae60 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 55 4e  ase file */.  UN
2ae70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
2ae80 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Off);..  /* If p
2ae90 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65  ==0 (unmap the e
2aea0 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e  ntire file) then
2aeb0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   there must be n
2aec0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20  o outstanding . 
2aed0 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72   ** xFetch refer
2aee0 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21  ences. Or, if p!
2aef0 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69  =0 (meaning it i
2af00 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65  s an xFetch refe
2af10 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65  rence),.  ** the
2af20 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
2af30 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
2af40 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20  standing.  */.  
2af50 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d  assert( (p==0)==
2af60 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  (pFd->nFetchOut=
2af70 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
2af80 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61  p!=0, it must ma
2af90 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c  tch the iOff val
2afa0 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ue. */.  assert(
2afb0 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75   p==0 || p==&((u
2afc0 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
2afd0 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20  ion)[iOff] );.. 
2afe0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46   if( p ){.    pF
2aff0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a  d->nFetchOut--;.
2b000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
2b010 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  xUnmapfile(pFd);
2b020 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
2b030 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
2b040 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  0 );.#else.  UNU
2b050 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
2b060 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2b070 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53  METER(p);.  UNUS
2b080 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66  ED_PARAMETER(iOf
2b090 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  f);.#endif.  ret
2b0a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b0b0 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
2b0c0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
2b0d0 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
2b0e0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
2b0f0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
2b100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
2b110 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
2b120 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
2b130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b140 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2b150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b190 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
2b1a0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
2b1b0 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
2b1c0 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
2b1d0 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
2b1e0 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
2b1f0 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
2b200 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
2b210 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
2b220 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
2b230 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
2b240 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
2b250 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
2b260 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
2b270 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
2b280 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2b290 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
2b2a0 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
2b2b0 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
2b2c0 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
2b2d0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
2b2e0 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
2b2f0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
2b300 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
2b310 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
2b320 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
2b330 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
2b340 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
2b350 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
2b360 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
2b370 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
2b380 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
2b390 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
2b3a0 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
2b3b0 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
2b3c0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
2b3d0 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
2b3e0 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
2b3f0 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
2b400 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
2b410 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
2b420 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
2b430 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
2b440 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20 74 77  r-function F, tw
2b450 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  o objects are cr
2b460 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eated:.**.**    
2b470 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e  (1) The real fin
2b480 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der-function nam
2b490 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a  ed "FImpt()"..**
2b4a0 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e  .**    (2) A con
2b4b0 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f  stant pointer to
2b4c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
2b4d0 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a  amed just "F"..*
2b4e0 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  *.**.** A pointe
2b4f0 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74  r to the F point
2b500 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68  er is used as th
2b510 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65  e pAppData value
2b520 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65   for VFS.** obje
2b530 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f  cts.  We have to
2b540 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64   do this instead
2b550 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70   of letting pApp
2b560 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69  Data point.** di
2b570 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69  rectly at the fi
2b580 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69  nder-function si
2b590 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72  nce C90 rules pr
2b5a0 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a  event a void*.**
2b5b0 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e   from be cast in
2b5c0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  to a function po
2b5d0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  inter..**.**.** 
2b5e0 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
2b5f0 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65   this macro gene
2b600 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74  rates two object
2b610 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20  s:.**.**   *  A 
2b620 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33  constant sqlite3
2b630 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2b640 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74  ct call METHOD t
2b650 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a  hat has locking.
2b660 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20  **      methods 
2b670 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
2b680 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a  OCK, CKRESLOCK..
2b690 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f  **.**   *  An I/
2b6a0 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
2b6b0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
2b6c0 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75  FINDER that retu
2b6d0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  rns a pointer.**
2b6e0 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54        to the MET
2b6f0 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  HOD object in th
2b700 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65  e previous bulle
2b710 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f  t..*/.#define IO
2b720 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 4d  METHODS(FINDER,M
2b730 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e 2c 43 4c  ETHOD,VERSION,CL
2b740 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c  OSE,LOCK,UNLOCK,
2b750 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29 20 20  CKLOCK,SHMMAP)  
2b760 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
2b770 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2b780 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20  hods METHOD = { 
2b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7b0 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20    \.   VERSION, 
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7d0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
2b7e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b800 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20   \.   CLOSE,    
2b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b820 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20    /* xClose */  
2b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b850 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20  \.   unixRead,  
2b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b870 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20   /* xRead */    
2b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2b8a0 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20  .   unixWrite,  
2b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8c0 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20  /* xWrite */    
2b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b8f0 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c     unixTruncate,
2b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b910 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20  * xTruncate */  
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2b940 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20    unixSync,     
2b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b960 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20   xSync */       
2b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b980 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b990 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20   unixFileSize,  
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b9b0 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20  xFileSize */    
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2b9e0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ba00 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
2ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55            \.   U
2ba30 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  NLOCK,          
2ba40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2ba50 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  nlock */        
2ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba70 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b           \.   CK
2ba80 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
2ba90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
2baa0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2bab0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2bac0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2bad0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  xFileControl,   
2bae0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
2baf0 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20  eControl */     
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb10 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2bb20 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
2bb30 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
2bb40 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  orSize */       
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb60 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44        \.   unixD
2bb70 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2bb80 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63  tics,  /* xDevic
2bb90 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f  eCapabilities */
2bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbb0 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d 41 50       \.   SHMMAP
2bbc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bbd0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2bbe0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc00 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
2bc10 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2bc20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
2bc30 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc50 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42     \.   unixShmB
2bc60 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
2bc70 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
2bc80 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  er */           
2bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bca0 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e    \.   unixShmUn
2bcb0 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
2bcc0 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
2bcd0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcf0 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68 2c   \.   unixFetch,
2bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd10 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20 20    /* xFetch */  
2bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd40 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63 68  \.   unixUnfetch
2bd50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bd60 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 20   /* xUnfetch */ 
2bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2bd90 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2bde0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2bdf0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2be00 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f  *FINDER##Impl(co
2be10 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69  nst char *z, uni
2be20 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20  xFile *p){   \. 
2be30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2be40 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52  R(z); UNUSED_PAR
2be50 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20  AMETER(p);      
2be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2be80 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20  return &METHOD; 
2be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bec0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20             \.}  
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf10 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
2bf20 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2bf30 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63  _io_methods *(*c
2bf40 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e  onst FINDER)(con
2bf50 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2bf60 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d  e *p)    \.    =
2bf70 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a   FINDER##Impl;..
2bf80 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61  /*.** Here are a
2bf90 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ll of the sqlite
2bfa0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2bfb0 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66  ects for each of
2bfc0 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20   the.** locking 
2bfd0 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e  strategies.  Fun
2bfe0 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75  ctions that retu
2bff0 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  rn pointers to t
2c000 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20  hese methods.** 
2c010 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64  are also created
2c020 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ..*/.IOMETHODS(.
2c030 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c    posixIoFinder,
2c040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2c050 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2c060 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f  ame */.  posixIo
2c070 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2c080 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2c090 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2c0a0 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20  name */.  3,    
2c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0c0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2c0d0 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72  mory and mmap ar
2c0e0 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75  e enabled */.  u
2c0f0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
2c100 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2c110 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
2c120 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
2c130 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2c140 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
2c150 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
2c160 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
2c170 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
2c180 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
2c190 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65  Lock,    /* xChe
2c1a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2c1b0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 53  ethod */.  unixS
2c1c0 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20 20 20  hmMap           
2c1d0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
2c1e0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
2c1f0 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49  THODS(.  nolockI
2c200 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2c210 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2c220 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2c230 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  nolockIoMethods,
2c240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2c250 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c260 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2c270 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
2c280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2c290 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20  ared memory and 
2c2a0 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64  mmap are enabled
2c2b0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
2c2c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2c2d0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2c2e0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
2c2f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c300 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2c310 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
2c320 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
2c330 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2c340 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
2c350 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2c360 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2c370 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2c380 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2c390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c3a0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2c3b0 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
2c3c0 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  dotlockIoFinder,
2c3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2c3e0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2c3f0 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  e */.  dotlockIo
2c400 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2c410 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2c420 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2c430 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2c440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c450 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2c460 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2c470 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  /.  dotlockClose
2c480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2c490 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2c4a0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c  /.  dotlockLock,
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c4c0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2c4d0 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
2c4e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2c4f0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2c500 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  /.  dotlockCheck
2c510 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a  ReservedLock, /*
2c520 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2c530 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2c540 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2c550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2c560 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2c570 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2c580 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2c590 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66  E.IOMETHODS(.  f
2c5a0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
2c5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
2c5c0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
2c5d0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74   */.  flockIoMet
2c5e0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
2c5f0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
2c600 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
2c610 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
2c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c630 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
2c640 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
2c650 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20  .  flockClose,  
2c660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c670 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2c680 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20  .  flockLock,   
2c690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c6a0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
2c6b0 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20    flockUnlock,  
2c6c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c6d0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2c6e0 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  .  flockCheckRes
2c6f0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20  ervedLock,   /* 
2c700 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2c710 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c730 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2c740 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
2c750 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
2c760 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
2c770 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
2c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c790 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2c7a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
2c7b0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2c7c0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2c7d0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2c7e0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c800 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2c810 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2c820 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73  ed */.  semXClos
2c830 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2c840 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2c850 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b  od */.  semXLock
2c860 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c870 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2c880 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63  d */.  semXUnloc
2c890 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2c8a0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2c8b0 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63  od */.  semXChec
2c8c0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2c8d0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2c8e0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2c8f0 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c910 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2c920 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
2c930 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2c940 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2c950 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2c960 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
2c970 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  afpIoFinder,    
2c980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2c990 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2c9a0 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68  e */.  afpIoMeth
2c9b0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
2c9c0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2c9d0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2c9e0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca00 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2ca10 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2ca20 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ca40 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2ca50 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ca70 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2ca80 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2caa0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2cab0 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
2cac0 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a  rvedLock,     /*
2cad0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2cae0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2caf0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2cb00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2cb10 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2cb20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2cb30 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
2cb40 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
2cb50 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
2cb60 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
2cb70 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
2cb80 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
2cb90 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
2cba0 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
2cbb0 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
2cbc0 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
2cbd0 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
2cbe0 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
2cbf0 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
2cc00 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
2cc10 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
2cc20 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
2cc30 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
2cc40 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
2cc50 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
2cc60 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
2cc70 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
2cc80 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
2cc90 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
2cca0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
2ccb0 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
2ccc0 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
2ccd0 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
2cce0 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
2ccf0 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
2cd00 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
2cd10 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
2cd20 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2cd30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2cd40 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
2cd50 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
2cd60 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
2cd70 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
2cd80 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
2cd90 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
2cda0 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
2cdb0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
2cdc0 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
2cdd0 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
2cde0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
2cdf0 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
2ce00 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
2ce10 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2ce20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2ce30 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2ce40 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
2ce50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2ce60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2ce70 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2ce80 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2ce90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2cea0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2ceb0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f  isabled */.  pro
2cec0 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  xyClose,        
2ced0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2cee0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
2cef0 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  xyLock,         
2cf00 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2cf10 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
2cf20 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  yUnlock,        
2cf30 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2cf40 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
2cf50 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
2cf60 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock,   /* xCheck
2cf70 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2cf80 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfa0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2cfb0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2cfc0 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
2cfd0 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
2cfe0 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
2cff0 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
2d000 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
2d010 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2d020 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2d030 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2d040 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
2d050 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
2d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d070 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2d080 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
2d090 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2d0a0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2d0b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2d0c0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2d0f0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2d100 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
2d110 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2d120 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2d130 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2d140 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2d150 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2d160 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
2d170 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2d180 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2d190 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
2d1a0 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
2d1b0 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65  ock,     /* xChe
2d1c0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2d1d0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1f0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2d200 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2d210 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
2d220 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2d230 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2d240 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a  KING_STYLE./* .*
2d250 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
2d260 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
2d270 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  s to determine t
2d280 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20  he best locking 
2d290 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72  strategy .** for
2d2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d2b0 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20  le "filePath".  
2d2c0 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  It then returns 
2d2d0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
2d2e0 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
2d2f0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2d300 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a   that strategy..
2d310 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f  **.** This is fo
2d320 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a  r MacOSX only..*
2d330 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2d340 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2d350 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
2d360 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
2d370 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
2d380 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
2d390 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d3a0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2d3b0 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
2d3c0 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  * open file obje
2d3d0 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ct for the datab
2d3e0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ase file */.){. 
2d3f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
2d400 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20  ruct Mapping {. 
2d410 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2d420 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20  Filesystem;     
2d430 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2d440 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65  system type name
2d450 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71   */.    const sq
2d460 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2d470 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a   *pMethods;   /*
2d480 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   Appropriate loc
2d490 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  king method */. 
2d4a0 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20   } aMap[] = {.  
2d4b0 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70    { "hfs",    &p
2d4c0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
2d4d0 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20  .    { "ufs",   
2d4e0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2d4f0 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73   },.    { "afpfs
2d500 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
2d510 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66  s },.    { "smbf
2d520 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
2d530 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62  ds },.    { "web
2d540 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  dav", &nolockIoM
2d550 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2d560 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e  0, 0 }.  };.  in
2d570 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
2d580 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73  atfs fsInfo;.  s
2d590 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
2d5a0 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
2d5b0 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
2d5c0 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
2d5d0 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
2d5e0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2d5f0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
2d600 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
2d610 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2d620 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
2d630 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
2d640 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20  IoMethods;.  }. 
2d650 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65   if( statfs(file
2d660 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21  Path, &fsInfo) !
2d670 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  = -1 ){.    if( 
2d680 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26  fsInfo.f_flags &
2d690 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20   MNT_RDONLY ){. 
2d6a0 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c       return &nol
2d6b0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2d6c0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
2d6d0 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
2d6e0 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  stem; i++){.    
2d6f0 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
2d700 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2d710 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  , aMap[i].zFiles
2d720 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  ystem)==0 ){.   
2d730 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70       return aMap
2d740 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20  [i].pMethods;.  
2d750 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2d760 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61  .  /* Default ca
2d770 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f  se. Handles, amo
2d780 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66  ngst others, "nf
2d790 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79  s"..  ** Test by
2d7a0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73  te-range lock us
2d7b0 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20  ing fcntl(). If 
2d7c0 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64  the call succeed
2d7d0 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  s, .  ** assume 
2d7e0 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79  that the file-sy
2d7f0 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f  stem supports PO
2d800 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
2d810 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66   .  */.  lockInf
2d820 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
2d830 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
2d840 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
2d850 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
2d860 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
2d870 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
2d880 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
2d890 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
2d8a0 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
2d8b0 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72   ) {.    if( str
2d8c0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
2d8d0 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d  ypename, "nfs")=
2d8e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2d8f0 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  rn &nfsIoMethods
2d900 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
2d910 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73       return &pos
2d920 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ixIoMethods;.   
2d930 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2d940 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49  return &dotlockI
2d950 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
2d960 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2d970 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2d980 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
2d990 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
2d9a0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
2d9b0 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
2d9c0 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
2d9d0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
2d9e0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2d9f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2da00 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
2da10 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a  f OS_VXWORKS./*.
2da20 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
2da30 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78   function for Vx
2da40 57 6f 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20  Works checks to 
2da50 73 65 65 20 69 66 20 70 6f 73 69 78 20 61 64 76  see if posix adv
2da60 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  isory.** locking
2da70 20 77 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64   works.  If it d
2da80 6f 65 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69  oes, then that i
2da90 73 20 77 68 61 74 20 69 73 20 75 73 65 64 2e 20  s what is used. 
2daa0 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a   If it does not.
2dab0 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61  ** work, then fa
2dac0 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20  llback to named 
2dad0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
2dae0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  g..*/.static con
2daf0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2db00 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f  thods *vxworksIo
2db10 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
2db20 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
2db30 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
2db40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2db50 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
2db60 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
2db70 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69    /* the open fi
2db80 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  le object */.){.
2db90 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
2dba0 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
2dbb0 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
2dbc0 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
2dbd0 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
2dbe0 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
2dbf0 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
2dc00 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
2dc10 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
2dc20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
2dc30 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
2dc40 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2dc50 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20  }..  /* Test if 
2dc60 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f  fcntl() is suppo
2dc70 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53  rted and use POS
2dc80 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a  IX style locks..
2dc90 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66    ** Otherwise f
2dca0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
2dcb0 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
2dcc0 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c  method..  */.  l
2dcd0 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
2dce0 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
2dcf0 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
2dd00 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
2dd10 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
2dd20 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
2dd30 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _RDLCK;.  if( os
2dd40 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  Fcntl(pNew->h, F
2dd50 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
2dd60 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72  o)!=-1 ) {.    r
2dd70 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
2dd80 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
2dd90 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49      return &semI
2dda0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
2ddb0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2ddc0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2ddd0 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f  .  *(*const vxwo
2dde0 72 6b 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  rksIoFinder)(con
2ddf0 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2de00 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46  e*) = vxworksIoF
2de10 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
2de20 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
2de30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62   */../*.** An ab
2de40 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20  stract type for 
2de50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2de60 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  IO method finder
2de70 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79   function:.*/.ty
2de80 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69  pedef const sqli
2de90 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2dea0 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63  (*finder_type)(c
2deb0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
2dec0 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  ile*);.../******
2ded0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2def0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df10 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2df20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df30 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
2df40 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
2df50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df60 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
2df70 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
2df80 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
2df90 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
2dfa0 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
2dfb0 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
2dfc0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2dfd0 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ze the contents 
2dfe0 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
2dff0 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
2e000 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a  d to by pId..*/.
2e010 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
2e020 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c  nUnixFile(.  sql
2e030 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2e040 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2e050 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
2e060 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
2e070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2e080 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
2e090 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67  or of file being
2e0a0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
2e0b0 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20  ite3_file *pId, 
2e0c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
2e0d0 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
2e0e0 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
2e0f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2e100 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
2e110 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
2e120 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
2e130 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20  int ctrlFlags   
2e140 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20          /* Zero 
2e150 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45  or more UNIXFILE
2e160 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  _* values */.){.
2e170 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
2e180 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63  io_methods *pLoc
2e190 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69  kingStyle;.  uni
2e1a0 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75  xFile *pNew = (u
2e1b0 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20  nixFile *)pId;. 
2e1c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e1d0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
2e1e0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55  pNew->pInode==NU
2e1f0 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6c  LL );..  /* No l
2e200 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e  ocking occurs in
2e210 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
2e220 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46   */.  assert( zF
2e230 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63  ilename!=0 || (c
2e240 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
2e250 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29  ILE_NOLOCK)!=0 )
2e260 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
2e270 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
2e280 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
2e290 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68  );.  pNew->h = h
2e2a0 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d  ;.  pNew->pVfs =
2e2b0 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a   pVfs;.  pNew->z
2e2c0 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2e2d0 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c  ;.  pNew->ctrlFl
2e2e0 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c  ags = (u8)ctrlFl
2e2f0 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ags;.#if SQLITE_
2e300 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
2e310 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65    pNew->mmapSize
2e320 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Max = sqlite3Glo
2e330 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
2e340 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  ;.#endif.  if( s
2e350 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2e360 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26  an(((ctrlFlags &
2e370 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f   UNIXFILE_URI) ?
2e380 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c   zFilename : 0),
2e390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e3a0 20 20 20 20 20 20 20 20 20 20 20 20 22 70 73 6f              "pso
2e3b0 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52  w", SQLITE_POWER
2e3c0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20  SAFE_OVERWRITE) 
2e3d0 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
2e3e0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2e3f0 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69  LE_PSOW;.  }.  i
2e400 66 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e  f( strcmp(pVfs->
2e410 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c  zName,"unix-excl
2e420 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ")==0 ){.    pNe
2e430 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
2e440 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20  UNIXFILE_EXCL;. 
2e450 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
2e460 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d  KS.  pNew->pId =
2e470 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65   vxworksFindFile
2e480 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  Id(zFilename);. 
2e490 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d   if( pNew->pId==
2e4a0 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61  0 ){.    ctrlFla
2e4b0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e  gs |= UNIXFILE_N
2e4c0 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  OLOCK;.    rc = 
2e4d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2e4e0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
2e4f0 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26   if( ctrlFlags &
2e500 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2e510 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67   ){.    pLocking
2e520 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49  Style = &nolockI
2e530 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
2e540 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  e{.    pLockingS
2e550 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65  tyle = (**(finde
2e560 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
2e570 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
2e580 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51  e, pNew);.#if SQ
2e590 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2e5a0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
2e5b0 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
2e5c0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
2e5d0 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
2e5e0 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
2e5f0 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
2e600 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
2e610 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
2e620 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
2e630 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
2e640 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
2e650 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
2e660 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
2e670 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
2e680 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
2e690 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2e6a0 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
2e6b0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
2e6c0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2e6d0 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
2e6e0 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64  hods.#if defined
2e6f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2e700 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2e710 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c  KING_STYLE.    |
2e720 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  | pLockingStyle 
2e730 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  == &nfsIoMethods
2e740 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
2e750 51 4c 49 54 45 5f 53 48 41 52 45 44 5f 4d 41 50  QLITE_SHARED_MAP
2e760 50 49 4e 47 0a 20 20 20 20 7c 7c 20 70 4c 6f 63  PING.    || pLoc
2e770 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 6f  kingStyle == &no
2e780 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 0a 23 65  lockIoMethods.#e
2e790 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e  ndif.  ){.    un
2e7a0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2e7b0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2e7c0 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2e7d0 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2e7e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e7f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
2e800 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2e810 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65  red in findInode
2e820 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68  Info(), close th
2e830 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2e840 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64  r.      ** immed
2e850 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72  iately, before r
2e860 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74  eleasing the mut
2e870 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  ex. findInodeInf
2e880 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20  o() may fail.   
2e890 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65     ** in two sce
2e8a0 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a  narios:.      **
2e8b0 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20  .      **   (a) 
2e8c0 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28  A call to fstat(
2e8d0 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  ) failed..      
2e8e0 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f  **   (b) A mallo
2e8f0 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  c failed..      
2e900 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e  **.      ** Scen
2e910 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c  ario (b) may onl
2e920 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70  y occur if the p
2e930 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
2e940 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20  g no other.     
2e950 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
2e960 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  tors open on the
2e970 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74   same file. If t
2e980 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20  here were other 
2e990 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
2e9a0 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69  scriptors on thi
2e9b0 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  s file, then no 
2e9c0 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20  malloc would be 
2e9d0 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
2e9e0 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e    ** findInodeIn
2e9f0 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73  fo(). If this is
2ea00 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73   the case, it is
2ea10 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63   quite safe to c
2ea20 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  lose.      ** ha
2ea30 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69  ndle h - as it i
2ea40 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
2ea50 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73  t no posix locks
2ea60 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65   will be release
2ea70 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f  d.      ** by do
2ea80 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a  ing so..      **
2ea90 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65  .      ** If sce
2eaa0 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64  nario (a) caused
2eab0 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20   the error then 
2eac0 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73  things are not s
2ead0 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20  o safe. The.    
2eae0 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73    ** implicit as
2eaf0 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73  sumption here is
2eb00 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29   that if fstat()
2eb10 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61   fails, things a
2eb20 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73  re in.      ** s
2eb30 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68  uch bad shape th
2eb40 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f  at dropping a lo
2eb50 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27  ck or two doesn'
2eb60 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20  t matter much.. 
2eb70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f       */.      ro
2eb80 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2eb90 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2eba0 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
2ebb0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2ebc0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69  Mutex();.  }..#i
2ebd0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2ebe0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
2ebf0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2ec00 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
2ec10 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2ec20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
2ec30 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
2ec40 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2ec50 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2ec60 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2ec70 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2ec80 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2ec90 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
2eca0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
2ecb0 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
2ecc0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2ecd0 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
2ece0 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
2ecf0 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
2ed00 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
2ed10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ed20 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2ed30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2ed40 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65   NB: zFilename e
2ed50 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e  xists and remain
2ed60 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68  s valid until th
2ed70 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  e file is closed
2ed80 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64  .      ** accord
2ed90 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65  ing to requireme
2eda0 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77  nt F11141.  So w
2edb0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
2edc0 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a   make a.      **
2edd0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c   copy of the fil
2ede0 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20  ename. */.      
2edf0 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a  pCtx->dbPath = z
2ee00 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
2ee10 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d  pCtx->reserved =
2ee20 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f   0;.      srando
2ee30 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e  mdev();.      un
2ee40 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2ee50 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49        rc = findI
2ee60 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2ee70 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2ee80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ee90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2eea0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2eeb0 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2eec0 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f  ext);.        ro
2eed0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2eee0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2eef0 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20         h = -1;. 
2ef00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69       }.      uni
2ef10 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20  xLeaveMutex();  
2ef20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d        .    }.  }
2ef30 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20  .#endif..  else 
2ef40 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2ef50 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  e == &dotlockIoM
2ef60 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
2ef70 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
2ef80 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2ef90 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2efa0 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
2efb0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74  n.    ** the dot
2efc0 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
2efd0 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  xt .    */.    c
2efe0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  har *zLockFile;.
2eff0 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
2f000 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  e;.    assert( z
2f010 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20  Filename!=0 );. 
2f020 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28     nFilename = (
2f030 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
2f040 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a  name) + 6;.    z
2f050 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
2f060 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2f070 63 36 34 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  c64(nFilename);.
2f080 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c      if( zLockFil
2f090 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
2f0a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2f0b0 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
2f0c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2f0d0 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
2f0e0 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
2f0f0 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
2f100 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
2f110 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
2f120 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2f130 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
2f140 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2f150 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2f160 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
2f170 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2f180 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
2f190 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
2f1a0 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2f1b0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
2f1c0 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
2f1d0 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
2f1e0 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
2f1f0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2f200 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
2f210 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2f220 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2f230 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
2f240 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
2f250 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2f260 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  m==NULL) ){.    
2f270 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65    char *zSemName
2f280 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d   = pNew->pInode-
2f290 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20  >aSemName;.     
2f2a0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71   int n;.      sq
2f2b0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2f2c0 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65  AX_PATHNAME, zSe
2f2d0 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22  mName, "/%s.sem"
2f2e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f2f0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
2f300 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
2f310 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  me);.      for( 
2f320 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  n=1; zSemName[n]
2f330 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20  ; n++ ).        
2f340 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d  if( zSemName[n]=
2f350 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b  ='/' ) zSemName[
2f360 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  n] = '_';.      
2f370 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2f380 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
2f390 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
2f3a0 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
2f3b0 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64   if( pNew->pInod
2f3c0 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  e->pSem == SEM_F
2f3d0 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
2f3e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2f3f0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
2f400 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
2f410 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30  SemName[0] = '\0
2f420 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
2f430 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
2f440 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
2f450 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61 73 74  f.  .  storeLast
2f460 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b 0a  Errno(pNew, 0);.
2f470 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2f480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f490 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
2f4a0 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
2f4b0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
2f4c0 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31  E__);.    h = -1
2f4d0 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  ;.    osUnlink(z
2f4e0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70  Filename);.    p
2f4f0 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
2f500 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  = UNIXFILE_DELET
2f510 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  E;.  }.#endif.  
2f520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f530 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d  K ){.    if( h>=
2f540 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  0 ) robust_close
2f550 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2f560 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  __);.  }else{.  
2f570 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
2f580 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  = pLockingStyle;
2f590 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
2f5a0 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69 66 79  (+1);.    verify
2f5b0 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20  DbFile(pNew);.  
2f5c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2f5d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2f5e0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  he name of a dir
2f5f0 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20  ectory in which 
2f600 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79  to put temporary
2f610 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f   files..** If no
2f620 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72   suitable tempor
2f630 61 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f  ary file directo
2f640 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ry can be found,
2f650 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
2f660 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2f670 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65  ar *unixTempFile
2f680 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  Dir(void){.  sta
2f690 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2f6a0 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
2f6b0 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20    0,.     0,.   
2f6c0 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
2f6d0 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
2f6e0 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
2f6f0 20 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73 69   ".".  };.  unsi
2f700 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b 0a  gned int i = 0;.
2f710 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
2f720 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
2f730 2a 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f  *zDir = sqlite3_
2f740 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
2f750 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30  .  if( !azDirs[0
2f760 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ] ) azDirs[0] = 
2f770 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54  getenv("SQLITE_T
2f780 4d 50 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21  MPDIR");.  if( !
2f790 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69  azDirs[1] ) azDi
2f7a0 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
2f7b0 54 4d 50 44 49 52 22 29 3b 0a 20 20 77 68 69 6c  TMPDIR");.  whil
2f7c0 65 28 31 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  e(1){.    if( zD
2f7d0 69 72 21 3d 30 0a 20 20 20 20 20 26 26 20 6f 73  ir!=0.     && os
2f7e0 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29  Stat(zDir, &buf)
2f7f0 3d 3d 30 0a 20 20 20 20 20 26 26 20 53 5f 49 53  ==0.     && S_IS
2f800 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
2f810 0a 20 20 20 20 20 26 26 20 6f 73 41 63 63 65 73  .     && osAcces
2f820 73 28 7a 44 69 72 2c 20 30 33 29 3d 3d 30 0a 20  s(zDir, 03)==0. 
2f830 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
2f840 72 6e 20 7a 44 69 72 3b 0a 20 20 20 20 7d 0a 20  rn zDir;.    }. 
2f850 20 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66     if( i>=sizeof
2f860 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
2f870 61 7a 44 69 72 73 5b 30 5d 29 20 29 20 62 72 65  azDirs[0]) ) bre
2f880 61 6b 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61  ak;.    zDir = a
2f890 7a 44 69 72 73 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a  zDirs[i++];.  }.
2f8a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2f8b0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
2f8c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
2f8d0 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
2f8e0 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
2f8f0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  ed.** by the cal
2f900 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64  ling process and
2f910 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
2f920 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c  ugh to hold at l
2f930 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78  east.** pVfs->mx
2f940 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a  Pathname bytes..
2f950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2f960 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
2f970 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2f980 75 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  uf){.  const cha
2f990 72 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20 69  r *zDir;.  int i
2f9a0 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Limit = 0;..  /*
2f9b0 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
2f9c0 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
2f9d0 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
2f9e0 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
2f9f0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
2fa00 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
2fa10 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
2fa20 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
2fa30 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
2fa40 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
2fa50 20 20 2a 2f 0a 20 20 7a 42 75 66 5b 30 5d 20 3d    */.  zBuf[0] =
2fa60 20 30 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   0;.  SimulateIO
2fa70 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
2fa80 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
2fa90 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70   zDir = unixTemp
2faa0 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28  FileDir();.  if(
2fab0 20 7a 44 69 72 3d 3d 30 20 29 20 72 65 74 75 72   zDir==0 ) retur
2fac0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  n SQLITE_IOERR_G
2fad0 45 54 54 45 4d 50 50 41 54 48 3b 0a 20 20 64 6f  ETTEMPPATH;.  do
2fae0 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
2faf0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2fb00 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26  ess(sizeof(r), &
2fb10 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
2fb20 6e 42 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a 42  nBuf>2 );.    zB
2fb30 75 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b 0a  uf[nBuf-2] = 0;.
2fb40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2fb50 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
2fb60 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d   "%s/"SQLITE_TEM
2fb70 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 22 25 6c  P_FILE_PREFIX"%l
2fb80 6c 78 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  lx%c",.         
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72              zDir
2fba0 2c 20 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , r, 0);.    if(
2fbb0 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d 30   zBuf[nBuf-2]!=0
2fbc0 20 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e 31   || (iLimit++)>1
2fbd0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2fbe0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69 6c  E_ERROR;.  }whil
2fbf0 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66  e( osAccess(zBuf
2fc00 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ,0)==0 );.  retu
2fc10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2fc20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2fc30 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2fc40 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
2fc50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75  PLE__)./*.** Rou
2fc60 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72  tine to transfor
2fc70 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74  m a unixFile int
2fc80 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  o a proxy-lockin
2fc90 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49  g unixFile..** I
2fca0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
2fcb0 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20   the proxy-lock 
2fcc0 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73  division, but us
2fcd0 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
2fce0 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52  .** if SQLITE_PR
2fcf0 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
2fd00 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  NG is defined..*
2fd10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2fd20 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
2fd30 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63  ile(unixFile*, c
2fd40 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e  onst char*);.#en
2fd50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  dif../*.** Searc
2fd60 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
2fd70 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2fd80 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20  that was opened 
2fd90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2fda0 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  .** file (not a 
2fdb0 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65  journal or maste
2fdc0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r-journal file) 
2fdd0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
2fde0 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20  thname.** zPath 
2fdf0 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e  with SQLITE_OPEN
2fe00 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68  _XXX flags match
2fe10 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64  ing those passed
2fe20 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   as the second.*
2fe30 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * argument to th
2fe40 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
2fe50 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64  ** Such a file d
2fe60 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78  escriptor may ex
2fe70 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73  ist if a databas
2fe80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
2fe90 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74   closed.** but t
2fea0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
2feb0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f  le descriptor co
2fec0 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  uld not be close
2fed0 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a  d because some.*
2fee0 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  * other file des
2fef0 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
2ff00 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73  the same file is
2ff10 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d   holding a file-
2ff20 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74  lock..** Refer t
2ff30 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  o comments in th
2ff40 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75  e unixClose() fu
2ff50 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c  nction and the l
2ff60 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a  engthy comment.*
2ff70 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f  * describing "Po
2ff80 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
2ff90 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61  king" at the sta
2ffa0 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  rt of this file 
2ffb0 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20  for .** further 
2ffc0 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74  details. Also, t
2ffd0 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a  icket #4018..**.
2ffe0 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65  ** If a suitable
2fff0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
30000 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
30010 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
30020 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69  If no.** such fi
30030 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
30040 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20   located, -1 is 
30050 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
30060 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64  tic UnixUnusedFd
30070 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64   *findReusableFd
30080 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61  (const char *zPa
30090 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  th, int flags){.
300a0 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
300b0 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  pUnused = 0;..  
300c0 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68  /* Do not search
300d0 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
300e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
300f0 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62  n vxworks. Not b
30100 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f  ecause.  ** vxwo
30110 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65  rks would not be
30120 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63  nefit from the c
30130 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c  hange (it might,
30140 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29   we're not sure)
30150 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75  ,.  ** but becau
30160 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73  se no way to tes
30170 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  t it is currentl
30180 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20  y available. It 
30190 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20  is better .  ** 
301a0 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61  not to risk brea
301b0 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70  king vxworks sup
301c0 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b  port for the sak
301d0 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73  e of such an obs
301e0 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75  cure .  ** featu
301f0 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f  re.  */.#if !OS_
30200 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
30210 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
30220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30230 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61  * Results of sta
30240 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 75  t() call */..  u
30250 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
30260 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20  ..  /* A stat() 
30270 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f  call may fail fo
30280 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e  r various reason
30290 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  s. If this happe
302a0 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61  ns, it is.  ** a
302b0 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
302c0 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c  at an open() cal
302d0 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  l on the same pa
302e0 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69  th will also fai
302f0 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73  l..  ** For this
30300 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65   reason, if an e
30310 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
30320 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68  he stat() call h
30330 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ere, it is.  ** 
30340 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69  ignored and -1 i
30350 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
30360 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20  caller will try 
30370 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
30380 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
30390 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  or on the same p
303a0 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72  ath, fail, and r
303b0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74  eturn an error t
303c0 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20  o SQLite..  **. 
303d0 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75   ** Even if a su
303e0 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20  bsequent open() 
303f0 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65  call does succee
30400 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e  d, the consequen
30410 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20  ces of.  ** not 
30420 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20  searching for a 
30430 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65  reusable file de
30440 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74  scriptor are not
30450 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28   dire.  */.  if(
30460 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20 26 26   inodeList!=0 &&
30470 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
30480 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
30490 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
304a0 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 70 49 6e  pInode;..    pIn
304b0 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
304c0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  .    while( pIno
304d0 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66  de && (pInode->f
304e0 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
304f0 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
30500 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
30510 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
30520 6e 6f 21 3d 28 75 36 34 29 73 53 74 61 74 2e 73  no!=(u64)sStat.s
30530 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
30540 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
30550 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
30560 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
30570 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
30580 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
30590 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
305a0 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 49  mutex_notheld(pI
305b0 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
305c0 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
305d0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
305e0 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
305f0 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70  x);.      for(pp
30600 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  =&pInode->pUnuse
30610 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d  d; *pp && (*pp)-
30620 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70  >flags!=flags; p
30630 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
30640 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  ));.      pUnuse
30650 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69  d = *pp;.      i
30660 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
30670 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75        *pp = pUnu
30680 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  sed->pNext;.    
30690 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
306a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49  3_mutex_leave(pI
306b0 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
306c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 75  );.    }.  }.  u
306d0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
306e0 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
306f0 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
30700 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
30710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
30720 74 68 65 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e  the mode, uid an
30730 64 20 67 69 64 20 6f 66 20 66 69 6c 65 20 7a 46  d gid of file zF
30740 69 6c 65 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ile. .*/.static 
30750 69 6e 74 20 67 65 74 46 69 6c 65 4d 6f 64 65 28  int getFileMode(
30760 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30770 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
30780 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
30790 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f  */.  mode_t *pMo
307a0 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
307b0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72       /* OUT: Per
307c0 6d 69 73 73 69 6f 6e 73 20 6f 66 20 7a 46 69 6c  missions of zFil
307d0 65 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55  e */.  uid_t *pU
307e0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
307f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75         /* OUT: u
30800 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a  id of zFile. */.
30810 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20    gid_t *pGid   
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30830 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 6f 66    /* OUT: gid of
30840 20 7a 46 69 6c 65 2e 20 2a 2f 0a 29 7b 0a 20 20   zFile. */.){.  
30850 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
30860 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
30870 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61  /* Output of sta
30880 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20  t() on database 
30890 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
308a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
308b0 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 46  if( 0==osStat(zF
308c0 69 6c 65 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ile, &sStat) ){.
308d0 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74      *pMode = sSt
308e0 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37  at.st_mode & 077
308f0 37 3b 0a 20 20 20 20 2a 70 55 69 64 20 3d 20 73  7;.    *pUid = s
30900 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20  Stat.st_uid;.   
30910 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73   *pGid = sStat.s
30920 74 5f 67 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t_gid;.  }else{.
30930 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30940 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
30950 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30960 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
30970 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
30980 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20  y unixOpen() to 
30990 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e  determine the un
309a0 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ix permissions.*
309b0 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20  * to create new 
309c0 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e  files with. If n
309d0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
309e0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
309f0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
30a00 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62  d a value suitab
30a10 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61  le for passing a
30a20 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
30a30 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20  ment to open(2) 
30a40 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  is.** written to
30a50 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49   *pMode. If an I
30a60 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
30a70 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
30a80 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
30a90 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
30aa0 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20  ue of *pMode is 
30ab0 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  not modified..**
30ac0 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  .** In most case
30ad0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
30ae0 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30  sets *pMode to 0
30af0 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63  , which will bec
30b00 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61  ome.** an indica
30b10 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f  tion to robust_o
30b20 70 65 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20  pen() to create 
30b30 74 68 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a  the file using.*
30b40 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
30b50 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
30b60 53 20 61 64 6a 75 73 74 65 64 20 62 79 20 74 68  S adjusted by th
30b70 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20  e umask..** But 
30b80 69 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  if the file bein
30b90 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41  g opened is a WA
30ba0 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75  L or regular jou
30bb0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
30bc0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
30bd0 6e 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69  n queries the fi
30be0 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
30bf0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e  e permissions on
30c00 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70   the .** corresp
30c10 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  onding database 
30c20 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70  file and sets *p
30c30 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c  Mode to this val
30c40 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a  ue. Whenever .**
30c50 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61   possible, WAL a
30c60 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
30c70 20 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69   are created usi
30c80 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  ng the same perm
30c90 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74  issions .** as t
30ca0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
30cb0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
30cc0 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  ** If the SQLITE
30cd0 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
30ce0 53 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  S option is enab
30cf0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  led, then the.**
30d00 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
30d10 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  me is unavailabl
30d20 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45  e.  But 8_3_NAME
30d30 53 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  S is only used f
30d40 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79  or.** FAT filesy
30d50 73 74 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73  stems and permis
30d60 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74  sions do not mat
30d70 74 65 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75  ter there, so ju
30d80 73 74 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65  st use.** the de
30d90 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
30da0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
30db0 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
30dc0 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode(.  const cha
30dd0 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
30de0 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f         /* Path o
30df0 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79  f file (possibly
30e00 29 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20  ) being created 
30e10 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
30e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e30 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
30e40 73 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75  ssed as 4th argu
30e50 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20  ment to xOpen() 
30e60 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f  */.  mode_t *pMo
30e70 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
30e80 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72       /* OUT: Per
30e90 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e  missions to open
30ea0 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
30eb0 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20  uid_t *pUid,    
30ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ed0 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73  /* OUT: uid to s
30ee0 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a  et on the file *
30ef0 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20  /.  gid_t *pGid 
30f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f10 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20      /* OUT: gid 
30f20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69  to set on the fi
30f30 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
30f40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
30f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30f60 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a  turn Code */.  *
30f70 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55  pMode = 0;.  *pU
30f80 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20  id = 0;.  *pGid 
30f90 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  = 0;.  if( flags
30fa0 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
30fb0 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
30fc0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
30fd0 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41  .    char zDb[MA
30fe0 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20  X_PATHNAME+1];  
30ff0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
31000 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
31010 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20  int nDb;        
31020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31030 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
31040 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f   bytes in zDb */
31050 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69  ..    /* zPath i
31060 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41  s a path to a WA
31070 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  L or journal fil
31080 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
31090 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20   block derives. 
310a0 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74     ** the path t
310b0 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  o the associated
310c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
310d0 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20  rom zPath. This 
310e0 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20  block handles.  
310f0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
31100 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e  ng naming conven
31110 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  tions:.    **.  
31120 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
31130 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20   db>-journal".  
31140 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
31150 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a   db>-wal".    **
31160 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
31170 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20  -journalNN".    
31180 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
31190 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a  b>-walNN".    **
311a0 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e  .    ** where NN
311b0 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75   is a decimal nu
311c0 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d  mber. The NN nam
311d0 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20  ing schemes are 
311e0 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20  .    ** used by 
311f0 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c  the test_multipl
31200 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20  ex.c module..   
31210 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71   */.    nDb = sq
31220 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
31230 61 74 68 29 20 2d 20 31 3b 20 0a 20 20 20 20 77  ath) - 1; .    w
31240 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d  hile( zPath[nDb]
31250 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f  !='-' ){.      /
31260 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 6f 70 65 72  * In normal oper
31270 61 74 69 6f 6e 2c 20 74 68 65 20 6a 6f 75 72 6e  ation, the journ
31280 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 6c  al file name wil
31290 6c 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e  l always contain
312a0 0a 20 20 20 20 20 20 2a 2a 20 61 20 27 2d 27 20  .      ** a '-' 
312b0 63 68 61 72 61 63 74 65 72 2e 20 20 48 6f 77 65  character.  Howe
312c0 76 65 72 20 69 6e 20 38 2b 33 20 66 69 6c 65 6e  ver in 8+3 filen
312d0 61 6d 65 20 6d 6f 64 65 2c 20 6f 72 20 69 66 20  ame mode, or if 
312e0 61 20 63 6f 72 72 75 70 74 0a 20 20 20 20 20 20  a corrupt.      
312f0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
31300 6e 61 6c 20 73 70 65 63 69 66 69 65 73 20 61 20  nal specifies a 
31310 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 77  master journal w
31320 69 74 68 20 61 20 67 6f 6f 66 79 20 6e 61 6d 65  ith a goofy name
31330 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
31340 74 68 65 20 27 2d 27 20 6d 69 67 68 74 20 62 65  the '-' might be
31350 20 6d 69 73 73 69 6e 67 2e 20 2a 2f 0a 20 20 20   missing. */.   
31360 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c     if( nDb==0 ||
31370 20 7a 50 61 74 68 5b 6e 44 62 5d 3d 3d 27 2e 27   zPath[nDb]=='.'
31380 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
31390 5f 4f 4b 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d  _OK;.      nDb--
313a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
313b0 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e  py(zDb, zPath, n
313c0 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62  Db);.    zDb[nDb
313d0 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 72  ] = '\0';..    r
313e0 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64 65 28  c = getFileMode(
313f0 7a 44 62 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64  zDb, pMode, pUid
31400 2c 20 70 47 69 64 29 3b 0a 20 20 7d 65 6c 73 65  , pGid);.  }else
31410 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
31420 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
31430 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70  NCLOSE ){.    *p
31440 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d  Mode = 0600;.  }
31450 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
31460 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
31470 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
31480 69 73 20 69 73 20 61 20 6d 61 69 6e 20 64 61 74  is is a main dat
31490 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
314a0 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e  he file was open
314b0 65 64 20 75 73 69 6e 67 20 61 20 55 52 49 0a 20  ed using a URI. 
314c0 20 20 20 2a 2a 20 66 69 6c 65 6e 61 6d 65 2c 20     ** filename, 
314d0 63 68 65 63 6b 20 66 6f 72 20 74 68 65 20 22 6d  check for the "m
314e0 6f 64 65 6f 66 22 20 70 61 72 61 6d 65 74 65 72  odeof" parameter
314f0 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20 69 6e  . If present, in
31500 74 65 72 70 72 65 74 0a 20 20 20 20 2a 2a 20 69  terpret.    ** i
31510 74 73 20 76 61 6c 75 65 20 61 73 20 61 20 66 69  ts value as a fi
31520 6c 65 6e 61 6d 65 20 61 6e 64 20 74 72 79 20 74  lename and try t
31530 6f 20 63 6f 70 79 20 74 68 65 20 6d 6f 64 65 2c  o copy the mode,
31540 20 75 69 64 20 61 6e 64 20 67 69 64 20 66 72 6f   uid and gid fro
31550 6d 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 66 69  m.    ** that fi
31560 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  le.  */.    cons
31570 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
31580 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
31590 72 28 7a 50 61 74 68 2c 20 22 6d 6f 64 65 6f 66  r(zPath, "modeof
315a0 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b  ");.    if( z ){
315b0 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 46  .      rc = getF
315c0 69 6c 65 4d 6f 64 65 28 7a 2c 20 70 4d 6f 64 65  ileMode(z, pMode
315d0 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20  , pUid, pGid);. 
315e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
315f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
31600 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61  pen the file zPa
31610 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69  th..** .** Previ
31620 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
31630 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
31640 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
31650 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
31660 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
31670 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
31680 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
31690 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
316a0 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
316b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
316c0 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
316d0 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
316e0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
316f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
31700 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
31710 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
31720 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
31730 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
31740 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
31750 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
31760 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
31770 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
31780 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
31790 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
317a0 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
317b0 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
317c0 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
317d0 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
317e0 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
317f0 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
31800 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
31810 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
31820 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
31830 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
31840 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
31850 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
31860 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
31870 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
31880 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
31890 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
318a0 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
318b0 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
318c0 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
318d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
318e0 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c   unixOpen(.  sql
318f0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
31900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31910 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74   VFS for which t
31920 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e  his is the xOpen
31930 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
31940 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
31950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
31960 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f  hname of file to
31970 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
31980 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
31990 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ile,         /* 
319a0 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
319b0 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  tor to be filled
319c0 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   in */.  int fla
319d0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
319e0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66        /* Input f
319f0 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
31a00 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20  the opening */. 
31a10 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
31a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31a30 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65   Output flags re
31a40 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
31a50 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   core */.){.  un
31a60 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
31a70 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  xFile *)pFile;. 
31a80 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20   int fd = -1;   
31a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31aa0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
31ab0 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
31ac0 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  pen() */.  int o
31ad0 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  penFlags = 0;   
31ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
31af0 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70  gs to pass to op
31b00 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54  en() */.  int eT
31b10 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
31b20 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
31b30 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
31b40 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b   */.  int noLock
31b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31b60 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
31b70 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69  omit locking pri
31b80 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74  mitives */.  int
31b90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
31bb0 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
31bc0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ode */.  int ctr
31bd0 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  lFlags = 0;     
31be0 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46          /* UNIXF
31bf0 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a  ILE_* flags */..
31c00 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
31c10 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
31c20 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
31c30 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
31c40 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
31c50 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
31c60 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
31c70 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
31c80 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
31c90 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
31ca0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
31cb0 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
31cc0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
31cd0 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
31ce0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
31cf0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
31d00 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69  N_READWRITE);.#i
31d10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
31d20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
31d30 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20  int isAutoProxy 
31d40 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
31d50 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
31d60 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  Y);.#endif.#if d
31d70 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
31d80 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
31d90 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
31da0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
31db0 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a   fsInfo;.#endif.
31dc0 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
31dd0 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
31de0 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
31df0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
31e00 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
31e10 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
31e20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
31e30 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
31e40 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
31e50 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
31e60 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
31e70 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
31e80 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
31e90 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
31ea0 2f 0a 20 20 69 6e 74 20 69 73 4e 65 77 4a 72 6e  /.  int isNewJrn
31eb0 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  l = (isCreate &&
31ec0 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
31ed0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
31ee0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
31ef0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
31f00 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
31f10 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
31f20 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
31f30 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f  N_WAL.  ));..  /
31f40 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
31f50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
31f60 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
31f70 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
31f80 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
31f90 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
31fa0 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
31fb0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
31fc0 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
31fd0 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b    char zTmpname[
31fe0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
31ff0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
32000 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20  Name = zPath;.. 
32010 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
32020 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
32030 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
32040 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
32050 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
32060 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
32070 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
32080 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
32090 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
320a0 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
320b0 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
320c0 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
320d0 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
320e0 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
320f0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
32100 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
32110 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
32120 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
32130 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
32140 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
32150 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
32160 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
32170 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
32180 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
32190 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
321a0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
321b0 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
321c0 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
321d0 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
321e0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
321f0 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
32200 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
32210 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
32220 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
32230 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
32240 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
32250 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
32260 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
32270 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
32280 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
32290 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
322a0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
322b0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
322c0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
322d0 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
322e0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
322f0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
32300 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
32310 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
32320 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
32330 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
32340 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
32350 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
32360 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
32370 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
32380 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
32390 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
323a0 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
323b0 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
323c0 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
323d0 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
323e0 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
323f0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
32400 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
32410 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
32420 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
32430 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
32440 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
32450 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
32460 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
32470 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
32480 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
32490 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
324a0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
324b0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
324c0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
324d0 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
324e0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
324f0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
32500 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
32510 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
32520 0a 20 20 2f 2a 20 44 65 74 65 63 74 20 61 20 70  .  /* Detect a p
32530 69 64 20 63 68 61 6e 67 65 20 61 6e 64 20 72 65  id change and re
32540 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 54  set the PRNG.  T
32550 68 65 72 65 20 69 73 20 61 20 72 61 63 65 20 63  here is a race c
32560 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65  ondition.  ** he
32570 72 65 20 73 75 63 68 20 74 68 61 74 20 74 77 6f  re such that two
32580 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73   or more threads
32590 20 61 6c 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f   all trying to o
325a0 70 65 6e 20 64 61 74 61 62 61 73 65 73 20 61 74  pen databases at
325b0 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69  .  ** the same i
325c0 6e 73 74 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c  nstant might all
325d0 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e   reset the PRNG.
325e0 20 20 42 75 74 20 6d 75 6c 74 69 70 6c 65 20 72    But multiple r
325f0 65 73 65 74 73 0a 20 20 2a 2a 20 61 72 65 20 68  esets.  ** are h
32600 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
32610 69 66 28 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69  if( randomnessPi
32620 64 21 3d 6f 73 47 65 74 70 69 64 28 30 29 20 29  d!=osGetpid(0) )
32630 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73  {.    randomness
32640 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30  Pid = osGetpid(0
32650 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
32660 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a  andomness(0,0);.
32670 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
32680 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
32690 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  le));..  if( eTy
326a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
326b0 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55  MAIN_DB ){.    U
326c0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
326d0 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65  used;.    pUnuse
326e0 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
326f0 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29  Fd(zName, flags)
32700 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65  ;.    if( pUnuse
32710 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20  d ){.      fd = 
32720 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20  pUnused->fd;.   
32730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55   }else{.      pU
32740 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
32750 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28  malloc64(sizeof(
32760 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
32770 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
32780 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
32790 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
327a0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
327b0 7d 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c  }.    p->pPreall
327c0 6f 63 61 74 65 64 55 6e 75 73 65 64 20 3d 20 70  ocatedUnused = p
327d0 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20  Unused;..    /* 
327e0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
327f0 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65  es are double-ze
32800 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66  ro terminated if
32810 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
32820 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70    ** URIs with p
32830 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63  arameters.  Henc
32840 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61  e, they can alwa
32850 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74  ys be passed int
32860 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
32870 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
32880 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
32890 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
328a0 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e  _OPEN_URI) || zN
328b0 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ame[strlen(zName
328c0 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65  )+1]==0 );..  }e
328d0 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29  lse if( !zName )
328e0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
328f0 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75  e is NULL, the u
32900 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65  pper layer is re
32910 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20  questing a temp 
32920 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
32930 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
32940 21 69 73 4e 65 77 4a 72 6e 6c 29 3b 0a 20 20 20  !isNewJrnl);.   
32950 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d   rc = unixGetTem
32960 70 6e 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61  pname(pVfs->mxPa
32970 74 68 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65  thname, zTmpname
32980 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
32990 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
329a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
329b0 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a   }.    zName = z
329c0 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  Tmpname;..    /*
329d0 20 47 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f   Generated tempo
329e0 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61  rary filenames a
329f0 72 65 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65  re always double
32a00 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
32a10 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20  .    ** for use 
32a20 62 79 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  by sqlite3_uri_p
32a30 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
32a40 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
32a50 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31  [strlen(zName)+1
32a60 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ]==0 );.  }..  /
32a70 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
32a80 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61  value of the fla
32a90 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  gs parameter pas
32aa0 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e  sed to POSIX fun
32ab0 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28  ction.  ** open(
32ac0 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65  ). These must be
32ad0 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e   calculated even
32ae0 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f   if open() is no
32af0 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a  t called, as.  *
32b00 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74  * they may be st
32b10 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
32b20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
32b30 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20  and used by the 
32b40 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c  .  ** 'conch fil
32b50 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74  e' locking funct
32b60 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20  ions later on.  
32b70 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  */.  if( isReado
32b80 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73  nly )  openFlags
32b90 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
32ba0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
32bb0 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f  ) openFlags |= O
32bc0 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43  _RDWR;.  if( isC
32bd0 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46  reate )    openF
32be0 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b  lags |= O_CREAT;
32bf0 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
32c00 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  ve ) openFlags |
32c10 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  = (O_EXCL|O_NOFO
32c20 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61  LLOW);.  openFla
32c30 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49  gs |= (O_LARGEFI
32c40 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20  LE|O_BINARY);.. 
32c50 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
32c60 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65   mode_t openMode
32c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
32c80 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  * Permissions to
32c90 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74   create file wit
32ca0 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75  h */.    uid_t u
32cb0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
32cc0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64         /* Userid
32cd0 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f   for the file */
32ce0 0a 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20  .    gid_t gid; 
32cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d00 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f     /* Groupid fo
32d10 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  r the file */.  
32d20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74    rc = findCreat
32d30 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c  eFileMode(zName,
32d40 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64   flags, &openMod
32d50 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a  e, &uid, &gid);.
32d60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32d70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
32d80 73 73 65 72 74 28 20 21 70 2d 3e 70 50 72 65 61  ssert( !p->pPrea
32d90 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 29  llocatedUnused )
32da0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32db0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
32dc0 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d  EN_WAL || eType=
32dd0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
32de0 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20  N_JOURNAL );.   
32df0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32e00 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62    }.    fd = rob
32e10 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
32e20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
32e30 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ode);.    OSTRAC
32e40 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64  E(("OPENX   %-3d
32e50 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20   %s 0%o\n", fd, 
32e60 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
32e70 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
32e80 21 69 73 45 78 63 6c 75 73 69 76 65 20 7c 7c 20  !isExclusive || 
32e90 28 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f 43  (openFlags & O_C
32ea0 52 45 41 54 29 21 3d 30 20 29 3b 0a 20 20 20 20  REAT)!=0 );.    
32eb0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
32ec0 20 20 69 66 28 20 69 73 4e 65 77 4a 72 6e 6c 20    if( isNewJrnl 
32ed0 26 26 20 65 72 72 6e 6f 3d 3d 45 41 43 43 45 53  && errno==EACCES
32ee0 20 26 26 20 6f 73 41 63 63 65 73 73 28 7a 4e 61   && osAccess(zNa
32ef0 6d 65 2c 20 46 5f 4f 4b 29 20 29 7b 0a 20 20 20  me, F_OK) ){.   
32f00 20 20 20 20 20 2f 2a 20 49 66 20 75 6e 61 62 6c       /* If unabl
32f10 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6a 6f  e to create a jo
32f20 75 72 6e 61 6c 20 62 65 63 61 75 73 65 20 74 68  urnal because th
32f30 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 6e  e directory is n
32f40 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72  ot.        ** wr
32f50 69 74 61 62 6c 65 2c 20 63 68 61 6e 67 65 20 74  itable, change t
32f60 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
32f70 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 2e 20   indicate that. 
32f80 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
32f90 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
32fa0 44 49 52 45 43 54 4f 52 59 3b 0a 20 20 20 20 20  DIRECTORY;.     
32fb0 20 7d 65 6c 73 65 20 69 66 28 20 65 72 72 6e 6f   }else if( errno
32fc0 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
32fd0 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
32fe0 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20     /* Failed to 
32ff0 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  open the file fo
33000 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
33010 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e  ess. Try read-on
33020 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ly. */.        f
33030 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45  lags &= ~(SQLITE
33040 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
33050 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
33060 54 45 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 65  TE);.        ope
33070 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44  nFlags &= ~(O_RD
33080 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20  WR|O_CREAT);.   
33090 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
330a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
330b0 4c 59 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e  LY;.        open
330c0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
330d0 59 3b 0a 20 20 20 20 20 20 20 20 69 73 52 65 61  Y;.        isRea
330e0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
330f0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
33100 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
33110 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
33120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33130 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
33140 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 75       int rc2 = u
33150 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
33160 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
33170 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29  , "open", zName)
33180 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
33190 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
331a0 20 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f   rc2;.      goto
331b0 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
331c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
331d0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
331e0 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
331f0 20 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67   and if creating
33200 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a   a new rollback.
33210 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f      ** journal o
33220 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20  r WAL file, set 
33230 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  the ownership of
33240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
33250 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  WAL to be.    **
33260 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
33270 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
33280 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
33290 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
332a0 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
332b0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
332c0 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 72  RNAL) ){.      r
332d0 6f 62 75 73 74 46 63 68 6f 77 6e 28 66 64 2c 20  obustFchown(fd, 
332e0 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d  uid, gid);.    }
332f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66  .  }.  assert( f
33300 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  d>=0 );.  if( pO
33310 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a  utFlags ){.    *
33320 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  pOutFlags = flag
33330 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  s;.  }..  if( p-
33340 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
33350 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70  used ){.    p->p
33360 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
33370 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20  ed->fd = fd;.   
33380 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65   p->pPreallocate
33390 64 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  dUnused->flags =
333a0 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
333b0 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
333c0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
333d0 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b    zPath = zName;
333e0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
333f0 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54  QLITE_UNLINK_AFT
33400 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50  ER_CLOSE).    zP
33410 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ath = sqlite3_mp
33420 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d  rintf("%s", zNam
33430 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  e);.    if( zPat
33440 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h==0 ){.      ro
33450 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
33460 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
33470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33480 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
33490 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55   }.#else.    osU
334a0 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65  nlink(zName);.#e
334b0 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c  ndif.  }.#if SQL
334c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
334d0 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b  NG_STYLE.  else{
334e0 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  .    p->openFlag
334f0 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
33500 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66   }.#endif.  .#if
33510 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
33520 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
33530 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
33540 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74 66 73  LE.  if( fstatfs
33550 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  (fd, &fsInfo) ==
33560 20 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   -1 ){.    store
33570 4c 61 73 74 45 72 72 6e 6f 28 70 2c 20 65 72 72  LastErrno(p, err
33580 6e 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  no);.    robust_
33590 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c  close(p, fd, __L
335a0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75  INE__);.    retu
335b0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
335c0 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66  ACCESS;.  }.  if
335d0 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22   (0 == strncmp("
335e0 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66  msdos", fsInfo.f
335f0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29  _fstypename, 5))
33600 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c   {.    ((unixFil
33610 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61  e*)pFile)->fsFla
33620 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46  gs |= SQLITE_FSF
33630 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20  LAGS_IS_MSDOS;. 
33640 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
33650 72 6e 63 6d 70 28 22 65 78 66 61 74 22 2c 20 66  rncmp("exfat", f
33660 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
33670 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
33680 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
33690 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
336a0 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
336b0 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  SDOS;.  }.#endif
336c0 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70  ..  /* Set up ap
336d0 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c  propriate ctrlFl
336e0 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ags */.  if( isD
336f0 65 6c 65 74 65 20 29 20 20 20 20 20 20 20 20 20  elete )         
33700 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
33710 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c   |= UNIXFILE_DEL
33720 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61  ETE;.  if( isRea
33730 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20  donly )         
33740 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
33750 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  = UNIXFILE_RDONL
33760 59 3b 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54  Y;.  noLock = eT
33770 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
33780 5f 4d 41 49 4e 5f 44 42 3b 0a 20 20 69 66 28 20  _MAIN_DB;.  if( 
33790 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20  noLock )        
337a0 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
337b0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
337c0 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 69 73  NOLOCK;.  if( is
337d0 4e 65 77 4a 72 6e 6c 20 29 20 20 20 20 20 20 20  NewJrnl )       
337e0 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
337f0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49  s |= UNIXFILE_DI
33800 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61  RSYNC;.  if( fla
33810 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
33820 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73  _URI ) ctrlFlags
33830 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49   |= UNIXFILE_URI
33840 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ;..#if SQLITE_EN
33850 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
33860 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52  LE.#if SQLITE_PR
33870 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
33880 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79  NG.  isAutoProxy
33890 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 1;.#endif.  i
338a0 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26  f( isAutoProxy &
338b0 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20  & (zPath!=NULL) 
338c0 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20  && (!noLock) && 
338d0 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20  pVfs->xOpen ){. 
338e0 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63     char *envforc
338f0 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  e = getenv("SQLI
33900 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
33910 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e  OCKING");.    in
33920 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a  t useProxy = 0;.
33930 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
33940 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
33950 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63  NG==1 means forc
33960 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f  e always use pro
33970 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20  xy, 0 means .   
33980 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72   ** never use pr
33990 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  oxy, NULL means 
339a0 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f  use proxy for no
339b0 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e  n-local files on
339c0 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ly.  */.    if( 
339d0 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29  envforce!=NULL )
339e0 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  {.      useProxy
339f0 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65   = atoi(envforce
33a00 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )>0;.    }else{.
33a10 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
33a20 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67   !(fsInfo.f_flag
33a30 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20  s&MNT_LOCAL);.  
33a40 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50    }.    if( useP
33a50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
33a60 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
33a70 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c  e(pVfs, fd, pFil
33a80 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c  e, zPath, ctrlFl
33a90 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
33aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33ab0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
33ac0 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
33ad0 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29  File((unixFile*)
33ae0 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29  pFile, ":auto:")
33af0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
33b00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33b10 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
33b20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65  unixClose to cle
33b30 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72  an up the resour
33b40 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c  ces added in fil
33b50 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20  lInUnixFile .   
33b60 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c         ** and cl
33b70 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75  ear all the stru
33b80 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63  cture's referenc
33b90 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  es.  Specificall
33ba0 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y, .          **
33bb0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
33bc0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f   will be NULL so
33bd0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20   sqlite3OsClose 
33be0 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20  will be a no-op 
33bf0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
33c00 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73          unixClos
33c10 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
33c20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
33c30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33c40 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
33c50 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
33c60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
33c70 20 61 73 73 65 72 74 28 20 7a 50 61 74 68 3d 3d   assert( zPath==
33c80 30 20 7c 7c 20 7a 50 61 74 68 5b 30 5d 3d 3d 27  0 || zPath[0]=='
33c90 2f 27 20 0a 20 20 20 20 20 20 7c 7c 20 65 54 79  /' .      || eTy
33ca0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
33cb0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
33cc0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
33cd0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
33ce0 4c 20 0a 20 20 29 3b 0a 20 20 72 63 20 3d 20 66  L .  );.  rc = f
33cf0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
33d00 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a  fs, fd, pFile, z
33d10 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29  Path, ctrlFlags)
33d20 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  ;..open_finished
33d30 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
33d40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
33d50 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 50 72  ite3_free(p->pPr
33d60 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
33d70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
33d80 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  rc;.}.../*.** De
33d90 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74  lete the file at
33da0 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
33db0 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
33dc0 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  is true, fsync()
33dd0 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
33de0 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
33df0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
33e00 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c  atic int unixDel
33e10 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
33e20 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  fs *NotUsed,    
33e30 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69   /* VFS containi
33e40 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78  ng this as the x
33e50 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f  Delete method */
33e60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
33e70 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  Path,        /* 
33e80 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
33e90 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
33ea0 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20  int dirSync     
33eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
33ec0 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69  true, fsync() di
33ed0 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
33ee0 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29  leting file */.)
33ef0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33f00 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44  ITE_OK;.  UNUSED
33f10 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
33f20 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
33f30 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
33f40 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
33f50 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69  E);.  if( osUnli
33f60 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20  nk(zPath)==(-1) 
33f70 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f  ){.    if( errno
33f80 3d 3d 45 4e 4f 45 4e 54 0a 23 69 66 20 4f 53 5f  ==ENOENT.#if OS_
33f90 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 20 20  VXWORKS.        
33fa0 7c 7c 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74  || osAccess(zPat
33fb0 68 2c 30 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20  h,0)!=0.#endif. 
33fc0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
33fd0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
33fe0 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20  LETE_NOENT;.    
33ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
34000 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
34010 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
34020 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50  TE, "unlink", zP
34030 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
34040 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
34050 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
34060 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
34070 69 66 28 20 28 64 69 72 53 79 6e 63 20 26 20 31  if( (dirSync & 1
34080 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
34090 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  fd;.    rc = osO
340a0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61  penDirectory(zPa
340b0 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66  th, &fd);.    if
340c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
340d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c  ){.      if( ful
340e0 6c 5f 66 73 79 6e 63 28 66 64 2c 30 2c 30 29 20  l_fsync(fd,0,0) 
340f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
34100 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
34110 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
34120 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50  YNC, "fsync", zP
34130 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
34140 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
34150 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
34160 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34170 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
34180 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
34190 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
341a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
341b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
341c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
341d0 54 65 73 74 20 74 68 65 20 65 78 69 73 74 65 6e  Test the existen
341e0 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20  ce of or access 
341f0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66  permissions of f
34200 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a  ile zPath. The.*
34210 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64  * test performed
34220 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
34230 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a  value of flags:.
34240 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
34250 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20  _ACCESS_EXISTS: 
34260 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
34270 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20  file exists.**  
34280 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
34290 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75  _READWRITE: Retu
342a0 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
342b0 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69   is read and wri
342c0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51  table..**     SQ
342d0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
342e0 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69  ONLY: Return 1 i
342f0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
34300 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  adable..**.** Ot
34310 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30  herwise return 0
34320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34330 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71  unixAccess(.  sq
34340 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
34350 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53  ed,   /* The VFS
34360 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
34370 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20   xAccess method 
34380 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
34390 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20  *zPath,      /* 
343a0 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65  Path of the file
343b0 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20   to examine */. 
343c0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
343d0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
343e0 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c   do we want to l
343f0 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a  earn about the z
34400 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20  Path file? */.  
34410 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20  int *pResOut    
34420 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
34430 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20   result boolean 
34440 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  here */.){.  UNU
34450 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
34460 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
34470 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
34480 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
34490 43 43 45 53 53 3b 20 29 3b 0a 20 20 61 73 73 65  CCESS; );.  asse
344a0 72 74 28 20 70 52 65 73 4f 75 74 21 3d 30 20 29  rt( pResOut!=0 )
344b0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 73 70 65 63  ;..  /* The spec
344c0 20 73 61 79 73 20 74 68 65 72 65 20 61 72 65 20   says there are 
344d0 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65 20 76  three possible v
344e0 61 6c 75 65 73 20 66 6f 72 20 66 6c 61 67 73 2e  alues for flags.
344f0 20 20 42 75 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20    But only.  ** 
34500 74 77 6f 20 6f 66 20 74 68 65 6d 20 61 72 65 20  two of them are 
34510 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 2a 2f  actually used */
34520 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
34530 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
34540 45 58 49 53 54 53 20 7c 7c 20 66 6c 61 67 73 3d  EXISTS || flags=
34550 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52  =SQLITE_ACCESS_R
34560 45 41 44 57 52 49 54 45 20 29 3b 0a 0a 20 20 69  EADWRITE );..  i
34570 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  f( flags==SQLITE
34580 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 29  _ACCESS_EXISTS )
34590 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
345a0 74 20 62 75 66 3b 0a 20 20 20 20 2a 70 52 65 73  t buf;.    *pRes
345b0 4f 75 74 20 3d 20 28 30 3d 3d 6f 73 53 74 61 74  Out = (0==osStat
345c0 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26 26  (zPath, &buf) &&
345d0 20 62 75 66 2e 73 74 5f 73 69 7a 65 3e 30 29 3b   buf.st_size>0);
345e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
345f0 52 65 73 4f 75 74 20 3d 20 6f 73 41 63 63 65 73  ResOut = osAcces
34600 73 28 7a 50 61 74 68 2c 20 57 5f 4f 4b 7c 52 5f  s(zPath, W_OK|R_
34610 4f 4b 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 72 65  OK)==0;.  }.  re
34620 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34630 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
34640 69 63 20 69 6e 74 20 6d 6b 46 75 6c 6c 50 61 74  ic int mkFullPat
34650 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63  hname(.  const c
34660 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
34670 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
34680 74 20 70 61 74 68 20 2a 2f 0a 20 20 63 68 61 72  t path */.  char
34690 20 2a 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20   *zOut,         
346a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
346b0 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
346c0 20 20 69 6e 74 20 6e 4f 75 74 20 20 20 20 20 20    int nOut      
346d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
346f0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 4f  ize of buffer zO
34700 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ut */.){.  int n
34710 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 53 74  Path = sqlite3St
34720 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 3b 0a 20  rlen30(zPath);. 
34730 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
34740 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27   if( zPath[0]!='
34750 2f 27 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 73  /' ){.    if( os
34760 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75  Getcwd(zOut, nOu
34770 74 2d 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-2)==0 ){.     
34780 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
34790 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
347a0 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63  OPEN_BKPT, "getc
347b0 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  wd", zPath);.   
347c0 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 73 71   }.    iOff = sq
347d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
347e0 75 74 29 3b 0a 20 20 20 20 7a 4f 75 74 5b 69 4f  ut);.    zOut[iO
347f0 66 66 2b 2b 5d 20 3d 20 27 2f 27 3b 0a 20 20 7d  ff++] = '/';.  }
34800 0a 20 20 69 66 28 20 28 69 4f 66 66 2b 6e 50 61  .  if( (iOff+nPa
34810 74 68 2b 31 29 3e 6e 4f 75 74 20 29 7b 0a 20 20  th+1)>nOut ){.  
34820 20 20 2f 2a 20 53 51 4c 69 74 65 20 61 73 73 75    /* SQLite assu
34830 6d 65 73 20 74 68 61 74 20 78 46 75 6c 6c 50 61  mes that xFullPa
34840 74 68 6e 61 6d 65 28 29 20 6e 75 6c 2d 74 65 72  thname() nul-ter
34850 6d 69 6e 61 74 65 73 20 74 68 65 20 6f 75 74 70  minates the outp
34860 75 74 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  ut buffer.    **
34870 20 65 76 65 6e 20 69 66 20 69 74 20 72 65 74 75   even if it retu
34880 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  rns an error.  *
34890 2f 0a 20 20 20 20 7a 4f 75 74 5b 69 4f 66 66 5d  /.    zOut[iOff]
348a0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 72 65 74   = '\0';.    ret
348b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
348c0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  PEN_BKPT;.  }.  
348d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
348e0 28 6e 4f 75 74 2d 69 4f 66 66 2c 20 26 7a 4f 75  (nOut-iOff, &zOu
348f0 74 5b 69 4f 66 66 5d 2c 20 22 25 73 22 2c 20 7a  t[iOff], "%s", z
34900 50 61 74 68 29 3b 0a 20 20 72 65 74 75 72 6e 20  Path);.  return 
34910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
34920 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
34930 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
34940 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
34950 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20  e. The relative 
34960 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65  path.** is store
34970 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69  d as a nul-termi
34980 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20  nated string in 
34990 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
349a0 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74  ed to by.** zPat
349b0 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70  h. .**.** zOut p
349c0 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
349d0 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71  r of at least sq
349e0 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
349f0 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28  name bytes .** (
34a00 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41  in this case, MA
34a10 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73  X_PATHNAME bytes
34a20 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68  ). The full-path
34a30 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a   is written to.*
34a40 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65  * this buffer be
34a50 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
34a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
34a70 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  ixFullPathname(.
34a80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
34a90 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
34aa0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
34ab0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
34ac0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
34ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
34ae0 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
34af0 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
34b00 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20   int nOut,      
34b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34b20 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
34b30 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
34b40 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
34b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b60 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
34b70 66 66 65 72 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  ffer */.){.#if !
34b80 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41  defined(HAVE_REA
34b90 44 4c 49 4e 4b 29 20 7c 7c 20 21 64 65 66 69 6e  DLINK) || !defin
34ba0 65 64 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20  ed(HAVE_LSTAT). 
34bb0 20 72 65 74 75 72 6e 20 6d 6b 46 75 6c 6c 50 61   return mkFullPa
34bc0 74 68 6e 61 6d 65 28 7a 50 61 74 68 2c 20 7a 4f  thname(zPath, zO
34bd0 75 74 2c 20 6e 4f 75 74 29 3b 0a 23 65 6c 73 65  ut, nOut);.#else
34be0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
34bf0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 42 79  TE_OK;.  int nBy
34c00 74 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 6b 20  te;.  int nLink 
34c10 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
34c20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
34c30 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 20   symbolic links 
34c40 66 6f 6c 6c 6f 77 65 64 20 73 6f 20 66 61 72 20  followed so far 
34c50 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
34c60 2a 7a 49 6e 20 3d 20 7a 50 61 74 68 3b 20 20 20  *zIn = zPath;   
34c70 20 20 20 2f 2a 20 49 6e 70 75 74 20 70 61 74 68     /* Input path
34c80 20 66 6f 72 20 65 61 63 68 20 69 74 65 72 61 74   for each iterat
34c90 69 6f 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  ion of loop */. 
34ca0 20 63 68 61 72 20 2a 7a 44 65 6c 20 3d 20 30 3b   char *zDel = 0;
34cb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ..  assert( pVfs
34cc0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41  ->mxPathname==MA
34cd0 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
34ce0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
34cf0 28 70 56 66 73 29 3b 0a 0a 20 20 2f 2a 20 49 74  (pVfs);..  /* It
34d00 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
34d10 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
34d20 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
34d30 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
34d40 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
34d50 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
34d60 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
34d70 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
34d80 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
34d90 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
34da0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
34db0 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
34dc0 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
34dd0 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
34de0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
34df0 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
34e00 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
34e10 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
34e20 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 64 6f  E_ERROR );..  do
34e30 20 7b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20   {..    /* Call 
34e40 73 74 61 74 28 29 20 6f 6e 20 70 61 74 68 20 7a  stat() on path z
34e50 49 6e 2e 20 53 65 74 20 62 4c 69 6e 6b 20 74 6f  In. Set bLink to
34e60 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 74   true if the pat
34e70 68 20 69 73 20 61 20 73 79 6d 62 6f 6c 69 63 0a  h is a symbolic.
34e80 20 20 20 20 2a 2a 20 6c 69 6e 6b 2c 20 6f 72 20      ** link, or 
34e90 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
34ea0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4c 69    */.    int bLi
34eb0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  nk = 0;.    stru
34ec0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
34ed0 20 69 66 28 20 6f 73 4c 73 74 61 74 28 7a 49 6e   if( osLstat(zIn
34ee0 2c 20 26 62 75 66 29 21 3d 30 20 29 7b 0a 20 20  , &buf)!=0 ){.  
34ef0 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45      if( errno!=E
34f00 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  NOENT ){.       
34f10 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
34f20 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
34f30 45 4e 5f 42 4b 50 54 2c 20 22 6c 73 74 61 74 22  EN_BKPT, "lstat"
34f40 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  , zIn);.      }.
34f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34f60 20 62 4c 69 6e 6b 20 3d 20 53 5f 49 53 4c 4e 4b   bLink = S_ISLNK
34f70 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20  (buf.st_mode);. 
34f80 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4c     }..    if( bL
34f90 69 6e 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ink ){.      if(
34fa0 20 7a 44 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zDel==0 ){.    
34fb0 20 20 20 20 7a 44 65 6c 20 3d 20 73 71 6c 69 74      zDel = sqlit
34fc0 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74 29 3b  e3_malloc(nOut);
34fd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 65  .        if( zDe
34fe0 6c 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  l==0 ) rc = SQLI
34ff0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
35000 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2b       }else if( +
35010 2b 6e 4c 69 6e 6b 3e 53 51 4c 49 54 45 5f 4d 41  +nLink>SQLITE_MA
35020 58 5f 53 59 4d 4c 49 4e 4b 53 20 29 7b 0a 20 20  X_SYMLINKS ){.  
35030 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35040 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
35050 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
35060 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 79  K ){.        nBy
35080 74 65 20 3d 20 6f 73 52 65 61 64 6c 69 6e 6b 28  te = osReadlink(
35090 7a 49 6e 2c 20 7a 44 65 6c 2c 20 6e 4f 75 74 2d  zIn, zDel, nOut-
350a0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
350b0 6e 42 79 74 65 3c 30 20 29 7b 0a 20 20 20 20 20  nByte<0 ){.     
350c0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
350d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
350e0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 72 65  NTOPEN_BKPT, "re
350f0 61 64 6c 69 6e 6b 22 2c 20 7a 49 6e 29 3b 0a 20  adlink", zIn);. 
35100 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
35110 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 65 6c          if( zDel
35120 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]!='/' ){.    
35130 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
35140 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6e             for(n
35150 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
35160 33 30 28 7a 49 6e 29 3b 20 6e 3e 30 20 26 26 20  30(zIn); n>0 && 
35170 7a 49 6e 5b 6e 2d 31 5d 21 3d 27 2f 27 3b 20 6e  zIn[n-1]!='/'; n
35180 2d 2d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  --);.           
35190 20 69 66 28 20 6e 42 79 74 65 2b 6e 2b 31 3e 6e   if( nByte+n+1>n
351a0 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Out ){.         
351b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
351c0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
351d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
351e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
351f0 20 6d 65 6d 6d 6f 76 65 28 26 7a 44 65 6c 5b 6e   memmove(&zDel[n
35200 5d 2c 20 7a 44 65 6c 2c 20 6e 42 79 74 65 2b 31  ], zDel, nByte+1
35210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
35220 20 6d 65 6d 63 70 79 28 7a 44 65 6c 2c 20 7a 49   memcpy(zDel, zI
35230 6e 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  n, n);.         
35240 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 6e 3b       nByte += n;
35250 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
35260 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35270 20 20 20 20 20 7a 44 65 6c 5b 6e 42 79 74 65 5d       zDel[nByte]
35280 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
35290 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
352a0 20 20 7a 49 6e 20 3d 20 7a 44 65 6c 3b 0a 20 20    zIn = zDel;.  
352b0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
352c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
352d0 7c 20 7a 49 6e 21 3d 7a 4f 75 74 20 7c 7c 20 7a  | zIn!=zOut || z
352e0 49 6e 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  In[0]=='/' );.  
352f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35300 5f 4f 4b 20 26 26 20 7a 49 6e 21 3d 7a 4f 75 74  _OK && zIn!=zOut
35310 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
35320 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 49  kFullPathname(zI
35330 6e 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a  n, zOut, nOut);.
35340 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 4c      }.    if( bL
35350 69 6e 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ink==0 ) break;.
35360 20 20 20 20 7a 49 6e 20 3d 20 7a 4f 75 74 3b 0a      zIn = zOut;.
35370 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
35380 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71  LITE_OK );..  sq
35390 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 65 6c 29  lite3_free(zDel)
353a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
353b0 65 6e 64 69 66 20 20 20 2f 2a 20 48 41 56 45 5f  endif   /* HAVE_
353c0 52 45 41 44 4c 49 4e 4b 20 26 26 20 48 41 56 45  READLINK && HAVE
353d0 5f 4c 53 54 41 54 20 2a 2f 0a 7d 0a 0a 0a 23 69  _LSTAT */.}...#i
353e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
353f0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
35400 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
35410 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
35420 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
35430 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
35440 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
35450 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
35460 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
35470 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
35480 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
35490 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
354a0 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
354b0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
354c0 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
354d0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
354e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
354f0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
35500 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
35510 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
35520 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
35530 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
35540 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
35550 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ion immediately 
35560 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
35570 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a  unixDlSym() or.*
35580 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66  * unixDlOpen() f
35590 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20  ails (returns a 
355a0 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49  null pointer). I
355b0 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65  f a more detaile
355c0 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
355d0 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ge is available,
355e0 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
355f0 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f  o zBufOut. If no
35600 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
35610 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
35620 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20  zBufOut is left 
35630 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53  unmodified and S
35640 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66  QLite uses a def
35650 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  ault.** error me
35660 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
35670 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f   void unixDlErro
35680 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
35690 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
356a0 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
356b0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
356c0 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
356d0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
356e0 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
356f0 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20  tex();.  zErr = 
35700 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  dlerror();.  if(
35710 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c   zErr ){.    sql
35720 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
35730 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73  uf, zBufOut, "%s
35740 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  ", zErr);.  }.  
35750 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
35760 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
35770 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69  (*unixDlSym(sqli
35780 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
35790 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74  , void *p, const
357a0 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69   char*zSym))(voi
357b0 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47  d){.  /* .  ** G
357c0 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  CC with -pedanti
357d0 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68  c-errors says th
357e0 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20  at C90 does not 
357f0 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f  allow a void* to
35800 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e   be.  ** cast in
35810 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
35820 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64  a function.  And
35830 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79   yet the library
35840 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65   dlsym() routine
35850 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
35860 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72  void* which is r
35870 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
35880 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
35890 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a  So how do we.  *
358a0 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69  * use dlsym() wi
358b0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
358c0 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ors?.  **.  ** V
358d0 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20  ariable x below 
358e0 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
358f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
35900 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a  function taking.
35910 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20    ** parameters 
35920 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20  void* and const 
35930 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e  char* and return
35940 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
35950 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a   a function..  *
35960 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  * We initialize 
35970 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69  x by assigning i
35980 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
35990 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74  he dlsym() funct
359a0 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20  ion..  ** (That 
359b0 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69  assignment requi
359c0 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68  res a cast.)  Th
359d0 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66  en we call the f
359e0 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a  unction that.  *
359f0 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  * x points to.  
35a00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
35a10 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75  work-around is u
35a20 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20  nlikely to work 
35a30 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79  correctly on any
35a40 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20   system where.  
35a50 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61  ** you really ca
35a60 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63  nnot cast a func
35a70 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74  tion pointer int
35a80 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68  o void*.  But th
35a90 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  en, on the.  ** 
35aa0 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79  other hand, dlsy
35ab0 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  m() will not wor
35ac0 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74  k on such a syst
35ad0 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65  em either, so we
35ae0 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72   have.  ** not r
35af0 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68  eally lost anyth
35b00 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64  ing..  */.  void
35b10 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f   (*(*x)(void*,co
35b20 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
35b30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
35b40 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
35b50 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29    x = (void(*(*)
35b60 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
35b70 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d  r*))(void))dlsym
35b80 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28  ;.  return (*x)(
35b90 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  p, zSym);.}.stat
35ba0 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
35bb0 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
35bc0 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
35bd0 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
35be0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
35bf0 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
35c00 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
35c10 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
35c20 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
35c30 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
35c40 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
35c50 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
35c60 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
35c70 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
35c80 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
35c90 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
35ca0 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
35cb0 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
35cc0 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
35cd0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
35ce0 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
35cf0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
35d00 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
35d10 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
35d20 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
35d30 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
35d40 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
35d50 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
35d60 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
35d70 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
35d80 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
35d90 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
35da0 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
35db0 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
35dc0 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
35dd0 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
35de0 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
35df0 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
35e00 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
35e10 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
35e20 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
35e30 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
35e40 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
35e50 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
35e60 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
35e70 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
35e80 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
35e90 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
35ea0 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
35eb0 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
35ec0 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
35ed0 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
35ee0 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
35ef0 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
35f00 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
35f10 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
35f20 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
35f30 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
35f40 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
35f50 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
35f60 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
35f70 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
35f80 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
35f90 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
35fa0 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
35fb0 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
35fc0 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
35fd0 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
35fe0 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
35ff0 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
36000 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
36010 6e 42 75 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e  nBuf);.  randomn
36020 65 73 73 50 69 64 20 3d 20 6f 73 47 65 74 70 69  essPid = osGetpi
36030 64 28 30 29 3b 20 20 0a 23 69 66 20 21 64 65 66  d(0);  .#if !def
36040 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
36050 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
36060 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d  LITE_OMIT_RANDOM
36070 4e 45 53 53 29 0a 20 20 7b 0a 20 20 20 20 69 6e  NESS).  {.    in
36080 74 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66  t fd, got;.    f
36090 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
360a0 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20  "/dev/urandom", 
360b0 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20  O_RDONLY, 0);.  
360c0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
360d0 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20      time_t t;.  
360e0 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20      time(&t);.  
360f0 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c      memcpy(zBuf,
36100 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b   &t, sizeof(t));
36110 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  .      memcpy(&z
36120 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20  Buf[sizeof(t)], 
36130 26 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 2c 20  &randomnessPid, 
36140 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73  sizeof(randomnes
36150 73 50 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73  sPid));.      as
36160 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b  sert( sizeof(t)+
36170 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73  sizeof(randomnes
36180 73 50 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e  sPid)<=(size_t)n
36190 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75  Buf );.      nBu
361a0 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20  f = sizeof(t) + 
361b0 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73  sizeof(randomnes
361c0 73 50 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sPid);.    }else
361d0 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f 74 20  {.      do{ got 
361e0 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75  = osRead(fd, zBu
361f0 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65  f, nBuf); }while
36200 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
36210 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20  ==EINTR );.     
36220 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c   robust_close(0,
36230 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
36240 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
36250 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a  .  return nBuf;.
36260 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
36270 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
36280 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
36290 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
362a0 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
362b0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
362c0 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
362d0 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
362e0 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
362f0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
36300 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
36310 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
36320 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
36330 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
36340 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
36350 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
36360 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
36370 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
36380 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
36390 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
363a0 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
363b0 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
363c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
363d0 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65  unixSleep(sqlite
363e0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
363f0 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
36400 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
36410 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
36420 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76  pec sp;..  sp.tv
36430 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f  _sec = microseco
36440 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20  nds / 1000000;. 
36450 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d   sp.tv_nsec = (m
36460 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30  icroseconds % 10
36470 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20  00000) * 1000;. 
36480 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20   nanosleep(&sp, 
36490 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f  NULL);.  UNUSED_
364a0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
364b0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
364c0 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66  roseconds;.#elif
364d0 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53   defined(HAVE_US
364e0 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
364f0 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69  LEEP.  usleep(mi
36500 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  croseconds);.  U
36510 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36520 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
36530 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
36540 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63  .#else.  int sec
36550 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63  onds = (microsec
36560 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30  onds+999999)/100
36570 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65  0000;.  sleep(se
36580 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
36590 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
365a0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ed);.  return se
365b0 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
365c0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
365d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
365e0 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
365f0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
36600 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
36610 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
36620 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
36630 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
36640 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
36650 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
36660 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
36670 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
36680 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
36690 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
366a0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
366b0 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
366c0 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
366d0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
366e0 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
366f0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
36700 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
36710 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
36720 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
36730 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
36740 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
36750 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
36760 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
36770 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
36780 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
36790 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
367a0 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
367b0 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
367c0 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
367d0 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
367e0 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
367f0 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
36800 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
36810 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
36820 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
36830 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
36840 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
36850 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
36860 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  OK.  Return SQLI
36870 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20  TE_ERROR if the 
36880 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a  time and date .*
36890 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  * cannot be foun
368a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
368b0 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
368c0 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
368d0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69  s *NotUsed, sqli
368e0 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
368f0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
36900 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
36910 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
36920 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
36930 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20 69  t64)8640000;.  i
36940 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36950 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  K;.#if defined(N
36960 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65  O_GETTOD).  time
36970 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29  _t t;.  time(&t)
36980 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73  ;.  *piNow = ((s
36990 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a  qlite3_int64)t)*
369a0 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68  1000 + unixEpoch
369b0 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52  ;.#elif OS_VXWOR
369c0 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
369d0 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f  spec sNow;.  clo
369e0 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b  ck_gettime(CLOCK
369f0 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77  _REALTIME, &sNow
36a00 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e  );.  *piNow = un
36a10 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28  ixEpoch + 1000*(
36a20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e  sqlite3_int64)sN
36a30 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77  ow.tv_sec + sNow
36a40 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30  .tv_nsec/1000000
36a50 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
36a60 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20   timeval sNow;. 
36a70 20 28 76 6f 69 64 29 67 65 74 74 69 6d 65 6f 66   (void)gettimeof
36a80 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 20 20  day(&sNow, 0);  
36a90 2f 2a 20 43 61 6e 6e 6f 74 20 66 61 69 6c 20 67  /* Cannot fail g
36aa0 69 76 65 6e 20 76 61 6c 69 64 20 61 72 67 75 6d  iven valid argum
36ab0 65 6e 74 73 20 2a 2f 0a 20 20 2a 70 69 4e 6f 77  ents */.  *piNow
36ac0 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
36ad0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
36ae0 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
36af0 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30   sNow.tv_usec/10
36b00 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  00;.#endif..#ifd
36b10 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
36b20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
36b30 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
36b40 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
36b50 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
36b60 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
36b70 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
36b80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
36b90 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
36ba0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
36bb0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
36bc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
36bd0 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 46 69 6e  ECATED./*.** Fin
36be0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
36bf0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
36c00 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
36c10 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
36c20 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
36c30 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
36c40 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
36c50 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
36c60 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
36c70 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
36c80 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
36c90 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
36ca0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
36cb0 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
36cc0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
36cd0 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
36ce0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
36cf0 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  i = 0;.  int rc;
36d00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
36d10 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
36d20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e 74  rc = unixCurrent
36d30 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29  TimeInt64(0, &i)
36d40 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38  ;.  *prNow = i/8
36d50 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74  6400000.0;.  ret
36d60 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a  urn rc;.}.#else.
36d70 23 20 64 65 66 69 6e 65 20 75 6e 69 78 43 75 72  # define unixCur
36d80 72 65 6e 74 54 69 6d 65 20 30 0a 23 65 6e 64 69  rentTime 0.#endi
36d90 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 47 65  f../*.** The xGe
36da0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
36db0 68 6f 64 20 69 73 20 64 65 73 69 67 6e 65 64 20  hod is designed 
36dc0 74 6f 20 72 65 74 75 72 6e 20 61 20 62 65 74 74  to return a bett
36dd0 65 72 0a 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20  er.** low-level 
36de0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68  error message wh
36df0 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73  en operating-sys
36e00 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d  tem problems com
36e10 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53  e up.** during S
36e20 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e  QLite operation.
36e30 20 20 4f 6e 6c 79 20 74 68 65 20 69 6e 74 65 67    Only the integ
36e40 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  er return code i
36e50 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  s currently.** u
36e60 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
36e70 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
36e80 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
36e90 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
36ea0 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
36eb0 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
36ec0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
36ed0 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
36ee0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
36ef0 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
36f00 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
36f10 3b 0a 20 20 72 65 74 75 72 6e 20 65 72 72 6e 6f  ;.  return errno
36f20 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*.*******
36f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36f40 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  * End of sqlite3
36f50 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
36f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36f70 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
36f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36fc0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
36fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37010 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
37020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37030 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79  **** Begin Proxy
37040 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
37050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37060 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
37070 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
37080 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67   a "uber-locking
37090 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73  -method" in this
370a0 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73   sense:  It uses
370b0 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f   the.** other lo
370c0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
370d0 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20   secondary lock 
370e0 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f  files.  Proxy lo
370f0 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65  cking is a.** me
37100 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f  ta-layer over to
37110 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69  p of the primiti
37120 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ve locking imple
37130 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46  mented above.  F
37140 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f  or.** this reaso
37150 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
37160 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
37170 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
37180 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20   is deferred.** 
37190 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68  until late in th
371a0 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66  e file (here) af
371b0 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f  ter all of the o
371c0 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73  ther I/O methods
371d0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65   have.** been de
371e0 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20  fined - so that 
371f0 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
37200 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72  cking methods ar
37210 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61  e available.** a
37220 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65  s services to he
37230 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c  lp with the impl
37240 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72  ementation of pr
37250 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  oxy locking..**.
37260 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
37270 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73  efault locking s
37280 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65  chemes in SQLite
37290 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20   use byte-range 
372a0 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  locks on the.** 
372b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
372c0 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65   coordinate safe
372d0 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63  , concurrent acc
372e0 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  ess by multiple 
372f0 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77  readers.** and w
37300 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73  riters [http://s
37310 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e  qlite.org/lockin
37320 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20  gv3.html].  The 
37330 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  five file lockin
37340 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c  g.** states (UNL
37350 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20  OCKED, PENDING, 
37360 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
37370 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65  , EXCLUSIVE) are
37380 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
37390 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20  as POSIX read & 
373a0 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72  write locks over
373b0 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f   fixed set of lo
373c0 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63  cations (via fsc
373d0 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61  tl),.** on AFP a
373e0 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c  nd SMB only excl
373f0 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65  usive byte-range
37400 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c   locks are avail
37410 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a  able via fsctl.*
37420 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27  * with _IOWR('z'
37430 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
37440 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74  eRangeLockPB2) t
37450 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65  o track the same
37460 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f   5 states..** To
37470 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44   simulate a F_RD
37480 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65  LCK on the share
37490 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20  d range, on AFP 
374a0 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  a randomly selec
374b0 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69  ted.** address i
374c0 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
374d0 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
374e0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
374f0 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61  he entire.** sha
37500 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
37510 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53  en for an EXCLUS
37520 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a  IVE lock):.**.**
37530 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
37540 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  TE        0x4000
37550 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53  0000.**      RES
37560 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20  ERVED_BYTE      
37570 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20   0x40000001.**  
37580 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45      SHARED_RANGE
37590 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
375a0 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30  02 -> 0x40000200
375b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
375c0 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f  s well on the lo
375d0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  cal file system,
375e0 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61   but shows a nea
375f0 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77  rly 100x.** slow
37600 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72  down in read per
37610 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20  formance on AFP 
37620 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20  because the AFP 
37630 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a  client disables.
37640 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68  ** the read cach
37650 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67  e when byte-rang
37660 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73  e locks are pres
37670 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74  ent.  Enabling t
37680 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65  he read.** cache
37690 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65   exposes a cache
376a0 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c   coherency probl
376b0 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65  em that is prese
376c0 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a  nt on all OS X.*
376d0 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77  * supported netw
376e0 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73  ork file systems
376f0 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62  .  NFS and AFP b
37700 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a  oth observe the.
37710 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e  ** close-to-open
37720 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65   semantics for e
37730 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f  nsuring cache co
37740 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70  herency.** [http
37750 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72  ://nfs.sourcefor
37760 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c  ge.net/#faq_a8],
37770 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
37780 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61  effectively.** a
37790 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69  ddress the requi
377a0 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63  rements for conc
377b0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
377c0 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
377d0 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e  le.** readers an
377e0 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74  d writers.** [ht
377f0 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e  tp://www.nabble.
37800 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46  com/SQLite-on-NF
37810 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63  S-cache-coherenc
37820 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d  y-td15655701.htm
37830 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64  l]..**.** To add
37840 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d  ress the perform
37850 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63  ance and cache c
37860 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c  oherency issues,
37870 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   proxy file lock
37880 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
37890 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20  he way database 
378a0 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f  access is contro
378b0 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67  lled by limiting
378c0 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20   access to a.** 
378d0 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61  single host at a
378e0 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67   time and moving
378f0 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20   file locks off 
37900 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
37910 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f  file.** and onto
37920 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e   a proxy file on
37930 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
37940 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a  system.  .**.**.
37950 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c  ** Using proxy l
37960 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ocks.** --------
37970 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
37980 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71  C APIs.**.**  sq
37990 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
379a0 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
379b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f  QLITE_FCNTL_SET_
379c0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
379d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
379e0 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70          <proxy_p
379f0 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29  ath> | ":auto:")
37a00 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.**  sqlite3_fi
37a10 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
37a20 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bname, SQLITE_FC
37a30 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_GET_LOCKPROX
37a40 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
37a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a60 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a  &<proxy_path>);.
37a70 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61  **.**.** SQL pra
37a80 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47  gmas.**.**  PRAG
37a90 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
37aa0 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70  ck_proxy_file=<p
37ab0 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75  roxy_path> | :au
37ac0 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  to:.**  PRAGMA [
37ad0 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
37ae0 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  roxy_file.**.** 
37af0 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74  Specifying ":aut
37b00 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69  o:" means that i
37b10 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e  f there is a con
37b20 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d  ch file with a m
37b30 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20  atching.** host 
37b40 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72  ID in it, the pr
37b50 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20  oxy path in the 
37b60 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
37b70 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69  be used, otherwi
37b80 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61  se.** a proxy pa
37b90 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  th based on the 
37ba0 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a  user's temp dir.
37bb0 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28  ** (via confstr(
37bc0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
37bd0 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77  TEMP_DIR,...)) w
37be0 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20  ill be used and 
37bf0 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72  the.** actual pr
37c00 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  oxy file name is
37c10 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
37c20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74  the name and pat
37c30 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  h of the.** data
37c40 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20  base file.  For 
37c50 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
37c60 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73       For databas
37c70 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d  e path "/Users/m
37c80 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20  e/foo.db" .**   
37c90 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74      The lock pat
37ca0 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64  h will be "<tmpd
37cb0 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73  ir>/sqliteplocks
37cc0 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64  /_Users_me_foo.d
37cd0 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20  b:auto:").**.** 
37ce0 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78  Once a lock prox
37cf0 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  y is configured 
37d00 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
37d10 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61  onnection, it ca
37d20 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f  n not.** be remo
37d30 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20  ved, however it 
37d40 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20  may be switched 
37d50 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
37d60 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a  roxy path via.**
37d70 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20   the above APIs 
37d80 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f  (assuming the co
37d90 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nch file is not 
37da0 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e  being held by an
37db0 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74  other.** connect
37dc0 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e  ion or process).
37dd0 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70   .**.**.** How p
37de0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  roxy locking wor
37df0 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
37e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
37e10 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c  .** Proxy file l
37e20 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72  ocking relies pr
37e30 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e  imarily on two n
37e40 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69  ew supporting fi
37e50 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  les: .**.**   * 
37e60 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c   conch file to l
37e70 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74  imit access to t
37e80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37e90 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73   to a single hos
37ea0 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74  t.**      at a t
37eb0 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70  ime.**.**   *  p
37ec0 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74  roxy file to act
37ed0 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20   as a proxy for 
37ee0 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  the advisory loc
37ef0 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20  ks normally.**  
37f00 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65      taken on the
37f10 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
37f20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d  The conch file -
37f30 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20   to use a proxy 
37f40 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73  file, sqlite mus
37f50 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68  t first "hold th
37f60 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74  e conch".** by t
37f70 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d  aking an sqlite-
37f80 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63  style shared loc
37f90 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  k on the conch f
37fa0 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65  ile, reading the
37fb0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  .** contents and
37fc0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68   comparing the h
37fd0 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73  ost's unique hos
37fe0 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29  t ID (see below)
37ff0 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f   and lock.** pro
38000 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20  xy path against 
38010 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
38020 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20  d in the conch. 
38030 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
38040 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  is.** stored in 
38050 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
38060 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ry as the databa
38070 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
38080 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20  file name.** is 
38090 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20  patterned after 
380a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
380b0 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74  e name as ".<dat
380c0 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68  abasename>-conch
380d0 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  "..** If the con
380e0 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  ch file does not
380f0 20 65 78 69 73 74 2c 20 6f 72 20 69 74 73 20 63   exist, or its c
38100 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d  ontents do not m
38110 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74  atch the.** host
38120 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79   ID and/or proxy
38130 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20   path, then the 
38140 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65  lock is escalate
38150 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  d to an exclusiv
38160 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68  e.** lock and th
38170 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
38180 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64  tents is updated
38190 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49   with the host I
381a0 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70  D and proxy.** p
381b0 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ath and the lock
381c0 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74   is downgraded t
381d0 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
381e0 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63  again.  If the c
381f0 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20  onch.** is held 
38200 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  by another proce
38210 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65  ss (with a share
38220 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63  d lock), the exc
38230 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77  lusive lock.** w
38240 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c  ill fail and SQL
38250 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
38260 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
38270 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73  proxy file - a s
38280 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20  ingle-byte file 
38290 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76  used for all adv
382a0 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73  isory file locks
382b0 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b  .** normally tak
382c0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
382d0 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20  se file.   This 
382e0 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20  allows for safe 
382f0 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  sharing.** of th
38300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
38310 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61  for multiple rea
38320 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
38330 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
38340 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20  host (the conch 
38350 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
38360 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61  y all use the sa
38370 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  me local lock fi
38380 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65  le)..**.** Reque
38390 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70  sting the lock p
383a0 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d  roxy does not im
383b0 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74  mediately take t
383c0 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a  he conch, it is.
383d0 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68  ** only taken wh
383e0 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71  en the first req
383f0 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74  uest to lock dat
38400 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61  abase file is ma
38410 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61  de.  .** This ma
38420 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74  tches the semant
38430 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69  ics of the tradi
38440 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62  tional locking b
38450 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a  ehavior, where.*
38460 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e  * opening a conn
38470 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
38480 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e  base file does n
38490 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f  ot take a lock o
384a0 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61  n it..** The sha
384b0 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20  red lock and an 
384c0 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
384d0 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69  ptor are maintai
384e0 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68  ned until .** th
384f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
38500 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
38510 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  closed. .**.** T
38520 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e  he proxy file an
38530 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  d the lock file 
38540 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65  are never delete
38550 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e  d so they only n
38560 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65  eed.** to be cre
38570 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74  ated the first t
38580 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65  ime they are use
38590 6