/ Hex Artifact Content
Login

Artifact fd755a51cc621b14c6b5816912e8e103ccc28c46d64f8173f22ba992ddbe9fd3:


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 7d 3b  ore */.#endif.};
9fb0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20  ../*.** A lists 
9fc0: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
9fd0: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a  Info objects..**
9fe0: 0a 2a 2a 20 4d 75 73 74 20 68 6f 6c 64 20 75 6e  .** Must hold un
9ff0: 69 78 42 69 67 4c 6f 63 6b 20 69 6e 20 6f 72 64  ixBigLock in ord
a000: 65 72 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  er to read or wr
a010: 69 74 65 20 74 68 69 73 20 76 61 72 69 61 62 6c  ite this variabl
a020: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69  e..*/.static uni
a030: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64  xInodeInfo *inod
a040: 65 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 41  eList = 0;  /* A
a050: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
a060: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 0a 23 69 66   objects */..#if
a070: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a080: 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 74  ./*.** True if t
a090: 68 65 20 69 6e 6f 64 65 20 6d 75 74 65 78 20 28  he inode mutex (
a0a0: 6f 6e 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  on the unixFile.
a0b0: 70 46 69 6c 65 4d 75 74 65 78 20 66 69 65 6c 64  pFileMutex field
a0c0: 29 20 69 73 20 68 65 6c 64 2c 20 6f 72 20 6e 6f  ) is held, or no
a0d0: 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  t..** This routi
a0e0: 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
a0f0: 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
a100: 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20 63  to help verify c
a110: 6f 72 72 65 63 74 20 6d 75 74 65 78 0a 2a 2a 20  orrect mutex.** 
a120: 75 73 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 75 6e  usage..*/.int un
a130: 69 78 46 69 6c 65 4d 75 74 65 78 48 65 6c 64 28  ixFileMutexHeld(
a140: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
a150: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  {.  assert( pFil
a160: 65 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 72  e->pInode );.  r
a170: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
a180: 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e  tex_held(pFile->
a190: 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
a1a0: 65 78 29 3b 0a 7d 0a 69 6e 74 20 75 6e 69 78 46  ex);.}.int unixF
a1b0: 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28  ileMutexNotheld(
a1c0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
a1d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  {.  assert( pFil
a1e0: 65 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 72  e->pInode );.  r
a1f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
a200: 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 46 69 6c  tex_notheld(pFil
a210: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  e->pInode->pLock
a220: 4d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  Mutex);.}.#endif
a230: 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ../*.**.** This 
a240: 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c  function - unixL
a250: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c  ogErrorAtLine(),
a260: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61   is only ever ca
a270: 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63  lled via the mac
a280: 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72  ro.** unixLogErr
a290: 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  or()..**.** It i
a2a0: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
a2b0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
a2c0: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
a2d0: 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20  n and errno has 
a2e0: 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20  been.** set. It 
a2f0: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
a300: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
a310: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
a320: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
a330: 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c  of.** errno and,
a340: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
a350: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
a360: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
a370: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a   strerror() or.*
a380: 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  * strerror_r()..
a390: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
a3a0: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
a3b0: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
a3c0: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
a3d0: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
a3e0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
a3f0: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
a400: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
a410: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
a420: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
a430: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
a440: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
a450: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
a460: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
a470: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67  t.** failed (e.g
a480: 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65  . "unlink", "ope
a490: 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f  n") and the asso
a4a0: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
a4b0: 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61  em path,.** if a
a4c0: 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75  ny..*/.#define u
a4d0: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  nixLogError(a,b,
a4e0: 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  c)     unixLogEr
a4f0: 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c  rorAtLine(a,b,c,
a500: 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63  __LINE__).static
a510: 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f   int unixLogErro
a520: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
a530: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
a540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
a550: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
a560: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
a570: 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  *zFunc,         
a580: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
a590: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
a5a0: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e   failed */.  con
a5b0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5d0: 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69  File path associ
a5e0: 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20  ated with error 
a5f0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20  */.  int iLine  
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c       /* Source l
a620: 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ine number where
a630: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
a640: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
a650: 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rr;             
a660: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61          /* Messa
a670: 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  ge from strerror
a680: 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  () or equivalent
a690: 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f   */.  int iErrno
a6a0: 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20   = errno;       
a6b0: 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73        /* Saved s
a6c0: 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d  yscall error num
a6d0: 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ber */..  /* If 
a6e0: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68  this is not a th
a6f0: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28  readsafe build (
a700: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
a710: 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a  E==0), then use.
a720: 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f    ** the strerro
a730: 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
a740: 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e  obtain the human
a750: 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20  -readable error 
a760: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75  message.  ** equ
a770: 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f  ivalent to errno
a780: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
a790: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20   strerror_r().. 
a7a0: 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f   */ .#if SQLITE_
a7b0: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
a7c0: 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52  fined(HAVE_STRER
a7d0: 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45  ROR_R).  char aE
a7e0: 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74  rr[80];.  memset
a7f0: 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (aErr, 0, sizeof
a800: 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20  (aErr));.  zErr 
a810: 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66  = aErr;..  /* If
a820: 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52   STRERROR_R_CHAR
a830: 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63  _P (set by autoc
a840: 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20  onf scripts) or 
a850: 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66  __USE_GNU is def
a860: 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d  ined,.  ** assum
a870: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
a880: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 47  m provides the G
a890: 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74  NU version of st
a8a0: 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a  rerror_r() that.
a8b0: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70    ** returns a p
a8c0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
a8d0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
a8e0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
a8f0: 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20   That pointer . 
a900: 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   ** may point to
a910: 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d   aErr[], or it m
a920: 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ay point to some
a930: 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20   static storage 
a940: 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a  somewhere. .  **
a950: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
a960: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
a970: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
a980: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66  POSIX version of
a990: 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f   .  ** strerror_
a9a0: 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79  r(), which alway
a9b0: 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f  s writes an erro
a9c0: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61  r message into a
a9d0: 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Err[]..  **.  **
a9e0: 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63   If the code inc
a9f0: 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73  orrectly assumes
aa00: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
aa10: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68  POSIX version th
aa20: 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c  at is.  ** avail
aa30: 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20  able, the error 
aa40: 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74  message will oft
aa50: 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  en be an empty s
aa60: 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a  tring. Not a.  *
aa70: 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20  * huge problem. 
aa80: 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63  Incorrectly conc
aa90: 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20  luding that the 
aaa0: 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61  GNU version is a
aab0: 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63  vailable .  ** c
aac0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73  ould lead to a s
aad0: 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a  egfault though..
aae0: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
aaf0: 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52  (STRERROR_R_CHAR
ab00: 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  _P) || defined(_
ab10: 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72  _USE_GNU).  zErr
ab20: 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74   = .# endif.  st
ab30: 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c  rerror_r(iErrno,
ab40: 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45   aErr, sizeof(aE
ab50: 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53  rr)-1);..#elif S
ab60: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
ab70: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
ab80: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
ab90: 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72  , but strerror_r
aba0: 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  () is not availa
abb0: 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  ble. */.  zErr =
abc0: 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20   "";.#else.  /* 
abd0: 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62  Non-threadsafe b
abe0: 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72  uild, use strerr
abf0: 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  or(). */.  zErr 
ac00: 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e  = strerror(iErrn
ac10: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
ac20: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
ac30: 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74  th = "";.  sqlit
ac40: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
ac50: 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63        "os_unix.c
ac60: 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29  :%d: (%d) %s(%s)
ac70: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
ac80: 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75  ine, iErrno, zFu
ac90: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a  nc, zPath, zErr.
aca0: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
acb0: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
acc0: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65   Close a file de
acd0: 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
ace0: 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63  We assume that c
acf0: 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c  lose() almost al
ad00: 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63  ways works, sinc
ad10: 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20  e it is only in 
ad20: 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61  a.** very sick a
ad30: 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e  pplication or on
ad40: 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61   a very sick pla
ad50: 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69  tform that it mi
ad60: 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20  ght fail..** If 
ad70: 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69  it does fail, si
ad80: 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69  mply leak the fi
ad90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62  le descriptor, b
ada0: 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a  ut do log the.**
adb0: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   error..**.** No
adc0: 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  te that it is no
add0: 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20  t safe to retry 
ade0: 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49  close() after EI
adf0: 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  NTR since the.**
ae00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ae10: 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65   might have alre
ae20: 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20  ady been reused 
ae30: 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  by another threa
ae40: 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27  d..** So we don'
ae50: 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65  t even try to re
ae60: 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49  cover from an EI
ae70: 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74  NTR.  Just log t
ae80: 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20  he error.** and 
ae90: 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  move on..*/.stat
aea0: 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63  ic void robust_c
aeb0: 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  lose(unixFile *p
aec0: 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74  File, int h, int
aed0: 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20   lineno){.  if( 
aee0: 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20  osClose(h) ){.  
aef0: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
af00: 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52  Line(SQLITE_IOER
af10: 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22  R_CLOSE, "close"
af20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
af30: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f           pFile ?
af40: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20   pFile->zPath : 
af50: 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a  0, lineno);.  }.
af60: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
af70: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
af80: 6f 2e 20 20 44 6f 20 74 68 69 73 20 69 6e 20 61  o.  Do this in a
af90: 20 73 75 62 72 6f 75 74 69 6e 65 20 61 73 20 74   subroutine as t
afa0: 68 61 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  hat provides.** 
afb0: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
afc0: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
afd0: 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
afe0: 63 20 76 6f 69 64 20 73 74 6f 72 65 4c 61 73 74  c void storeLast
aff0: 45 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a  Errno(unixFile *
b000: 70 46 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72  pFile, int error
b010: 29 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ){.  pFile->last
b020: 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d  Errno = error;.}
b030: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
b040: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
b050: 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e  rs accumuated in
b060: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
b070: 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74  fo->pUnused list
b080: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
b090: 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64  d closePendingFd
b0a0: 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
b0b0: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
b0c0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
b0d0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
b0e0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a  nixUnusedFd *p;.
b0f0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
b100: 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28  pNext;.  assert(
b110: 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 48 65   unixFileMutexHe
b120: 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 66  ld(pFile) );.  f
b130: 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e  or(p=pInode->pUn
b140: 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74  used; p; p=pNext
b150: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
b160: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62  ->pNext;.    rob
b170: 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
b180: 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   p->fd, __LINE__
b190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
b1a0: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49  ree(p);.  }.  pI
b1b0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
b1c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
b1d0: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
b1e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
b1f0: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
b200: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
b210: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
b220: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 6d 75   global mutex mu
b230: 73 74 20 62 65 20 68 65 6c 64 20 77 68 65 6e 20  st be held when 
b240: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b250: 63 61 6c 6c 65 64 2c 20 62 75 74 20 74 68 65 20  called, but the 
b260: 6d 75 74 65 78 0a 2a 2a 20 6f 6e 20 74 68 65 20  mutex.** on the 
b270: 69 6e 6f 64 65 20 62 65 69 6e 67 20 64 65 6c 65  inode being dele
b280: 74 65 64 20 6d 75 73 74 20 4e 4f 54 20 62 65 20  ted must NOT be 
b290: 68 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  held..*/.static 
b2a0: 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64  void releaseInod
b2b0: 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a  eInfo(unixFile *
b2c0: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
b2d0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
b2e0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
b2f0: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
b300: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
b310: 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65  assert( unixFile
b320: 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 46 69  MutexNotheld(pFi
b330: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  le) );.  if( ALW
b340: 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20  AYS(pInode) ){. 
b350: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d     pInode->nRef-
b360: 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
b370: 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
b380: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
b390: 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  de->pShmNode==0 
b3a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b3b0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 49 6e  _mutex_enter(pIn
b3c0: 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29  ode->pLockMutex)
b3d0: 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e  ;.      closePen
b3e0: 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
b3f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
b400: 74 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65  tex_leave(pInode
b410: 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20  ->pLockMutex);. 
b420: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
b430: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
b440: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
b450: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
b460: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
b470: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d    pInode->pPrev-
b480: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
b490: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
b4a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
b4b0: 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d  ert( inodeList==
b4c0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
b4d0: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
b4e0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
b4f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
b500: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a  Inode->pNext ){.
b510: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b520: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
b530: 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Prev==pInode );.
b540: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
b550: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
b560: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20  Inode->pPrev;.  
b570: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
b580: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
b590: 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
b5a0: 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
b5b0: 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a  3_free(pInode);.
b5c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
b5d0: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
b5e0: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
b5f0: 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  te the unixInode
b600: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
b610: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
b620: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
b630: 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  or.  Create a ne
b640: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
b650: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
b660: 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62  rn value might b
b670: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
b680: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
b690: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 67 6c  rs..**.** The gl
b6a0: 6f 62 61 6c 20 6d 75 74 65 78 20 6d 75 73 74 20  obal mutex must 
b6b0: 68 65 6c 64 20 77 68 65 6e 20 63 61 6c 6c 69 6e  held when callin
b6c0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
b6d0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
b6e0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
b6f0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
b700: 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49  c int findInodeI
b710: 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  nfo(.  unixFile 
b720: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
b730: 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
b740: 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73  le with file des
b750: 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  c used in the ke
b760: 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  y */.  unixInode
b770: 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20  Info **ppInode  
b780: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
b790: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
b7a0: 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f  o object here */
b7b0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
b7e0: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
b7f0: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
b820: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
b830: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
b840: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
b850: 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b  Id;      /* Look
b860: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
b870: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a  nixInodeInfo */.
b880: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
b890: 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
b8a0: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
b8b0: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
b8c0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
b8d0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20  o *pInode = 0;  
b8e0: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
b8f0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
b900: 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ject */..  asser
b910: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
b920: 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  () );..  /* Get 
b930: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
b940: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
b950: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
b960: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
b970: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
b980: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
b990: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
b9a0: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73  le->h;.  rc = os
b9b0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
b9c0: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
b9d0: 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
b9e0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
b9f0: 72 6e 6f 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  rno);.#if define
ba00: 64 28 45 4f 56 45 52 46 4c 4f 57 29 20 26 26 20  d(EOVERFLOW) && 
ba10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
ba20: 49 53 41 42 4c 45 5f 4c 46 53 29 0a 20 20 20 20  ISABLE_LFS).    
ba30: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  if( pFile->lastE
ba40: 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20  rrno==EOVERFLOW 
ba50: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ba60: 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20  NOLFS;.#endif.  
ba70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ba80: 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64  IOERR;.  }..#ifd
ba90: 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f  ef __APPLE__.  /
baa0: 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20  * On OS X on an 
bab0: 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
bac0: 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  , the inode numb
bad0: 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20  er is reported. 
bae0: 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   ** incorrectly 
baf0: 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69  for zero-size fi
bb00: 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74  les.  See ticket
bb10: 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b   #3260.  To work
bb20: 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69  .  ** around thi
bb30: 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f  s problem (we co
bb40: 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20  nsider it a bug 
bb50: 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c  in OS X, not SQL
bb60: 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77  ite).  ** we alw
bb70: 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65  ays increase the
bb80: 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20   file size to 1 
bb90: 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  by writing a sin
bba0: 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72  gle byte.  ** pr
bbb0: 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67  ior to accessing
bbc0: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
bbd0: 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65  r.  The one byte
bbe0: 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a   written is.  **
bbf0: 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68   an ASCII 'S' ch
bc00: 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c  aracter which al
bc10: 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  so happens to be
bc20: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
bc30: 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64    ** in the head
bc40: 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69  er of every SQLi
bc50: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  te database.  In
bc60: 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68   this way, if th
bc70: 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61  ere.  ** is a ra
bc80: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63  ce condition suc
bc90: 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74  h that another t
bca0: 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64  hread has alread
bcb0: 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a  y populated.  **
bcc0: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
bcd0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
bce0: 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f   no damage is do
bcf0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
bd00: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
bd10: 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46  0 && (pFile->fsF
bd20: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53  lags & SQLITE_FS
bd30: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21  FLAGS_IS_MSDOS)!
bd40: 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63  =0 ){.    do{ rc
bd50: 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22   = osWrite(fd, "
bd60: 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20  S", 1); }while( 
bd70: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
bd80: 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20  INTR );.    if( 
bd90: 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  rc!=1 ){.      s
bda0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
bdb0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
bdc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bdd0: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
bde0: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
bdf0: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
be00: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
be10: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
be20: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
be30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
be40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
be50: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
be60: 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64    memset(&fileId
be70: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  , 0, sizeof(file
be80: 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64  Id));.  fileId.d
be90: 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ev = statbuf.st_
bea0: 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dev;.#if OS_VXWO
beb0: 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64  RKS.  fileId.pId
bec0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23   = pFile->pId;.#
bed0: 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e  else.  fileId.in
bee0: 6f 20 3d 20 28 75 36 34 29 73 74 61 74 62 75 66  o = (u64)statbuf
bef0: 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a  .st_ino;.#endif.
bf00: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
bf10: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 70  texHeld() );.  p
bf20: 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73  Inode = inodeLis
bf30: 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  t;.  while( pIno
bf40: 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69  de && memcmp(&fi
bf50: 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66  leId, &pInode->f
bf60: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
bf70: 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49  leId)) ){.    pI
bf80: 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  node = pInode->p
bf90: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
bfa0: 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  pInode==0 ){.   
bfb0: 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65   pInode = sqlite
bfc0: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
bfd0: 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20  of(*pInode) );. 
bfe0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30     if( pInode==0
bff0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c000: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
c010: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  PT;.    }.    me
c020: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
c030: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
c040: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
c050: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
c060: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
c070: 6c 65 49 64 29 29 3b 0a 20 20 20 20 69 66 28 20  leId));.    if( 
c080: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
c090: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
c0a0: 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
c0b0: 70 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 73 71 6c  pLockMutex = sql
c0c0: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
c0d0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
c0e0: 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ST);.      if( p
c0f0: 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
c100: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
c110: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
c120: 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ode);.        re
c130: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
c140: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  M_BKPT;.      }.
c150: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 6f 64 65      }.    pInode
c160: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
c170: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
c180: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 20 20 70  xHeld() );.    p
c190: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69  Inode->pNext = i
c1a0: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49  nodeList;.    pI
c1b0: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b  node->pPrev = 0;
c1c0: 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69  .    if( inodeLi
c1d0: 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e  st ) inodeList->
c1e0: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a  pPrev = pInode;.
c1f0: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
c200: 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  pInode;.  }else{
c210: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
c220: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e  f++;.  }.  *ppIn
c230: 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ode = pInode;.  
c240: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c260: 6e 20 54 52 55 45 20 69 66 20 70 46 69 6c 65 20  n TRUE if pFile 
c270: 68 61 73 20 62 65 65 6e 20 72 65 6e 61 6d 65 64  has been renamed
c280: 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20 73 69 6e   or unlinked sin
c290: 63 65 20 69 74 20 77 61 73 20 66 69 72 73 74 20  ce it was first 
c2a0: 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  opened..*/.stati
c2b0: 63 20 69 6e 74 20 66 69 6c 65 48 61 73 4d 6f 76  c int fileHasMov
c2c0: 65 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ed(unixFile *pFi
c2d0: 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  le){.#if OS_VXWO
c2e0: 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 70 46 69  RKS.  return pFi
c2f0: 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26  le->pInode!=0 &&
c300: 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d 70 46 69   pFile->pId!=pFi
c310: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  le->pInode->file
c320: 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  Id.pId;.#else.  
c330: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
c340: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
c350: 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a 20 20  >pInode!=0 &&.  
c360: 20 20 20 20 28 6f 73 53 74 61 74 28 70 46 69 6c      (osStat(pFil
c370: 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75 66 29 21  e->zPath, &buf)!
c380: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
c390: 28 75 36 34 29 62 75 66 2e 73 74 5f 69 6e 6f 21  (u64)buf.st_ino!
c3a0: 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  =pFile->pInode->
c3b0: 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a 23 65 6e  fileId.ino);.#en
c3c0: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  dif.}.../*.** Ch
c3d0: 65 63 6b 20 61 20 75 6e 69 78 46 69 6c 65 20 74  eck a unixFile t
c3e0: 68 61 74 20 69 73 20 61 20 64 61 74 61 62 61 73  hat is a databas
c3f0: 65 2e 20 20 56 65 72 69 66 79 20 74 68 65 20 66  e.  Verify the f
c400: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
c410: 28 31 29 20 54 68 65 72 65 20 69 73 20 65 78 61  (1) There is exa
c420: 63 74 6c 79 20 6f 6e 65 20 68 61 72 64 20 6c 69  ctly one hard li
c430: 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  nk on the file.*
c440: 2a 20 28 32 29 20 54 68 65 20 66 69 6c 65 20 69  * (2) The file i
c450: 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63  s not a symbolic
c460: 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65   link.** (3) The
c470: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
c480: 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e  en renamed or un
c490: 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73  linked.**.** Iss
c4a0: 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  ue sqlite3_log(S
c4b0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e  QLITE_WARNING,..
c4c0: 2e 29 20 6d 65 73 73 61 67 65 73 20 69 66 20 61  .) messages if a
c4d0: 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f 74 20 72  nything is not r
c4e0: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
c4f0: 76 6f 69 64 20 76 65 72 69 66 79 44 62 46 69 6c  void verifyDbFil
c500: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
c510: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  e){.  struct sta
c520: 74 20 62 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b  t buf;.  int rc;
c530: 0a 0a 20 20 2f 2a 20 54 68 65 73 65 20 76 65 72  ..  /* These ver
c540: 69 66 69 63 61 74 69 6f 6e 73 20 6f 63 63 75 72  ifications occur
c550: 73 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  s for the main d
c560: 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 2a 2f 0a  atabase only */.
c570: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
c580: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
c590: 45 5f 4e 4f 4c 4f 43 4b 20 29 20 72 65 74 75 72  E_NOLOCK ) retur
c5a0: 6e 3b 0a 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  n;..  rc = osFst
c5b0: 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
c5c0: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
c5d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
c5e0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
c5f0: 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74  G, "cannot fstat
c600: 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46   db file %s", pF
c610: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
c620: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
c630: 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d  f( buf.st_nlink=
c640: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c650: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
c660: 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69  NING, "file unli
c670: 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a  nked while open:
c680: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
c690: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  th);.    return;
c6a0: 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73  .  }.  if( buf.s
c6b0: 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20  t_nlink>1 ){.   
c6c0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c6d0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75  ITE_WARNING, "mu
c6e0: 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20  ltiple links to 
c6f0: 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c 65  file: %s", pFile
c700: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
c710: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
c720: 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69  fileHasMoved(pFi
c730: 6c 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  le) ){.    sqlit
c740: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
c750: 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e  RNING, "file ren
c760: 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a  amed while open:
c770: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
c780: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  th);.    return;
c790: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  .  }.}.../*.** T
c7a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
c7b0: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
c7c0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
c7d0: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
c7e0: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
c7f0: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
c800: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
c810: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
c820: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
c830: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
c840: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
c850: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
c860: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
c870: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
c880: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
c890: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
c8a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
c8b0: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
c8c0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
c8d0: 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72  t unixCheckReser
c8e0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
c8f0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
c900: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
c910: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c920: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
c930: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
c940: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
c950: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
c960: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
c970: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
c980: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
c990: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
c9a0: 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  File );.  assert
c9b0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
c9c0: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
c9d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
c9e0: 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ex_enter(pFile->
c9f0: 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
ca00: 65 78 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ex);..  /* Check
ca10: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
ca20: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
ca30: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
ca40: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
ca50: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
ca60: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
ca70: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
ca80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65  ;.  }..  /* Othe
ca90: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
caa0: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
cab0: 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23  holds it..  */.#
cac0: 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  ifndef __DJGPP__
cad0: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
cae0: 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f   && !pFile->pIno
caf0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
cb00: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
cb10: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c  lock lock;.    l
cb20: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
cb30: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
cb40: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
cb50: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c  RVED_BYTE;.    l
cb60: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
cb70: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
cb80: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66   F_WRLCK;.    if
cb90: 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  ( osFcntl(pFile-
cba0: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
cbb0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ck) ){.      rc 
cbc0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
cbd0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
cbe0: 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
cbf0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
cc00: 72 6e 6f 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rno);.    } else
cc10: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
cc20: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
cc30: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
cc40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
cc50: 66 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d  f.  .  sqlite3_m
cc60: 75 74 65 78 5f 6c 65 61 76 65 28 70 46 69 6c 65  utex_leave(pFile
cc70: 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  ->pInode->pLockM
cc80: 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
cc90: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
cca0: 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c  %d %d %d (unix)\
ccb0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
ccc0: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
ccd0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
cce0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
ccf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
cd00: 61 20 70 6f 73 69 78 2d 61 64 76 69 73 6f 72 79  a posix-advisory
cd10: 2d 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -lock..**.** The
cd20: 72 65 20 61 72 65 20 74 77 6f 20 76 65 72 73 69  re are two versi
cd30: 6f 6e 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ons of this rout
cd40: 69 6e 65 2e 20 20 49 66 20 63 6f 6d 70 69 6c 65  ine.  If compile
cd50: 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45  d with.** SQLITE
cd60: 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54 49  _ENABLE_SETLK_TI
cd70: 4d 45 4f 55 54 20 74 68 65 6e 20 74 68 65 20 72  MEOUT then the r
cd80: 6f 75 74 69 6e 65 20 68 61 73 20 61 6e 20 65 78  outine has an ex
cd90: 74 72 61 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  tra parameter.**
cda0: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
cdb0: 74 65 72 20 74 6f 20 61 20 75 6e 69 78 46 69 6c  ter to a unixFil
cdc0: 65 2e 20 20 49 66 20 74 68 65 20 75 6e 69 78 46  e.  If the unixF
cdd0: 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75  ile->iBusyTimeou
cde0: 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 73 65  t.** value is se
cdf0: 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  t, then it is th
ce00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
ce10: 69 73 65 63 6f 6e 64 73 20 74 6f 20 77 61 69 74  iseconds to wait
ce20: 20 62 65 66 6f 72 65 0a 2a 2a 20 66 61 69 6c 69   before.** faili
ce30: 6e 67 20 74 68 65 20 6c 6f 63 6b 2e 20 20 54 68  ng the lock.  Th
ce40: 65 20 69 42 75 73 79 54 69 6d 65 6f 75 74 20 76  e iBusyTimeout v
ce50: 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20 72  alue is always r
ce60: 65 73 65 74 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  eset back to.** 
ce70: 7a 65 72 6f 20 6f 6e 20 65 61 63 68 20 63 61 6c  zero on each cal
ce80: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  l..**.** If SQLI
ce90: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f  TE_ENABLE_SETLK_
cea0: 54 49 4d 45 4f 55 54 20 69 73 20 6e 6f 74 20 64  TIMEOUT is not d
ceb0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 64 6f 20  efined, then do 
cec0: 61 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a  a non-blocking.*
ced0: 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * attempt to set
cee0: 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 23 69   the lock..*/.#i
cef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
cf00: 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55  BLE_SETLK_TIMEOU
cf10: 54 0a 23 20 64 65 66 69 6e 65 20 6f 73 53 65 74  T.# define osSet
cf20: 50 6f 73 69 78 41 64 76 69 73 6f 72 79 4c 6f 63  PosixAdvisoryLoc
cf30: 6b 28 68 2c 78 2c 74 29 20 6f 73 46 63 6e 74 6c  k(h,x,t) osFcntl
cf40: 28 68 2c 46 5f 53 45 54 4c 4b 2c 78 29 0a 23 65  (h,F_SETLK,x).#e
cf50: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  lse.static int o
cf60: 73 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72  sSetPosixAdvisor
cf70: 79 4c 6f 63 6b 28 0a 20 20 69 6e 74 20 68 2c 20  yLock(.  int h, 
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf90: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
cfa0: 69 70 74 6f 72 20 6f 6e 20 77 68 69 63 68 20 74  iptor on which t
cfb0: 6f 20 74 61 6b 65 20 74 68 65 20 6c 6f 63 6b 20  o take the lock 
cfc0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  */.  struct floc
cfd0: 6b 20 2a 70 4c 6f 63 6b 2c 20 20 2f 2a 20 54 68  k *pLock,  /* Th
cfe0: 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
cff0: 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   the lock */.  u
d000: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 20  nixFile *pFile  
d010: 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72       /* Structur
d020: 65 20 68 6f 6c 64 69 6e 67 20 74 69 6d 65 6f 75  e holding timeou
d030: 74 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  t value */.){.  
d040: 69 6e 74 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c  int rc = osFcntl
d050: 28 68 2c 46 5f 53 45 54 4c 4b 2c 70 4c 6f 63 6b  (h,F_SETLK,pLock
d060: 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3c 30  );.  while( rc<0
d070: 20 26 26 20 70 46 69 6c 65 2d 3e 69 42 75 73 79   && pFile->iBusy
d080: 54 69 6d 65 6f 75 74 3e 30 20 29 7b 0a 20 20 20  Timeout>0 ){.   
d090: 20 2f 2a 20 4f 6e 20 73 79 73 74 65 6d 73 20 74   /* On systems t
d0a0: 68 61 74 20 73 75 70 70 6f 72 74 20 73 6f 6d 65  hat support some
d0b0: 20 6b 69 6e 64 20 6f 66 20 62 6c 6f 63 6b 69 6e   kind of blockin
d0c0: 67 20 66 69 6c 65 20 6c 6f 63 6b 20 77 69 74 68  g file lock with
d0d0: 20 61 20 74 69 6d 65 6f 75 74 2c 0a 20 20 20 20   a timeout,.    
d0e0: 2a 2a 20 6d 61 6b 65 20 61 70 70 72 6f 70 72 69  ** make appropri
d0f0: 61 74 65 20 63 68 61 6e 67 65 73 20 68 65 72 65  ate changes here
d100: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 61 74 20   to invoke that 
d110: 62 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 20 6c 6f  blocking file lo
d120: 63 6b 2e 20 20 4f 6e 0a 20 20 20 20 2a 2a 20 67  ck.  On.    ** g
d130: 65 6e 65 72 69 63 20 70 6f 73 69 78 2c 20 68 6f  eneric posix, ho
d140: 77 65 76 65 72 2c 20 74 68 65 72 65 20 69 73 20  wever, there is 
d150: 6e 6f 20 73 75 63 68 20 41 50 49 2e 20 20 53 6f  no such API.  So
d160: 20 77 65 20 73 69 6d 70 6c 79 20 74 72 79 20 74   we simply try t
d170: 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 6f  he.    ** lock o
d180: 6e 63 65 20 65 76 65 72 79 20 6d 69 6c 6c 69 73  nce every millis
d190: 65 63 6f 6e 64 20 75 6e 74 69 6c 20 65 69 74 68  econd until eith
d1a0: 65 72 20 74 68 65 20 74 69 6d 65 6f 75 74 20 65  er the timeout e
d1b0: 78 70 69 72 65 73 2c 20 6f 72 20 75 6e 74 69 6c  xpires, or until
d1c0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
d1d0: 20 69 73 20 6f 62 74 61 69 6e 65 64 2e 20 2a 2f   is obtained. */
d1e0: 0a 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30  .    usleep(1000
d1f0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  );.    rc = osFc
d200: 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c 70 4c  ntl(h,F_SETLK,pL
d210: 6f 63 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ock);.    pFile-
d220: 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 2d 2d 3b  >iBusyTimeout--;
d230: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d240: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
d250: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c  LITE_ENABLE_SETL
d260: 4b 5f 54 49 4d 45 4f 55 54 20 2a 2f 0a 0a 0a 2f  K_TIMEOUT */.../
d270: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
d280: 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63  set a system-loc
d290: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46  k on the file pF
d2a0: 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ile.  The lock i
d2b0: 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  s .** described 
d2c0: 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  by pLock..**.** 
d2d0: 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73  If the pFile was
d2e0: 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
d2f0: 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63  te from unix-exc
d300: 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79  l, then the only
d310: 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62   lock.** ever ob
d320: 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63  tained is an exc
d330: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64  lusive lock, and
d340: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
d350: 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20  exactly once.** 
d360: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
d370: 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d  ny lock is attem
d380: 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65  pted.  All subse
d390: 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63  quent system loc
d3a0: 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  king.** operatio
d3b0: 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73  ns become no-ops
d3c0: 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  .  Locking opera
d3d0: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70  tions still happ
d3e0: 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a  en internally,.*
d3f0: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
d400: 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20  ordinate access 
d410: 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65  between separate
d420: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d430: 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20  tions.** within 
d440: 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75  this process, bu
d450: 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73  t all of that is
d460: 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f   handled in memo
d470: 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70  ry and the.** op
d480: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64  erating system d
d490: 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70  oes not particip
d4a0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
d4b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61  function is a pa
d4c0: 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63  ss-through to fc
d4d0: 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20  ntl(F_SETLK) if 
d4e0: 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a  pFile is using.*
d4f0: 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20  * any VFS other 
d500: 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  than "unix-excl"
d510: 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20   or if pFile is 
d520: 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d  opened on "unix-
d530: 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20  excl".** and is 
d540: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  read-only..**.**
d550: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
d560: 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f  d if the call co
d570: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
d580: 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61  ully, or -1 if a
d590: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74   call.** to fcnt
d5a0: 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68  l() fails. In th
d5b0: 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69  is case, errno i
d5c0: 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74  s set appropriat
d5d0: 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29  ely (by fcntl())
d5e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d5f0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69  unixFileLock(uni
d600: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74  xFile *pFile, st
d610: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63  ruct flock *pLoc
d620: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  k){.  int rc;.  
d630: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
d640: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
d650: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
d660: 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20   pInode!=0 );.  
d670: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d680: 6d 75 74 65 78 5f 68 65 6c 64 28 70 49 6e 6f 64  mutex_held(pInod
d690: 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 20 29  e->pLockMutex) )
d6a0: 3b 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  ;.  if( (pFile->
d6b0: 63 74 72 6c 46 6c 61 67 73 20 26 20 28 55 4e 49  ctrlFlags & (UNI
d6c0: 58 46 49 4c 45 5f 45 58 43 4c 7c 55 4e 49 58 46  XFILE_EXCL|UNIXF
d6d0: 49 4c 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e  ILE_RDONLY))==UN
d6e0: 49 58 46 49 4c 45 5f 45 58 43 4c 20 29 7b 0a 20  IXFILE_EXCL ){. 
d6f0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
d700: 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
d710: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66  {.      struct f
d720: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20  lock lock;.     
d730: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
d740: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  >nLock==0 );.   
d750: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
d760: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
d770: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d780: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
d790: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
d7a0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
d7b0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
d7c0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
d7d0: 20 20 20 72 63 20 3d 20 6f 73 53 65 74 50 6f 73     rc = osSetPos
d7e0: 69 78 41 64 76 69 73 6f 72 79 4c 6f 63 6b 28 70  ixAdvisoryLock(p
d7f0: 46 69 6c 65 2d 3e 68 2c 20 26 6c 6f 63 6b 2c 20  File->h, &lock, 
d800: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
d810: 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  ( rc<0 ) return 
d820: 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  rc;.      pInode
d830: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d  ->bProcessLock =
d840: 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   1;.      pInode
d850: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ->nLock++;.    }
d860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
d870: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
d880: 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 53 65  e{.    rc = osSe
d890: 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79 4c 6f  tPosixAdvisoryLo
d8a0: 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 70 4c 6f  ck(pFile->h, pLo
d8b0: 63 6b 2c 20 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  ck, pFile);.  }.
d8c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d8d0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
d8e0: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
d8f0: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
d900: 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
d910: 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
d920: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
d930: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
d940: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
d950: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
d960: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
d970: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
d980: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
d990: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
d9a0: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
d9b0: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
d9c0: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
d9d0: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
d9e0: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
d9f0: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
da00: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
da10: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
da20: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
da30: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
da40: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
da50: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
da60: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
da70: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
da80: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
da90: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
daa0: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
dab0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
dac0: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
dad0: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
dae0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
daf0: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
db00: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
db10: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
db20: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
db30: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
db40: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
db50: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
db60: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
db70: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
db80: 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
db90: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
dba0: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
dbb0: 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
dbc0: 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
dbd0: 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
dbe0: 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
dbf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
dc00: 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nixLock(sqlite3_
dc10: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
dc20: 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54  ileLock){.  /* T
dc30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73  he following des
dc40: 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65  cribes the imple
dc50: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
dc60: 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61   various locks a
dc70: 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61  nd.  ** lock tra
dc80: 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d  nsitions in term
dc90: 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61  s of the POSIX a
dca0: 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61  dvisory shared a
dcb0: 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a  nd exclusive.  *
dcc0: 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65  * lock primitive
dcd0: 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c  s (called read-l
dce0: 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c  ocks and write-l
dcf0: 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61  ocks below, to a
dd00: 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73  void.  ** confus
dd10: 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20  ion with SQLite 
dd20: 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65  lock names). The
dd30: 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20   algorithms are 
dd40: 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a  complicated.  **
dd50: 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64   slightly in ord
dd60: 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69  er to be compati
dd70: 62 6c 65 20 77 69 74 68 20 57 69 6e 64 6f 77 73  ble with Windows
dd80: 39 35 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  95 systems simul
dd90: 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
dda0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
ddb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
ddc0: 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
ddd0: 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
dde0: 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
ddf0: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
de00: 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
de10: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
de20: 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
de30: 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
de40: 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
de50: 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
de60: 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
de70: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
de80: 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
de90: 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
dea0: 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
deb0: 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
dec0: 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
ded0: 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
dee0: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
def0: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
df00: 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
df10: 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
df20: 75 6c 2c 20 27 73 68 61 72 65 64 20 62 79 74 65  ul, 'shared byte
df30: 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d   range' is read-
df40: 6c 6f 63 6b 65 64 0a 20 20 2a 2a 20 61 6e 64 20  locked.  ** and 
df50: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
df60: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
df70: 65 6c 65 61 73 65 64 2e 20 20 28 4c 65 67 61 63  eleased.  (Legac
df80: 79 20 6e 6f 74 65 3a 20 20 57 68 65 6e 0a 20 20  y note:  When.  
df90: 2a 2a 20 53 51 4c 69 74 65 20 77 61 73 20 66 69  ** SQLite was fi
dfa0: 72 73 74 20 64 65 76 65 6c 6f 70 65 64 2c 20 57  rst developed, W
dfb0: 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73  indows95 systems
dfc0: 20 77 65 72 65 20 73 74 69 6c 6c 20 76 65 72 79   were still very
dfd0: 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 2a 2a 20 61 6e   common,.  ** an
dfe0: 64 20 57 69 64 6e 6f 77 73 39 35 20 6c 61 63 6b  d Widnows95 lack
dff0: 73 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  s a shared-lock 
e000: 63 61 70 61 62 69 6c 69 74 79 2e 20 20 53 6f 20  capability.  So 
e010: 6f 6e 20 57 69 6e 64 6f 77 73 39 35 2c 20 61 0a  on Windows95, a.
e020: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 72 61 6e 64    ** single rand
e030: 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 20 62 79  omly selected by
e040: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
e050: 64 20 62 79 74 65 20 72 61 6e 67 65 27 20 69 73  d byte range' is
e060: 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2a 20 57 69   locked..  ** Wi
e070: 6e 64 6f 77 73 39 35 20 69 73 20 6e 6f 77 20 70  ndows95 is now p
e080: 72 65 74 74 79 20 6d 75 63 68 20 65 78 74 69 6e  retty much extin
e090: 63 74 2c 20 62 75 74 20 74 68 69 73 20 77 6f 72  ct, but this wor
e0a0: 6b 2d 61 72 6f 75 6e 64 20 66 6f 72 20 74 68 65  k-around for the
e0b0: 0a 20 20 2a 2a 20 6c 61 63 6b 20 6f 66 20 73 68  .  ** lack of sh
e0c0: 61 72 65 64 2d 6c 6f 63 6b 73 20 6f 6e 20 57 69  ared-locks on Wi
e0d0: 6e 64 6f 77 73 39 35 20 6c 69 76 65 73 20 6f 6e  ndows95 lives on
e0e0: 2c 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73 0a  , for backwards.
e0f0: 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 69 6c 69    ** compatibili
e100: 74 79 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ty.).  **.  ** A
e110: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
e120: 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  y obtain a RESER
e130: 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  VED lock after i
e140: 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c  t has a SHARED l
e150: 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45  ock..  ** A RESE
e160: 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70  RVED lock is imp
e170: 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62  lemented by grab
e180: 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  bing a write-loc
e190: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72  k on the.  ** 'r
e1a0: 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a  eserved byte'. .
e1b0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
e1c0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
e1d0: 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ain a PENDING lo
e1e0: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
e1f0: 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20  obtained a.  ** 
e200: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50  SHARED lock. A P
e210: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69  ENDING lock is i
e220: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
e230: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
e240: 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
e250: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e   'pending byte'.
e260: 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
e270: 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44  at no new SHARED
e280: 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20   locks can be.  
e290: 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74  ** obtained, but
e2a0: 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44   existing SHARED
e2b0: 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77   locks are allow
e2c0: 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41  ed to persist. A
e2d0: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f   process.  ** do
e2e0: 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f  es not have to o
e2f0: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
e300: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79   lock on the way
e310: 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   to a PENDING lo
e320: 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  ck..  ** This pr
e330: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62  operty is used b
e340: 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  y the algorithm 
e350: 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  for rolling back
e360: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
e370: 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61    ** after a cra
e380: 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  sh..  **.  ** An
e390: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
e3a0: 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20   obtained after 
e3b0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
e3c0: 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20  s held, is.  ** 
e3d0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
e3e0: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
e3f0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74  -lock on the ent
e400: 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65  ire 'shared byte
e410: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69  .  ** range'. Si
e420: 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f  nce all other lo
e430: 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65  cks require a re
e440: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f  ad-lock on one o
e450: 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a  f the bytes.  **
e460: 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e   within this ran
e470: 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  ge, this ensures
e480: 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c   that no other l
e490: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ocks are held on
e4a0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
e4b0: 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  se. .  */.  int 
e4c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e4d0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e4e0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e4f0: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
e500: 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74  fo *pInode;.  st
e510: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
e520: 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20  .  int tErrno = 
e530: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  0;..  assert( pF
e540: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
e550: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
e560: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
e570: 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
e580: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
e590: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
e5a0: 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
e5b0: 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
e5c0: 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69  ock),.      azFi
e5d0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49  leLock(pFile->pI
e5e0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
e5f0: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
e600: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
e610: 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
e620: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
e630: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
e640: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
e650: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
e660: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
e670: 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
e680: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
e690: 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
e6a0: 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
e6b0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
e6c0: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
e6d0: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
e6e0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
e6f0: 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
e700: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
e710: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
e720: 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
e730: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e740: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
e750: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
e760: 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74  Lock)));.    ret
e770: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
e780: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
e790: 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
e7a0: 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
e7b0: 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ct..  **  (1) We
e7c0: 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
e7d0: 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
e7e0: 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
e7f0: 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
e800: 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
e810: 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
e820: 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
e830: 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
e840: 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
e850: 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
e860: 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
e870: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
e880: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e890: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e8a0: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
e8b0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
e8c0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
e8d0: 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
e8e0: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
e8f0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
e900: 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
e910: 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
e920: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
e930: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
e940: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
e950: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
e960: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
e970: 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
e980: 2a 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  */.  pInode = pF
e990: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73  ile->pInode;.  s
e9a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e9b0: 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  er(pInode->pLock
e9c0: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  Mutex);..  /* If
e9d0: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
e9e0: 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
e9f0: 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
ea00: 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
ea10: 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
ea20: 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
ea30: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
ea40: 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
ea50: 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
ea60: 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
ea70: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
ea80: 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f  .          (pIno
ea90: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
eaa0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
eab0: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
eac0: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
ead0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
eae0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
eaf0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ock;.  }..  /* I
eb00: 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
eb10: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
eb20: 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
eb30: 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
eb40: 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
eb50: 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
eb60: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
eb70: 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
eb80: 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
eb90: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
eba0: 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OK..  */.  if( e
ebb0: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
ebc0: 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20  _LOCK && .      
ebd0: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
ebe0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
ebf0: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
ec00: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
ec10: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
ec20: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
ec30: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
ec40: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
ec50: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
ec60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
ec70: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
ec80: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
ec90: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
eca0: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
ecb0: 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
ecc0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
ecd0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
ece0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ock;.  }...  /* 
ecf0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
ed00: 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
ed10: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
ed20: 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
ed30: 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
ed40: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
ed50: 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
ed60: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
ed70: 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
ed80: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
ed90: 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  */.  lock.l_len 
eda0: 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77  = 1L;.  lock.l_w
edb0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
edc0: 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  ;.  if( eFileLoc
edd0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
ede0: 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
edf0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
ee00: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
ee10: 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
ee20: 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c  LOCK).  ){.    l
ee30: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46  ock.l_type = (eF
ee40: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
ee50: 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57  LOCK?F_RDLCK:F_W
ee60: 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  RLCK);.    lock.
ee70: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
ee80: 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20  G_BYTE;.    if( 
ee90: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
eea0: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
eeb0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
eec0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
eed0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
eee0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
eef0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
ef00: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
ef10: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
ef20: 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
ef30: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
ef40: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
ef50: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
ef60: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
ef70: 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
ef80: 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
ef90: 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
efa0: 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
efb0: 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
efc0: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
efd0: 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
efe0: 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
eff0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
f000: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
f010: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
f020: 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
f030: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
f040: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
f050: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
f060: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f070: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  ;..    /* Now ge
f080: 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
f090: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
f0a0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f0b0: 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ST;.    lock.l_l
f0c0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
f0d0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
f0e0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f0f0: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
f100: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f110: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
f120: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
f130: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
f140: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
f150: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f     }..    /* Dro
f160: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
f170: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
f180: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f190: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
f1a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
f1b0: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
f1c0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
f1d0: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
f1e0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f1f0: 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ck) && rc==SQLIT
f200: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
f210: 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70   This could happ
f220: 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72  en with a networ
f230: 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  k mount */.     
f240: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
f250: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
f260: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
f270: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28   .    }..    if(
f280: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
f290: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
f2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
f2b0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
f2c0: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
f2d0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
f2e0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  d_lock;.    }els
f2f0: 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
f300: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
f310: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
f320: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
f330: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
f340: 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
f350: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
f360: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
f370: 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
f380: 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
f390: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
f3a0: 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
f3b0: 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
f3c0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
f3d0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
f3e0: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
f3f0: 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
f400: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
f410: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
f420: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
f430: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
f440: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
f450: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
f460: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
f470: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
f480: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
f490: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
f4a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
f4b0: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
f4c0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f4d0: 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
f4e0: 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ock );.    lock.
f4f0: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
f500: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
f510: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
f520: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  ED_LOCK || eFile
f530: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
f540: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20  LOCK );.    if( 
f550: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
f560: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
f570: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
f580: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
f590: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
f5a0: 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65   = 1L;.    }else
f5b0: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
f5c0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f5d0: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
f5e0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
f5f0: 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  IZE;.    }..    
f600: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f610: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
f620: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
f630: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
f640: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f650: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f660: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f670: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
f680: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
f690: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  SY ){.        st
f6a0: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
f6b0: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
f6c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
f6d0: 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   ..#ifdef SQLITE
f6e0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20  _DEBUG.  /* Set 
f6f0: 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
f700: 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on-counter chang
f710: 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73  e checking flags
f720: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   when.  ** trans
f730: 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20  itioning from a 
f740: 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45  SHARED to a RESE
f750: 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20  RVED lock.  The 
f760: 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d  change.  ** from
f770: 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
f780: 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65  VED marks the be
f790: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72  ginning of a nor
f7a0: 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f  mal.  ** write o
f7b0: 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20  peration (not a 
f7c0: 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot journal roll
f7d0: 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  back)..  */.  if
f7e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
f7f0: 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69     && pFile->eFi
f800: 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
f810: 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c  OCK.   && eFileL
f820: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
f830: 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c  CK.  ){.    pFil
f840: 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
f850: 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
f860: 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
f870: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
f880: 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d  alWrite = 1;.  }
f890: 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20  .#endif...  if( 
f8a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f8b0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
f8c0: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
f8d0: 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
f8e0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
f8f0: 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
f900: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
f910: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
f920: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
f930: 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
f940: 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
f950: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
f960: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
f970: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74  nd_lock:.  sqlit
f980: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
f990: 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
f9a0: 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
f9b0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
f9c0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
f9d0: 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
f9e0: 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
f9f0: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
fa00: 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
fa10: 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
fa20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
fa30: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
fa40: 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c  ptor used by fil
fa50: 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74  e handle pFile t
fa60: 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
fa70: 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c  ing.** pUnused l
fa80: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
fa90: 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64  oid setPendingFd
faa0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
fab0: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
fac0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
fad0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
fae0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20  ixUnusedFd *p = 
faf0: 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
fb00: 61 74 65 64 55 6e 75 73 65 64 3b 0a 20 20 61 73  atedUnused;.  as
fb10: 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75  sert( unixFileMu
fb20: 74 65 78 48 65 6c 64 28 70 46 69 6c 65 29 20 29  texHeld(pFile) )
fb30: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
fb40: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
fb50: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
fb60: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
fb70: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
fb80: 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
fb90: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
fba0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
fbb0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
fbc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
fbd0: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
fbe0: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
fbf0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
fc00: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
fc10: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
fc20: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fc30: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
fc40: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
fc50: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
fc60: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
fc70: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
fc80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
fc90: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20  a no-op..** .** 
fca0: 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  If handleNFSUnlo
fcb0: 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ck is true, then
fcc0: 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   on downgrading 
fcd0: 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  an EXCLUSIVE_LOC
fce0: 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74  K to SHARED.** t
fcf0: 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73  he byte range is
fd00: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20   divided into 2 
fd10: 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69  parts and the fi
fd20: 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f  rst part is unlo
fd30: 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74  cked then.** set
fd40: 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c   to a read lock,
fd50: 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20   then the other 
fd60: 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75  part is simply u
fd70: 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77  nlocked.  This w
fd80: 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20  orks .** around 
fd90: 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53  a bug in BSD NFS
fda0: 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65   lockd (also see
fdb0: 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33  n on MacOSX 10.3
fdc0: 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f  +) that fails to
fdd0: 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20   .** remove the 
fde0: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20  write lock on a 
fdf0: 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65  region when a re
fe00: 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a  ad lock is set..
fe10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
fe20: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
fe30: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
fe40: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
fe50: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
fe60: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
fe70: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
fe80: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
fe90: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
fea0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
feb0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
fec0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
fed0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
fee0: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
fef0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
ff00: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
ff10: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
ff20: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
ff30: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ff40: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
ff50: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
ff60: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
ff70: 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74  red,.      osGet
ff80: 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73  pid(0)));..  ass
ff90: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
ffa0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
ffb0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
ffc0: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
ffd0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ffe0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
fff0: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
10000 70 49 6e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65  pInode;.  sqlite
10010 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 49  3_mutex_enter(pI
10020 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
10030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
10040 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
10050 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
10060 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
10070 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
10080 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
10090 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
100a0 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66  FileLock );..#if
100b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
100c0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
100d0 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
100e0 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
100f0 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
10100 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
10110 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10120 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
10130 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
10140 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
10150 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
10160 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
10170 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
10180 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
10190 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
101a0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
101b0 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
101c0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
101d0 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
101e0 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
101f0 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
10200 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
10210 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
10220 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
10230 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
10240 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
10250 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
10260 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
10270 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
10280 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
10290 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e    */.    pFile->
102a0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
102b0 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
102c0 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f  * downgrading to
102d0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
102e0 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63  n NFS involves c
102f0 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74  learing the writ
10300 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65  e lock.    ** be
10310 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e  fore establishin
10320 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d  g the readlock -
10330 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65   to avoid a race
10340 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f   condition we do
10350 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74  wngrade.    ** t
10360 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f  he lock in 2 blo
10370 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72  cks, so that par
10380 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77  t of the range w
10390 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62  ill be covered b
103a0 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74  y a .    ** writ
103b0 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65  e lock until the
103c0 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64   rest is covered
103d0 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a   by a read lock:
103e0 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57  .    **  1:   [W
103f0 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a  WWWW].    **  2:
10400 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a     [....W].    *
10410 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a  *  3:   [RRRRW].
10420 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52      **  4:   [RR
10430 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RR.].    */.    
10440 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
10450 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69  HARED_LOCK ){.#i
10460 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  f !defined(__APP
10470 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45  LE__) || !SQLITE
10480 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
10490 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69  STYLE.      (voi
104a0 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  d)handleNFSUnloc
104b0 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
104c0 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
104d0 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==0 );.#endif.#i
104e0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
104f0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
10500 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
10510 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61  YLE.      if( ha
10520 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b  ndleNFSUnlock ){
10530 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
10540 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
10550 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
10560 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
10570 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
10580 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a      off_t divSiz
10590 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20  e = SHARED_SIZE 
105a0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  - 1;.        .  
105b0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
105c0 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
105d0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
105e0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
105f0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
10600 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
10610 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
10620 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
10630 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
10640 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10650 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
10660 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
10670 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
10680 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10690 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
106a0 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
106b0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
106c0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
106d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
106e0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
106f0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
10700 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
10710 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
10720 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
10730 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
10740 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
10750 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
10760 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
10770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
10780 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10790 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
107a0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
107b0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
107c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
107d0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
107e0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
107f0 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
10800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
10810 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
10820 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
10830 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
10840 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
10850 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10860 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
10870 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
10880 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
10890 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
108a0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
108b0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
108c0 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
108d0 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
108e0 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a  _FIRST+divSize;.
108f0 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
10900 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
10910 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  -divSize;.      
10920 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
10930 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
10940 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
10950 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
10960 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
10970 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
10980 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
10990 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
109a0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
109b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
109c0 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
109d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
109e0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  e.#endif /* defi
109f0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
10a00 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
10a10 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
10a20 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
10a30 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
10a40 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
10a50 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
10a60 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
10a70 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10a80 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
10a90 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
10aa0 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
10ab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
10ac0 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
10ad0 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
10ae0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
10af0 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  y, the call to u
10b00 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61  nixFileLock() ca
10b10 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73  nnot fail becaus
10b20 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20  e another.      
10b30 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69      ** process i
10b40 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63  s holding an inc
10b50 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20  ompatible lock. 
10b60 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73  If it does, this
10b70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
10b80 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
10b90 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
10ba0 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
10bb0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20   the locking.   
10bc0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63         ** protoc
10bd0 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ol. If this happ
10be0 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ens, return SQLI
10bf0 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e  TE_IOERR_RDLOCK.
10c00 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   Returning.     
10c10 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42       ** SQLITE_B
10c20 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73  USY would confus
10c30 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  e the upper laye
10c40 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69  r (in practice i
10c50 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20  t causes .      
10c60 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74      ** an assert
10c70 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20   to fail). */ . 
10c80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10c90 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
10ca0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  K;.          sto
10cb0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
10cc0 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
10cd0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
10ce0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
10cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10d00 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
10d10 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
10d20 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
10d30 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
10d40 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
10d50 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
10d60 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
10d70 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
10d80 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
10d90 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
10da0 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
10db0 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
10dc0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
10dd0 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
10de0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
10df0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10e00 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10e10 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
10e20 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
10e30 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rno);.      goto
10e40 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
10e50 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69   }.  }.  if( eFi
10e60 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
10e70 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  ){.    /* Decrem
10e80 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
10e90 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
10ea0 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
10eb0 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
10ec0 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
10ed0 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
10ee0 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
10ef0 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
10f00 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
10f10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
10f20 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
10f30 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
10f40 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
10f50 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
10f60 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
10f70 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
10f80 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
10f90 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
10fa0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
10fb0 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
10fc0 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
10fd0 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
10fe0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
10ff0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
11000 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11010 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11020 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
11030 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
11040 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
11050 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  no);.        pIn
11060 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
11070 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
11080 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11090 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
110a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
110b0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
110c0 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
110d0 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
110e0 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
110f0 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
11100 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
11110 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
11120 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
11130 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
11140 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
11150 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
11160 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
11170 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
11180 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73  nLock--;.    ass
11190 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
111a0 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ck>=0 );.    if(
111b0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
111c0 30 20 29 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  0 ) closePending
111d0 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  Fds(pFile);.  }.
111e0 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 73  .end_unlock:.  s
111f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
11200 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  ve(pInode->pLock
11210 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 72 63  Mutex);.  if( rc
11220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11230 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11240 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11250 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
11270 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
11280 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
11290 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
112a0 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
112b0 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
112c0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
112d0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
112e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
112f0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
11300 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11310 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
11320 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
11330 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
11340 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
11350 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
11360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
11370 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
11380 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
11390 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20  eFileLock){.#if 
113a0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
113b0 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28  SIZE>0.  assert(
113c0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
113d0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69  ED_LOCK || ((uni
113e0 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65  xFile *)id)->nFe
113f0 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e  tchOut==0 );.#en
11400 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  dif.  return pos
11410 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
11420 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23  leLock, 0);.}..#
11430 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
11440 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63  AP_SIZE>0.static
11450 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65   int unixMapfile
11460 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20  (unixFile *pFd, 
11470 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74  i64 nByte);.stat
11480 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61  ic void unixUnma
11490 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
114a0 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pFd);.#endif../*
114b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
114c0 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70  n performs the p
114d0 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f  arts of the "clo
114e0 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69  se file" operati
114f0 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f  on .** common to
11500 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68   all locking sch
11510 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20  emes. It closes 
11520 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e  the directory an
11530 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65  d file.** handle
11540 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76  s, if they are v
11550 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61  alid, and sets a
11560 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
11570 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
11580 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a  ucture to 0..**.
11590 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e  ** It is *not* n
115a0 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64  ecessary to hold
115b0 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20   the mutex when 
115c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
115d0 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20  called,.** even 
115e0 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d  on VxWorks.  A m
115f0 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71  utex will be acq
11600 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  uired on VxWorks
11610 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72   by the.** vxwor
11620 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
11630 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
11640 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e  atic int closeUn
11650 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66  ixFile(sqlite3_f
11660 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
11670 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11680 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66  nixFile*)id;.#if
11690 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
116a0 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e  _SIZE>0.  unixUn
116b0 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
116c0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69  #endif.  if( pFi
116d0 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  le->h>=0 ){.    
116e0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
116f0 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f  le, pFile->h, __
11700 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69  LINE__);.    pFi
11710 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a  le->h = -1;.  }.
11720 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
11730 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20   if( pFile->pId 
11740 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  ){.    if( pFile
11750 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
11760 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b  IXFILE_DELETE ){
11770 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
11780 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e  pFile->pId->zCan
11790 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
117a0 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65   }.    vxworksRe
117b0 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
117c0 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69  e->pId);.    pFi
117d0 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d  le->pId = 0;.  }
117e0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
117f0 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54  QLITE_UNLINK_AFT
11800 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70  ER_CLOSE.  if( p
11810 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
11820 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  & UNIXFILE_DELET
11830 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e  E ){.    osUnlin
11840 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  k(pFile->zPath);
11850 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
11860 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c  e(*(char**)&pFil
11870 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
11880 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b  File->zPath = 0;
11890 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
118a0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20  TRACE(("CLOSE   
118b0 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
118c0 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  h));.  OpenCount
118d0 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  er(-1);.  sqlite
118e0 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 50  3_free(pFile->pP
118f0 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
11900 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  d);.  memset(pFi
11910 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
11920 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75  ixFile));.  retu
11930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11940 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
11950 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
11960 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c  nt unixClose(sql
11970 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
11980 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11990 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
119a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
119b0 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78  ile *)id;.  unix
119c0 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
119d0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
119e0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  e;..  assert( pI
119f0 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 76 65 72  node!=0 );.  ver
11a00 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c 65 29  ifyDbFile(pFile)
11a10 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69  ;.  unixUnlock(i
11a20 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 61  d, NO_LOCK);.  a
11a30 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d  ssert( unixFileM
11a40 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 46 69 6c  utexNotheld(pFil
11a50 65 29 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  e) );.  unixEnte
11a60 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
11a70 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20  unixFile.pInode 
11a80 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
11a90 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  here. Otherwise,
11aa0 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f   a different clo
11ab0 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  se.  ** routine 
11ac0 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  (e.g. nolockClos
11ad0 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61  e()) would be ca
11ae0 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20  lled instead..  
11af0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
11b00 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
11b10 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49  k>0 || pFile->pI
11b20 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
11b30 63 6b 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  ck==0 );.  sqlit
11b40 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
11b50 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
11b60 78 29 3b 0a 20 20 69 66 28 20 70 49 6e 6f 64 65  x);.  if( pInode
11b70 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
11b80 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
11b90 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
11ba0 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
11bb0 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
11bc0 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
11bd0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
11be0 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
11bf0 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
11c00 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
11c10 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
11c20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  to pInode->pUnus
11c30 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
11c40 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
11c50 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a  ly closed .    *
11c60 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
11c70 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
11c80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50  .    */.    setP
11c90 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
11ca0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
11cb0 75 74 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64  utex_leave(pInod
11cc0 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a  e->pLockMutex);.
11cd0 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
11ce0 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20  fo(pFile);.  rc 
11cf0 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
11d00 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
11d10 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
11d20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n rc;.}../******
11d30 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
11d40 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  the posix adviso
11d50 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ry lock implemen
11d60 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
11d70 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
11d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dc0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
11dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
11e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e30 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c  ******** No-op L
11e40 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
11e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
11e70 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  Of the various l
11e80 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
11e90 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65  ations available
11ea0 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72  , this is by far
11eb0 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74   the.** simplest
11ec0 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67  :  locking is ig
11ed0 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d  nored.  No attem
11ee0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f  pt is made to lo
11ef0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
11f00 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ** file for read
11f10 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a  ing or writing..
11f20 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69  **.** This locki
11f30 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f  ng mode is appro
11f40 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f  priate for use o
11f50 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  n read-only data
11f60 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61  bases.** (ex: da
11f70 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65  tabases that are
11f80 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d   burned into CD-
11f90 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ROM, for example
11fa0 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c  .)  It can.** al
11fb0 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68  so be used if th
11fc0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d  e application em
11fd0 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72  ploys some exter
11fe0 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f  nal mechanism to
11ff0 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75  .** prevent simu
12000 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20  ltaneous access 
12010 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  of the same data
12020 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d  base by two or m
12030 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ore.** database 
12040 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75  connections.  Bu
12050 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72  t there is a ser
12060 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74  ious risk of dat
12070 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74  abase.** corrupt
12080 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b  ion if this lock
12090 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
120a0 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77   in situations w
120b0 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  here multiple.**
120c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
120d0 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73  tions are access
120e0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
120f0 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
12100 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61  e same.** time a
12110 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  nd one or more o
12120 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
12130 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e  ons are writing.
12140 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
12150 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
12160 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
12170 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
12180 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
12190 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
121a0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52  (NotUsed);.  *pR
121b0 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74  esOut = 0;.  ret
121c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
121d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
121e0 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
121f0 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
12200 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
12210 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
12220 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
12230 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
12240 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
12250 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f  c int nolockUnlo
12260 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
12270 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
12280 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
12290 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
122a0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
122b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
122c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
122d0 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ose the file..*/
122e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
122f0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
12300 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65  file *id) {.  re
12310 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
12320 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  le(id);.}../****
12330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12340 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
12350 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
12360 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
12370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
12380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
123d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
12420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12430 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d  ***** Begin dot-
12440 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  file Locking ***
12450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
12470 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f  * The dotfile lo
12480 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
12490 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78  tion uses the ex
124a0 69 73 74 65 6e 63 65 20 6f 66 20 73 65 70 61 72  istence of separ
124b0 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65  ate lock.** file
124c0 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72 65  s (really a dire
124d0 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f  ctory) to contro
124e0 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  l access to the 
124f0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
12500 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74  works.** on just
12510 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c   about every fil
12520 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62  esystem imaginab
12530 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  le.  But there a
12540 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73  re serious downs
12550 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ides:.**.**    (
12560 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72  1)  There is zer
12570 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20  o concurrency.  
12580 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20  A single reader 
12590 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72  blocks all other
125a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e  .**         conn
125b0 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61  ections from rea
125c0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
125d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
125e0 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61  .**    (2)  An a
125f0 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68  pplication crash
12600 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63   or power loss c
12610 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c  an leave stale l
12620 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20  ock files.**    
12630 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f       sitting aro
12640 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f  und that need to
12650 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75   be cleared manu
12660 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65  ally..**.** Neve
12670 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c  rtheless, a dotl
12680 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70  ock is an approp
12690 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f  riate locking mo
126a0 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f  de for use if no
126b0 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
126c0 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76  g strategy is av
126d0 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44  ailable..**.** D
126e0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77  otfile locking w
126f0 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67  orks by creating
12700 20 61 20 73 75 62 64 69 72 65 63 74 6f 72 79 20   a subdirectory 
12710 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
12720 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20  ctory as.** the 
12730 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74  database and wit
12740 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
12750 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63  but with a ".loc
12760 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64  k" extension add
12770 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74  ed..** The exist
12780 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64  ence of a lock d
12790 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65 73  irectory implies
127a0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
127b0 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a  ck.  All other.*
127c0 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53 48  * lock types (SH
127d0 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
127e0 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
127f0 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
12800 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
12810 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
12820 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
12830 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
12840 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
12850 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72   the.** lock dir
12860 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  ectory..*/.#defi
12870 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  ne DOTLOCK_SUFFI
12880 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a  X ".lock"../*.**
12890 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
128a0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
128b0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
128c0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
128d0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
128e0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
128f0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
12900 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
12910 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
12920 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
12930 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
12940 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
12950 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
12960 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
12970 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
12980 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
12990 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
129a0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
129b0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64  king..**.** In d
129c0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
129d0 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78  either a lock ex
129e0 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20  ists or it does 
129f0 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73  not.  So in this
12a00 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66  .** variation of
12a10 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f   CheckReservedLo
12a20 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69  ck(), *pResOut i
12a30 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
12a40 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   any lock.** is 
12a50 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
12a60 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
12a70 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
12a80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
12a90 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65  t dotlockCheckRe
12aa0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
12ab0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12ac0 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
12ad0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12ae0 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
12af0 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
12b00 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
12b10 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
12b20 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
12b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12b40 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
12b50 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
12b60 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12b70 72 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63  reserved = osAcc
12b80 65 73 73 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  ess((const char*
12b90 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
12ba0 6f 6e 74 65 78 74 2c 20 30 29 3d 3d 30 3b 0a 20  ontext, 0)==0;. 
12bb0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
12bc0 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
12bd0 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
12be0 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
12bf0 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73  erved));.  *pRes
12c00 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
12c10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12c20 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
12c30 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
12c40 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
12c50 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
12c60 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
12c70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
12c80 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
12c90 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
12ca0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
12cb0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
12cc0 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
12cd0 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
12ce0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
12cf0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
12d00 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
12d10 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
12d20 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
12d30 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
12d40 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
12d50 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
12d60 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
12d70 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
12d80 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
12d90 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
12da0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
12db0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
12dc0 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
12dd0 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
12de0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
12df0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
12e00 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
12e10 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
12e20 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
12e30 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
12e40 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
12e50 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
12e60 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
12e70 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
12e80 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
12e90 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
12ea0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
12eb0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
12ec0 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
12ed0 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
12ee0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
12ef0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
12f00 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
12f10 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
12f20 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
12f30 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
12f40 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66  .**.** With dotf
12f50 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20  ile locking, we 
12f60 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70  really only supp
12f70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45  ort state (4): E
12f80 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74  XCLUSIVE..** But
12f90 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74   we track the ot
12fa0 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  her locking leve
12fb0 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a  ls internally..*
12fc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
12fd0 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
12fe0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
12ff0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
13000 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13010 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
13020 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
13030 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
13040 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
13050 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13060 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
13070 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
13080 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
13090 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
130a0 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
130b0 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
130c0 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
130d0 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
130e0 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
130f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
13100 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
13110 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
13120 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13130 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f  eFileLock;.    /
13140 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
13150 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
13160 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
13170 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49  .#ifdef HAVE_UTI
13180 4d 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f  ME.    utime(zLo
13190 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23  ckFile, NULL);.#
131a0 65 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28  else.    utimes(
131b0 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
131c0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
131d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
131e0 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
131f0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
13200 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b  k */.  rc = osMk
13210 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30  dir(zLockFile, 0
13220 37 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30  777);.  if( rc<0
13230 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
13240 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
13250 20 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74   the lock direct
13260 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  ory */.    int t
13270 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
13280 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d     if( EEXIST ==
13290 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
132a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
132b0 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
132c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
132d0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
132e0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
132f0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
13300 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
13310 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
13320 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
13330 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
13340 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
13350 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
13360 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67  ;.  } .  .  /* g
13370 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
13380 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
13390 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
133a0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
133b0 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
133c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
133d0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
133e0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
133f0 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
13400 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
13410 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
13420 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
13430 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
13440 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
13450 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
13460 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
13470 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
13480 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
13490 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
134a0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
134b0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
134c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
134d0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
134e0 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
134f0 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
13500 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
13510 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
13520 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13530 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
13540 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
13550 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13560 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
13570 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
13580 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
13590 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
135a0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
135b0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
135c0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
135d0 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
135e0 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
135f0 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
13600 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
13610 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
13620 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
13630 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
13640 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
13650 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
13660 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
13670 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
13680 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
13690 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
136a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
136b0 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64    /* To downgrad
136c0 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d  e to shared, sim
136d0 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69  ply update our i
136e0 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f  nternal notion o
136f0 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  f the.  ** lock 
13700 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20  state.  No need 
13710 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65  to mess with the
13720 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
13730 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
13740 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
13750 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
13760 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
13770 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  D_LOCK;.    retu
13780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13790 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c  }.  .  /* To ful
137a0 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ly unlock the da
137b0 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74  tabase, delete t
137c0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  he lock file */.
137d0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
137e0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ock==NO_LOCK );.
137f0 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a    rc = osRmdir(z
13800 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
13810 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74   rc<0 ){.    int
13820 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
13830 0a 20 20 20 20 69 66 28 20 74 45 72 72 6e 6f 3d  .    if( tErrno=
13840 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
13850 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13860 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13870 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
13880 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
13890 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
138a0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
138b0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
138c0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
138d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
138e0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
138f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13900 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
13910 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
13920 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
13930 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
13940 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
13950 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
13960 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
13970 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46  e *id) {.  unixF
13980 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
13990 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73  ixFile*)id;.  as
139a0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
139b0 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69   dotlockUnlock(i
139c0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73  d, NO_LOCK);.  s
139d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
139e0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
139f0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f  t);.  return clo
13a00 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
13a10 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
13a20 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
13a30 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69   dot-file lock i
13a40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
13a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a60 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ab0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b00 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
13b20 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e  gin flock Lockin
13b30 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
13b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b50 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  **.**.** Use the
13b60 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20   flock() system 
13b70 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20  call to do file 
13b80 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66  locking..**.** f
13b90 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69  lock() locking i
13ba0 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20  s like dot-file 
13bb0 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20  locking in that 
13bc0 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66  the various.** f
13bd0 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e  ine-grain lockin
13be0 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74  g levels support
13bf0 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65  ed by SQLite are
13c00 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a   collapsed into.
13c10 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c  ** a single excl
13c20 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20  usive lock.  In 
13c30 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41  other words, SHA
13c40 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61  RED, RESERVED, a
13c50 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f  nd.** PENDING lo
13c60 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  cks are the same
13c70 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43   thing as an EXC
13c80 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51  LUSIVE lock.  SQ
13c90 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f  Lite.** still wo
13ca0 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20  rks when you do 
13cb0 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72  this, but concur
13cc0 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64  rency is reduced
13cd0 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61   since.** only a
13ce0 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
13cf0 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74  can be reading t
13d00 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61  he database at a
13d10 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69   time..**.** Omi
13d20 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69  t this section i
13d30 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13d40 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
13d50 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23   turned off.*/.#
13d60 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
13d70 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a  _LOCKING_STYLE..
13d80 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63  /*.** Retry floc
13d90 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  k() calls that f
13da0 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a  ail with EINTR.*
13db0 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73  /.#ifdef EINTR.s
13dc0 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
13dd0 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69  _flock(int fd, i
13de0 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63  nt op){.  int rc
13df0 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f  ;.  do{ rc = flo
13e00 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c  ck(fd,op); }whil
13e10 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
13e20 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
13e30 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a  urn rc;.}.#else.
13e40 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f  # define robust_
13e50 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b  flock(a,b) flock
13e60 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20  (a,b).#endif.   
13e70 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72    ../*.** This r
13e80 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
13e90 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
13ea0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
13eb0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
13ec0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
13ed0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
13ee0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
13ef0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
13f00 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
13f10 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
13f20 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
13f30 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
13f40 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
13f50 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
13f60 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
13f70 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
13f80 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
13f90 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
13fa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13fb0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
13fc0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13fd0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
13fe0 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
13ff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
14000 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
14010 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14020 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14030 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
14040 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
14050 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
14060 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
14070 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
14080 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  File );.  .  /* 
14090 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
140a0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
140b0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
140c0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
140d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
140e0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
140f0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
14100 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
14110 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
14120 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
14130 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
14140 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
14150 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f     /* attempt to
14160 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f   get the lock */
14170 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72  .    int lrc = r
14180 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
14190 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
141a0 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66  LOCK_NB);.    if
141b0 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  ( !lrc ){.      
141c0 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c  /* got the lock,
141d0 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20   unlock it */.  
141e0 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74      lrc = robust
141f0 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
14200 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
14210 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20   if ( lrc ) {.  
14220 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
14230 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
14240 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c    /* unlock fail
14250 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
14260 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20   */.        lrc 
14270 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
14280 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20  NLOCK; .        
14290 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
142a0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
142b0 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
142c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
142d0 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
142e0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
142f0 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
14300 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
14310 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
14320 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
14330 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
14340 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14350 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14360 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
14370 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
14380 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
14390 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rc) ){.        s
143a0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
143b0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
143c0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
143d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
143e0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
143f0 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
14400 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %d (flock)\n", 
14410 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
14420 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65  served));..#ifde
14430 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
14440 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
14450 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 30 78  S.  if( (rc & 0x
14460 66 66 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  ff) == SQLITE_IO
14470 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
14480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
14490 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23  eserved=1;.  }.#
144a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
144b0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
144c0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70  K_ERRORS */.  *p
144d0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
144e0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
144f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
14500 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
14510 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
14520 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
14530 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
14540 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
14550 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
14560 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
14570 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
14580 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
14590 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
145a0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
145b0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
145c0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
145d0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
145e0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
145f0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
14600 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
14610 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
14620 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
14630 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
14640 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
14650 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
14660 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
14670 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
14680 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
14690 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
146a0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
146b0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
146c0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
146d0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
146e0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
146f0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
14700 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
14710 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
14720 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14730 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
14740 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
14750 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
14760 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
14770 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
14780 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
14790 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
147a0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  USIVE.**.** floc
147b0 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  k() only really 
147c0 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
147d0 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
147e0 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
147f0 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
14800 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
14810 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
14820 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
14830 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
14840 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
14850 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
14860 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
14870 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
14880 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
14890 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
148a0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
148b0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
148c0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
148d0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
148e0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
148f0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
14900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
14910 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
14920 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
14930 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e  FileLock) {.  in
14940 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14950 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
14960 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14970 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
14980 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69  pFile );..  /* i
14990 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
149a0 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
149b0 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
149c0 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
149d0 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
149e0 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
149f0 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
14a00 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
14a10 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
14a20 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
14a30 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
14a40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
14a50 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
14a60 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
14a70 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74  .  .  if (robust
14a80 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
14a90 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
14aa0 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74  NB)) {.    int t
14ab0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
14ac0 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74     /* didn't get
14ad0 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a  , must be busy *
14ae0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
14af0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
14b00 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
14b10 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
14b20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
14b30 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
14b40 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
14b50 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
14b60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  );.    }.  } els
14b70 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
14b80 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
14b90 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
14ba0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
14bb0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
14bc0 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
14bd0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
14be0 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
14bf0 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
14c00 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
14c10 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
14c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
14c30 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
14c40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
14c50 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
14c60 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
14c70 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49   & 0xff) == SQLI
14c80 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
14c90 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
14ca0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
14cb0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
14cc0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
14cd0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
14ce0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
14cf0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
14d00 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
14d10 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
14d20 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
14d30 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
14d40 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
14d50 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
14d60 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
14d70 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
14d80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
14d90 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
14da0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
14db0 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
14dc0 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
14dd0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
14de0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
14df0 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
14e00 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14e10 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14e20 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14e30 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14e40 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
14e50 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
14e60 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
14e70 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
14e80 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
14e90 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
14ea0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14eb0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
14ec0 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
14ed0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
14ee0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
14ef0 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
14f00 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
14f10 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
14f20 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
14f30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14f40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
14f50 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
14f60 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
14f70 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
14f80 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
14f90 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
14fa0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
14fb0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
14fc0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
14fd0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
14fe0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
14ff0 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
15000 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
15010 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  ( robust_flock(p
15020 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
15030 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
15040 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
15050 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
15060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15070 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
15080 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
15090 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
150a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
150b0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
150c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
150d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
150e0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
150f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15100 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
15110 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
15120 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
15130 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
15140 69 64 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20  id) {.  assert( 
15150 69 64 21 3d 30 20 29 3b 0a 20 20 66 6c 6f 63 6b  id!=0 );.  flock
15160 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
15170 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c  CK);.  return cl
15180 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
15190 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
151a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
151b0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
151c0 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a  _VXWORK */../***
151d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151e0 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63   End of the floc
151f0 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  k lock implement
15200 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
15210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
15220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
15270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
152c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152d0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65  ***** Begin Name
152e0 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b  d Semaphore Lock
152f0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
15300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
15310 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
15320 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
15330 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20  ly supported on 
15340 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53  VxWorks..**.** S
15350 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
15360 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63   is like dot-loc
15370 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74  k and flock in t
15380 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e  hat it really on
15390 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45  ly.** supports E
153a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67  XCLUSIVE locking
153b0 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  .  Only a single
153c0 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61   process can rea
153d0 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68  d or write.** th
153e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
153f0 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73  at a time.  This
15400 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69   reduces potenti
15410 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20  al concurrency, 
15420 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  but.** makes the
15430 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
15440 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72  tion much easier
15450 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ..*/.#if OS_VXWO
15460 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RKS../*.** This 
15470 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
15480 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
15490 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
154a0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
154b0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
154c0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
154d0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
154e0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
154f0 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
15500 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
15510 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
15520 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
15530 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
15540 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
15550 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
15560 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
15570 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
15580 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
15590 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
155a0 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  mXCheckReservedL
155b0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
155c0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
155d0 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
155e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
155f0 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
15600 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15610 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15620 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
15630 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
15640 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
15650 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
15660 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15670 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ile );..  /* Che
15680 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
15690 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
156a0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
156b0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
156c0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
156d0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
156e0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
156f0 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
15700 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
15710 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
15720 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
15730 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
15740 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
15750 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
15760 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f  m;..    if( sem_
15770 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
15780 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  1 ){.      int t
15790 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
157a0 20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20       if( EAGAIN 
157b0 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
157c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
157d0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
157e0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
157f0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
15800 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
15810 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
15820 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
15830 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  o);.      } else
15840 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
15850 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
15860 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
15870 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
15880 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
15890 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
158a0 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
158b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
158c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
158d0 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
158e0 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
158f0 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
15900 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
15910 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
15920 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
15930 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
15940 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
15950 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
15960 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
15970 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
15980 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
15990 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
159a0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
159b0 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
159c0 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
159d0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
159e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
159f0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
15a00 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
15a10 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
15a20 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
15a30 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
15a40 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
15a50 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
15a60 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
15a70 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
15a80 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
15a90 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
15aa0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
15ab0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
15ac0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
15ad0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
15ae0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
15af0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
15b00 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
15b10 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
15b20 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
15b30 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
15b40 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
15b50 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
15b60 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
15b70 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
15b80 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
15b90 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
15ba0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
15bb0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
15bc0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
15bd0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
15be0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
15bf0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
15c00 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
15c10 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
15c20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
15c30 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
15c40 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
15c50 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
15c60 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
15c70 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
15c80 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
15c90 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
15ca0 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
15cb0 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
15cc0 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
15cd0 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
15ce0 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
15cf0 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
15d00 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
15d10 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
15d20 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
15d30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
15d40 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
15d50 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
15d60 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
15d70 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
15d80 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
15d90 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
15da0 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f 63 6b 28  ic int semXLock(
15db0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15dc0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
15dd0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
15de0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
15df0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
15e00 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
15e10 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74  ode->pSem;.  int
15e20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15e30 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
15e40 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
15e50 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
15e60 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
15e70 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
15e80 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
15e90 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
15ea0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
15eb0 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
15ec0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15ed0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
15ee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15ef0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
15f00 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
15f10 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f   /* lock semapho
15f20 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20  re now but bail 
15f30 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79  out when already
15f40 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66   locked. */.  if
15f50 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
15f60 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72  em)==-1 ){.    r
15f70 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15f80 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
15f90 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
15fa0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
15fb0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
15fc0 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
15fd0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
15fe0 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e  leLock;.. sem_en
15ff0 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e  d_lock:.  return
16000 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
16010 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
16020 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
16030 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
16040 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
16050 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
16060 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
16070 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
16080 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
16090 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
160a0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
160b0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
160c0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
160d0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
160e0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
160f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
16100 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
16110 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 73 71 6c  t semXUnlock(sql
16120 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16130 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
16140 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
16150 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
16160 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
16170 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
16180 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72  ->pSem;..  asser
16190 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73  t( pFile );.  as
161a0 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20  sert( pSem );.  
161b0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
161c0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
161d0 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20  id=%d (sem)\n", 
161e0 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
161f0 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
16200 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16210 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
16220 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
16230 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
16240 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
16250 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
16260 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
16270 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
16280 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
16290 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
162a0 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
162b0 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
162c0 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
162d0 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
162e0 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
162f0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
16300 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
16310 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
16320 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
16330 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16340 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
16350 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
16360 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
16370 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
16380 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
16390 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
163a0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
163b0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
163c0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
163d0 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
163e0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
163f0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73  R(rc) ){.      s
16400 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
16410 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
16420 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
16430 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
16440 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
16450 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
16460 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16470 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65   ** Close a file
16480 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
16490 20 73 65 6d 58 43 6c 6f 73 65 28 73 71 6c 69 74   semXClose(sqlit
164a0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
164b0 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
164c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
164d0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
164e0 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 69      semXUnlock(i
164f0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
16500 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
16510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 75 6e  ;.    assert( un
16520 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65  ixFileMutexNothe
16530 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 20  ld(pFile) );.   
16540 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16550 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e  );.    releaseIn
16560 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
16570 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
16580 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55  ex();.    closeU
16590 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
165a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
165b0 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
165c0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
165d0 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  /*.** Named sema
165e0 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
165f0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
16600 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
16610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
16620 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  nd of the named 
16630 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69  semaphore lock i
16640 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
16650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
16660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
166b0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
166c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16700 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
16710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
16720 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a  in AFP Locking *
16730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16750 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68  .**.** AFP is th
16760 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50  e Apple Filing P
16770 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73  rotocol.  AFP is
16780 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73   a network files
16790 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f  ystem found.** o
167a0 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73  n Apple Macintos
167b0 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f  h computers - bo
167c0 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a  th OS9 and OSX..
167d0 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74  **.** Third-part
167e0 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  y implementation
167f0 73 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61  s of AFP are ava
16800 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69  ilable.  But thi
16810 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f  s code here.** o
16820 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58  nly works on OSX
16830 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
16840 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
16850 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
16860 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a  CKING_STYLE./*.*
16870 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * The afpLocking
16880 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
16890 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61  e contains all a
168a0 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63  fp lock specific
168b0 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65   state.*/.typede
168c0 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  f struct afpLock
168d0 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f  ingContext afpLo
168e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
168f0 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
16900 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72  ontext {.  int r
16910 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74  eserved;.  const
16920 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
16930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
16940 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
16950 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63  ile */.};..struc
16960 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
16970 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  B2.{.  unsigned 
16980 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
16990 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73  ;        /* offs
169a0 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
169b0 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
169c0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
169d0 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20   length;        
169e0 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20  /* nbr of bytes 
169f0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
16a00 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
16a10 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f  retRangeStart; /
16a20 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74  * nbr of 1st byt
16a30 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63  e locked if succ
16a40 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69  essful */.  unsi
16a50 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b  gned char unLock
16a60 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Flag;         /*
16a70 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d   1 = unlock, 0 =
16a80 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
16a90 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e  ned char startEn
16aa0 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  dFlag;       /* 
16ab0 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20  1=rel to end of 
16ac0 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73  fork, 0=rel to s
16ad0 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64  tart */.  int fd
16ae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
16b00 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f  ile desc to asso
16b10 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68  c this lock with
16b20 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
16b30 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
16b40 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20  ck2FSCTL        
16b50 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
16b60 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
16b70 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54  ockPB2)../*.** T
16b80 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
16b90 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20   for setting or 
16ba0 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72  clearing a bit-r
16bb0 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a  ange lock on an.
16bc0 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  ** AFP filesyste
16bd0 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  m..** .** Return
16be0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
16bf0 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55  ccess, SQLITE_BU
16c00 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  SY on failure..*
16c10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
16c20 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74  SetLock(.  const
16c30 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20   char *path,    
16c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
16c50 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
16c60 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e   be locked or un
16c70 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
16c80 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
16c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
16ca0 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
16cb0 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20  or on path */.  
16cc0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
16cd0 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f  ng offset,     /
16ce0 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20  * First byte to 
16cf0 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
16d00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
16d10 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a  g length,     /*
16d20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
16d30 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
16d40 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20  t setLockFlag   
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d60 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b  True to set lock
16d70 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61  .  False to clea
16d80 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73  r lock */.){.  s
16d90 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
16da0 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74  ockPB2 pb;.  int
16db0 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e   err;.  .  pb.un
16dc0 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f  LockFlag = setLo
16dd0 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a  ckFlag ? 0 : 1;.
16de0 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61    pb.startEndFla
16df0 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73  g = 0;.  pb.offs
16e00 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70  et = offset;.  p
16e10 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74  b.length = lengt
16e20 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46  h; .  pb.fd = pF
16e30 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54  ile->h;.  .  OST
16e40 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
16e50 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20  K [%s] for %d%s 
16e60 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c  in range %llx:%l
16e70 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74  lx\n", .    (set
16e80 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f  LockFlag?"ON":"O
16e90 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  FF"), pFile->h, 
16ea0 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73  (pb.fd==-1?"[tes
16eb0 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20  tval-1]":""),.  
16ec0 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68    offset, length
16ed0 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74  ));.  err = fsct
16ee0 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74  l(path, afpfsByt
16ef0 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
16f00 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20  , &pb, 0);.  if 
16f10 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20  ( err==-1 ) {.  
16f20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
16f30 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
16f40 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
16f50 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65  AFPSETLOCK faile
16f60 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73  d to fsctl() '%s
16f70 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  ' %d %s\n",.    
16f80 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74           path, t
16f90 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28  Errno, strerror(
16fa0 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65  tErrno)));.#ifde
16fb0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
16fc0 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  AFP_LOCK_ERRORS.
16fd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16fe0 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20  BUSY;.#else.    
16ff0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
17000 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
17010 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
17020 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f             setLo
17030 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f  ckFlag ? SQLITE_
17040 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c  IOERR_LOCK : SQL
17050 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
17060 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
17070 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
17080 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
17090 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
170a0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
170b0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
170c0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
170d0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
170e0 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
170f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17100 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
17110 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17120 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
17130 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
17140 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
17150 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
17160 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
17170 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
17180 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
17190 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
171a0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
171b0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
171c0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
171d0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
171e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
171f0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
17200 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
17210 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
17220 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
17230 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
17240 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
17250 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
17260 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17270 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
17280 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17290 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
172a0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
172b0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
172c0 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f  ile*)id;.  afpLo
172d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
172e0 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75  ntext;.  .  Simu
172f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
17300 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
17310 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
17320 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
17330 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63  rt( pFile );.  c
17340 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
17350 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
17360 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
17370 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74  text;.  if( cont
17380 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
17390 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
173a0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
173b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73  LITE_OK;.  }.  s
173c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
173d0 65 72 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  er(pFile->pInode
173e0 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20  ->pLockMutex);. 
173f0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
17400 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
17410 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
17420 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
17430 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
17440 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
17450 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
17460 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
17470 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
17480 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
17490 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
174a0 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28   it..   */.  if(
174b0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
174c0 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45    /* lock the RE
174d0 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20  SERVED byte */. 
174e0 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70     int lrc = afp
174f0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17500 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17510 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
17520 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53  ,1);  .    if( S
17530 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b  QLITE_OK==lrc ){
17540 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
17550 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b  succeeded in tak
17560 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64  ing the reserved
17570 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
17580 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20   to restore.    
17590 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
175a0 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20  l state */.     
175b0 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
175c0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
175d0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
175e0 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
175f0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
17600 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c     /* if we fail
17610 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  ed to get the lo
17620 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20  ck then someone 
17630 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69  else must have i
17640 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72  t */.      reser
17650 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
17660 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
17670 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
17680 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d     rc=lrc;.    }
17690 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65  .  }.  .  sqlite
176a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 46  3_mutex_leave(pF
176b0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f  ile->pInode->pLo
176c0 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ckMutex);.  OSTR
176d0 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
176e0 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66 70  CK %d %d %d (afp
176f0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
17700 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
17710 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20    .  *pResOut = 
17720 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
17730 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17740 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
17750 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
17760 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
17770 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
17780 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
17790 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
177a0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
177b0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
177c0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
177d0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
177e0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
177f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
17800 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
17810 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
17820 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
17830 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
17840 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
17850 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
17860 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
17870 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
17880 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
17890 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
178a0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
178b0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
178c0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
178d0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
178e0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
178f0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
17900 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
17910 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
17920 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
17930 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
17940 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
17950 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
17960 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
17970 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
17980 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
17990 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
179a0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
179b0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
179c0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
179d0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
179e0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
179f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17a00 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
17a10 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
17a20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
17a30 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
17a40 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
17a50 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
17a60 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b  atic int afpLock
17a70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17a80 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
17a90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
17aa0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
17ab0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
17ac0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
17ad0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
17ae0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
17af0 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
17b00 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
17b10 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
17b20 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
17b30 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
17b40 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
17b50 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
17b60 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
17b70 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
17b80 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
17b90 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
17ba0 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
17bb0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
17bc0 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
17bd0 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
17be0 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
17bf0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17c00 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  k), pInode->nSha
17c10 72 65 64 20 2c 20 6f 73 47 65 74 70 69 64 28 30  red , osGetpid(0
17c20 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
17c30 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
17c40 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
17c50 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
17c60 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
17c70 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
17c80 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
17c90 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c  se the afp_end_l
17ca0 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
17cb0 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
17cc0 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
17cd0 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
17ce0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
17cf0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
17d00 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
17d10 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
17d20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
17d30 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e  dy held) (afp)\n
17d40 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
17d50 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
17d60 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
17d70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17d80 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
17d90 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
17da0 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
17db0 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  is correct.  ** 
17dc0 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
17dd0 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
17de0 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
17df0 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
17e00 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
17e10 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
17e20 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
17e30 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
17e40 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
17e50 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
17e60 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
17e70 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
17e80 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
17e90 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
17ea0 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
17eb0 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
17ec0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
17ed0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
17ee0 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
17ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
17f00 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
17f10 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
17f20 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
17f30 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
17f40 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
17f50 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
17f60 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
17f70 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
17f80 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 70 49  hreads.  */.  pI
17f90 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
17fa0 6e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  node;.  sqlite3_
17fb0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 49 6e 6f  mutex_enter(pIno
17fc0 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b  de->pLockMutex);
17fd0 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
17fe0 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
17ff0 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
18000 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
18010 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
18020 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
18030 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
18040 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
18050 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
18060 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
18070 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
18080 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
18090 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
180a0 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
180b0 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
180c0 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20  HARED_LOCK)).   
180d0 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
180e0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
180f0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
18100 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  ;.  }.  .  /* If
18110 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
18120 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
18130 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
18140 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
18150 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
18160 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
18170 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
18180 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
18190 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
181a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
181b0 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
181c0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
181d0 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70  LOCK && .     (p
181e0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
181f0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
18200 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
18210 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
18220 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
18230 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
18240 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
18250 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
18260 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
18270 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
18280 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
18290 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
182a0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
182b0 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
182c0 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
182d0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
182e0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
182f0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a  _lock;.  }.    .
18300 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
18310 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
18320 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
18330 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
18340 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
18350 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
18360 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
18370 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
18380 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
18390 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
183a0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  d..  */.  if( eF
183b0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
183c0 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
183d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
183e0 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
183f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
18400 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
18410 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b  .    int failed;
18420 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66  .    failed = af
18430 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18440 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18450 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
18460 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
18470 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
18480 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
18490 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
184a0 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
184b0 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
184c0 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
184d0 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
184e0 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
184f0 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
18500 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
18510 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
18520 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
18530 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
18540 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
18550 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32    int lrc1, lrc2
18560 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b  , lrc1Errno = 0;
18570 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61  .    long lk, ma
18580 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73  sk;.    .    ass
18590 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
185a0 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
185b0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
185c0 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
185d0 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b         .    mask
185e0 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29   = (sizeof(long)
185f0 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49  ==8) ? LARGEST_I
18600 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66  NT64 : 0x7ffffff
18610 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  f;.    /* Now ge
18620 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
18630 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20  SHARED_LOCK */. 
18640 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20     /* note that 
18650 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
18660 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f  he randomness do
18670 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61  esn't matter tha
18680 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b  t much */.    lk
18690 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20   = random(); .  
186a0 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
186b0 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73  Byte = (lk & mas
186c0 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  k)%(SHARED_SIZE 
186d0 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d  - 1);.    lrc1 =
186e0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
186f0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18700 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  le, .          S
18710 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
18720 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
18730 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49  1, 1);.    if( I
18740 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
18750 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31  1) ){.      lrc1
18760 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c  Errno = pFile->l
18770 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  astErrno;.    }.
18780 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
18790 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
187a0 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72  G lock */.    lr
187b0 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c2 = afpSetLock(
187c0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
187d0 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
187e0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
187f0 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43   .    if( IS_LOC
18800 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20  K_ERROR(lrc1) ) 
18810 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
18820 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72  tErrno(pFile, lr
18830 63 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  c1Errno);.      
18840 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
18850 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
18860 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
18870 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
18880 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
18890 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
188a0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
188b0 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
188c0 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
188d0 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
188e0 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
188f0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
18900 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
18910 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
18920 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
18930 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
18940 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
18950 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
18960 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
18970 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
18980 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
18990 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
189a0 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
189b0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
189c0 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
189d0 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a   in this.     **
189e0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
189f0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
18a00 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
18a10 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18a20 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
18a30 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
18a40 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
18a50 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
18a60 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
18a70 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
18a80 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
18a90 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
18aa0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
18ab0 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
18ac0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
18ad0 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
18ae0 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
18af0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
18b00 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63      if (eFileLoc
18b10 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  k >= RESERVED_LO
18b20 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
18b30 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45  leLock < RESERVE
18b40 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
18b50 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
18b60 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
18b70 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
18b80 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
18b90 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18ba0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
18bb0 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69  E, 1,1);.      i
18bc0 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20  f( !failed ){.  
18bd0 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
18be0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
18bf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
18c00 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46  f (!failed && eF
18c10 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55  ileLock == EXCLU
18c20 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
18c30 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
18c40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
18c50 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
18c60 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
18c70 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
18c80 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
18c90 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
18ca0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
18cb0 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
18cc0 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
18cd0 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
18ce0 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
18cf0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61  /.      if( !(fa
18d00 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
18d10 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
18d20 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
18d30 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d50 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
18d60 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
18d70 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
18d80 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
18d90 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
18da0 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
18db0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
18dc0 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
18dd0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
18de0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18df0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18e00 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
18e30 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
18e40 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
18e50 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
18e60 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18e70 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18e80 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
18e90 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
18ea0 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65  D_FIRST + pInode
18eb0 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
18ec0 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
18ed0 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
18ee0 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
18ef0 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
18f00 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
18f10 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
18f20 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
18f30 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
18f40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
18f50 3d 20 28 28 66 61 69 6c 65 64 20 26 20 30 78 66  = ((failed & 0xf
18f60 66 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  f) == SQLITE_IOE
18f70 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20  RR) ? failed2 : 
18f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18f90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
18fa0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
18fb0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
18fc0 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
18fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18fe0 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20  rc = failed; .  
18ff0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19000 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
19010 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
19020 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
19030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19040 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
19050 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
19060 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
19070 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
19080 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
19090 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
190a0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
190b0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
190c0 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
190d0 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
190e0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
190f0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
19100 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63  }.  .afp_end_loc
19110 6b 3a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  k:.  sqlite3_mut
19120 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d  ex_leave(pInode-
19130 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20  >pLockMutex);.  
19140 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
19150 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29    %d %s %s (afp)
19160 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
19170 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
19180 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
19190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
191a0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
191b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
191c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
191d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
191e0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
191f0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
19200 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
19210 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
19220 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
19230 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
19240 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
19250 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
19260 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
19270 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
19280 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
19290 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
192a0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
192b0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
192c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
192d0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
192e0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
192f0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
19300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19310 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
19320 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
19330 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
19340 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66  fo *pInode;.  af
19350 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
19360 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
19370 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
19380 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
19390 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b  ontext;.  int sk
193a0 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69  ipShared = 0;.#i
193b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
193c0 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65  .  int h = pFile
193d0 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ->h;.#endif..  a
193e0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
193f0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
19400 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
19410 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
19420 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
19430 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
19440 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
19450 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
19460 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
19470 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
19480 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
19490 20 20 20 20 20 20 20 20 6f 73 47 65 74 70 69 64          osGetpid
194a0 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  (0)));..  assert
194b0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
194c0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
194d0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
194e0 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
194f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19500 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 49 6e  TE_OK;.  }.  pIn
19510 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
19520 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ode;.  sqlite3_m
19530 75 74 65 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64  utex_enter(pInod
19540 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a  e->pLockMutex);.
19550 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
19560 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
19570 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
19580 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
19590 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
195a0 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
195b0 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
195c0 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d  eLock );.    Sim
195d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
195e0 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c  gn(1);.    Simul
195f0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
19600 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74  1) ).    Simulat
19610 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
19620 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53  );.    .#ifdef S
19630 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
19640 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
19650 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
19660 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
19670 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
19680 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
19690 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
196a0 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
196b0 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
196c0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
196d0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
196e0 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
196f0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
19700 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
19710 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
19720 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
19730 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
19740 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
19750 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
19760 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
19770 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
19780 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
19790 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
197a0 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
197b0 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
197c0 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
197d0 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
197e0 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
197f0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
19800 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
19810 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
19820 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
19830 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
19840 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
19850 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
19860 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43  || pFile->transC
19870 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20  ntrChng==1 );.  
19880 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
19890 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
198a0 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  if.    .    if( 
198b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
198c0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
198d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
198e0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
198f0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
19900 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
19910 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
19920 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
19930 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
19940 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
19950 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
19960 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20  Shared>1) ){.   
19970 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d       /* only re-
19980 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
19990 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63  ared lock if nec
199a0 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20  essary */.      
199b0 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b    int sharedLock
199c0 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
199d0 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
199e0 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20  edByte;.        
199f0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
19a00 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
19a10 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
19a20 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  ckByte, 1, 1);. 
19a30 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
19a40 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64        skipShared
19a50 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
19a60 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
19a70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
19a80 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  le->eFileLock>=P
19a90 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
19aa0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
19ab0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
19ac0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
19ad0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
19ae0 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28  ;.    } .    if(
19af0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19b00 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
19b10 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
19b20 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65  K && context->re
19b30 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20  served ){.      
19b40 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
19b50 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
19b60 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
19b70 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
19b80 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a      if( !rc ){ .
19b90 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
19ba0 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a  >reserved = 0; .
19bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19bc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19bd0 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
19be0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
19bf0 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
19c00 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e  d>1)){.      pIn
19c10 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
19c20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
19c30 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
19c40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
19c50 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
19c60 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  K ){..    /* Dec
19c70 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
19c80 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
19c90 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
19ca0 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
19cb0 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
19cc0 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
19cd0 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
19ce0 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
19cf0 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
19d00 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ck..    */.    u
19d10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
19d20 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  g sharedLockByte
19d30 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
19d40 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
19d50 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  te;.    pInode->
19d60 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
19d70 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
19d80 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ed==0 ){.      S
19d90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
19da0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
19db0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19dc0 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
19dd0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
19de0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
19df0 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29  f( !skipShared )
19e00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  {.        rc = a
19e10 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
19e20 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
19e30 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
19e40 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
19e50 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29  .      if( !rc )
19e60 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
19e70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
19e80 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
19e90 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
19ea0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
19eb0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
19ec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19ed0 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
19ee0 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61  nLock--;.      a
19ef0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
19f00 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Lock>=0 );.     
19f10 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
19f20 63 6b 3d 3d 30 20 29 20 63 6c 6f 73 65 50 65 6e  ck==0 ) closePen
19f30 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
19f40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73      }.  }.  .  s
19f50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
19f60 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  ve(pInode->pLock
19f70 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 72 63  Mutex);.  if( rc
19f80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19f90 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
19fa0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
19fb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
19fd0 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
19fe0 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
19ff0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
1a000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
1a010 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
1a020 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
1a030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a040 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1a050 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1a060 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  id;.  assert( id
1a070 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f  !=0 );.  afpUnlo
1a080 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
1a090 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 46  .  assert( unixF
1a0a0 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28  ileMutexNotheld(
1a0b0 70 46 69 6c 65 29 20 29 3b 0a 20 20 75 6e 69 78  pFile) );.  unix
1a0c0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1a0d0 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
1a0e0 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f  e ){.    unixIno
1a0f0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
1a100 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
1a110 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1a120 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e  x_enter(pInode->
1a130 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 20  pLockMutex);.   
1a140 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
1a150 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
1a160 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
1a170 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
1a180 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
1a190 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
1a1a0 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
1a1b0 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
1a1c0 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
1a1d0 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
1a1e0 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
1a1f0 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
1a200 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e   to pInode->aPen
1a210 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62  ding.  It will b
1a220 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
1a230 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20  closed when.    
1a240 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
1a250 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
1a260 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65       */.      se
1a270 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
1a280 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1a290 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1a2a0 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
1a2b0 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  tex);.  }.  rele
1a2c0 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
1a2d0 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  le);.  sqlite3_f
1a2e0 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
1a2f0 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63  ngContext);.  rc
1a300 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
1a310 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  (id);.  unixLeav
1a320 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
1a330 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
1a340 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
1a350 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
1a360 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1a370 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
1a380 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
1a390 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
1a3a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
1a3b0 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
1a3c0 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
1a3d0 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
1a3e0 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
1a3f0 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
1a400 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
1a410 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  s available.  If
1a420 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69   you don't compi
1a430 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68  le for a mac, th
1a440 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70  en the "unix-afp
1a450 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20  ".** VFS is not 
1a460 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
1a470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a480 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41  *** End of the A
1a490 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
1a4a0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
1a4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1a4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
1a510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1a560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
1a580 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   NFS Locking ***
1a590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
1a5b0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
1a5c0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
1a5d0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1a5e0 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77  STYLE./*. ** Low
1a5f0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
1a600 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
1a610 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
1a620 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
1a630 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20  leLock. ** must 
1a640 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
1a650 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
1a660 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65  .. **. ** If the
1a670 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
1a680 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
1a690 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
1a6a0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a   at or below. **
1a6b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
1a6c0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
1a6d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1a6e0 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69  no-op.. */.stati
1a6f0 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28  c int nfsUnlock(
1a700 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a710 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
1a720 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  {.  return posix
1a730 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
1a740 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e  Lock, 1);.}..#en
1a750 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
1a760 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
1a770 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1a780 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
1a790 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
1a7a0 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   is the NFS lock
1a7b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
1a7c0 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
1a7d0 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
1a7e0 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
1a7f0 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
1a800 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
1a810 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
1a820 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
1a830 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   .**.***********
1a840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
1a850 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  f the NFS lock i
1a860 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
1a870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a880 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1a890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8d0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
1a8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a920 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1a930 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69  ****** Non-locki
1a940 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ng sqlite3_file 
1a950 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
1a960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a970 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
1a980 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f  next division co
1a990 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74  ntains implement
1a9a0 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d  ations for all m
1a9b0 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a  ethods of the .*
1a9c0 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f  * sqlite3_file o
1a9d0 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e  bject other than
1a9e0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   the locking met
1a9f0 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69  hods.  The locki
1aa00 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65  ng.** methods we
1aa10 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69  re defined in di
1aa20 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f  visions above (o
1aa30 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ne locking metho
1aa40 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f  d per.** divisio
1aa50 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f  n).  Those metho
1aa60 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  ds that are comm
1aa70 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
1aa80 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67  g modes.** are g
1aa90 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69  ather together i
1aaa0 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f  nto this divisio
1aab0 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  n..*/../*.** See
1aac0 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
1aad0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1aae0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74  cond argument, t
1aaf0 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a  hen read cnt .**
1ab00 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
1ab10 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
1ab20 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
1ab30 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ually read..**.*
1ab40 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65  * NB:  If you de
1ab50 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f  fine USE_PREAD o
1ab60 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74  r USE_PREAD64, t
1ab70 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73  hen it might als
1ab80 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72  o.** be necessar
1ab90 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  y to define _XOP
1aba0 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20  EN_SOURCE to be 
1abb0 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65  500.  This varie
1abc0 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79  s from.** one sy
1abd0 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e  stem to another.
1abe0 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64    Since SQLite d
1abf0 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55  oes not define U
1ac00 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61  SE_PREAD.** in a
1ac10 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75  ny form by defau
1ac20 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20  lt, we will not 
1ac30 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e  attempt to defin
1ac40 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e  e _XOPEN_SOURCE.
1ac50 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20  .** See tickets 
1ac60 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e  #2741 and #2681.
1ac70 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
1ac80 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
1ac90 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
1aca0 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61  iled read the la
1acb0 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
1acc0 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
1acd0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1ace0 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52  tic int seekAndR
1acf0 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ead(unixFile *id
1ad00 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1ad10 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42  offset, void *pB
1ad20 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
1ad30 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70  int got;.  int p
1ad40 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21  rior = 0;.#if (!
1ad50 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1ad60 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  D) && !defined(U
1ad70 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69  SE_PREAD64)).  i
1ad80 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65  64 newOffset;.#e
1ad90 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41  ndif.  TIMER_STA
1ada0 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e  RT;.  assert( cn
1adb0 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29  t==(cnt&0x1ffff)
1adc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1add0 2d 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23  ->h>2 );.  do{.#
1ade0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1adf0 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20  READ).    got = 
1ae00 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70  osPread(id->h, p
1ae10 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
1ae20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1ae30 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
1ae40 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1ae50 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
1ae60 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
1ae70 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
1ae80 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
1ae90 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1aea0 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
1aeb0 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73  else.    newOffs
1aec0 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
1aed0 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
1aee0 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
1aef0 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66  eIOError( newOff
1af00 73 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20  set = -1 );.    
1af10 69 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20  if( newOffset<0 
1af20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
1af30 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
1af40 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20  e*)id, errno);. 
1af50 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1af60 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20      }.    got = 
1af70 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  osRead(id->h, pB
1af80 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
1af90 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e  .    if( got==cn
1afa0 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  t ) break;.    i
1afb0 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
1afc0 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e    if( errno==EIN
1afd0 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63  TR ){ got = 1; c
1afe0 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20  ontinue; }.     
1aff0 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20   prior = 0;.    
1b000 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1b010 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20  ((unixFile*)id, 
1b020 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62   errno);.      b
1b030 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  reak;.    }else 
1b040 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20  if( got>0 ){.   
1b050 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20     cnt -= got;. 
1b060 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67       offset += g
1b070 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20  ot;.      prior 
1b080 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42  += got;.      pB
1b090 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74  uf = (void*)(got
1b0a0 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b   + (char*)pBuf);
1b0b0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1b0c0 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45   got>0 );.  TIME
1b0d0 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
1b0e0 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20  (("READ    %-3d 
1b0f0 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1b100 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
1b110 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c  d->h, got+prior,
1b120 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54   offset-prior, T
1b130 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
1b140 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69    return got+pri
1b150 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  or;.}../*.** Rea
1b160 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
1b170 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
1b180 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1b190 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
1b1a0 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
1b1b0 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
1b1c0 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
1b1d0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1b1e0 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
1b1f0 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20   int unixRead(. 
1b200 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
1b210 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  d, .  void *pBuf
1b220 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
1b230 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
1b240 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69  fset.){.  unixFi
1b250 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1b260 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
1b270 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28  t got;.  assert(
1b280 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28   id );.  assert(
1b290 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20   offset>=0 );.  
1b2a0 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
1b2b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1b2c0 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
1b2d0 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
1b2e0 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
1b2f0 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
1b300 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
1b310 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
1b320 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
1b330 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
1b340 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
1b350 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
1b360 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
1b370 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
1b380 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
1b390 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
1b3a0 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
1b3b0 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
1b3c0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ;.#endif..#if SQ
1b3d0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1b3e0 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
1b3f0 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
1b400 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74  his read request
1b410 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1b420 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1b430 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1b440 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1b450 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1b460 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1b470 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1b480 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1b490 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1b4a0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1b4b0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
1b4c0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1b4d0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1b4e0 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  t], amt);.      
1b4f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b500 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b510 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1b520 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1b530 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1b540 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
1b550 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
1b560 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
1b570 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1b580 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1b590 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1b5a0 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1b5b0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1b5c0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1b5d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20  }.#endif..  got 
1b5e0 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
1b5f0 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
1b600 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67  f, amt);.  if( g
1b610 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72  ot==amt ){.    r
1b620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b630 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74  .  }else if( got
1b640 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73  <0 ){.    /* las
1b650 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
1b660 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
1b670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b680 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  OERR_READ;.  }el
1b690 73 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73  se{.    storeLas
1b6a0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29  tErrno(pFile, 0)
1b6b0 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73  ;   /* not a sys
1b6c0 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
1b6d0 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
1b6e0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
1b6f0 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
1b700 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
1b710 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
1b720 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
1b730 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1b740 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1b750 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
1b760 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1b770 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73  eek the file-des
1b780 63 72 69 70 74 6f 72 20 70 61 73 73 65 64 20 61  criptor passed a
1b790 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1b7a0 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c  ment to.** absol
1b7b0 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c  ute offset iOff,
1b7c0 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   then attempt to
1b7d0 20 77 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   write nBuf byte
1b7e0 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a  s of data from.*
1b7f0 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66  * pBuf to it. If
1b800 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1b810 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20  , return -1 and 
1b820 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74  set *piErrno. Ot
1b830 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74  herwise, .** ret
1b840 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e  urn the actual n
1b850 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1b860 72 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61  ritten (which ma
1b870 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a  y be less than.*
1b880 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74  * nBuf)..*/.stat
1b890 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
1b8a0 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c  iteFd(.  int fd,
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1b8d0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77   descriptor to w
1b8e0 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34  rite to */.  i64
1b8f0 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20   iOff,          
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b910 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62  File offset to b
1b920 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20  egin writing at 
1b930 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1b940 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
1b950 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74       /* Copy dat
1b960 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66  a from this buff
1b970 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a  er to the file *
1b980 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20  /.  int nBuf,   
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
1b9b0 75 66 66 65 72 20 70 42 75 66 20 69 6e 20 62 79  uffer pBuf in by
1b9c0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  tes */.  int *pi
1b9d0 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20  Errno           
1b9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1b9f0 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66   Error number if
1ba00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f   error occurs */
1ba10 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
1ba20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ba30 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
1ba40 65 74 75 72 6e 65 64 20 62 79 20 73 79 73 74 65  eturned by syste
1ba50 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73  m call */..  ass
1ba60 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66  ert( nBuf==(nBuf
1ba70 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61  &0x1ffff) );.  a
1ba80 73 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20  ssert( fd>2 );. 
1ba90 20 61 73 73 65 72 74 28 20 70 69 45 72 72 6e 6f   assert( piErrno
1baa0 21 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d  !=0 );.  nBuf &=
1bab0 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45   0x1ffff;.  TIME
1bac0 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65  R_START;..#if de
1bad0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
1bae0 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74  .  do{ rc = (int
1baf0 29 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70 42  )osPwrite(fd, pB
1bb00 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1bb10 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1bb20 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1bb30 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
1bb40 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f  SE_PREAD64).  do
1bb50 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77  { rc = (int)osPw
1bb60 72 69 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c  rite64(fd, pBuf,
1bb70 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68   nBuf, iOff);}wh
1bb80 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1bb90 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73  no==EINTR);.#els
1bba0 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20  e.  do{.    i64 
1bbb0 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64  iSeek = lseek(fd
1bbc0 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54  , iOff, SEEK_SET
1bbd0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1bbe0 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 20 3d 20  OError( iSeek = 
1bbf0 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 53  -1 );.    if( iS
1bc00 65 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  eek<0 ){.      r
1bc10 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72  c = -1;.      br
1bc20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
1bc30 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20  c = osWrite(fd, 
1bc40 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d  pBuf, nBuf);.  }
1bc50 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
1bc60 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
1bc70 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45  endif..  TIMER_E
1bc80 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ND;.  OSTRACE(("
1bc90 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
1bca0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
1bcb0 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49  fd, rc, iOff, TI
1bcc0 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a  MER_ELAPSED));..
1bcd0 20 20 69 66 28 20 72 63 3c 30 20 29 20 2a 70 69    if( rc<0 ) *pi
1bce0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1bcf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1bd00 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
1bd10 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e  e offset in id->
1bd20 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64  offset then read
1bd30 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20   cnt bytes into 
1bd40 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pBuf..** Return 
1bd50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1bd60 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
1bd70 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f  d.  Update the o
1bd80 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ffset..**.** To 
1bd90 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
1bda0 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
1bdb0 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65  n a failed write
1bdc0 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
1bdd0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
1bde0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1bdf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1be00 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
1be10 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66  File *id, i64 of
1be20 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  fset, const void
1be30 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
1be40 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41  {.  return seekA
1be50 6e 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c  ndWriteFd(id->h,
1be60 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63   offset, pBuf, c
1be70 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72  nt, &id->lastErr
1be80 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  no);.}.../*.** W
1be90 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
1bea0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
1beb0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
1bec0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1bed0 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
1bee0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
1bef0 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
1bf00 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74  tic int unixWrit
1bf10 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
1bf20 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20  e *id, .  const 
1bf30 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
1bf40 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
1bf50 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a  3_int64 offset .
1bf60 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1bf70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1bf80 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74  *)id;.  int wrot
1bf90 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
1bfa0 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28   id );.  assert(
1bfb0 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20   amt>0 );..  /* 
1bfc0 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
1bfd0 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
1bfe0 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
1bff0 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
1c000 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
1c010 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
1c020 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
1c030 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
1c040 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
1c050 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
1c060 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f   pFile->pPreallo
1c070 63 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20  catedUnused==0. 
1c080 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
1c090 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
1c0a0 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
1c0b0 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
1c0c0 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
1c0d0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1c0e0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77  _DEBUG.  /* If w
1c0f0 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
1c100 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
1c110 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
1c120 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a  s opposed to.  *
1c130 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1c140 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1c150 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1c160 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1c170 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  n a.  ** normal 
1c180 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74  database file) t
1c190 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66  hen record the f
1c1a0 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74  act that the dat
1c1b0 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63  abase.  ** has c
1c1c0 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
1c1d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1c1e0 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c  ter is modified,
1c1f0 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a   record that.  *
1c200 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f  * fact too..  */
1c210 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e  .  if( pFile->in
1c220 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20  NormalWrite ){. 
1c230 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
1c240 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  te = 1;  /* The 
1c250 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1c260 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20  n modified */.  
1c270 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34    if( offset<=24
1c280 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d   && offset+amt>=
1c290 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  27 ){.      int 
1c2a0 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f  rc;.      char o
1c2b0 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20  ldCntr[4];.     
1c2c0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1c2d0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1c2e0 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61   rc = seekAndRea
1c2f0 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64  d(pFile, 24, old
1c300 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cntr, 4);.      
1c310 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1c320 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1c330 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d  if( rc!=4 || mem
1c340 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28  cmp(oldCntr, &((
1c350 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f  char*)pBuf)[24-o
1c360 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b  ffset], 4)!=0 ){
1c370 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1c380 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
1c390 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  1;  /* The trans
1c3a0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68  action counter h
1c3b0 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  as changed */.  
1c3c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c3d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1c3e0 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f  ned(SQLITE_MMAP_
1c3f0 52 45 41 44 57 52 49 54 45 29 20 26 26 20 53 51  READWRITE) && SQ
1c400 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1c410 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
1c420 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
1c430 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73  his write reques
1c440 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
1c450 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
1c460 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1c470 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
1c480 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
1c490 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1c4a0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1c4b0 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
1c4c0 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
1c4d0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1c4e0 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1c4f0 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1c500 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
1c510 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  Buf, amt);.     
1c520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c530 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1c540 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1c550 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1c560 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1c570 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
1c580 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1c590 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
1c5a0 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  f, nCopy);.     
1c5b0 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
1c5c0 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
1c5d0 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
1c5e0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
1c5f0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
1c600 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77 68   }.#endif. .  wh
1c610 69 6c 65 28 20 28 77 72 6f 74 65 20 3d 20 73 65  ile( (wrote = se
1c620 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1c630 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1c640 61 6d 74 29 29 3c 61 6d 74 20 26 26 20 77 72 6f  amt))<amt && wro
1c650 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  te>0 ){.    amt 
1c660 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
1c670 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
1c680 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
1c690 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
1c6a0 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
1c6b0 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
1c6c0 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
1c6d0 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1c6e0 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
1c6f0 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69  , amt=1 ));..  i
1c700 66 28 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a  f( amt>wrote ){.
1c710 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
1c720 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  && pFile->lastEr
1c730 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20  rno!=ENOSPC ){. 
1c740 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e       /* lastErrn
1c750 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
1c760 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72  Write */.      r
1c770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1c780 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  RR_WRITE;.    }e
1c790 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  lse{.      store
1c7a0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1c7b0 20 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79   0); /* not a sy
1c7c0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1c7d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c7e0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
1c7f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1c800 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
1c810 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
1c820 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1c830 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
1c840 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
1c850 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
1c860 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
1c870 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
1c880 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69  yncs are occurri
1c890 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
1c8a0 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
1c8b0 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1c8c0 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
1c8d0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1c8e0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1c8f0 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72  .** We do not tr
1c900 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70  ust systems to p
1c910 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67  rovide a working
1c920 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53   fdatasync().  S
1c930 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72  ome do..** Other
1c940 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20  s do no.  To be 
1c950 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74  safe, we will st
1c960 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c  ick with the (sl
1c970 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a  ightly slower).*
1c980 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f  * fsync(). If yo
1c990 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72  u know that your
1c9a0 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70   system does sup
1c9b0 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29  port fdatasync()
1c9c0 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74   correctly,.** t
1c9d0 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69  hen simply compi
1c9e0 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73  le with -Dfdatas
1c9f0 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72  ync=fdatasync or
1ca00 20 2d 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e   -DHAVE_FDATASYN
1ca10 43 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  C.*/.#if !define
1ca20 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20  d(fdatasync) && 
1ca30 21 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a  !HAVE_FDATASYNC.
1ca40 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
1ca50 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
1ca60 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
1ca70 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
1ca80 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
1ca90 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1caa0 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
1cab0 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
1cac0 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
1cad0 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
1cae0 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
1caf0 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
1cb00 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
1cb10 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
1cb20 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
1cb30 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1cb40 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
1cb50 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1cb60 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
1cb70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
1cb80 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
1cb90 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
1cba0 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
1cbb0 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
1cbc0 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
1cbd0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
1cbe0 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
1cbf0 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
1cc00 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
1cc10 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1cc20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
1cc30 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
1cc40 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
1cc50 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
1cc60 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
1cc70 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
1cc80 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
1cc90 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
1cca0 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
1ccb0 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
1ccc0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1ccd0 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
1cce0 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
1ccf0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1cd00 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
1cd10 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
1cd20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
1cd30 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
1cd40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1cd50 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
1cd60 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1cd70 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
1cd80 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
1cd90 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
1cda0 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
1cdb0 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
1cdc0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
1cdd0 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
1cde0 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
1cdf0 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
1ce00 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
1ce10 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
1ce20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
1ce30 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
1ce40 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
1ce50 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
1ce60 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
1ce70 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
1ce80 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1ce90 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
1cea0 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
1ceb0 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
1cec0 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
1ced0 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
1cee0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
1cef0 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
1cf00 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
1cf10 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
1cf20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
1cf30 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
1cf40 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
1cf50 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
1cf60 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
1cf70 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
1cf80 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
1cf90 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1cfa0 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
1cfb0 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
1cfc0 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
1cfd0 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
1cfe0 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
1cff0 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
1d000 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
1d010 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
1d020 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
1d030 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
1d040 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
1d050 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
1d060 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
1d070 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
1d080 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
1d090 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
1d0a0 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
1d0b0 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
1d0c0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1d0d0 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
1d0e0 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
1d0f0 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
1d100 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
1d110 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
1d120 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
1d130 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
1d140 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
1d150 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
1d160 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
1d170 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
1d180 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
1d190 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1d1a0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1d1b0 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
1d1c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
1d1d0 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
1d1e0 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1d1f0 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
1d200 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
1d210 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1d220 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
1d230 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d240 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1d250 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1d260 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
1d270 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
1d280 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
1d290 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
1d2a0 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
1d2b0 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
1d2c0 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
1d2d0 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
1d2e0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
1d2f0 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
1d300 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
1d310 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
1d320 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
1d330 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1d340 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
1d350 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
1d360 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
1d370 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1d380 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
1d390 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
1d3a0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
1d3b0 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
1d3c0 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
1d3d0 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 42  a.  ** no-op.  B
1d3e0 75 74 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ut go ahead and 
1d3f0 63 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20  call fstat() to 
1d400 76 61 6c 69 64 61 74 65 20 74 68 65 20 66 69 6c  validate the fil
1d410 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f  e.  ** descripto
1d420 72 20 61 73 20 77 65 20 6e 65 65 64 20 61 20 6d  r as we need a m
1d430 65 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f 6b 65  ethod to provoke
1d440 20 61 20 66 61 69 6c 75 72 65 20 64 75 72 69 6e   a failure durin
1d450 67 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74 65 20  g.  ** coverate 
1d460 74 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a 23 69  testing..  */.#i
1d470 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1d480 59 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  YNC.  {.    stru
1d490 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
1d4a0 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64   rc = osFstat(fd
1d4b0 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  , &buf);.  }.#el
1d4c0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1d4d0 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
1d4e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46   ){.    rc = osF
1d4f0 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46  cntl(fd, F_FULLF
1d500 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  SYNC, 0);.  }els
1d510 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
1d520 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46   }.  /* If the F
1d530 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c  ULLFSYNC failed,
1d540 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74   fall back to at
1d550 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e  tempting an fsyn
1d560 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f  c()..  ** It sho
1d570 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62  uldn't be possib
1d580 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63  le for fullfsync
1d590 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   to fail on the 
1d5a0 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  local .  ** file
1d5b0 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29   system (on OSX)
1d5c0 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64  , so failure ind
1d5d0 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c  icates that FULL
1d5e0 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74  FSYNC.  ** isn't
1d5f0 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74   supported for t
1d600 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  his file system.
1d610 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20   So, attempt an 
1d620 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20  fsync .  ** and 
1d630 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65  (for now) ignore
1d640 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
1d650 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66   a superfluous f
1d660 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a  cntl call.  .  *
1d670 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72  * It'd be better
1d680 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66   to detect fullf
1d690 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63  sync support onc
1d6a0 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a  e and avoid .  *
1d6b0 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c  * the fcntl call
1d6c0 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63   every time sync
1d6d0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f   is called..  */
1d6e0 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d  .  if( rc ) rc =
1d6f0 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c   fsync(fd);..#el
1d700 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1d710 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61  LE__).  /* fdata
1d720 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64  sync() on HFS+ d
1d730 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68  oesn't yet flush
1d740 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1d750 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72  f it changed cor
1d760 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63  rectly.  ** so c
1d770 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61  urrently we defa
1d780 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  ult to the macro
1d790 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20   that redefines 
1d7a0 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79  fdatasync to fsy
1d7b0 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66  nc.  */.  rc = f
1d7c0 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20  sync(fd);.#else 
1d7d0 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e  .  rc = fdatasyn
1d7e0 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58  c(fd);.#if OS_VX
1d7f0 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d  WORKS.  if( rc==
1d800 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  -1 && errno==ENO
1d810 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d  TSUP ){.    rc =
1d820 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a   fsync(fd);.  }.
1d830 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
1d840 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  ORKS */.#endif /
1d850 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  * ifdef SQLITE_N
1d860 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45  O_SYNC elif HAVE
1d870 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20  _FULLFSYNC */.. 
1d880 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20   if( OS_VXWORKS 
1d890 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20  && rc!= -1 ){.  
1d8a0 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    rc = 0;.  }.  
1d8b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d8c0 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  .** Open a file 
1d8d0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
1d8e0 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1d8f0 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c  aining file zFil
1d900 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63  ename..** If suc
1d910 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73  cessful, *pFd is
1d920 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e   set to the open
1d930 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1d940 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  or and.** SQLITE
1d950 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1d960 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d970 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49  urs, either SQLI
1d980 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53  TE_NOMEM.** or S
1d990 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69  QLITE_CANTOPEN i
1d9a0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1d9b0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pFd is set to an
1d9c0 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61   undefined.** va
1d9d0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  lue..**.** The d
1d9e0 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
1d9f0 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64  scriptor is used
1da00 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68   for only one th
1da10 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e  ing - to.** fsyn
1da20 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20  c() a directory 
1da30 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c  to make sure fil
1da40 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64  e creation and d
1da50 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a  eletion events.*
1da60 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f  * are flushed to
1da70 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79   disk.  Such fsy
1da80 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64  ncs are not need
1da90 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a  ed on newer.** j
1daa0 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79  ournaling filesy
1dab0 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72  stems, but are r
1dac0 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72  equired on older
1dad0 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
1dae0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1daf0 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
1db00 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65  en using the xSe
1db10 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61  tSysCall interfa
1db20 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69  ce..** The abili
1db30 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74  ty to override t
1db40 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1db50 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74  added in support
1db60 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d   of the.** chrom
1db70 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70  ium sandbox.  Op
1db80 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ening a director
1db90 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20  y is a security 
1dba0 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20  risk (we are.** 
1dbb0 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20  told) so making 
1dbc0 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  it overrideable 
1dbd0 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d  allows the chrom
1dbe0 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a  ium sandbox to.*
1dbf0 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72  * replace this r
1dc00 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61  outine with a ha
1dc10 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54  rmless no-op.  T
1dc20 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74  o make this rout
1dc30 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20  ine.** a no-op, 
1dc40 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20  replace it with 
1dc50 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75  a stub that retu
1dc60 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  rns SQLITE_OK bu
1dc70 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64  t leaves.** *pFd
1dc80 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69   set to a negati
1dc90 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ve number..**.**
1dca0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1dcb0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
1dcc0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1dcd0 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
1dce0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
1dcf0 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
1dd00 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
1dd10 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
1dd20 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
1dd30 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
1dd40 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
1dd50 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
1dd60 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
1dd70 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
1dd80 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
1dd90 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1dda0 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
1ddb0 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
1ddc0 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29  ;.  for(ii=(int)
1ddd0 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
1dde0 3b 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e 61  ; ii>0 && zDirna
1ddf0 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
1de00 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
1de10 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
1de20 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c  i] = '\0';.  }el
1de30 73 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72  se{.    if( zDir
1de40 6e 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a  name[0]!='/' ) z
1de50 44 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27  Dirname[0] = '.'
1de60 3b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31  ;.    zDirname[1
1de70 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20  ] = 0;.  }.  fd 
1de80 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44  = robust_open(zD
1de90 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
1dea0 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
1deb0 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
1dec0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
1ded0 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20  DIR %-3d %s\n", 
1dee0 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a  fd, zDirname));.
1def0 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b    }.  *pFd = fd;
1df00 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72  .  if( fd>=0 ) r
1df10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1df20 0a 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f  .  return unixLo
1df30 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
1df40 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
1df50 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44  enDirectory", zD
1df60 69 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  irname);.}../*.*
1df70 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
1df80 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
1df90 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
1dfa0 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
1dfb0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  k..**.** If data
1dfc0 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74  Only==0 then bot
1dfd0 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  h the file itsel
1dfe0 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61  f and its metada
1dff0 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65  ta (file.** size
1e000 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65  , access time, e
1e010 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20  tc) are synced. 
1e020 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20   If dataOnly!=0 
1e030 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  then only the.**
1e040 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79   file data is sy
1e050 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65  nced..**.** Unde
1e060 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b  r Unix, also mak
1e070 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
1e080 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1e090 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  for the file.** 
1e0a0 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
1e0b0 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68   by fsync-ing th
1e0c0 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
1e0d0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69   contains the fi
1e0e0 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20  le..** If we do 
1e0f0 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20  not do this and 
1e100 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70  we encounter a p
1e110 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
1e120 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65  e directory.** e
1e130 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
1e140 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65  rnal might not e
1e150 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65  xist after we re
1e160 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a  boot.  The next.
1e170 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63  ** SQLite to acc
1e180 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ess the file wil
1e190 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20  l not know that 
1e1a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  the journal exis
1e1b0 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ts (because.** t
1e1c0 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
1e1d0 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1e1e0 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65  al was never cre
1e1f0 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72  ated) and the tr
1e200 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c  ansaction.** wil
1e210 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  l not roll back 
1e220 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69  - possibly leadi
1e230 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
1e240 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
1e250 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e  atic int unixSyn
1e260 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
1e270 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
1e280 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
1e290 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1e2a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
1e2b0 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d  int isDataOnly =
1e2c0 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53   (flags&SQLITE_S
1e2d0 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20  YNC_DATAONLY);. 
1e2e0 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20   int isFullsync 
1e2f0 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  = (flags&0x0F)==
1e300 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1e310 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
1e320 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  at one of SQLITE
1e330 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20  _SYNC_NORMAL or 
1e340 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20  FULL was passed 
1e350 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61  */.  assert((fla
1e360 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1e370 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20  _SYNC_NORMAL.   
1e380 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30     || (flags&0x0
1e390 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
1e3a0 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  FULL.  );..  /* 
1e3b0 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
1e3c0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
1e3d0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1e3e0 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
1e3f0 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
1e400 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
1e410 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
1e420 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
1e430 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
1e440 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
1e450 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1e460 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65  _FULL );..  asse
1e470 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
1e480 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20  STRACE(("SYNC   
1e490 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
1e4a0 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c  >h));.  rc = ful
1e4b0 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68  l_fsync(pFile->h
1e4c0 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73  , isFullsync, is
1e4d0 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d  DataOnly);.  Sim
1e4e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
1e4f0 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  =1 );.  if( rc )
1e500 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
1e510 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
1e520 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75  o);.    return u
1e530 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1e540 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20  TE_IOERR_FSYNC, 
1e550 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46  "full_fsync", pF
1e560 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
1e570 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e  ..  /* Also fsyn
1e580 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  c the directory 
1e590 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
1e5a0 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59  ile if the DIRSY
1e5b0 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20  NC flag.  ** is 
1e5c0 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20  set.  This is a 
1e5d0 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65  one-time occurre
1e5e0 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65  nce.  Many syste
1e5f0 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49  ms (examples: AI
1e600 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62  X).  ** are unab
1e610 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69  le to fsync a di
1e620 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f  rectory, so igno
1e630 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65  re errors on the
1e640 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69   fsync..  */.  i
1e650 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
1e660 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
1e670 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e  IRSYNC ){.    in
1e680 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54  t dirfd;.    OST
1e690 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25  RACE(("DIRSYNC %
1e6a0 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  s (have_fullfsyn
1e6b0 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
1e6c0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  )\n", pFile->zPa
1e6d0 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  th,.            
1e6e0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
1e6f0 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20  isFullsync));.  
1e700 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
1e710 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50  ectory(pFile->zP
1e720 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20  ath, &dirfd);.  
1e730 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e740 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c  _OK ){.      ful
1e750 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30  l_fsync(dirfd, 0
1e760 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  , 0);.      robu
1e770 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
1e780 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  dirfd, __LINE__)
1e790 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e7a0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1e7b0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
1e7c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1e7d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e7e0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1e7f0 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f  gs &= ~UNIXFILE_
1e800 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72  DIRSYNC;.  }.  r
1e810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e820 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
1e830 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
1e840 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
1e850 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54  static int unixT
1e860 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f  runcate(sqlite3_
1e870 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42  file *id, i64 nB
1e880 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  yte){.  unixFile
1e890 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1e8a0 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
1e8b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  rc;.  assert( pF
1e8c0 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
1e8d0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1e8e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
1e8f0 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20  UNCATE );..  /* 
1e900 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
1e910 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
1e920 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
1e930 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20   file, truncate 
1e940 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f  the.  ** file so
1e950 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74   that it consist
1e960 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  s of an integer 
1e970 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73  number of chunks
1e980 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20   (i.e. the.  ** 
1e990 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65  actual file size
1e9a0 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
1e9b0 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67  tion may be larg
1e9c0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
1e9d0 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29  ested.  ** size)
1e9e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1e9f0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
1ea00 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
1ea10 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
1ea20 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
1ea30 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
1ea40 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
1ea50 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f  ..  rc = robust_
1ea60 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
1ea70 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  >h, nByte);.  if
1ea80 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72  ( rc ){.    stor
1ea90 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1eaa0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
1eab0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1eac0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1ead0 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1eae0 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1eaf0 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69  th);.  }else{.#i
1eb00 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1eb10 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  G.    /* If we a
1eb20 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
1eb30 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
1eb40 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
1eb50 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a  pposed to.    **
1eb60 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1eb70 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1eb80 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1eb90 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1eba0 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c   a.    ** normal
1ebb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1ebc0 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20  and we truncate 
1ebd0 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
1ebe0 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20   length,.    ** 
1ebf0 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79  that effectively
1ec00 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
1ec10 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68  nge counter.  Th
1ec20 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a  is might happen.
1ec30 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74      ** when rest
1ec40 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  oring a database
1ec50 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75   using the backu
1ec60 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72  p API from a zer
1ec70 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  o-length.    ** 
1ec80 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20  source..    */. 
1ec90 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e     if( pFile->in
1eca0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e  NormalWrite && n
1ecb0 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
1ecc0 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
1ecd0 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d  rChng = 1;.    }
1ece0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1ecf0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1ed00 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  E>0.    /* If th
1ed10 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  e file was just 
1ed20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73  truncated to a s
1ed30 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  ize smaller than
1ed40 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   the currently. 
1ed50 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67     ** mapped reg
1ed60 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20  ion, reduce the 
1ed70 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e  effective mappin
1ed80 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20  g size as well. 
1ed90 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20  SQLite will.    
1eda0 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e  ** use read() an
1edb0 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63  d write() to acc
1edc0 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20  ess data beyond 
1edd0 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20  this point from 
1ede0 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f  now on.  .    */
1edf0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70  .    if( nByte<p
1ee00 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1ee10 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d  {.      pFile->m
1ee20 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b  mapSize = nByte;
1ee30 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1ee40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ee50 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
1ee60 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
1ee70 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
1ee80 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
1ee90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1eea0 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  ixFileSize(sqlit
1eeb0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1eec0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
1eed0 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  rc;.  struct sta
1eee0 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28  t buf;.  assert(
1eef0 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73   id );.  rc = os
1ef00 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  Fstat(((unixFile
1ef10 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b  *)id)->h, &buf);
1ef20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1ef30 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1ef40 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc!=0 ){.    s
1ef50 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75  toreLastErrno((u
1ef60 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72  nixFile*)id, err
1ef70 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  no);.    return 
1ef80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1ef90 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  AT;.  }.  *pSize
1efa0 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
1efb0 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69  .  /* When openi
1efc0 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64  ng a zero-size d
1efd0 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e  atabase, the fin
1efe0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f  dInodeInfo() pro
1eff0 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74  cedure.  ** writ
1f000 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  es a single byte
1f010 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20   into that file 
1f020 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
1f030 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20   around a bug.  
1f040 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d  ** in the OS-X m
1f050 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e  sdos filesystem.
1f060 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76    In order to av
1f070 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  oid problems wit
1f080 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79  h upper.  ** lay
1f090 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ers, we need to 
1f0a0 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65  report this file
1f0b0 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76   size as zero ev
1f0c0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a  en though it is.
1f0d0 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20    ** really 1.  
1f0e0 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20   Ticket #3260.. 
1f0f0 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65   */.  if( *pSize
1f100 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30  ==1 ) *pSize = 0
1f110 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ;...  return SQL
1f120 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
1f130 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1f140 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1f150 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1f160 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66  ./*.** Handler f
1f170 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  or proxy-locking
1f180 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65   file-control ve
1f190 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65  rbs.  Defined be
1f1a0 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72  low in the.** pr
1f1b0 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64  oxying locking d
1f1c0 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ivision..*/.stat
1f1d0 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
1f1e0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1f1f0 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29  file*,int,void*)
1f200 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a  ;.#endif../* .**
1f210 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f220 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64  s called to hand
1f230 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  le the SQLITE_FC
1f240 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a  NTL_SIZE_HINT .*
1f250 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f  * file-control o
1f260 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72  peration.  Enlar
1f270 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ge the database 
1f280 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a  to nBytes in siz
1f290 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70  e.** (rounded up
1f2a0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75   to the next chu
1f2b0 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68  nk-size).  If th
1f2c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
1f2d0 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20  ready.** nBytes 
1f2e0 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20  or larger, this 
1f2f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1f300 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
1f310 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  t fcntlSizeHint(
1f320 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
1f330 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69   i64 nByte){.  i
1f340 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1f350 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  k>0 ){.    i64 n
1f360 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1f370 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1f380 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1f390 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
1f3a0 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  t buf;          
1f3b0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68      /* Used to h
1f3c0 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65  old return value
1f3d0 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a  s of fstat() */.
1f3e0 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73     .    if( osFs
1f3f0 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
1f400 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  uf) ){.      ret
1f410 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1f420 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20  _FSTAT;.    }.. 
1f430 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79     nSize = ((nBy
1f440 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  te+pFile->szChun
1f450 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a  k-1) / pFile->sz
1f460 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
1f470 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28  szChunk;.    if(
1f480 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e   nSize>(i64)buf.
1f490 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20  st_size ){..#if 
1f4a0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53  defined(HAVE_POS
1f4b0 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26  IX_FALLOCATE) &&
1f4c0 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c   HAVE_POSIX_FALL
1f4d0 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54  OCATE.      /* T
1f4e0 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73  he code below is
1f4f0 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65   handling the re
1f500 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73  turn value of os
1f510 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20  Fallocate() .   
1f520 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e     ** correctly.
1f530 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1f540 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
1f550 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f   "returns zero o
1f560 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20  n success, .    
1f570 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72    ** or an error
1f580 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c   number on  fail
1f590 75 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61  ure". See the ma
1f5a0 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c  npage for detail
1f5b0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  s. */.      int 
1f5c0 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  err;.      do{. 
1f5d0 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46         err = osF
1f5e0 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e  allocate(pFile->
1f5f0 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20  h, buf.st_size, 
1f600 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a  nSize-buf.st_siz
1f610 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  e);.      }while
1f620 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a  ( err==EINTR );.
1f630 20 20 20 20 20 20 69 66 28 20 65 72 72 20 26 26        if( err &&
1f640 20 65 72 72 21 3d 45 49 4e 56 41 4c 20 29 20 72   err!=EINVAL ) r
1f650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1f660 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
1f670 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1f680 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
1f690 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1f6a0 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69  (), fake it. Wri
1f6b0 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73  te a .      ** s
1f6c0 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68  ingle byte to th
1f6d0 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1f6e0 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66  ach block that f
1f6f0 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20  alls entirely.  
1f700 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
1f710 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1f720 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75  n. Then, if requ
1f730 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62  ired, a single b
1f740 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  yte.      ** at 
1f750 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29  offset (nSize-1)
1f760 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a  , to set the siz
1f770 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
1f780 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
1f790 2a 20 54 68 69 73 20 69 73 20 61 20 73 69 6d 69  * This is a simi
1f7a0 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f  lar technique to
1f7b0 20 74 68 61 74 20 75 73 65 64 20 62 79 20 67 6c   that used by gl
1f7c0 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20  ibc on systems. 
1f7d0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20       ** that do 
1f7e0 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1f7f0 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c  fallocate() call
1f800 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f810 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1f820 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1f830 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1f840 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1f850 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20  int nWrite = 0; 
1f860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f870 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1f880 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e  ritten by seekAn
1f890 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1f8a0 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f8c0 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1f8d0 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1f8e0 20 69 57 72 69 74 65 20 3d 20 28 62 75 66 2e 73   iWrite = (buf.s
1f8f0 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c  t_size/nBlk)*nBl
1f900 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20  k + nBlk - 1;.  
1f910 20 20 20 20 61 73 73 65 72 74 28 20 69 57 72 69      assert( iWri
1f920 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20  te>=buf.st_size 
1f930 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f940 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e 42 6c   ((iWrite+1)%nBl
1f950 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  k)==0 );.      f
1f960 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57  or(/*no-op*/; iW
1f970 72 69 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d  rite<nSize+nBlk-
1f980 31 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20  1; iWrite+=nBlk 
1f990 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1f9a0 57 72 69 74 65 3e 3d 6e 53 69 7a 65 20 29 20 69  Write>=nSize ) i
1f9b0 57 72 69 74 65 20 3d 20 6e 53 69 7a 65 20 2d 20  Write = nSize - 
1f9c0 31 3b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74  1;.        nWrit
1f9d0 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1f9e0 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20  (pFile, iWrite, 
1f9f0 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  "", 1);.        
1fa00 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20  if( nWrite!=1 ) 
1fa10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1fa20 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  ERR_WRITE;.     
1fa30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1fa40 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
1fa50 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1fa60 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
1fa70 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42  pSizeMax>0 && nB
1fa80 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte>pFile->mmapS
1fa90 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ize ){.    int r
1faa0 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  c;.    if( pFile
1fab0 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a  ->szChunk<=0 ){.
1fac0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
1fad0 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1fae0 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
1faf0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
1fb00 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
1fb10 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  no);.        ret
1fb20 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1fb30 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1fb40 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1fb50 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1fb60 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1fb70 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  }..    rc = unix
1fb80 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e  Mapfile(pFile, n
1fb90 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Byte);.    retur
1fba0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
1fbb0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1fbc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1fbd0 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
1fbe0 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
1fbf0 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
1fc00 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
1fc10 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
1fc20 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1fc30 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
1fc40 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1fc50 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
1fc60 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
1fc70 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
1fc80 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
1fc90 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
1fca0 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
1fcb0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f  atic void unixMo
1fcc0 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a  deBit(unixFile *
1fcd0 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20  pFile, unsigned 
1fce0 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a  char mask, int *
1fcf0 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41  pArg){.  if( *pA
1fd00 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72  rg<0 ){.    *pAr
1fd10 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  g = (pFile->ctrl
1fd20 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30  Flags & mask)!=0
1fd30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a  ;.  }else if( (*
1fd40 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pArg)==0 ){.    
1fd50 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1fd60 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c   &= ~mask;.  }el
1fd70 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  se{.    pFile->c
1fd80 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  trlFlags |= mask
1fd90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ;.  }.}../* Forw
1fda0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1fdb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1fdc0 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
1fdd0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1fde0 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  uf);../*.** Info
1fdf0 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
1fe00 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
1fe10 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
1fe20 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1fe30 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1fe40 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1fe50 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
1fe60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1fe70 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1fe80 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  id;.  switch( op
1fe90 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
1fea0 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
1feb0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1fec0 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
1fed0 5f 57 52 49 54 45 29 0a 20 20 20 20 63 61 73 65  _WRITE).    case
1fee0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 45   SQLITE_FCNTL_BE
1fef0 47 49 4e 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  GIN_ATOMIC_WRITE
1ff00 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
1ff10 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65   = osIoctl(pFile
1ff20 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 53 54  ->h, F2FS_IOC_ST
1ff30 41 52 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  ART_ATOMIC_WRITE
1ff40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ff50 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc ? SQLITE_IOER
1ff60 52 5f 42 45 47 49 4e 5f 41 54 4f 4d 49 43 20 3a  R_BEGIN_ATOMIC :
1ff70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ff80 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1ff90 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 41  E_FCNTL_COMMIT_A
1ffa0 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20  TOMIC_WRITE: {. 
1ffb0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73       int rc = os
1ffc0 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Ioctl(pFile->h, 
1ffd0 46 32 46 53 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f  F2FS_IOC_COMMIT_
1ffe0 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20  ATOMIC_WRITE);. 
1fff0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
20000 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f   SQLITE_IOERR_CO
20010 4d 4d 49 54 5f 41 54 4f 4d 49 43 20 3a 20 53 51  MMIT_ATOMIC : SQ
20020 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
20030 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
20040 43 4e 54 4c 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54  CNTL_ROLLBACK_AT
20050 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20  OMIC_WRITE: {.  
20060 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 49      int rc = osI
20070 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  octl(pFile->h, F
20080 32 46 53 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f  2FS_IOC_ABORT_VO
20090 4c 41 54 49 4c 45 5f 57 52 49 54 45 29 3b 0a 20  LATILE_WRITE);. 
200a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
200b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 4f   SQLITE_IOERR_RO
200c0 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 20 3a 20  LLBACK_ATOMIC : 
200d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
200e0 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e  .#endif /* __lin
200f0 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45  ux__ && SQLITE_E
20100 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
20110 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20  IC_WRITE */..   
20120 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
20130 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
20140 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
20150 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  g = pFile->eFile
20160 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75  Lock;.      retu
20170 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
20180 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
20190 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45  ITE_FCNTL_LAST_E
201a0 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
201b0 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
201c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
201d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
201e0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
201f0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
20200 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
20210 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43        pFile->szC
20220 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
20230 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Arg;.      retur
20240 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
20250 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
20260 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
20270 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  NT: {.      int 
20280 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  rc;.      Simula
20290 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
202a0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  1);.      rc = f
202b0 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69  cntlSizeHint(pFi
202c0 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67  le, *(i64 *)pArg
202d0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
202e0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
202f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20300 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  rc;.    }.    ca
20310 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
20320 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
20330 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
20340 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
20350 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69  _PERSIST_WAL, (i
20360 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
20370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20380 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
20390 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
203a0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
203b0 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  TE: {.      unix
203c0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
203d0 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  NIXFILE_PSOW, (i
203e0 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
203f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20400 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
20410 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
20420 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
20430 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
20440 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
20450 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66  "%s", pFile->pVf
20460 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
20470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20480 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
20490 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
204a0 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
204b0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
204c0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
204d0 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56 66  oc64( pFile->pVf
204e0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
204f0 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c  .      if( zTFil
20500 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69  e ){.        uni
20510 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69  xGetTempname(pFi
20520 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
20530 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20  name, zTFile);. 
20540 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
20550 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
20560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
20570 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20580 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
20590 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
205a0 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28  OVED: {.      *(
205b0 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65  int*)pArg = file
205c0 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b  HasMoved(pFile);
205d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
205e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
205f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20600 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55  BLE_SETLK_TIMEOU
20610 54 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  T.    case SQLIT
20620 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d  E_FCNTL_LOCK_TIM
20630 45 4f 55 54 3a 20 7b 0a 20 20 20 20 20 20 70 46  EOUT: {.      pF
20640 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75  ile->iBusyTimeou
20650 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b  t = *(int*)pArg;
20660 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20670 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
20680 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
20690 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
206a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
206b0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
206c0 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65  : {.      i64 ne
206d0 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29  wLimit = *(i64*)
206e0 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  pArg;.      int 
206f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20700 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
20710 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  it>sqlite3Global
20720 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b  Config.mxMmap ){
20730 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  .        newLimi
20740 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  t = sqlite3Globa
20750 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a  lConfig.mxMmap;.
20760 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20770 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * The value of n
20780 65 77 4c 69 6d 69 74 20 6d 61 79 20 62 65 20 65  ewLimit may be e
20790 76 65 6e 74 75 61 6c 6c 79 20 63 61 73 74 20 74  ventually cast t
207a0 6f 20 28 73 69 7a 65 5f 74 29 20 61 6e 64 20 70  o (size_t) and p
207b0 61 73 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  assed.      ** t
207c0 6f 20 6d 6d 61 70 28 29 2e 20 52 65 73 74 72 69  o mmap(). Restri
207d0 63 74 20 69 74 73 20 76 61 6c 75 65 20 74 6f 20  ct its value to 
207e0 32 47 42 20 69 66 20 28 73 69 7a 65 5f 74 29 20  2GB if (size_t) 
207f0 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73 74 20  is not at least 
20800 61 0a 20 20 20 20 20 20 2a 2a 20 36 34 2d 62 69  a.      ** 64-bi
20810 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20 20  t type. */.     
20820 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 30 20   if( newLimit>0 
20830 26 26 20 73 69 7a 65 6f 66 28 73 69 7a 65 5f 74  && sizeof(size_t
20840 29 3c 38 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  )<8 ){.        n
20850 65 77 4c 69 6d 69 74 20 3d 20 28 6e 65 77 4c 69  ewLimit = (newLi
20860 6d 69 74 20 26 20 30 78 37 46 46 46 46 46 46 46  mit & 0x7FFFFFFF
20870 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
20880 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
20890 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
208a0 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
208b0 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
208c0 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
208d0 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
208e0 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
208f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
20900 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
20910 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
20920 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
20930 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
20940 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66        unixUnmapf
20950 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ile(pFile);.    
20960 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d        rc = unixM
20970 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
20980 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20990 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
209a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
209b0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
209c0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
209d0 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68  e pager calls th
209e0 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67  is method to sig
209f0 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20  nal that it has 
20a00 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f  done.    ** a ro
20a10 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  llback and that 
20a20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
20a30 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e  therefore unchan
20a40 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ged and.    ** i
20a50 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b  t hence it is OK
20a60 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63   for the transac
20a70 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e  tion change coun
20a80 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  ter to be.    **
20a90 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20   unchanged..    
20aa0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
20ab0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
20ac0 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28  ANGED: {.      (
20ad0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
20ae0 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
20af0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20b00 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
20b10 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
20b20 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
20b30 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
20b40 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73  APPLE__).    cas
20b50 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
20b60 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
20b70 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
20b80 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b  E_FCNTL_GET_LOCK
20b90 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
20ba0 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46     return proxyF
20bb0 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70  ileControl(id,op
20bc0 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65  ,pArg);.    }.#e
20bd0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
20be0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
20bf0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
20c00 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d  _APPLE__) */.  }
20c10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20c20 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
20c30 0a 2a 2a 20 49 66 20 70 46 64 2d 3e 73 65 63 74  .** If pFd->sect
20c40 6f 72 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65  orSize is non-ze
20c50 72 6f 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ro when this fun
20c60 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
20c70 20 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f   it is a.** no-o
20c80 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
20c90 65 20 76 61 6c 75 65 73 20 6f 66 20 70 46 64 2d  e values of pFd-
20ca0 3e 73 65 63 74 6f 72 53 69 7a 65 20 61 6e 64 20  >sectorSize and 
20cb0 0a 2a 2a 20 70 46 64 2d 3e 64 65 76 69 63 65 43  .** pFd->deviceC
20cc0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 61  haracteristics a
20cd0 72 65 20 73 65 74 20 61 63 63 6f 72 64 69 6e 67  re set according
20ce0 20 74 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73   to the file-sys
20cf0 74 65 6d 20 0a 2a 2a 20 63 68 61 72 61 63 74 65  tem .** characte
20d00 72 69 73 74 69 63 73 2e 20 0a 2a 2a 0a 2a 2a 20  ristics. .**.** 
20d10 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 76 65  There are two ve
20d20 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
20d30 75 6e 63 74 69 6f 6e 2e 20 4f 6e 65 20 66 6f 72  unction. One for
20d40 20 51 4e 58 20 61 6e 64 20 6f 6e 65 20 66 6f 72   QNX and one for
20d50 20 61 6c 6c 0a 2a 2a 20 6f 74 68 65 72 20 73 79   all.** other sy
20d60 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
20d70 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 73 74 61  f __QNXNTO__.sta
20d80 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69  tic void setDevi
20d90 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20da0 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  s(unixFile *pFd)
20db0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  {.  assert( pFd-
20dc0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
20dd0 69 73 74 69 63 73 3d 3d 30 20 7c 7c 20 70 46 64  istics==0 || pFd
20de0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 21 3d 30 20  ->sectorSize!=0 
20df0 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 73 65  );.  if( pFd->se
20e00 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 7b 0a 23  ctorSize==0 ){.#
20e10 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  if defined(__lin
20e20 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64  ux__) && defined
20e30 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42  (SQLITE_ENABLE_B
20e40 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ATCH_ATOMIC_WRIT
20e50 45 29 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  E).    int res;.
20e60 20 20 20 20 75 33 32 20 66 20 3d 20 30 3b 0a 0a      u32 f = 0;..
20e70 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
20e80 20 73 75 70 70 6f 72 74 20 66 6f 72 20 46 32 46   support for F2F
20e90 53 20 61 74 6f 6d 69 63 20 62 61 74 63 68 20 77  S atomic batch w
20ea0 72 69 74 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65  rites. */.    re
20eb0 73 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 64 2d  s = osIoctl(pFd-
20ec0 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 47 45 54  >h, F2FS_IOC_GET
20ed0 5f 46 45 41 54 55 52 45 53 2c 20 26 66 29 3b 0a  _FEATURES, &f);.
20ee0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26      if( res==0 &
20ef0 26 20 28 66 20 26 20 46 32 46 53 5f 46 45 41 54  & (f & F2FS_FEAT
20f00 55 52 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  URE_ATOMIC_WRITE
20f10 29 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ) ){.      pFd->
20f20 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20f30 73 74 69 63 73 20 3d 20 53 51 4c 49 54 45 5f 49  stics = SQLITE_I
20f40 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
20f50 43 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  C;.    }.#endif 
20f60 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20  /* __linux__ && 
20f70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41  SQLITE_ENABLE_BA
20f80 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  TCH_ATOMIC_WRITE
20f90 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
20fa0 74 68 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  the POWERSAFE_OV
20fb0 45 52 57 52 49 54 45 20 66 6c 61 67 20 69 66 20  ERWRITE flag if 
20fc0 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
20fd0 20 20 69 66 28 20 70 46 64 2d 3e 63 74 72 6c 46    if( pFd->ctrlF
20fe0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
20ff0 50 53 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 46  PSOW ){.      pF
21000 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  d->deviceCharact
21010 65 72 69 73 74 69 63 73 20 7c 3d 20 53 51 4c 49  eristics |= SQLI
21020 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
21030 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20  FE_OVERWRITE;.  
21040 20 20 7d 0a 0a 20 20 20 20 70 46 64 2d 3e 73 65    }..    pFd->se
21050 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54  ctorSize = SQLIT
21060 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
21070 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  _SIZE;.  }.}.#el
21080 73 65 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  se.#include <sys
21090 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e  /dcmd_blk.h>.#in
210a0 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76  clude <sys/statv
210b0 66 73 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  fs.h>.static voi
210c0 64 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61  d setDeviceChara
210d0 63 74 65 72 69 73 74 69 63 73 28 75 6e 69 78 46  cteristics(unixF
210e0 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
210f0 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  f( pFile->sector
21100 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Size == 0 ){.   
21110 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20   struct statvfs 
21120 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a  fsInfo;.       .
21130 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75      /* Set defau
21140 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70  lts for non-supp
21150 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d  orted filesystem
21160 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  s */.    pFile->
21170 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
21180 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
21190 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69  OR_SIZE;.    pFi
211a0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
211b0 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
211c0 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73 28     if( fstatvfs(
211d0 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66  pFile->h, &fsInf
211e0 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20  o) == -1 ) {.   
211f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
21200 0a 0a 20 20 20 20 69 66 28 20 21 73 74 72 63 6d  ..    if( !strcm
21210 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
21220 79 70 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a  ype, "tmp") ) {.
21230 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
21240 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
21250 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
21260 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
21270 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
21280 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
21290 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20  CAP_ATOMIC4K |  
212a0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20       /* All ram 
212b0 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65  filesystem write
212c0 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
212d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
212e0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
212f0 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
21300 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
21310 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
21350 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
21360 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
21370 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
21380 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
21390 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
213a0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213d0 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
213e0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
213f0 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
21400 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66  if( strstr(fsInf
21410 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65  o.f_basetype, "e
21420 74 66 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70  tfs") ){.      p
21430 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
21440 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
21450 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
21460 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
21470 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
21480 2f 2a 20 65 74 66 73 20 63 6c 75 73 74 65 72 20  /* etfs cluster 
21490 73 69 7a 65 20 77 72 69 74 65 73 20 61 72 65 20  size writes are 
214a0 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
214b0 20 20 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72    (pFile->sector
214c0 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
214d0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
214e0 35 31 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53  512) |.        S
214f0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
21500 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
21510 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
21520 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
21530 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21550 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
21560 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
21570 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
21580 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
21590 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
215a0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
215b0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
215c0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
215f0 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
21600 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
21610 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63   }else if( !strc
21620 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
21630 74 79 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b  type, "qnx6") ){
21640 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
21650 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
21660 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
21670 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
21680 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
21690 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
216a0 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20  OCAP_ATOMIC |   
216b0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c        /* All fil
216c0 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61  esystem writes a
216d0 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
216e0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
216f0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
21700 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
21710 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
21720 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21750 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
21760 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
21770 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
21780 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
21790 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
217a0 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
217b0 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217e0 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
217f0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
21800 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
21810 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
21820 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78  f_basetype, "qnx
21830 34 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  4") ){.      pFi
21840 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
21850 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
21860 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
21870 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
21880 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
21890 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
218a0 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
218b0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
218c0 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
218d0 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
218e0 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
218f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
21900 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
21910 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
21920 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
21930 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
21940 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
21950 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
21960 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21980 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
21990 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
219a0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
219b0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72  }else if( strstr
219c0 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
219d0 70 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20  pe, "dos") ){.  
219e0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
219f0 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
21a00 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
21a10 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
21a20 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
21a30 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
21a40 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
21a50 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
21a60 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
21a70 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
21a80 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
21a90 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
21aa0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
21ab0 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
21ac0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
21ad0 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
21ae0 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
21af0 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
21b00 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b30 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
21b40 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
21b50 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
21b60 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
21b70 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21b80 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
21b90 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
21ba0 32 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63  2 |      /* bloc
21bb0 6b 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  ks are atomic */
21bc0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
21bd0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
21be0 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
21bf0 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
21c00 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c30 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
21c40 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
21c50 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a         0;.    }.
21c60 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68    }.  /* Last ch
21c70 61 6e 63 65 20 76 65 72 69 66 69 63 61 74 69 6f  ance verificatio
21c80 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 74 6f  n.  If the secto
21c90 72 20 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d  r size isn't a m
21ca0 75 6c 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20  ultiple of 512. 
21cb0 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27   ** then it isn'
21cc0 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28  t valid.*/.  if(
21cd0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
21ce0 7a 65 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b  ze % 512 != 0 ){
21cf0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69  .    pFile->devi
21d00 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
21d10 73 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  s = 0;.    pFile
21d20 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53  ->sectorSize = S
21d30 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
21d40 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
21d50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
21d60 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
21d70 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
21d80 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
21d90 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
21da0 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
21db0 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
21dc0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
21dd0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
21de0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
21df0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
21e00 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
21e10 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
21e20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
21e30 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
21e40 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
21e50 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
21e60 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
21e70 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
21e80 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
21e90 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
21ea0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
21eb0 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
21ec0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
21ed0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
21ee0 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
21ef0 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
21f00 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
21f10 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
21f20 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
21f30 65 2a 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69  e*)id;.  setDevi
21f40 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
21f50 73 28 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e  s(pFd);.  return
21f60 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65   pFd->sectorSize
21f70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21f80 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
21f90 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
21fa0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
21fb0 20 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74   This VFS is set
21fc0 20 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51   up to return SQ
21fd0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
21fe0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62  SAFE_OVERWRITE b
21ff0 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f  y default..** Ho
22000 77 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69  wever, that choi
22010 63 65 20 69 73 20 63 6f 6e 74 72 6f 76 65 72 73  ce is controvers
22020 69 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69  ial since techni
22030 63 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c  cally the underl
22040 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73  ying.** file sys
22050 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77  tem does not alw
22060 61 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65  ays provide powe
22070 72 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73  rsafe overwrites
22080 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  .  (In other.** 
22090 77 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70  words, after a p
220a0 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c  ower-loss event,
220b0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69   parts of the fi
220c0 6c 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76  le that were nev
220d0 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69  er.** written mi
220e0 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
220f0 20 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65   altered.)  Howe
22100 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65  ver, non-PSOW be
22110 68 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a  havior is very,.
22120 2a 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41  ** very rare.  A
22130 6e 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f  nd asserting PSO
22140 57 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20  W makes a large 
22150 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  reduction in the
22160 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65   amount.** of re
22170 71 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a  quired I/O for j
22180 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65  ournaling, since
22190 20 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e   a lot of paddin
221a0 67 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e  g is eliminated.
221b0 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c  .**  Hence, whil
221c0 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  e POWERSAFE_OVER
221d0 57 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64  WRITE is on by d
221e0 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73  efault, there is
221f0 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a   a file-control.
22200 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ** available to 
22210 74 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20  turn it off and 
22220 55 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65  URI query parame
22230 74 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ter available to
22240 20 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f   turn it off..*/
22250 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
22260 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
22270 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
22280 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
22290 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
222a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 74 44  File*)id;.  setD
222b0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
222c0 74 69 63 73 28 70 46 64 29 3b 0a 20 20 72 65 74  tics(pFd);.  ret
222d0 75 72 6e 20 70 46 64 2d 3e 64 65 76 69 63 65 43  urn pFd->deviceC
222e0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a  haracteristics;.
222f0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
22300 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
22310 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
22320 4d 41 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a  MAP_SIZE>0../*.*
22330 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 79 73  * Return the sys
22340 74 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  tem page size..*
22350 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22360 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  on should not be
22370 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79   called directly
22380 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69   by other code i
22390 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a  n this file. .**
223a0 20 49 6e 73 74 65 61 64 2c 20 69 74 20 73 68 6f   Instead, it sho
223b0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 76 69  uld be called vi
223c0 61 20 6d 61 63 72 6f 20 6f 73 47 65 74 70 61 67  a macro osGetpag
223d0 65 73 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  esize()..*/.stat
223e0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61  ic int unixGetpa
223f0 67 65 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69  gesize(void){.#i
22400 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72  f OS_VXWORKS.  r
22410 65 74 75 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69  eturn 1024;.#eli
22420 66 20 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53  f defined(_BSD_S
22430 4f 55 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20  OURCE).  return 
22440 67 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23  getpagesize();.#
22450 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69  else.  return (i
22460 6e 74 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50  nt)sysconf(_SC_P
22470 41 47 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66  AGESIZE);.#endif
22480 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  .}..#endif /* !d
22490 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
224a0 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
224b0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
224c0 30 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  0 */..#ifndef SQ
224d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
224e0 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
224f0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e   to represent an
22500 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
22510 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  uffer.  .**.** W
22520 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72  hen multiple thr
22530 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e  eads all referen
22540 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d  ce the same wal-
22550 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65  index, each thre
22560 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77  ad.** has its ow
22570 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  n unixShm object
22580 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70  , but they all p
22590 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
225a0 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20   instance.** of 
225b0 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65  this unixShmNode
225c0 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
225d0 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77  er words, each w
225e0 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  al-index is open
225f0 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20  ed.** only once 
22600 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
22610 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e  ** Each unixShmN
22620 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  ode object is co
22630 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e  nnected to a sin
22640 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  gle unixInodeInf
22650 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20  o object..** We 
22660 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74  could coalesce t
22670 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  his object into 
22680 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62  unixInodeInfo, b
22690 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65  ut that would me
226a0 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e  an.** every open
226b0 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20   file that does 
226c0 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d  not use shared m
226d0 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20  emory (in other 
226e0 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f  words, most.** o
226f0 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64  pen files) would
22700 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61   have to carry a
22710 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61  round this extra
22720 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53   information.  S
22730 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f  o.** the unixIno
22740 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f  deInfo object co
22750 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
22760 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d   to this unixShm
22770 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61  Node object.** a
22780 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  nd the unixShmNo
22790 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  de object is cre
227a0 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e  ated only when n
227b0 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69  eeded..**.** uni
227c0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  xMutexHeld() mus
227d0 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63  t be true when c
227e0 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72  reating or destr
227f0 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62  oying.** this ob
22800 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65  ject or while re
22810 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
22820 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
22830 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ields:.**.**    
22840 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65    nRef.**.** The
22850 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
22860 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
22870 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
22880 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
22890 0a 2a 2a 20 20 20 20 20 20 68 53 68 6d 0a 2a 2a  .**      hShm.**
228a0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
228b0 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69  **.** Either uni
228c0 78 53 68 6d 4e 6f 64 65 2e 70 53 68 6d 4d 75 74  xShmNode.pShmMut
228d0 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
228e0 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  or unixShmNode.n
228f0 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e  Ref==0 and.** un
22900 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
22910 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
22920 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
22930 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
22940 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
22950 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  re..*/.struct un
22960 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e  ixShmNode {.  un
22970 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
22980 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78  ode;     /* unix
22990 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f  InodeInfo that o
229a0 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64  wns this SHM nod
229b0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
229c0 75 74 65 78 20 2a 70 53 68 6d 4d 75 74 65 78 3b  utex *pShmMutex;
229d0 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
229e0 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
229f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
22a00 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
22a10 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
22a20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
22a30 20 20 69 6e 74 20 68 53 68 6d 3b 20 20 20 20 20    int hShm;     
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22a50 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
22a60 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ptor */.  int sz
22a70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
22a80 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22a90 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
22aa0 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e  gions */.  u16 n
22ab0 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
22ac0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
22ad0 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20   array apRegion 
22ae0 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e  */.  u8 isReadon
22af0 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
22b00 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 2d  /* True if read-
22b10 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 69 73 55  only */.  u8 isU
22b20 6e 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20  nlocked;        
22b30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22b40 6e 6f 20 44 4d 53 20 6c 6f 63 6b 20 68 65 6c 64  no DMS lock held
22b50 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52   */.  char **apR
22b60 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
22b70 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70   /* Array of map
22b80 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ped shared-memor
22b90 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  y regions */.  i
22ba0 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
22bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
22bc0 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f  ber of unixShm o
22bd0 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
22be0 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69  to this */.  uni
22bf0 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20  xShm *pFirst;   
22c00 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75          /* All u
22c10 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
22c20 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
22c30 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
22c40 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c  _DEBUG.  u8 excl
22c50 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
22c60 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
22c70 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
22c80 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72  eld */.  u8 shar
22c90 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
22ca0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
22cb0 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
22cc0 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d   */.  u8 nextShm
22cd0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
22ce0 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
22cf0 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61  le unixShm.id va
22d00 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
22d10 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
22d20 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
22d30 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
22d40 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
22d50 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
22d60 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
22d70 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
22d80 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
22d90 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
22da0 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
22db0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
22dc0 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
22dd0 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
22de0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53  :.**.**    unixS
22df0 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20  hm.pShmNode.**  
22e00 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a    unixShm.id.**.
22e10 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
22e20 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
22e30 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d  te.  The unixShm
22e40 2e 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d  .pShmNode->pShmM
22e50 75 74 65 78 20 6d 75 73 74 0a 2a 2a 20 62 65 20  utex must.** be 
22e60 68 65 6c 64 20 77 68 69 6c 65 20 61 63 63 65 73  held while acces
22e70 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
22e80 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
22e90 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a  truct unixShm {.
22ea0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
22eb0 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  ShmNode;     /* 
22ec0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75  The underlying u
22ed0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
22ee0 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  t */.  unixShm *
22ef0 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
22f00 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68    /* Next unixSh
22f10 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
22f20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
22f30 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
22f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22f50 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
22f60 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2d 3e  he unixShmNode->
22f70 70 53 68 6d 4d 75 74 65 78 20 2a 2f 0a 20 20 75  pShmMutex */.  u
22f80 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
22f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
22fa0 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
22fb0 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e  on within its un
22fc0 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  ixShmNode */.  u
22fd0 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  16 sharedMask;  
22fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
22ff0 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
23000 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20  s held */.  u16 
23010 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
23020 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
23030 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
23040 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  s held */.};../*
23050 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73  .** Constants us
23060 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a  ed for locking.*
23070 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53  /.#define UNIX_S
23080 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53  HM_BASE   ((22+S
23090 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
230a0 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66  *4)         /* f
230b0 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
230c0 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53  /.#define UNIX_S
230d0 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f  HM_DMS    (UNIX_
230e0 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
230f0 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
23100 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
23110 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f  ../*.** Apply po
23120 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
23130 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73  ks for all bytes
23140 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75   from ofst throu
23150 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a  gh ofst+n-1..**.
23160 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69  ** Locks block i
23170 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78  f the mask is ex
23180 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43  actly UNIX_SHM_C
23190 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f   and are non-blo
231a0 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69  cking.** otherwi
231b0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
231c0 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  t unixShmSystemL
231d0 6f 63 6b 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  ock(.  unixFile 
231e0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  *pFile,       /*
231f0 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e   Open connection
23200 20 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65   to the WAL file
23210 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
23220 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe,          /* 
23230 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b  F_UNLCK, F_RDLCK
23240 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a  , or F_WRLCK */.
23250 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
23260 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
23270 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f  t byte of the lo
23280 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20  cking range */. 
23290 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20   int n          
232a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
232b0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
232c0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  ck */.){.  unixS
232d0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
232e0 3b 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73  ; /* Apply locks
232f0 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
23300 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
23310 65 6e 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ent */.  struct 
23320 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 20  flock f;        
23330 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76  /* The posix adv
23340 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74  isory locking st
23350 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
23360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23370 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
23380 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20  de form fcntl() 
23390 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
233a0 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  to the unixShmNo
233b0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
233c0 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
233d0 61 6c 6c 65 72 20 2a 2f 0a 20 20 70 53 68 6d 4e  aller */.  pShmN
233e0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
233f0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
23400 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
23410 65 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 73 71  e->nRef==0 || sq
23420 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
23430 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d  (pShmNode->pShmM
23440 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 53  utex) );..  /* S
23450 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65  hared locks neve
23460 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e  r span more than
23470 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61   one byte */.  a
23480 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c  ssert( n==1 || l
23490 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b  ockType!=F_RDLCK
234a0 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20   );..  /* Locks 
234b0 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
234c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   */.  assert( n>
234d0 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49 54 45 5f  =1 && n<=SQLITE_
234e0 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SHM_NLOCK );..  
234f0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53  if( pShmNode->hS
23500 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  hm>=0 ){.    /* 
23510 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
23520 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
23530 73 20 2a 2f 0a 20 20 20 20 66 2e 6c 5f 74 79 70  s */.    f.l_typ
23540 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20  e = lockType;.  
23550 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53    f.l_whence = S
23560 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c  EEK_SET;.    f.l
23570 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20  _start = ofst;. 
23580 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a     f.l_len = n;.
23590 20 20 20 20 72 63 20 3d 20 6f 73 53 65 74 50 6f      rc = osSetPo
235a0 73 69 78 41 64 76 69 73 6f 72 79 4c 6f 63 6b 28  sixAdvisoryLock(
235b0 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c 20  pShmNode->hShm, 
235c0 26 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20 20 20  &f, pFile);.    
235d0 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20  rc = (rc!=(-1)) 
235e0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
235f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
23600 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
23610 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
23620 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
23630 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
23640 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
23650 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
23660 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
23670 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f   "));.  mask = o
23680 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20  fst>31 ? 0xffff 
23690 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  : (1<<(ofst+n)) 
236a0 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
236b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
236c0 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
236d0 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
236e0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
236f0 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
23700 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
23710 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
23720 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
23730 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
23740 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
23750 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
23760 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
23770 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
23780 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
23790 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
237a0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
237b0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
237c0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
237d0 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
237e0 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
237f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
23800 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
23810 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
23820 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
23830 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
23840 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
23850 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
23860 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
23870 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
23880 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
23890 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
238a0 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
238b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
238c0 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
238d0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
238e0 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
238f0 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
23900 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
23910 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
23920 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
23930 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
23940 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
23950 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
23960 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
23970 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
23980 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
23990 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
239a0 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
239b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
239c0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
239d0 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
239e0 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
239f0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
23a00 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a  ;        .}../*.
23a10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69  ** Return the mi
23a20 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
23a30 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73  32KB shm regions
23a40 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
23a50 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74  mapped at.** a t
23a60 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ime, assuming th
23a70 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  at each mapping 
23a80 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67  must be an integ
23a90 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
23aa0 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79  he.** current sy
23ab0 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a  stem page-size..
23ac0 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74  **.** Usually, t
23ad0 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78  his is 1. The ex
23ae0 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f  ception seems to
23af0 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74   be systems that
23b00 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a   are configured.
23b10 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70  ** to use 64KB p
23b20 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63  ages - in this c
23b30 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67  ase each mapping
23b40 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c   must cover at l
23b50 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20  east two.** shm 
23b60 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  regions..*/.stat
23b70 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65  ic int unixShmRe
23b80 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29  gionPerMap(void)
23b90 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20  {.  int shmsz = 
23ba0 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20  32*1024;        
23bb0 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f      /* SHM regio
23bc0 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  n size */.  int 
23bd0 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65  pgsz = osGetpage
23be0 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73  size();   /* Sys
23bf0 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tem page size */
23c00 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73  .  assert( ((pgs
23c10 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b  z-1)&pgsz)==0 );
23c20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
23c30 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
23c40 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67  of 2 */.  if( pg
23c50 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72  sz<shmsz ) retur
23c60 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67  n 1;.  return pg
23c70 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a  sz/shmsz;.}../*.
23c80 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69  ** Purge the uni
23c90 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  xShmNodeList lis
23ca0 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
23cb0 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64   with unixShmNod
23cc0 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
23cd0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
23ce0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
23cf0 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
23d00 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
23d10 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
23d20 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
23d30 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
23d40 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
23d50 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a  Purge(unixFile *
23d60 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  pFd){.  unixShmN
23d70 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49  ode *p = pFd->pI
23d80 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
23d90 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
23da0 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69  texHeld() );.  i
23db0 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70  f( p && ALWAYS(p
23dc0 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20  ->nRef==0) ){.  
23dd0 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70    int nShmPerMap
23de0 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e   = unixShmRegion
23df0 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e  PerMap();.    in
23e00 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
23e10 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d   p->pInode==pFd-
23e20 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73  >pInode );.    s
23e30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
23e40 65 28 70 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b  e(p->pShmMutex);
23e50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23e60 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e  p->nRegion; i+=n
23e70 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20 20  ShmPerMap){.    
23e80 20 20 69 66 28 20 70 2d 3e 68 53 68 6d 3e 3d 30    if( p->hShm>=0
23e90 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75   ){.        osMu
23ea0 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e  nmap(p->apRegion
23eb0 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e  [i], p->szRegion
23ec0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23ed0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23ee0 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e  free(p->apRegion
23ef0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
23f00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
23f10 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e  free(p->apRegion
23f20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 53  );.    if( p->hS
23f30 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  hm>=0 ){.      r
23f40 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c  obust_close(pFd,
23f50 20 70 2d 3e 68 53 68 6d 2c 20 5f 5f 4c 49 4e 45   p->hShm, __LINE
23f60 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 53  __);.      p->hS
23f70 68 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  hm = -1;.    }. 
23f80 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53     p->pInode->pS
23f90 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  hmNode = 0;.    
23fa0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
23fb0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
23fc0 65 20 44 4d 53 20 6c 6f 63 6b 20 68 61 73 20 6e  e DMS lock has n
23fd0 6f 74 20 79 65 74 20 62 65 65 6e 20 74 61 6b 65  ot yet been take
23fe0 6e 20 6f 6e 20 73 68 6d 20 66 69 6c 65 20 70 53  n on shm file pS
23ff0 68 6d 4e 6f 64 65 2e 20 41 74 74 65 6d 70 74 20  hmNode. Attempt 
24000 74 6f 0a 2a 2a 20 74 61 6b 65 20 69 74 20 6e 6f  to.** take it no
24010 77 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  w. Return SQLITE
24020 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
24030 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
24040 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
24050 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  herwise..**.** I
24060 66 20 74 68 65 20 44 4d 53 20 63 61 6e 6e 6f 74  f the DMS cannot
24070 20 62 65 20 6c 6f 63 6b 65 64 20 62 65 63 61 75   be locked becau
24080 73 65 20 74 68 69 73 20 69 73 20 61 20 72 65 61  se this is a rea
24090 64 6f 6e 6c 79 5f 73 68 6d 3d 31 20 0a 2a 2a 20  donly_shm=1 .** 
240a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 6e  connection and n
240b0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
240c0 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 20  already holds a 
240d0 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  lock, return.** 
240e0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
240f0 43 41 4e 54 49 4e 49 54 20 61 6e 64 20 73 65 74  CANTINIT and set
24100 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c   pShmNode->isUnl
24110 6f 63 6b 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61 74  ocked=1..*/.stat
24120 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 53  ic int unixLockS
24130 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78  haredMemory(unix
24140 46 69 6c 65 20 2a 70 44 62 46 64 2c 20 75 6e 69  File *pDbFd, uni
24150 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
24160 64 65 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  de){.  struct fl
24170 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
24180 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24190 0a 20 20 2f 2a 20 55 73 65 20 46 5f 47 45 54 4c  .  /* Use F_GETL
241a0 4b 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  K to determine t
241b0 68 65 20 6c 6f 63 6b 73 20 6f 74 68 65 72 20 70  he locks other p
241c0 72 6f 63 65 73 73 65 73 20 61 72 65 20 68 6f 6c  rocesses are hol
241d0 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ding.  ** on the
241e0 20 44 4d 53 20 62 79 74 65 2e 20 49 66 20 69 74   DMS byte. If it
241f0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
24200 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
24210 69 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20  is holding.  ** 
24220 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
24230 68 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73  hen this process
24240 20 6d 61 79 20 61 6c 73 6f 20 74 61 6b 65 20 61   may also take a
24250 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a   SHARED lock.  *
24260 2a 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69  * and proceed wi
24270 74 68 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 2a  th opening the *
24280 2d 73 68 6d 20 66 69 6c 65 2e 20 0a 20 20 2a 2a  -shm file. .  **
24290 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f 20  .  ** Or, if no 
242a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
242b0 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c 6f 63   holding any loc
242c0 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 70 72 6f  k, then this pro
242d0 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 74 68 65  cess.  ** is the
242e0 20 66 69 72 73 74 20 74 6f 20 6f 70 65 6e 20 69   first to open i
242f0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
24300 74 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49 56  take an EXCLUSIV
24310 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
24320 2a 2a 20 44 4d 53 20 62 79 74 65 20 61 6e 64 20  ** DMS byte and 
24330 74 72 75 6e 63 61 74 65 20 74 68 65 20 2a 2d 73  truncate the *-s
24340 68 6d 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  hm file to zero 
24350 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54  bytes in size. T
24360 68 65 6e 0a 20 20 2a 2a 20 64 6f 77 6e 67 72 61  hen.  ** downgra
24370 64 65 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  de to a SHARED l
24380 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d 53 20 62  ock on the DMS b
24390 79 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  yte..  **.  ** I
243a0 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
243b0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  s is holding an 
243c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
243d0 6e 20 74 68 65 20 44 4d 53 20 62 79 74 65 2c 0a  n the DMS byte,.
243e0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
243f0 54 45 5f 42 55 53 59 20 74 6f 20 74 68 65 20 63  TE_BUSY to the c
24400 61 6c 6c 65 72 20 28 69 74 20 77 69 6c 6c 20 74  aller (it will t
24410 72 79 20 61 67 61 69 6e 29 2e 20 41 6e 20 65 61  ry again). An ea
24420 72 6c 69 65 72 0a 20 20 2a 2a 20 76 65 72 73 69  rlier.  ** versi
24430 6f 6e 20 6f 66 20 74 68 69 73 20 63 6f 64 65 20  on of this code 
24440 61 74 74 65 6d 70 74 65 64 20 74 68 65 20 53 48  attempted the SH
24450 41 52 45 44 20 6c 6f 63 6b 20 61 74 20 74 68 69  ARED lock at thi
24460 73 20 70 6f 69 6e 74 2e 20 42 75 74 0a 20 20 2a  s point. But.  *
24470 2a 20 74 68 69 73 20 69 6e 74 72 6f 64 75 63 65  * this introduce
24480 64 20 61 20 73 75 62 74 6c 65 20 72 61 63 65 20  d a subtle race 
24490 63 6f 6e 64 69 74 69 6f 6e 3a 20 69 66 20 74 68  condition: if th
244a0 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 69 6e  e process holdin
244b0 67 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45  g.  ** EXCLUSIVE
244c0 20 66 61 69 6c 65 64 20 6a 75 73 74 20 62 65 66   failed just bef
244d0 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 20 74  ore truncating t
244e0 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2c 20 74  he *-shm file, t
244f0 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70 72  hen this.  ** pr
24500 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
24510 20 61 6e 64 20 75 73 65 20 74 68 65 20 2a 2d 73   and use the *-s
24520 68 6d 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  hm file without 
24530 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 20  truncating it.. 
24540 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 2a   ** And if the *
24550 2d 73 68 6d 20 66 69 6c 65 20 68 61 73 20 62 65  -shm file has be
24560 65 6e 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  en corrupted by 
24570 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
24580 6f 72 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20 63  or.  ** system c
24590 72 61 73 68 2c 20 74 68 65 20 64 61 74 61 62 61  rash, the databa
245a0 73 65 20 69 74 73 65 6c 66 20 6d 61 79 20 61 6c  se itself may al
245b0 73 6f 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  so become corrup
245c0 74 2e 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f  t.  */.  lock.l_
245d0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
245e0 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  T;.  lock.l_star
245f0 74 20 3d 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  t = UNIX_SHM_DMS
24600 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  ;.  lock.l_len =
24610 20 31 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70   1;.  lock.l_typ
24620 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 69  e = F_WRLCK;.  i
24630 66 28 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e  f( osFcntl(pShmN
24640 6f 64 65 2d 3e 68 53 68 6d 2c 20 46 5f 47 45 54  ode->hShm, F_GET
24650 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 20  LK, &lock)!=0 ) 
24660 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
24670 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
24680 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c  }else if( lock.l
24690 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
246a0 7b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  {.    if( pShmNo
246b0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29  de->isReadonly )
246c0 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  {.      pShmNode
246d0 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 31  ->isUnlocked = 1
246e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
246f0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
24700 54 49 4e 49 54 3b 0a 20 20 20 20 7d 65 6c 73 65  TINIT;.    }else
24710 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
24720 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
24730 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55  DbFd, F_WRLCK, U
24740 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  NIX_SHM_DMS, 1);
24750 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
24760 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 6f 62 75  QLITE_OK && robu
24770 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
24780 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c 20 30 29 20  mNode->hShm, 0) 
24790 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
247a0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
247b0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
247c0 4e 2c 22 66 74 72 75 6e 63 61 74 65 22 2c 70 53  N,"ftruncate",pS
247d0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
247e0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
247f0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  }.  }else if( lo
24800 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  ck.l_type==F_WRL
24810 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  CK ){.    rc = S
24820 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
24830 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
24850 72 74 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d  rt( lock.l_type=
24860 3d 46 5f 55 4e 4c 43 4b 20 7c 7c 20 6c 6f 63 6b  =F_UNLCK || lock
24870 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
24880 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   );.    rc = uni
24890 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
248a0 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 55  DbFd, F_RDLCK, U
248b0 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  NIX_SHM_DMS, 1);
248c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
248d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
248e0 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
248f0 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
24900 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61  with open databa
24910 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20  se file pDbFd.  
24920 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75  .** This particu
24930 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  lar implementati
24940 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20  on uses mmapped 
24950 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
24960 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d   file used to im
24970 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d  plement shared-m
24980 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20  emory is in the 
24990 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a  same directory.*
249a0 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  * as the open da
249b0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
249c0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
249d0 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  e as the open da
249e0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77  tabase.** file w
249f0 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73  ith the "-shm" s
24a00 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f  uffix added.  Fo
24a10 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
24a20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
24a30 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65  ** is "/home/use
24a40 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68  r1/config.db" th
24a50 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  en the file that
24a60 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
24a70 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73  mmapped.** for s
24a80 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
24a90 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f  l be called "/ho
24aa0 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
24ab0 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a  db-shm".  .**.**
24ac0 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63   Another approac
24ad0 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66  h to is to use f
24ae0 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d  iles in /dev/shm
24af0 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20   or /dev/tmp or 
24b00 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72  an.** some other
24b10 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75   tmpfs mount. Bu
24b20 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61  t if a file in a
24b30 20 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63   different direc
24b40 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  tory.** from the
24b50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
24b60 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66  s used, then dif
24b70 66 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65  fering access pe
24b80 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20  rmissions.** or 
24b90 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74  a chroot() might
24ba0 20 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65   cause two diffe
24bb0 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f  rent processes o
24bc0 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61  n the same.** da
24bd0 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70  tabase to end up
24be0 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74   using different
24bf0 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65   files for share
24c00 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d  d memory - .** m
24c10 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69  eaning that thei
24c20 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e  r memory would n
24c30 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61  ot really be sha
24c40 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a  red - resulting.
24c50 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  ** in database c
24c60 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65  orruption.  Neve
24c70 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74  rtheless, this t
24c80 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a  mpfs file usage.
24c90 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65  ** can be enable
24ca0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
24cb0 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  e using -DSQLITE
24cc0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22  _SHM_DIRECTORY="
24cd0 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20  /dev/shm".** or 
24ce0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  the equivalent. 
24cf0 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20   The use of the 
24d00 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
24d10 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
24d20 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75  e.** option resu
24d30 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  lts in an incomp
24d40 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20  atible build of 
24d50 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20  SQLite;  builds 
24d60 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61  of SQLite.** tha
24d70 74 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67  t with differing
24d80 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
24d90 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61  CTORY settings a
24da0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68  ttempt to use th
24db0 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61  e.** same databa
24dc0 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
24dd0 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61  ame time, databa
24de0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  se corruption wi
24df0 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
24e00 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f  ult. The SQLITE_
24e10 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
24e20 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
24e30 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a  n is considered.
24e40 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22  ** "unsupported"
24e50 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79   and may go away
24e60 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c   in a future SQL
24e70 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a  ite release..**.
24e80 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
24e90 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
24ea0 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
24eb0 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
24ec0 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
24ed0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
24ee0 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
24ef0 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
24f00 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
24f10 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
24f20 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
24f30 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
24f40 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
24f50 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  cleared..**.** I
24f60 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
24f70 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44  atabase file (pD
24f80 62 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68  bFd) is using th
24f90 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46  e "unix-excl" VF
24fa0 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20  S.** that means 
24fb0 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76  that an exclusiv
24fc0 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  e lock is held o
24fd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24fe0 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20  ile and.** that 
24ff0 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
25000 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  es are able to r
25010 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
25020 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a   database.  In.*
25030 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20  * that case, we 
25040 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65  do not really ne
25050 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ed shared memory
25060 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d  .  No shared mem
25070 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63  ory.** file is c
25080 72 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61  reated.  The sha
25090 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
250a0 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74  be simulated wit
250b0 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a  h heap memory..*
250c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
250d0 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
250e0 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46  y(unixFile *pDbF
250f0 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  d){.  struct uni
25100 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20  xShm *p = 0;    
25110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
25120 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
25130 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
25140 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
25150 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65  hmNode;   /* The
25160 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
25170 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
25180 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
251a0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
251b0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
251c0 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20  *pInode;        
251d0 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f    /* The inode o
251e0 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  f fd */.  char *
251f0 7a 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  zShm;           
25200 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
25210 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53   file used for S
25220 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d  HM */.  int nShm
25230 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
25240 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
25250 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e  of the SHM filen
25260 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
25270 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
25280 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
25290 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e   unixShm object.
252a0 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
252b0 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
252c0 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
252d0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
252e0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
252f0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
25300 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61  sizeof(*p));.  a
25310 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53  ssert( pDbFd->pS
25320 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  hm==0 );..  /* C
25330 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
25340 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
25350 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  ect already exis
25360 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69  ts. Reuse an exi
25370 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69  sting.  ** one i
25380 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74  f present. Creat
25390 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
253a0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
253b0 20 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c   assert( unixFil
253c0 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 44  eMutexNotheld(pD
253d0 62 46 64 29 20 29 3b 0a 20 20 75 6e 69 78 45 6e  bFd) );.  unixEn
253e0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
253f0 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
25400 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  node;.  pShmNode
25410 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e   = pInode->pShmN
25420 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  ode;.  if( pShmN
25430 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ode==0 ){.    st
25440 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f   /* fstat() info
25470 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69   for database fi
25480 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le */.#ifndef SQ
25490 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
254a0 52 59 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  RY.    const cha
254b0 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d 20 70  r *zBasePath = p
254c0 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e  DbFd->zPath;.#en
254d0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  dif..    /* Call
254e0 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75   fstat() to figu
254f0 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69  re out the permi
25500 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61  ssions on the da
25510 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
25520 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73      ** a new *-s
25530 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  hm file is creat
25540 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77  ed, an attempt w
25550 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63  ill be made to c
25560 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20  reate it.    ** 
25570 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 65  with the same pe
25580 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a  rmissions..    *
25590 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
255a0 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74  t(pDbFd->h, &sSt
255b0 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  at) ){.      rc 
255c0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  = SQLITE_IOERR_F
255d0 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  STAT;.      goto
255e0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
255f0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
25600 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
25610 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  Y.    nShmFilena
25620 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49  me = sizeof(SQLI
25630 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
25640 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20  ) + 31;.#else.  
25650 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    nShmFilename =
25660 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e   6 + (int)strlen
25670 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e  (zBasePath);.#en
25680 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
25690 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
256a0 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  c64( sizeof(*pSh
256b0 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c  mNode) + nShmFil
256c0 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28  ename );.    if(
256d0 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
256e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
256f0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
25700 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
25710 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
25720 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
25730 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
25740 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e  mNode)+nShmFilen
25750 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 20 3d  ame);.    zShm =
25760 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
25770 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
25780 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64  ShmNode[1];.#ifd
25790 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
257a0 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69  RECTORY.    sqli
257b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
257c0 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c  mFilename, zShm,
257d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
257e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48         SQLITE_SH
257f0 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71  M_DIRECTORY "/sq
25800 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c  lite-shm-%x-%x",
25810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25820 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74        (u32)sStat
25830 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53  .st_ino, (u32)sS
25840 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c  tat.st_dev);.#el
25850 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  se.    sqlite3_s
25860 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
25870 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 22 25 73 2d  name, zShm, "%s-
25880 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74 68 29  shm", zBasePath)
25890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
258a0 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
258b0 7a 50 61 74 68 2c 20 7a 53 68 6d 29 3b 0a 23 65  zPath, zShm);.#e
258c0 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
258d0 65 2d 3e 68 53 68 6d 20 3d 20 2d 31 3b 0a 20 20  e->hShm = -1;.  
258e0 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
258f0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
25900 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
25910 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
25920 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
25930 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
25940 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
25950 65 78 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d  ex ){.      pShm
25960 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 20  Node->pShmMutex 
25970 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
25980 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
25990 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
259a0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 53  if( pShmNode->pS
259b0 68 6d 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  hmMutex==0 ){.  
259c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
259d0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
259e0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
259f0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  pen_err;.      }
25a00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
25a10 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
25a20 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
25a30 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
25a40 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46  uri_boolean(pDbF
25a50 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f  d->zPath, "reado
25a60 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a  nly_shm", 0) ){.
25a70 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
25a80 2d 3e 68 53 68 6d 20 3d 20 72 6f 62 75 73 74 5f  ->hShm = robust_
25a90 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 57  open(zShm, O_RDW
25aa0 52 7c 4f 5f 43 52 45 41 54 2c 28 73 53 74 61 74  R|O_CREAT,(sStat
25ab0 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b  .st_mode&0777));
25ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25ad0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68  f( pShmNode->hSh
25ae0 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  m<0 ){.        p
25af0 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 20 3d 20  ShmNode->hShm = 
25b00 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
25b10 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 28 73 53 74  , O_RDONLY, (sSt
25b20 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  at.st_mode&0777)
25b30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
25b40 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3c 30 20  ShmNode->hShm<0 
25b50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
25b60 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
25b70 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
25b80 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68  KPT, "open", zSh
25b90 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  m);.          go
25ba0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
25bb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25bc0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52     pShmNode->isR
25bd0 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadonly = 1;.   
25be0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
25bf0 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  f this process i
25c00 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  s running as roo
25c10 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  t, make sure tha
25c20 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20  t the SHM file. 
25c30 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64       ** is owned
25c40 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65   by the same use
25c50 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20  r that owns the 
25c60 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
25c70 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  e.  Otherwise,. 
25c80 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
25c90 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20  inal owner will 
25ca0 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63  not be able to c
25cb0 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f  onnect..      */
25cc0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68  .      robustFch
25cd0 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53  own(pShmNode->hS
25ce0 68 6d 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64  hm, sStat.st_uid
25cf0 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b  , sStat.st_gid);
25d00 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  ..      rc = uni
25d10 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72  xLockSharedMemor
25d20 79 28 70 44 62 46 64 2c 20 70 53 68 6d 4e 6f 64  y(pDbFd, pShmNod
25d30 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
25d40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
25d50 63 21 3d 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  c!=SQLITE_READON
25d60 4c 59 5f 43 41 4e 54 49 4e 49 54 20 29 20 67 6f  LY_CANTINIT ) go
25d70 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
25d80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
25d90 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f   Make the new co
25da0 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64  nnection a child
25db0 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   of the unixShmN
25dc0 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
25dd0 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
25de0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25df0 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70  EBUG.  p->id = p
25e00 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
25e10 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
25e20 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
25e30 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
25e40 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d   p;.  unixLeaveM
25e50 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
25e60 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
25e70 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
25e80 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
25e90 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
25ea0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
25eb0 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  of the unixEnter
25ec0 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
25ed0 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
25ee0 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
25ef0 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29  (struct unixShm)
25f00 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
25f10 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
25f20 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
25f30 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
25f40 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
25f50 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
25f60 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
25f70 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
25f80 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
25f90 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
25fa0 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
25fb0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 70 53 68  ing the.  ** pSh
25fc0 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78  mNode->pShmMutex
25fd0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
25fe0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
25ff0 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78  mNode->pShmMutex
26000 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
26010 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
26020 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
26030 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
26040 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
26050 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75  pShmNode->pShmMu
26060 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
26070 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  c;..  /* Jump he
26080 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
26090 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
260a0 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
260b0 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
260c0 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
260d0 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
260e0 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
260f0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
26100 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
26110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26120 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
26130 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
26140 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
26150 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
26160 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
26170 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
26180 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
26190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
261a0 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
261b0 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
261c0 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
261d0 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
261e0 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
261f0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
26200 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
26210 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
26220 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
26230 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
26240 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
26250 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
26260 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
26270 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
26280 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
26290 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
262a0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
262b0 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
262c0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
262d0 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
262e0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
262f0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
26300 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
26310 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
26320 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
26330 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
26340 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
26350 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
26360 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
26370 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
26380 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
26390 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
263a0 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
263b0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
263c0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
263d0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
263e0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
263f0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
26400 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
26410 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
26420 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
26430 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
26440 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
26450 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
26460 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
26470 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
26480 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
26490 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
264a0 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
264b0 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
264c0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
264d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
264e0 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
264f0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
26500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
26510 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
26520 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
26530 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
26540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26550 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
26560 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
26570 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
26580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
26590 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
265a0 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265c0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
265d0 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
265e0 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
265f0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
26600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
26610 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
26620 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
26630 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
26640 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
26650 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
26660 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
26670 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26680 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68  TE_OK;.  int nSh
26690 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68  mPerMap = unixSh
266a0 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b  mRegionPerMap();
266b0 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f  .  int nReqRegio
266c0 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
266d0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
266e0 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
266f0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
26700 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66   it now. */.  if
26710 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
26720 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
26730 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
26740 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
26750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26760 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
26770 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ..  p = pDbFd->p
26780 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  Shm;.  pShmNode 
26790 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
267a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
267b0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 70  nter(pShmNode->p
267c0 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20 69 66 28  ShmMutex);.  if(
267d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c   pShmNode->isUnl
267e0 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 72 63 20  ocked ){.    rc 
267f0 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64  = unixLockShared
26800 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53  Memory(pDbFd, pS
26810 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  hmNode);.    if(
26820 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26830 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
26840 74 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  t;.    pShmNode-
26850 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b  >isUnlocked = 0;
26860 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
26870 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
26880 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
26890 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
268a0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
268b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
268c0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
268d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
268e0 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20  hmNode->hShm>=0 
268f0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
26900 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
26910 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
26920 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3c 30 20  ShmNode->hShm<0 
26930 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
26940 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
26950 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d  0 );..  /* Minim
26960 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67  um number of reg
26970 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f  ions required to
26980 20 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20   be mapped. */. 
26990 20 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20 28 28   nReqRegion = ((
269a0 69 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d  iRegion+nShmPerM
269b0 61 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70  ap) / nShmPerMap
269c0 29 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a  ) * nShmPerMap;.
269d0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
269e0 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67  >nRegion<nReqReg
269f0 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ion ){.    char 
26a00 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20  **apNew;        
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a20 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20   New apRegion[] 
26a30 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
26a40 20 6e 42 79 74 65 20 3d 20 6e 52 65 71 52 65 67   nByte = nReqReg
26a50 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20  ion*szRegion;   
26a60 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
26a70 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
26a80 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
26a90 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
26aa0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
26ab0 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20  by fstat() */.. 
26ac0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
26ad0 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
26ae0 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  ;..    if( pShmN
26af0 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b 0a  ode->hShm>=0 ){.
26b00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
26b10 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73  uested region is
26b20 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   not mapped into
26b30 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
26b40 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20  address space.. 
26b50 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f       ** Check to
26b60 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
26b70 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
26b80 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
26b90 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
26ba0 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
26bb0 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
26bc0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
26bd0 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  on)..      */.  
26be0 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
26bf0 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c 20  pShmNode->hShm, 
26c00 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
26c10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
26c20 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20  OERR_SHMSIZE;.  
26c30 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
26c40 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
26c50 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74    .      if( sSt
26c60 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65  at.st_size<nByte
26c70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
26c80 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
26c90 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
26ca0 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45  not exist. If bE
26cb0 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a  xtend is set to.
26cc0 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65          ** false
26cd0 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
26ce0 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
26cf0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
26d00 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
26d10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
26d20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b   if( !bExtend ){
26d30 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
26d40 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
26d50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
26d60 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79  /* Alternatively
26d70 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20  , if bExtend is 
26d80 74 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65  true, extend the
26d90 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62   file. Do this b
26da0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69  y.        ** wri
26db0 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79  ting a single by
26dc0 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  te to the end of
26dd0 20 65 61 63 68 20 28 4f 53 29 20 70 61 67 65 20   each (OS) page 
26de0 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  being.        **
26df0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78   allocated or ex
26e00 74 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61  tended. Technica
26e10 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c  lly, we need onl
26e20 79 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20  y write to the. 
26e30 20 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70         ** last p
26e40 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  age in order to 
26e50 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e  extend the file.
26e60 20 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20   But writing to 
26e70 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20  all new.        
26e80 2a 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73 20  ** pages forces 
26e90 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61  the OS to alloca
26ea0 74 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74  te them immediat
26eb0 65 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75 63  ely, which reduc
26ec0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  es.        ** th
26ed0 65 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47  e chances of SIG
26ee0 42 55 53 20 77 68 69 6c 65 20 61 63 63 65 73 73  BUS while access
26ef0 69 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20 72  ing the mapped r
26f00 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a  egion later on..
26f10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26f20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20     else{.       
26f30 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
26f40 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b  int pgsz = 4096;
26f50 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
26f60 50 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  Pg;..          /
26f70 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c  * Write to the l
26f80 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68  ast byte of each
26f90 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
26fa0 20 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61 67   or extended pag
26fb0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  e */.          a
26fc0 73 73 65 72 74 28 20 28 6e 42 79 74 65 20 25 20  ssert( (nByte % 
26fd0 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20  pgsz)==0 );.    
26fe0 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73        for(iPg=(s
26ff0 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73  Stat.st_size/pgs
27000 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70  z); iPg<(nByte/p
27010 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  gsz); iPg++){.  
27020 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20            int x 
27030 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
27040 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74   if( seekAndWrit
27050 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53  eFd(pShmNode->hS
27060 68 6d 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70  hm, iPg*pgsz + p
27070 67 73 7a 2d 31 2c 22 22 2c 31 2c 26 78 29 21 3d  gsz-1,"",1,&x)!=
27080 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
27090 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
270a0 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  File = pShmNode-
270b0 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20  >zFilename;.    
270c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
270d0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
270e0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
270f0 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65  , "write", zFile
27100 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
27110 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
27120 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
27130 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27150 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
27160 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
27170 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
27180 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
27190 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
271a0 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
271b0 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
271c0 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
271d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
271e0 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a  ion, nReqRegion*
271f0 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20  sizeof(char *). 
27200 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
27210 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
27220 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
27230 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
27240 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
27250 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
27260 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
27270 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68   = apNew;.    wh
27280 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
27290 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f  Region<nReqRegio
272a0 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n ){.      int n
272b0 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e  Map = szRegion*n
272c0 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 20  ShmPerMap;.     
272d0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76 6f   int i;.      vo
272e0 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20  id *pMem;.      
272f0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53  if( pShmNode->hS
27300 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  hm>=0 ){.       
27310 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30   pMem = osMmap(0
27320 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20  , nMap,.        
27330 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
27340 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f  Readonly ? PROT_
27350 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44  READ : PROT_READ
27360 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20  |PROT_WRITE, .  
27370 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48            MAP_SH
27380 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  ARED, pShmNode->
27390 68 53 68 6d 2c 20 73 7a 52 65 67 69 6f 6e 2a 28  hShm, szRegion*(
273a0 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  i64)pShmNode->nR
273b0 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b  egion.        );
273c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
273d0 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  m==MAP_FAILED ){
273e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
273f0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
27400 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
27410 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f  , "mmap", pShmNo
27420 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
27430 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
27440 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
27450 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
27460 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  e{.        pMem 
27470 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
27480 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  64(szRegion);.  
27490 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
274a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
274b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
274c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
274d0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
274e0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
274f0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d       memset(pMem
27500 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a  , 0, szRegion);.
27510 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
27520 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65  or(i=0; i<nShmPe
27530 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rMap; i++){.    
27540 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
27550 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
27560 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28  >nRegion+i] = &(
27570 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52  (char*)pMem)[szR
27580 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20  egion*i];.      
27590 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  }.      pShmNode
275a0 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68  ->nRegion += nSh
275b0 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20  mPerMap;.    }. 
275c0 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
275d0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
275e0 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
275f0 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53   ){.    *pp = pS
27600 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
27610 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c  [iRegion];.  }el
27620 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
27630 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
27640 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
27650 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
27660 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52   ) rc = SQLITE_R
27670 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74  EADONLY;.  sqlit
27680 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
27690 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74  ShmNode->pShmMut
276a0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
276b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
276c0 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  e the lock state
276d0 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65   for a shared-me
276e0 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a  mory segment..**
276f0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
27700 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
27710 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e  etween SHAREd an
27720 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  d EXCLUSIVE lock
27730 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a  s is a little.**
27740 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65 20   different here 
27750 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20  than in posix.  
27760 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f  In xShmLock(), o
27770 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75  ne can go from u
27780 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68  nlocked.** to sh
27790 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72  ared and back or
277a0 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
277b0 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20  o exclusive and 
277c0 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d  back.  But one m
277d0 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f  ay.** not go fro
277e0 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c  m shared to excl
277f0 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78  usive or from ex
27800 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72 65  clusive to share
27810 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
27820 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20   unixShmLock(.  
27830 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
27840 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
27850 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
27860 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
27870 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f  emory */.  int o
27880 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
27890 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
278a0 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f  ock to acquire o
278b0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
278c0 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
278d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
278e0 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ber of locks to 
278f0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
27900 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
27910 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
27920 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
27930 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a   with the lock *
27940 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
27950 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
27960 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20  le*)fd;      /* 
27970 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69  Connection holdi
27980 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
27990 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
279a0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20   = pDbFd->pShm; 
279b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
279c0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
279d0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f   being locked */
279e0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20  .  unixShm *pX; 
279f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
27a10 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c  looping over all
27a20 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75   siblings */.  u
27a30 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
27a40 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
27a50 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  de;  /* The unde
27a60 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64  rlying file iNod
27a70 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
27a80 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
27a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27aa0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
27ab0 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20   u16 mask;      
27ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ad0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
27ae0 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20  f locks to take 
27af0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20  or release */.. 
27b00 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
27b10 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
27b20 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
27b30 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
27b40 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
27b50 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
27b60 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
27b70 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
27b80 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
27b90 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
27ba0 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
27bb0 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
27bc0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
27bd0 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
27be0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
27bf0 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
27c00 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
27c10 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
27c20 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
27c30 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
27c40 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
27c50 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
27c60 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
27c70 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
27c80 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
27c90 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
27ca0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
27cb0 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20 20  LUSIVE)!=0 );.  
27cc0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
27cd0 2d 3e 68 53 68 6d 3e 3d 30 20 7c 7c 20 70 44 62  ->hShm>=0 || pDb
27ce0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
27cf0 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
27d00 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
27d10 65 2d 3e 68 53 68 6d 3c 30 20 7c 7c 20 70 44 62  e->hShm<0 || pDb
27d20 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
27d30 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
27d40 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
27d50 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
27d60 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  t);.  assert( n>
27d70 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
27d80 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
27d90 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
27da0 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65  hmNode->pShmMute
27db0 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
27dc0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
27dd0 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
27de0 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
27df0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
27e00 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
27e10 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
27e20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
27e30 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
27e40 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
27e50 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
27e60 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
27e70 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
27e80 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
27e90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
27ea0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
27eb0 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
27ec0 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
27ed0 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
27ee0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
27ef0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
27f00 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
27f10 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
27f20 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
27f30 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
27f40 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
27f50 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
27f60 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  Fd, F_UNLCK, ofs
27f70 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
27f80 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
27f90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27fa0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
27fb0 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
27fc0 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
27fd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27fe0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
27ff0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
28000 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
28010 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
28020 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
28030 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
28040 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
28050 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
28060 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
28070 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
28080 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
28090 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
280a0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
280b0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
280c0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
280d0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
280e0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
280f0 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
28100 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
28110 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
28120 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
28130 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
28140 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
28150 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
28160 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
28170 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
28180 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
28190 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
281a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
281b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
281c0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
281d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
281e0 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
281f0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
28200 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
28210 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
28220 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
28230 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
28240 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
28260 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
28270 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
28280 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
28290 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
282a0 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
282b0 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
282c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
282d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
282e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
282f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
28300 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
28310 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
28320 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28330 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
28340 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
28350 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
28360 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
28370 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
28380 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
28390 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
283a0 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
283b0 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
283c0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
283d0 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
283e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
283f0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
28400 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
28410 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
28420 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
28430 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
28440 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
28450 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
28460 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28470 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
28480 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
28490 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
284a0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
284b0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
284c0 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
284d0 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
284e0 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
284f0 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
28500 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
28510 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
28520 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28530 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
28540 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
28550 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
28560 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
28570 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
28580 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28590 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
285a0 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
285b0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
285c0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
285d0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
285e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
285f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
28600 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
28610 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20 4f  >pShmMutex);.  O
28620 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
28630 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
28640 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
28650 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28660 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69 64 28  p->id, osGetpid(
28670 30 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  0), p->sharedMas
28680 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29  k, p->exclMask))
28690 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
286a0 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
286b0 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
286c0 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
286d0 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
286e0 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ory.  .**.** All
286f0 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65   loads and store
28700 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74  s begun before t
28710 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20  he barrier must 
28720 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a  complete before.
28730 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73  ** any load or s
28740 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72  tore begun after
28750 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f   the barrier..*/
28760 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
28770 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73  xShmBarrier(.  s
28780 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
287a0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
287b0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
287c0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
287d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
287e0 45 52 28 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  ER(fd);.  sqlite
287f0 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29  3MemoryBarrier()
28800 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d  ;         /* com
28810 70 69 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d 65  piler-defined me
28820 6d 6f 72 79 20 62 61 72 72 69 65 72 20 2a 2f 0a  mory barrier */.
28830 20 20 61 73 73 65 72 74 28 20 66 64 2d 3e 70 4d    assert( fd->pM
28840 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 3d 3d 6e  ethods->xLock==n
28850 6f 6c 6f 63 6b 4c 6f 63 6b 20 0a 20 20 20 20 20  olockLock .     
28860 20 20 7c 7c 20 75 6e 69 78 46 69 6c 65 4d 75 74    || unixFileMut
28870 65 78 4e 6f 74 68 65 6c 64 28 28 75 6e 69 78 46  exNotheld((unixF
28880 69 6c 65 2a 29 66 64 29 20 0a 20 20 29 3b 0a 20  ile*)fd) .  );. 
28890 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
288a0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
288b0 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20   /* Also mutex, 
288c0 66 6f 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a  for redundancy *
288d0 2f 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  /.  unixLeaveMut
288e0 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ex();.}../*.** C
288f0 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
28900 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
28910 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
28920 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
28930 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
28940 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Flag is true..**
28950 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
28960 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  no shared memory
28970 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
28980 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
28990 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
289a0 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
289b0 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ss no-op..*/.sta
289c0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55  tic int unixShmU
289d0 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
289e0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
289f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
28a00 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
28a10 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
28a20 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a40 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65  Delete shared-me
28a50 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a  mory if true */.
28a60 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  ){.  unixShm *p;
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a80 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
28a90 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
28aa0 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  sed */.  unixShm
28ab0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
28ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28ad0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
28ae0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
28af0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b  .  unixShm **pp;
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
28b20 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
28b30 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
28b40 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b  unixFile *pDbFd;
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
28b70 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
28b80 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75  */..  pDbFd = (u
28b90 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  nixFile*)fd;.  p
28ba0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
28bb0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
28bc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28bd0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
28be0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  ShmNode;..  asse
28bf0 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
28c00 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
28c10 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
28c20 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
28c30 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
28c40 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  de );..  /* Remo
28c50 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
28c60 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
28c70 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
28c80 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
28c90 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
28ca0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
28cb0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68  er(pShmNode->pSh
28cc0 6d 4d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  mMutex);.  for(p
28cd0 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
28ce0 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
28cf0 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
28d00 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
28d10 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
28d20 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
28d30 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
28d40 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
28d50 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
28d60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
28d70 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d  e(pShmNode->pShm
28d80 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  Mutex);..  /* If
28d90 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
28da0 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
28db0 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
28dc0 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
28dd0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
28de0 2c 20 74 6f 6f 20 2a 2f 0a 20 20 61 73 73 65 72  , too */.  asser
28df0 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78  t( unixFileMutex
28e00 4e 6f 74 68 65 6c 64 28 70 44 62 46 64 29 20 29  Notheld(pDbFd) )
28e10 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
28e20 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
28e30 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30  pShmNode->nRef>0
28e40 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   );.  pShmNode->
28e50 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53  nRef--;.  if( pS
28e60 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
28e70 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74  ){.    if( delet
28e80 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64  eFlag && pShmNod
28e90 65 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20  e->hShm>=0 ){.  
28ea0 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68      osUnlink(pSh
28eb0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
28ec0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69  );.    }.    uni
28ed0 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
28ee0 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
28ef0 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
28f00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28f10 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ...#else.# defin
28f20 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20  e unixShmMap    
28f30 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
28f40 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
28f50 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72  efine unixShmBar
28f60 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
28f70 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30  unixShmUnmap   0
28f80 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
28f90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
28fa0 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54  AL */..#if SQLIT
28fb0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
28fc0 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  0./*.** If it is
28fd0 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72   currently memor
28fe0 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70 20  y mapped, unmap 
28ff0 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61  file pFd..*/.sta
29000 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d  tic void unixUnm
29010 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
29020 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74 28  *pFd){.  assert(
29030 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
29040 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d  =0 );.  if( pFd-
29050 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20  >pMapRegion ){. 
29060 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64 2d     osMunmap(pFd-
29070 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46 64  >pMapRegion, pFd
29080 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
29090 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70  );.    pFd->pMap
290a0 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20  Region = 0;.    
290b0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
290c0 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  0;.    pFd->mmap
290d0 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a  SizeActual = 0;.
290e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
290f0 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20  empt to set the 
29100 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  size of the memo
29110 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e 74  ry mapping maint
29120 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a 2a  ained by file .*
29130 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 64  * descriptor pFd
29140 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e 20   to nNew bytes. 
29150 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70  Any existing map
29160 70 69 6e 67 20 69 73 20 64 69 73 63 61 72 64 65  ping is discarde
29170 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
29180 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e  essful, this fun
29190 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 66  ction sets the f
291a0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
291b0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
291c0 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65 67  unixFile.pMapReg
291d0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69  ion.**       uni
291e0 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a  xFile.mmapSize.*
291f0 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  *       unixFile
29200 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 0a  .mmapSizeActual.
29210 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63 65  **.** If unsucce
29220 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72 20  ssful, an error 
29230 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67 65  message is logge
29240 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f  d via sqlite3_lo
29250 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74  g() and.** the t
29260 68 72 65 65 20 76 61 72 69 61 62 6c 65 73 20 61  hree variables a
29270 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  bove are zeroed.
29280 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 53 51   In this case SQ
29290 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 63  Lite should.** c
292a0 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69 6e  ontinue accessin
292b0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  g the database u
292c0 73 69 6e 67 20 74 68 65 20 78 52 65 61 64 28 29  sing the xRead()
292d0 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a 2a   and xWrite().**
292e0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
292f0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65 6d  tic void unixRem
29300 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46 69  apfile(.  unixFi
29310 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20 20  le *pFd,        
29320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
29330 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62 6a  e descriptor obj
29340 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65  ect */.  i64 nNe
29350 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
29360 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
29370 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69 7a  ired mapping siz
29380 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
29390 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d 6d  char *zErr = "mm
293a0 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20 70  ap";.  int h = p
293b0 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20 20  Fd->h;          
293c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
293d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
293e0 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20 2a  pen on db file *
293f0 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d 20  /.  u8 *pOrig = 
29400 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
29410 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e  egion;   /* Poin
29420 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 66  ter to current f
29430 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20  ile mapping */. 
29440 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46 64   i64 nOrig = pFd
29450 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
29460 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
29470 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69 6e   pOrig region in
29480 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a   bytes */.  u8 *
29490 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  pNew = 0;       
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294b0 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20   /* Location of 
294c0 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20  new mapping */. 
294d0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52 4f   int flags = PRO
294e0 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20 20  T_READ;         
294f0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
29500 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28 29  o pass to mmap()
29510 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
29520 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
29530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
29540 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ew>pFd->mmapSize
29550 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
29560 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ew<=pFd->mmapSiz
29570 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65 72 74  eMax );.  assert
29580 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61 73  ( nNew>0 );.  as
29590 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70 53  sert( pFd->mmapS
295a0 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d 3e  izeActual>=pFd->
295b0 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73  mmapSize );.  as
295c0 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c 45 44  sert( MAP_FAILED
295d0 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  !=0 );..#ifdef S
295e0 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57  QLITE_MMAP_READW
295f0 52 49 54 45 0a 20 20 69 66 28 20 28 70 46 64 2d  RITE.  if( (pFd-
29600 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
29610 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30  XFILE_RDONLY)==0
29620 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54   ) flags |= PROT
29630 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 0a  _WRITE;.#endif..
29640 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23    if( pOrig ){.#
29650 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
29660 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20     i64 nReuse = 
29670 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23  pFd->mmapSize;.#
29680 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
29690 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f  nt szSyspage = o
296a0 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a  sGetpagesize();.
296b0 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d      i64 nReuse =
296c0 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20   (pFd->mmapSize 
296d0 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29  & ~(szSyspage-1)
296e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38  );.#endif.    u8
296f0 20 2a 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b   *pReq = &pOrig[
29700 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a  nReuse];..    /*
29710 20 55 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73   Unmap any pages
29720 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67   of the existing
29730 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 63 61   mapping that ca
29740 6e 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20  nnot be reused. 
29750 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73  */.    if( nReus
29760 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  e!=nOrig ){.    
29770 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c    osMunmap(pReq,
29780 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a   nOrig-nReuse);.
29790 20 20 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f      }..#if HAVE_
297a0 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20  MREMAP.    pNew 
297b0 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67  = osMremap(pOrig
297c0 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20  , nReuse, nNew, 
297d0 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b  MREMAP_MAYMOVE);
297e0 0a 20 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65  .    zErr = "mre
297f0 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20  map";.#else.    
29800 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52  pNew = osMmap(pR
29810 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c  eq, nNew-nReuse,
29820 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52   flags, MAP_SHAR
29830 45 44 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a  ED, h, nReuse);.
29840 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41      if( pNew!=MA
29850 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
29860 20 20 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71    if( pNew!=pReq
29870 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75   ){.        osMu
29880 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20  nmap(pNew, nNew 
29890 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20  - nReuse);.     
298a0 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
298b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
298c0 20 20 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a    pNew = pOrig;.
298d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
298e0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
298f0 20 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65   attempt to exte
29900 6e 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  nd the existing 
29910 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20  mapping failed. 
29920 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  Free it. */.    
29930 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41  if( pNew==MAP_FA
29940 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20  ILED || pNew==0 
29950 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  ){.      osMunma
29960 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29  p(pOrig, nReuse)
29970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
29980 2a 20 49 66 20 70 4e 65 77 20 69 73 20 73 74 69  * If pNew is sti
29990 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20  ll NULL, try to 
299a0 63 72 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65  create an entire
299b0 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20  ly new mapping. 
299c0 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
299d0 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f   ){.    pNew = o
299e0 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66  sMmap(0, nNew, f
299f0 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44  lags, MAP_SHARED
29a00 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , h, 0);.  }..  
29a10 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41  if( pNew==MAP_FA
29a20 49 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77  ILED ){.    pNew
29a30 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d   = 0;.    nNew =
29a40 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45   0;.    unixLogE
29a50 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20  rror(SQLITE_OK, 
29a60 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68  zErr, pFd->zPath
29a70 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
29a80 65 20 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66  e mmap() above f
29a90 61 69 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ailed, assume th
29aa0 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  at all subsequen
29ab0 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20  t mmap() calls. 
29ac0 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61     ** will proba
29ad0 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61  bly fail too. Fa
29ae0 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67  ll back to using
29af0 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 65 78   xRead/xWrite ex
29b00 63 6c 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a  clusively.    **
29b10 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
29b20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  */.    pFd->mmap
29b30 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d  SizeMax = 0;.  }
29b40 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  .  pFd->pMapRegi
29b50 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65  on = (void *)pNe
29b60 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  w;.  pFd->mmapSi
29b70 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ze = pFd->mmapSi
29b80 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b  zeActual = nNew;
29b90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79  .}../*.** Memory
29ba0 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68   map or remap th
29bb0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  e file opened by
29bc0 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
29bd0 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c   pFd (if the fil
29be0 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20  e.** is already 
29bf0 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73  mapped, the exis
29c00 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
29c10 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
29c20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a  new). Or, if .**
29c30 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
29c40 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
29c50 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
29c60 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
29c70 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69  ll .** outstandi
29c80 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65  ng xFetch() refe
29c90 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68  rences to it, th
29ca0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
29cb0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
29cc0 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65   parameter nByte
29cd0 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
29ce0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
29cf0 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
29d00 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69  of .** the mappi
29d10 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74  ng to create. Ot
29d20 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74  herwise, if nByt
29d30 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
29d40 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ero, then the .*
29d50 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
29d60 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
29d70 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
29d80 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
29d90 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
29da0 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
29db0 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
29dc0 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
29dd0 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
29de0 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54   .** using SQLIT
29df0 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d  E_FCNTL_MMAP_LIM
29e00 49 54 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  IT, whichever is
29e10 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   smaller..**.** 
29e20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
29e30 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
29e40 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69  r occurs (even i
29e50 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  f the mapping is
29e60 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65   not.** recreate
29e70 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  d as a result of
29e80 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
29e90 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53  erences) or an S
29ea0 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
29eb0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
29ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
29ed0 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  xMapfile(unixFil
29ee0 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 4d 61 70  e *pFd, i64 nMap
29ef0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ){.  assert( nMa
29f00 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
29f10 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61  tchOut==0 );.  a
29f20 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c  ssert( nMap>0 ||
29f30 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d   (pFd->mmapSize=
29f40 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70 52  =0 && pFd->pMapR
29f50 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69  egion==0) );.  i
29f60 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  f( pFd->nFetchOu
29f70 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
29f80 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e  ITE_OK;..  if( n
29f90 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72  Map<0 ){.    str
29fa0 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
29fb0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
29fc0 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66  w-level file inf
29fd0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
29fe0 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 64 2d  if( osFstat(pFd-
29ff0 3e 68 2c 20 26 73 74 61 74 62 75 66 29 20 29 7b  >h, &statbuf) ){
2a000 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2a010 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
2a020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70  ;.    }.    nMap
2a030 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69   = statbuf.st_si
2a040 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  ze;.  }.  if( nM
2a050 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
2a060 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
2a070 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
2a080 61 78 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ax;.  }..  asser
2a090 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46  t( nMap>0 || (pF
2a0a0 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26  d->mmapSize==0 &
2a0b0 26 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  & pFd->pMapRegio
2a0c0 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 6e  n==0) );.  if( n
2a0d0 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  Map!=pFd->mmapSi
2a0e0 7a 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 52 65  ze ){.    unixRe
2a0f0 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d 61  mapfile(pFd, nMa
2a100 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  p);.  }..  retur
2a110 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2a120 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2a130 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
2a140 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
2a150 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
2a160 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
2a170 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
2a180 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
2a190 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
2a1a0 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
2a1b0 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
2a1c0 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
2a1d0 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
2a1e0 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
2a1f0 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
2a200 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
2a210 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
2a220 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
2a230 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
2a240 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
2a250 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
2a260 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
2a270 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
2a280 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
2a290 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
2a2a0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
2a2b0 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
2a2c0 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
2a2d0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
2a2e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
2a2f0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
2a300 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
2a310 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
2a320 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
2a330 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
2a340 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75  nce by calling u
2a350 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f  nixUnfetch()..*/
2a360 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2a370 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
2a380 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
2a390 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
2a3a0 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
2a3b0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2a3c0 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
2a3d0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
2a3e0 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
2a3f0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
2a400 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
2a410 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66  .  *pp = 0;..#if
2a420 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
2a430 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
2a440 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  d->mmapSizeMax>0
2a450 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d   ){.    if( pFd-
2a460 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  >pMapRegion==0 )
2a470 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
2a480 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64   unixMapfile(pFd
2a490 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  , -1);.      if(
2a4a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a4b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a4c0 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
2a4d0 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
2a4e0 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
2a4f0 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
2a500 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
2a510 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
2a520 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
2a530 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
2a540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
2a560 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
2a570 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
2a580 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2a590 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
2a5a0 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
2a5b0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
2a5c0 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63  call to unixFetc
2a5d0 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
2a5e0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
2a5f0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
2a600 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
2a610 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
2a620 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
2a630 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
2a640 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69  assed to the uni
2a650 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  xFetch() invocat
2a660 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ion. .**.** Or, 
2a670 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  if the third arg
2a680 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
2a690 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2a6a0 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
2a6b0 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  d .** to inform 
2a6c0 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
2a6d0 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
2a6e0 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
2a6f0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a  ting mapping .**
2a700 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61   may now be inva
2a710 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
2a720 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73  e unmapped..*/.s
2a730 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
2a740 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  fetch(sqlite3_fi
2a750 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
2a760 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20  , void *p){.#if 
2a770 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
2a780 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c  SIZE>0.  unixFil
2a790 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
2a7a0 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  le *)fd;   /* Th
2a7b0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
2a7c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2a7d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a7e0 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66  (iOff);..  /* If
2a7f0 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
2a800 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
2a810 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
2a820 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2a830 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
2a840 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
2a850 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
2a860 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
2a870 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
2a880 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
2a890 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
2a8a0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
2a8b0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
2a8c0 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
2a8d0 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
2a8e0 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
2a8f0 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
2a900 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
2a910 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
2a920 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
2a930 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
2a940 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2a950 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
2a960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
2a970 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  nixUnmapfile(pFd
2a980 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
2a990 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
2a9a0 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55  >=0 );.#else.  U
2a9b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a9c0 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
2a9d0 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e  RAMETER(p);.  UN
2a9e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
2a9f0 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  Off);.#endif.  r
2aa00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2aa10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
2aa20 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
2aa30 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
2aa40 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
2aa50 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
2aa60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
2aa70 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
2aa80 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
2aa90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aaa0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2aab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aaf0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
2ab00 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
2ab10 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
2ab20 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
2ab30 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
2ab40 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
2ab50 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
2ab60 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
2ab70 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
2ab80 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
2ab90 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
2aba0 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
2abb0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
2abc0 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
2abd0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
2abe0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2abf0 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
2ac00 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
2ac10 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
2ac20 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
2ac30 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
2ac40 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
2ac50 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
2ac60 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
2ac70 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
2ac80 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
2ac90 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
2aca0 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
2acb0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
2acc0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
2acd0 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
2ace0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
2acf0 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
2ad00 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
2ad10 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
2ad20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2ad30 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
2ad40 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
2ad50 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
2ad60 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
2ad70 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
2ad80 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
2ad90 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
2ada0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20  der-function F, 
2adb0 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20  two objects are 
2adc0 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
2add0 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66    (1) The real f
2ade0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e  inder-function n
2adf0 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a  amed "FImpt()"..
2ae00 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63  **.**    (2) A c
2ae10 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20  onstant pointer 
2ae20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2ae30 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e   named just "F".
2ae40 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .**.**.** A poin
2ae50 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69  ter to the F poi
2ae60 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20  nter is used as 
2ae70 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c  the pAppData val
2ae80 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62  ue for VFS.** ob
2ae90 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20  jects.  We have 
2aea0 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65  to do this inste
2aeb0 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41  ad of letting pA
2aec0 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20  ppData point.** 
2aed0 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20  directly at the 
2aee0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
2aef0 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20  since C90 rules 
2af00 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a  prevent a void*.
2af10 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20  ** from be cast 
2af20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  into a function 
2af30 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a  pointer..**.**.*
2af40 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
2af50 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
2af60 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
2af70 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
2af80 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
2af90 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2afa0 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
2afb0 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
2afc0 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
2afd0 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
2afe0 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
2aff0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
2b000 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
2b010 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
2b020 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
2b030 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
2b040 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
2b050 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
2b060 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
2b070 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
2b080 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
2b090 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e 2c  ,METHOD,VERSION,
2b0a0 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43  CLOSE,LOCK,UNLOC
2b0b0 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29  K,CKLOCK,SHMMAP)
2b0c0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
2b0d0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2b0e0 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
2b0f0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b110 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e      \.   VERSION
2b120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b130 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
2b140 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b160 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
2b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b180 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1b0 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1d0 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b200 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b220 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
2b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b250 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
2b260 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2b270 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
2b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2b2a0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2c0 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
2b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b2f0 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b310 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b330 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2b340 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
2b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b360 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
2b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b380 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b390 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b3b0 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2b3e0 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b400 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b410 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
2b420 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2b430 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
2b440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
2b450 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
2b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b470 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2b480 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
2b490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
2b4a0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2b4d0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
2b4e0 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
2b4f0 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
2b500 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2b510 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d         \.   SHMM
2b520 41 50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  AP,             
2b530 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2b540 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
2b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b560 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
2b570 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
2b580 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
2b590 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
2b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5b0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
2b5c0 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
2b5d0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
2b5e0 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rier */         
2b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b600 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
2b610 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
2b620 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
2b630 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
2b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b650 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63     \.   unixFetc
2b660 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
2b670 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
2b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6a0 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74    \.   unixUnfet
2b6b0 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
2b6c0 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
2b6d0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6f0 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20   \.};           
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b740 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
2b750 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b760 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28  s *FINDER##Impl(
2b770 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75  const char *z, u
2b780 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c  nixFile *p){   \
2b790 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b7a0 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50  TER(z); UNUSED_P
2b7b0 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20  ARAMETER(p);    
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b7e0 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44    return &METHOD
2b7f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b820 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b870 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
2b880 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2b890 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
2b8a0 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63  *const FINDER)(c
2b8b0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
2b8c0 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20  ile *p)    \.   
2b8d0 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b   = FINDER##Impl;
2b8e0 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65  ../*.** Here are
2b8f0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69   all of the sqli
2b900 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2b910 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
2b920 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  of the.** lockin
2b930 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46  g strategies.  F
2b940 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65  unctions that re
2b950 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  turn pointers to
2b960 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a   these methods.*
2b970 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74  * are also creat
2b980 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53  ed..*/.IOMETHODS
2b990 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65  (.  posixIoFinde
2b9a0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2b9b0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2b9c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78   name */.  posix
2b9d0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2b9e0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2b9f0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2ba00 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20  t name */.  3,  
2ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2ba30 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20  memory and mmap 
2ba40 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  are enabled */. 
2ba50 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
2ba60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2ba70 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2ba80 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
2ba90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2baa0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2bab0 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
2bac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2bad0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2bae0 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
2baf0 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43  edLock,    /* xC
2bb00 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2bb10 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
2bb20 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20  xShmMap         
2bb30 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
2bb40 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  p method */.).IO
2bb50 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63  METHODS(.  noloc
2bb60 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
2bb70 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2bb80 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2bb90 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64    nolockIoMethod
2bba0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  s,          /* s
2bbb0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2bbc0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2bbd0 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
2bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bbf0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e  shared memory an
2bc00 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c  d mmap are enabl
2bc10 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c  ed */.  nolockCl
2bc20 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2bc30 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2bc40 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f  od */.  nolockLo
2bc50 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2bc60 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2bc70 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c  d */.  nolockUnl
2bc80 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2bc90 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2bca0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68  od */.  nolockCh
2bcb0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2bcc0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2bcd0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2bce0 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bd00 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2bd10 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
2bd20 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65    dotlockIoFinde
2bd30 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  r,          /* F
2bd40 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2bd50 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  ame */.  dotlock
2bd60 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2bd70 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2bd80 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2bd90 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdb0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2bdc0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2bdd0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f   */.  dotlockClo
2bde0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2bdf0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2be00 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63   */.  dotlockLoc
2be10 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2be20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2be30 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  */.  dotlockUnlo
2be40 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ck,            /
2be50 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2be60 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65   */.  dotlockChe
2be70 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
2be80 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2be90 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2bea0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2beb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2bec0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2bed0 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .)..#if SQLITE_E
2bee0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2bef0 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
2bf00 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
2bf10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2bf20 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2bf30 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
2bf40 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2bf50 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2bf60 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2bf70 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
2bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf90 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2bfa0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2bfb0 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c  */.  flockClose,
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bfd0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2bfe0 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20  */.  flockLock, 
2bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c000 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2c010 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  /.  flockUnlock,
2c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c030 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2c040 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52  */.  flockCheckR
2c050 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f  eservedLock,   /
2c060 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2c070 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2c080 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
2c090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2c0a0 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
2c0b0 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
2c0c0 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
2c0d0 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
2c0e0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2c0f0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
2c100 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
2c110 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2c120 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2c130 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2c140 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
2c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c160 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
2c170 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
2c180 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c  bled */.  semXCl
2c190 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2c1a0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
2c1b0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f  thod */.  semXLo
2c1c0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2c1d0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
2c1e0 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c  hod */.  semXUnl
2c1f0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2c200 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
2c210 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68  thod */.  semXCh
2c220 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2c230 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
2c240 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
2c250 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
2c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c270 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
2c280 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
2c290 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2c2a0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2c2b0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2c2c0 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
2c2d0 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20    afpIoFinder,  
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2c2f0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2c300 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65  ame */.  afpIoMe
2c310 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2c320 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2c330 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2c340 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c360 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2c370 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2c380 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20   */.  afpClose, 
2c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3a0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2c3b0 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20   */.  afpLock,  
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3d0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2c3e0 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20  */.  afpUnlock, 
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c400 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2c410 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65   */.  afpCheckRe
2c420 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
2c430 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2c440 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2c450 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2c460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c470 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2c480 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .).#endif../*.**
2c490 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
2c4a0 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22  ng method is a "
2c4b0 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e  super-method" in
2c4c0 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
2c4d0 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f  it.** opens seco
2c4e0 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72  ndary file descr
2c4f0 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  iptors for the c
2c500 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69  onch and lock fi
2c510 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73  les and.** it us
2c520 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69  es proxy, dot-fi
2c530 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f  le, AFP, and flo
2c540 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ck() locking met
2c550 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a  hods on those.**
2c560 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73   secondary files
2c570 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
2c580 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
2c590 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2c5a0 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** proxy lockin
2c5b0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63  g is located muc
2c5c0 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69  h further down i
2c5d0 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74  n the file.  But
2c5e0 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67   we need.** to g
2c5f0 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69  o ahead and defi
2c600 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ne the sqlite3_i
2c610 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69  o_methods and fi
2c620 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  nder function.**
2c630 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
2c640 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20  ng here.  So we 
2c650 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20  forward declare 
2c660 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e  the I/O methods.
2c670 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
2c680 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2c690 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2c6a0 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
2c6b0 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28   int proxyClose(
2c6c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
2c6d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2c6e0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
2c6f0 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
2c700 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
2c710 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
2c720 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
2c730 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
2c740 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
2c750 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f  file*, int*);.IO
2c760 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79  METHODS(.  proxy
2c770 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2c780 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2c790 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2c7a0 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73    proxyIoMethods
2c7b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
2c7c0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2c7d0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2c7e0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c800 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2c810 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70   disabled */.  p
2c820 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20  roxyClose,      
2c830 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2c840 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  se method */.  p
2c850 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20  roxyLock,       
2c860 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2c870 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
2c880 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  oxyUnlock,      
2c890 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
2c8a0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
2c8b0 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
2c8c0 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65  dLock,   /* xChe
2c8d0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2c8e0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c900 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
2c910 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
2c920 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64  if../* nfs lockd
2c930 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f   on OSX 10.3+ do
2c940 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74  esn't clear writ
2c950 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72  e locks when a r
2c960 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20  ead lock is set 
2c970 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2c980 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2c990 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2c9a0 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
2c9b0 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65  DS(.  nfsIoFinde
2c9c0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2c9d0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2c9e0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66  ion name */.  nf
2c9f0 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  sIoMethods,     
2ca00 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2ca10 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2ca20 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2ca30 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
2ca40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2ca50 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2ca60 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  isabled */.  uni
2ca70 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
2ca80 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2ca90 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
2caa0 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
2cab0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2cac0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66  k method */.  nf
2cad0 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  sUnlock,        
2cae0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2caf0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2cb00 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
2cb10 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43  dLock,     /* xC
2cb20 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2cb30 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb50 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2cb60 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2cb70 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
2cb80 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2cb90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2cba0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
2cbb0 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
2cbc0 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
2cbd0 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
2cbe0 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
2cbf0 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
2cc00 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2cc10 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
2cc20 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
2cc30 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
2cc40 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
2cc50 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
2cc60 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
2cc70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
2cc80 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
2cc90 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2cca0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2ccb0 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
2ccc0 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
2ccd0 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
2cce0 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
2ccf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cd00 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2cd10 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
2cd20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
2cd30 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
2cd40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
2cd50 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2cd60 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
2cd70 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2cd80 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
2cd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2cda0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
2cdb0 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
2cdc0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2cdd0 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
2cde0 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
2cdf0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
2ce00 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
2ce10 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
2ce20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
2ce30 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
2ce40 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
2ce50 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
2ce60 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
2ce70 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
2ce80 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
2ce90 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
2cea0 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
2ceb0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2cec0 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
2ced0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2cee0 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
2cef0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
2cf00 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
2cf10 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
2cf20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
2cf30 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
2cf40 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
2cf50 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
2cf60 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
2cf70 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2cf80 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
2cf90 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
2cfa0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2cfb0 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
2cfc0 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
2cfd0 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
2cfe0 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
2cff0 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
2d000 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
2d010 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2d020 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
2d030 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
2d040 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
2d050 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
2d060 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
2d070 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
2d080 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
2d090 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
2d0a0 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
2d0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d0c0 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
2d0d0 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
2d0e0 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
2d0f0 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
2d100 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
2d110 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
2d120 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
2d130 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
2d140 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
2d150 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
2d160 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
2d170 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
2d180 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
2d190 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
2d1a0 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
2d1b0 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
2d1c0 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
2d1d0 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
2d1e0 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
2d1f0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
2d200 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
2d210 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
2d220 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
2d230 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
2d240 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
2d250 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
2d260 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
2d270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
2d280 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
2d290 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2d2a0 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
2d2b0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
2d2c0 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
2d2d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2d2e0 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
2d2f0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
2d300 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2d310 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
2d320 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
2d330 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
2d340 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2d350 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2d360 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
2d370 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
2d380 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65  *.** This "finde
2d390 72 22 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  r" function for 
2d3a0 56 78 57 6f 72 6b 73 20 63 68 65 63 6b 73 20 74  VxWorks checks t
2d3b0 6f 20 73 65 65 20 69 66 20 70 6f 73 69 78 20 61  o see if posix a
2d3c0 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69  dvisory.** locki
2d3d0 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66 20 69 74  ng works.  If it
2d3e0 20 64 6f 65 73 2c 20 74 68 65 6e 20 74 68 61 74   does, then that
2d3f0 20 69 73 20 77 68 61 74 20 69 73 20 75 73 65 64   is what is used
2d400 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
2d410 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20  t.** work, then 
2d420 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65  fallback to name
2d430 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
2d440 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
2d450 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2d460 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73  methods *vxworks
2d470 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
2d480 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
2d490 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
2d4a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d4b0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
2d4c0 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
2d4d0 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20      /* the open 
2d4e0 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  file object */.)
2d4f0 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
2d500 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
2d510 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
2d520 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
2d530 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
2d540 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
2d550 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
2d560 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
2d570 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
2d580 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
2d590 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
2d5a0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2d5b0 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69    }..  /* Test i
2d5c0 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70  f fcntl() is sup
2d5d0 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50  ported and use P
2d5e0 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
2d5f0 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
2d600 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
2d610 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
2d620 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20  e method..  */. 
2d630 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
2d640 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
2d650 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
2d660 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
2d670 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
2d680 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
2d690 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
2d6a0 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
2d6b0 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
2d6c0 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
2d6d0 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
2d6e0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
2d6f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65  {.    return &se
2d700 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  mIoMethods;.  }.
2d710 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
2d720 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2d730 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78  s .  *(*const vx
2d740 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 29 28 63  worksIoFinder)(c
2d750 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
2d760 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49  ile*) = vxworksI
2d770 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
2d780 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
2d790 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  KS */../*.** An 
2d7a0 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
2d7b0 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
2d7c0 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64  n IO method find
2d7d0 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a  er function:.*/.
2d7e0 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71  typedef const sq
2d7f0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2d800 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29   *(*finder_type)
2d810 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2d820 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a  xFile*);.../****
2d830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d870 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2d880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d890 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
2d8a0 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
2d8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d8c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
2d8d0 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
2d8e0 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
2d8f0 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
2d900 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
2d910 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
2d920 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
2d930 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lize the content
2d940 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
2d950 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
2d960 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a  ted to by pId..*
2d970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
2d980 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73  lInUnixFile(.  s
2d990 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2d9a0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
2d9b0 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
2d9c0 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20  */.  int h,     
2d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d9e0 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
2d9f0 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69  ptor of file bei
2da00 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  ng opened */.  s
2da10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
2da20 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
2da30 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
2da40 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2da50 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2da60 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
2da70 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
2da80 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
2da90 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20    int ctrlFlags 
2daa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72            /* Zer
2dab0 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49  o or more UNIXFI
2dac0 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29  LE_* values */.)
2dad0 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
2dae0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c  3_io_methods *pL
2daf0 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
2db00 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
2db10 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
2db20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2db30 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2db40 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d  ( pNew->pInode==
2db50 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  NULL );..  /* No
2db60 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20   locking occurs 
2db70 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  in temporary fil
2db80 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
2db90 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20  zFilename!=0 || 
2dba0 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2dbb0 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30  XFILE_NOLOCK)!=0
2dbc0 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
2dbd0 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
2dbe0 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
2dbf0 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
2dc00 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73   h;.  pNew->pVfs
2dc10 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d   = pVfs;.  pNew-
2dc20 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  >zPath = zFilena
2dc30 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c  me;.  pNew->ctrl
2dc40 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c  Flags = (u8)ctrl
2dc50 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54  Flags;.#if SQLIT
2dc60 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
2dc70 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69  0.  pNew->mmapSi
2dc80 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
2dc90 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
2dca0 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ap;.#endif.  if(
2dcb0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2dcc0 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73  lean(((ctrlFlags
2dcd0 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29   & UNIXFILE_URI)
2dce0 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30   ? zFilename : 0
2dcf0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
2dd10 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
2dd20 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
2dd30 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  ) ){.    pNew->c
2dd40 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2dd50 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20  FILE_PSOW;.  }. 
2dd60 20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73   if( strcmp(pVfs
2dd70 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78  ->zName,"unix-ex
2dd80 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  cl")==0 ){.    p
2dd90 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
2dda0 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b  = UNIXFILE_EXCL;
2ddb0 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
2ddc0 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
2ddd0 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
2dde0 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
2ddf0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
2de00 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46  ==0 ){.    ctrlF
2de10 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2de20 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  _NOLOCK;.    rc 
2de30 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2de40 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
2de50 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73  .  if( ctrlFlags
2de60 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f   & UNIXFILE_NOLO
2de70 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  CK ){.    pLocki
2de80 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63  ngStyle = &noloc
2de90 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  kIoMethods;.  }e
2dea0 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  lse{.    pLockin
2deb0 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e  gStyle = (**(fin
2dec0 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e  der_type*)pVfs->
2ded0 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e  pAppData)(zFilen
2dee0 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20  ame, pNew);.#if 
2def0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2df00 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
2df10 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61  /* Cache zFilena
2df20 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  me in the lockin
2df30 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61  g context (AFP a
2df40 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72  nd dotlock overr
2df50 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ide) for.    ** 
2df60 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61  proxyLock activa
2df70 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  tion is possible
2df80 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69   (remote proxy i
2df90 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61  s based on db na
2dfa0 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65  me).    ** zFile
2dfb0 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  name remains val
2dfc0 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73  id until file is
2dfd0 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70   closed, to supp
2dfe0 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ort */.    pNew-
2dff0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2e000 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61  = (void*)zFilena
2e010 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  me;.#endif.  }..
2e020 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74    if( pLockingSt
2e030 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d  yle == &posixIoM
2e040 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e  ethods.#if defin
2e050 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2e060 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2e070 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
2e080 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c   || pLockingStyl
2e090 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f  e == &nfsIoMetho
2e0a0 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  ds.#endif.  ){. 
2e0b0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2e0c0 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
2e0d0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2e0e0 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2e0f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2e100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e110 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2e120 6f 63 63 75 72 72 65 64 20 69 6e 20 66 69 6e 64  occurred in find
2e130 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f  InodeInfo(), clo
2e140 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
2e150 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20  riptor.      ** 
2e160 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66  immediately, bef
2e170 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68  ore releasing th
2e180 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f  e mutex. findIno
2e190 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69  deInfo() may fai
2e1a0 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77  l.      ** in tw
2e1b0 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20  o scenarios:.   
2e1c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
2e1d0 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66   (a) A call to f
2e1e0 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20  stat() failed.. 
2e1f0 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20       **   (b) A 
2e200 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20  malloc failed.. 
2e210 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2e220 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61   Scenario (b) ma
2e230 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  y only occur if 
2e240 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68  the process is h
2e250 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a  olding no other.
2e260 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65        ** file de
2e270 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f  scriptors open o
2e280 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e  n the same file.
2e290 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f   If there were o
2e2a0 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20  ther file.      
2e2b0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  ** descriptors o
2e2c0 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
2e2d0 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c  n no malloc woul
2e2e0 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79  d be required by
2e2f0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e  .      ** findIn
2e300 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68  odeInfo(). If th
2e310 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
2e320 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65  it is quite safe
2e330 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20   to close.      
2e340 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73  ** handle h - as
2e350 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2e360 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20  d that no posix 
2e370 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65  locks will be re
2e380 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  leased.      ** 
2e390 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20  by doing so..   
2e3a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
2e3b0 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63  f scenario (a) c
2e3c0 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20  aused the error 
2e3d0 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20  then things are 
2e3e0 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65  not so safe. The
2e3f0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63  .      ** implic
2e400 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65  it assumption he
2e410 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73  re is that if fs
2e420 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69  tat() fails, thi
2e430 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20  ngs are in.     
2e440 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61   ** such bad sha
2e450 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67  pe that dropping
2e460 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64   a lock or two d
2e470 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75  oesn't matter mu
2e480 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
2e490 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2e4a0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2e4b0 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31  _);.      h = -1
2e4c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
2e4d0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2e4e0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
2e4f0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2e500 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
2e510 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20  APPLE__).  else 
2e520 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2e530 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  e == &afpIoMetho
2e540 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50  ds ){.    /* AFP
2e550 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2e560 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2e570 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2e580 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2e590 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
2e5a0 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
2e5b0 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
2e5c0 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20  text *pCtx;.    
2e5d0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2e5e0 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71  text = pCtx = sq
2e5f0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
2e600 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
2e610 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30  .    if( pCtx==0
2e620 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2e630 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2e640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e650 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e     /* NB: zFilen
2e660 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72  ame exists and r
2e670 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2e680 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  il the file is c
2e690 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  losed.      ** a
2e6a0 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75  ccording to requ
2e6b0 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20  irement F11141. 
2e6c0 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65   So we do not ne
2e6d0 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20  ed to make a.   
2e6e0 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
2e6f0 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20  e filename. */. 
2e700 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74       pCtx->dbPat
2e710 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2e720 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72       pCtx->reser
2e730 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ved = 0;.      s
2e740 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20  randomdev();.   
2e750 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2e760 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
2e770 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2e780 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2e790 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2e7a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e7b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2e7c0 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  ree(pNew->lockin
2e7d0 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  gContext);.     
2e7e0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2e7f0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2e800 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  _);.        h = 
2e810 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
2e820 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2e830 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
2e840 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2e850 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2e860 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
2e870 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
2e880 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
2e890 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2e8a0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2e8b0 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
2e8c0 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
2e8d0 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
2e8e0 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
2e8f0 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
2e900 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
2e910 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65  lename;.    asse
2e920 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
2e930 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d   );.    nFilenam
2e940 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
2e950 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
2e960 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
2e970 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2e980 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61  malloc64(nFilena
2e990 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
2e9a0 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
2e9b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2e9c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
2e9d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2e9e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69  te3_snprintf(nFi
2e9f0 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c  lename, zLockFil
2ea00 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f  e, "%s" DOTLOCK_
2ea10 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d  SUFFIX, zFilenam
2ea20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  e);.    }.    pN
2ea30 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2ea40 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  xt = zLockFile;.
2ea50 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f    }..#if OS_VXWO
2ea60 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70  RKS.  else if( p
2ea70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2ea80 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &semIoMethods ){
2ea90 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65  .    /* Named se
2eaa0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
2eab0 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
2eac0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
2ead0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c  o be.    ** incl
2eae0 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c  uded in the semL
2eaf0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20  ockingContext.  
2eb00 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74    */.    unixEnt
2eb10 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
2eb20 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
2eb30 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
2eb40 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
2eb50 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
2eb60 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  && (pNew->pInode
2eb70 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b  ->pSem==NULL) ){
2eb80 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65  .      char *zSe
2eb90 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49  mName = pNew->pI
2eba0 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a  node->aSemName;.
2ebb0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
2ebc0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2ebd0 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
2ebe0 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73  , zSemName, "/%s
2ebf0 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20  .sem",.         
2ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
2ec10 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69  ew->pId->zCanoni
2ec20 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  calName);.      
2ec30 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61  for( n=1; zSemNa
2ec40 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20  me[n]; n++ ).   
2ec50 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d       if( zSemNam
2ec60 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d  e[n]=='/' ) zSem
2ec70 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20  Name[n] = '_';. 
2ec80 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
2ec90 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70  e->pSem = sem_op
2eca0 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43  en(zSemName, O_C
2ecb0 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a  REAT, 0666, 1);.
2ecc0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
2ecd0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20  pInode->pSem == 
2ece0 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  SEM_FAILED ){.  
2ecf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ed00 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2ed10 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
2ed20 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20  de->aSemName[0] 
2ed30 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a  = '\0';.      }.
2ed40 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
2ed50 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
2ed60 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 74 6f 72  #endif.  .  stor
2ed70 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c  eLastErrno(pNew,
2ed80 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f   0);.#if OS_VXWO
2ed90 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
2eda0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2edb0 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
2edc0 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2edd0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68  __LINE__);.    h
2ede0 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c   = -1;.    osUnl
2edf0 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
2ee00 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2ee10 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2ee20 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64  DELETE;.  }.#end
2ee30 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
2ee40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2ee50 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
2ee60 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2ee70 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
2ee80 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
2ee90 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
2eea0 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
2eeb0 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76  unter(+1);.    v
2eec0 65 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77  erifyDbFile(pNew
2eed0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2eee0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2eef0 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
2ef00 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77  a directory in w
2ef10 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70  hich to put temp
2ef20 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20  orary files..** 
2ef30 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74  If no suitable t
2ef40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69  emporary file di
2ef50 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66  rectory can be f
2ef60 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ound, return NUL
2ef70 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
2ef80 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
2ef90 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a  pFileDir(void){.
2efa0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
2efb0 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
2efc0 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
2efd0 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
2efe0 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
2eff0 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
2f000 0a 20 20 20 20 20 22 2e 22 0a 20 20 7d 3b 0a 20  .     ".".  };. 
2f010 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20   unsigned int i 
2f020 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 73 74  = 0;.  struct st
2f030 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
2f040 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 73 71 6c  char *zDir = sql
2f050 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
2f060 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21 61 7a 44  ory;..  if( !azD
2f070 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b  irs[0] ) azDirs[
2f080 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  0] = getenv("SQL
2f090 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20  ITE_TMPDIR");.  
2f0a0 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
2f0b0 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
2f0c0 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
2f0d0 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 69   while(1){.    i
2f0e0 66 28 20 7a 44 69 72 21 3d 30 0a 20 20 20 20 20  f( zDir!=0.     
2f0f0 26 26 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20  && osStat(zDir, 
2f100 26 62 75 66 29 3d 3d 30 0a 20 20 20 20 20 26 26  &buf)==0.     &&
2f110 20 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f   S_ISDIR(buf.st_
2f120 6d 6f 64 65 29 0a 20 20 20 20 20 26 26 20 6f 73  mode).     && os
2f130 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 33 29  Access(zDir, 03)
2f140 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
2f150 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 20 20   return zDir;.  
2f160 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 73    }.    if( i>=s
2f170 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
2f180 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 20  zeof(azDirs[0]) 
2f190 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 44 69  ) break;.    zDi
2f1a0 72 20 3d 20 61 7a 44 69 72 73 5b 69 2b 2b 5d 3b  r = azDirs[i++];
2f1b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2f1c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2f1d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2f1e0 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
2f1f0 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c   zBuf must be al
2f200 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  located.** by th
2f210 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73  e calling proces
2f220 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69  s and must be bi
2f230 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
2f240 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66   at least.** pVf
2f250 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  s->mxPathname by
2f260 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
2f270 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
2f280 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
2f290 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63 6f 6e 73  r *zBuf){.  cons
2f2a0 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 20 20  t char *zDir;.  
2f2b0 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
2f2c0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
2f2d0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
2f2e0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
2f2f0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
2f300 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
2f310 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
2f320 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
2f330 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
2f340 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
2f350 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
2f360 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 7a 42 75 66  ng. .  */.  zBuf
2f370 5b 30 5d 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c  [0] = 0;.  Simul
2f380 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2f390 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
2f3a0 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69  );..  zDir = uni
2f3b0 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a  xTempFileDir();.
2f3c0 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
2f3d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2f3e0 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3b  ERR_GETTEMPPATH;
2f3f0 0a 20 20 64 6f 7b 0a 20 20 20 20 75 36 34 20 72  .  do{.    u64 r
2f400 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
2f410 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
2f420 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 61 73 73  r), &r);.    ass
2f430 65 72 74 28 20 6e 42 75 66 3e 32 20 29 3b 0a 20  ert( nBuf>2 );. 
2f440 20 20 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 20     zBuf[nBuf-2] 
2f450 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2f460 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
2f470 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54  zBuf, "%s/"SQLIT
2f480 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
2f490 49 58 22 25 6c 6c 78 25 63 22 2c 0a 20 20 20 20  IX"%llx%c",.    
2f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4b0 20 7a 44 69 72 2c 20 72 2c 20 30 29 3b 0a 20 20   zDir, r, 0);.  
2f4c0 20 20 69 66 28 20 7a 42 75 66 5b 6e 42 75 66 2d    if( zBuf[nBuf-
2f4d0 32 5d 21 3d 30 20 7c 7c 20 28 69 4c 69 6d 69 74  2]!=0 || (iLimit
2f4e0 2b 2b 29 3e 31 30 20 29 20 72 65 74 75 72 6e 20  ++)>10 ) return 
2f4f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2f500 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73  }while( osAccess
2f510 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
2f520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f530 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
2f540 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2f550 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2f560 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
2f570 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61  * Routine to tra
2f580 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c  nsform a unixFil
2f590 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c  e into a proxy-l
2f5a0 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e  ocking unixFile.
2f5b0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2f5c0 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d  on in the proxy-
2f5d0 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62  lock division, b
2f5e0 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f  ut used by unixO
2f5f0 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49  pen().** if SQLI
2f600 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2f610 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e  LOCKING is defin
2f620 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2f630 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
2f640 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
2f650 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  e*, const char*)
2f660 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
2f670 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  Search for an un
2f680 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
2f690 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  ptor that was op
2f6a0 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ened on the data
2f6b0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e  base .** file (n
2f6c0 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  ot a journal or 
2f6d0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
2f6e0 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20  ile) identified 
2f6f0 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a  by pathname.** z
2f700 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45  Path with SQLITE
2f710 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
2f720 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70  matching those p
2f730 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2f740 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
2f750 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2f760 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66  ..**.** Such a f
2f770 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
2f780 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61  ay exist if a da
2f790 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2f7a0 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20  n was closed.** 
2f7b0 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  but the associat
2f7c0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2f7d0 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  or could not be 
2f7e0 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73  closed because s
2f7f0 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c  ome.** other fil
2f800 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
2f810 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2f820 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  le is holding a 
2f830 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65  file-lock..** Re
2f840 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20  fer to comments 
2f850 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65  in the unixClose
2f860 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  () function and 
2f870 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d  the lengthy comm
2f880 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  ent.** describin
2f890 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72  g "Posix Advisor
2f8a0 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68  y Locking" at th
2f8b0 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
2f8c0 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72  file for .** fur
2f8d0 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c  ther details. Al
2f8e0 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38  so, ticket #4018
2f8f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69  ..**.** If a sui
2f900 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  table file descr
2f910 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  iptor is found, 
2f920 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
2f930 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ned. If no.** su
2f940 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
2f950 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d  or is located, -
2f960 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
2f970 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75  /.static UnixUnu
2f980 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61  sedFd *findReusa
2f990 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72  bleFd(const char
2f9a0 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
2f9b0 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65  gs){.  UnixUnuse
2f9c0 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30  dFd *pUnused = 0
2f9d0 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  ;..  /* Do not s
2f9e0 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
2f9f0 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
2fa00 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  tor on vxworks. 
2fa10 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  Not because.  **
2fa20 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e   vxworks would n
2fa30 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  ot benefit from 
2fa40 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d  the change (it m
2fa50 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20  ight, we're not 
2fa60 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20  sure),.  ** but 
2fa70 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74  because no way t
2fa80 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72  o test it is cur
2fa90 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
2faa0 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a  . It is better .
2fab0 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b    ** not to risk
2fac0 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b   breaking vxwork
2fad0 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  s support for th
2fae0 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61  e sake of such a
2faf0 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20  n obscure .  ** 
2fb00 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66  feature.  */.#if
2fb10 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73   !OS_VXWORKS.  s
2fb20 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2fb30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fb40 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f      /* Results o
2fb50 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f  f stat() call */
2fb60 0a 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ..  unixEnterMut
2fb70 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 41 20 73 74  ex();..  /* A st
2fb80 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
2fb90 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
2fba0 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
2fbb0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
2fbc0 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
2fbd0 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
2fbe0 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
2fbf0 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
2fc00 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
2fc10 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
2fc20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2fc30 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
2fc40 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
2fc50 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
2fc60 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
2fc70 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
2fc80 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
2fc90 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
2fca0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
2fcb0 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
2fcc0 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
2fcd0 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
2fce0 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
2fcf0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
2fd00 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
2fd10 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
2fd20 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
2fd30 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
2fd40 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20 66 69  or a reusable fi
2fd50 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
2fd60 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a  e not dire.  */.
2fd70 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 21    if( inodeList!
2fd80 3d 30 20 26 26 20 30 3d 3d 6f 73 53 74 61 74 28  =0 && 0==osStat(
2fd90 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29  zPath, &sStat) )
2fda0 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49  {.    unixInodeI
2fdb0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20  nfo *pInode;..  
2fdc0 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
2fdd0 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
2fde0 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f   pInode && (pIno
2fdf0 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d  de->fileId.dev!=
2fe00 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20  sStat.st_dev.   
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c    || pInode->fil
2fe30 65 49 64 2e 69 6e 6f 21 3d 28 75 36 34 29 73 53  eId.ino!=(u64)sS
2fe40 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20  tat.st_ino) ){. 
2fe50 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70        pInode = p
2fe60 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
2fe70 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f    }.    if( pIno
2fe80 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78  de ){.      Unix
2fe90 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20  UnusedFd **pp;. 
2fea0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2feb0 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
2fec0 6c 64 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  ld(pInode->pLock
2fed0 4d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 20 20  Mutex) );.      
2fee0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
2fef0 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ter(pInode->pLoc
2ff00 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66  kMutex);.      f
2ff10 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70  or(pp=&pInode->p
2ff20 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28  Unused; *pp && (
2ff30 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61  *pp)->flags!=fla
2ff40 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  gs; pp=&((*pp)->
2ff50 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70  pNext));.      p
2ff60 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20  Unused = *pp;.  
2ff70 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
2ff80 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d  ){.        *pp =
2ff90 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b   pUnused->pNext;
2ffa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2ffb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2ffc0 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  ve(pInode->pLock
2ffd0 4d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  Mutex);.    }.  
2ffe0 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
2fff0 65 78 28 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ex();.#endif    
30000 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /* if !OS_VXWORK
30010 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55  S */.  return pU
30020 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nused;.}../*.** 
30030 46 69 6e 64 20 74 68 65 20 6d 6f 64 65 2c 20 75  Find the mode, u
30040 69 64 20 61 6e 64 20 67 69 64 20 6f 66 20 66 69  id and gid of fi
30050 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a 2f 0a 73 74  le zFile. .*/.st
30060 61 74 69 63 20 69 6e 74 20 67 65 74 46 69 6c 65  atic int getFile
30070 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  Mode(.  const ch
30080 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20  ar *zFile,      
30090 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
300a0 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  name */.  mode_t
300b0 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20   *pMode,        
300c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
300d0 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  : Permissions of
300e0 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 75 69 64 5f   zFile */.  uid_
300f0 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20  t *pUid,        
30100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30110 55 54 3a 20 75 69 64 20 6f 66 20 7a 46 69 6c 65  UT: uid of zFile
30120 2e 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  . */.  gid_t *pG
30130 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
30140 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
30150 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a  id of zFile. */.
30160 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  ){.  struct stat
30170 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
30180 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
30190 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
301a0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
301b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
301c0 4b 3b 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  K;.  if( 0==osSt
301d0 61 74 28 7a 46 69 6c 65 2c 20 26 73 53 74 61 74  at(zFile, &sStat
301e0 29 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20  ) ){.    *pMode 
301f0 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20  = sStat.st_mode 
30200 26 20 30 37 37 37 3b 0a 20 20 20 20 2a 70 55 69  & 0777;.    *pUi
30210 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64  d = sStat.st_uid
30220 3b 0a 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53  ;.    *pGid = sS
30230 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 7d 65  tat.st_gid;.  }e
30240 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
30250 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
30260 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
30270 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
30280 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30290 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  led by unixOpen(
302a0 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  ) to determine t
302b0 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69  he unix permissi
302c0 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  ons.** to create
302d0 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e   new files with.
302e0 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
302f0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
30300 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
30310 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73  ** and a value s
30320 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73  uitable for pass
30330 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64  ing as the third
30340 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65   argument to ope
30350 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74  n(2) is.** writt
30360 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66  en to *pMode. If
30370 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
30380 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
30390 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
303a0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
303b0 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64  e value of *pMod
303c0 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65  e is not modifie
303d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74  d..**.** In most
303e0 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75   cases, this rou
303f0 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65  tine sets *pMode
30400 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c   to 0, which wil
30410 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69  l become.** an i
30420 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62  ndication to rob
30430 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72  ust_open() to cr
30440 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73  eate the file us
30450 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45  ing.** SQLITE_DE
30460 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
30470 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20  SSIONS adjusted 
30480 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  by the umask..**
30490 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65   But if the file
304a0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
304b0 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61   a WAL or regula
304c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
304d0 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  then .** this fu
304e0 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74  nction queries t
304f0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
30500 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  or the permissio
30510 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f  ns on the .** co
30520 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
30530 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65  base file and se
30540 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69  ts *pMode to thi
30550 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65  s value. Wheneve
30560 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20  r .** possible, 
30570 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  WAL and journal 
30580 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
30590 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
305a0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
305b0 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   as the associat
305c0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
305d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
305e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
305f0 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73  _NAMES option is
30600 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
30610 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66  he.** original f
30620 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61  ilename is unava
30630 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33  ilable.  But 8_3
30640 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75  _NAMES is only u
30650 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66  sed for.** FAT f
30660 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70  ilesystems and p
30670 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f  ermissions do no
30680 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20  t matter there, 
30690 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74  so just use.** t
306a0 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69  he default permi
306b0 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssions..*/.stati
306c0 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65  c int findCreate
306d0 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
306e0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
306f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30700 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73  ath of file (pos
30710 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65  sibly) being cre
30720 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ated */.  int fl
30730 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
30740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
30750 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68  gs passed as 4th
30760 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70   argument to xOp
30770 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  en() */.  mode_t
30780 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20   *pMode,        
30790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
307a0 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  : Permissions to
307b0 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20   open file with 
307c0 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64  */.  uid_t *pUid
307d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
307e0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64       /* OUT: uid
307f0 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66   to set on the f
30800 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a  ile */.  gid_t *
30810 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20  pGid            
30820 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
30830 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   gid to set on t
30840 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  he file */.){.  
30850 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30860 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
30870 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
30880 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a  /.  *pMode = 0;.
30890 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a    *pUid = 0;.  *
308a0 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  pGid = 0;.  if( 
308b0 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
308c0 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
308d0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
308e0 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  L) ){.    char z
308f0 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  Db[MAX_PATHNAME+
30900 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  1];     /* Datab
30910 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f  ase file path */
30920 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20  .    int nDb;   
30930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30940 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30950 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a  valid bytes in z
30960 44 62 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50  Db */..    /* zP
30970 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f  ath is a path to
30980 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61   a WAL or journa
30990 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  l file. The foll
309a0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69  owing block deri
309b0 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ves.    ** the p
309c0 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63  ath to the assoc
309d0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
309e0 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20  ile from zPath. 
309f0 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c  This block handl
30a00 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  es.    ** the fo
30a10 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63  llowing naming c
30a20 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20  onventions:.    
30a30 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  **.    **   "<pa
30a40 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
30a50 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
30a60 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20  th to db>-wal". 
30a70 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
30a80 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22  o db>-journalNN"
30a90 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
30aa0 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20   to db>-walNN". 
30ab0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65     **.    ** whe
30ac0 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d  re NN is a decim
30ad0 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e  al number. The N
30ae0 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73  N naming schemes
30af0 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65   are .    ** use
30b00 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75  d by the test_mu
30b10 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65  ltiplex.c module
30b20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62  ..    */.    nDb
30b30 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
30b40 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a  30(zPath) - 1; .
30b50 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68      while( zPath
30b60 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20  [nDb]!='-' ){.  
30b70 20 20 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c      /* In normal
30b80 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 65 20   operation, the 
30b90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
30ba0 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 63 6f  e will always co
30bb0 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ntain.      ** a
30bc0 20 27 2d 27 20 63 68 61 72 61 63 74 65 72 2e 20   '-' character. 
30bd0 20 48 6f 77 65 76 65 72 20 69 6e 20 38 2b 33 20   However in 8+3 
30be0 66 69 6c 65 6e 61 6d 65 20 6d 6f 64 65 2c 20 6f  filename mode, o
30bf0 72 20 69 66 20 61 20 63 6f 72 72 75 70 74 0a 20  r if a corrupt. 
30c00 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
30c10 20 6a 6f 75 72 6e 61 6c 20 73 70 65 63 69 66 69   journal specifi
30c20 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
30c30 6e 61 6c 20 77 69 74 68 20 61 20 67 6f 6f 66 79  nal with a goofy
30c40 20 6e 61 6d 65 2c 20 74 68 65 6e 0a 20 20 20 20   name, then.    
30c50 20 20 2a 2a 20 74 68 65 20 27 2d 27 20 6d 69 67    ** the '-' mig
30c60 68 74 20 62 65 20 6d 69 73 73 69 6e 67 2e 20 2a  ht be missing. *
30c70 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 44 62 3d  /.      if( nDb=
30c80 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d  =0 || zPath[nDb]
30c90 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 20 53  =='.' ) return S
30ca0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
30cb0 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  nDb--;.    }.   
30cc0 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61   memcpy(zDb, zPa
30cd0 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44  th, nDb);.    zD
30ce0 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a  b[nDb] = '\0';..
30cf0 20 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c 65      rc = getFile
30d00 4d 6f 64 65 28 7a 44 62 2c 20 70 4d 6f 64 65 2c  Mode(zDb, pMode,
30d10 20 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20 20   pUid, pGid);.  
30d20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
30d30 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
30d40 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20  LETEONCLOSE ){. 
30d50 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30     *pMode = 0600
30d60 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
30d70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
30d80 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20 2f 2a 20  N_URI ){.    /* 
30d90 49 66 20 74 68 69 73 20 69 73 20 61 20 6d 61 69  If this is a mai
30da0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
30db0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 77 61 73  and the file was
30dc0 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 61 20   opened using a 
30dd0 55 52 49 0a 20 20 20 20 2a 2a 20 66 69 6c 65 6e  URI.    ** filen
30de0 61 6d 65 2c 20 63 68 65 63 6b 20 66 6f 72 20 74  ame, check for t
30df0 68 65 20 22 6d 6f 64 65 6f 66 22 20 70 61 72 61  he "modeof" para
30e00 6d 65 74 65 72 2e 20 49 66 20 70 72 65 73 65 6e  meter. If presen
30e10 74 2c 20 69 6e 74 65 72 70 72 65 74 0a 20 20 20  t, interpret.   
30e20 20 2a 2a 20 69 74 73 20 76 61 6c 75 65 20 61 73   ** its value as
30e30 20 61 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20   a filename and 
30e40 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  try to copy the 
30e50 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64 20 67 69  mode, uid and gi
30e60 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  d from.    ** th
30e70 61 74 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  at file.  */.   
30e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
30e90 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
30ea0 61 6d 65 74 65 72 28 7a 50 61 74 68 2c 20 22 6d  ameter(zPath, "m
30eb0 6f 64 65 6f 66 22 29 3b 0a 20 20 20 20 69 66 28  odeof");.    if(
30ec0 20 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   z ){.      rc =
30ed0 20 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 2c 20   getFileMode(z, 
30ee0 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47 69  pMode, pUid, pGi
30ef0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  d);.    }.  }.  
30f00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30f10 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
30f20 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
30f30 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
30f40 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
30f50 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
30f60 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
30f70 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
30f80 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
30f90 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
30fa0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
30fb0 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
30fc0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
30fd0 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
30fe0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
30ff0 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
31000 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
31010 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
31020 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
31030 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
31040 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
31050 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
31060 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
31070 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
31080 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
31090 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
310a0 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
310b0 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
310c0 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
310d0 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
310e0 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
310f0 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
31100 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
31110 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
31120 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
31130 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
31140 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
31150 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
31160 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
31170 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
31180 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
31190 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
311a0 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
311b0 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
311c0 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
311d0 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
311e0 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
311f0 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
31200 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
31210 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
31220 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
31230 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
31240 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
31250 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
31260 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
31270 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
31280 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
31290 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
312a0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
312b0 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
312c0 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
312d0 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
312e0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
312f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
31300 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
31310 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
31320 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
31330 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
31340 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
31350 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
31360 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
31370 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
31380 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
31390 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
313a0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
313b0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
313c0 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
313d0 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
313e0 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
313f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
31400 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
31410 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  to open() */.  i
31420 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
31430 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
31440 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
31450 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
31460 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
31470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
31480 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e  e to omit lockin
31490 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a  g primitives */.
314a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
314b0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
314c0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
314d0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
314e0 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b  t ctrlFlags = 0;
314f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31500 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73  UNIXFILE_* flags
31510 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
31520 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
31530 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
31540 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
31550 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
31560 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
31570 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
31580 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
31590 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
315a0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
315b0 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
315c0 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
315d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
315e0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
315f0 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
31600 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
31610 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
31620 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
31630 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
31640 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50  LE.  int isAutoP
31650 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26  roxy  = (flags &
31660 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
31670 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a  OPROXY);.#endif.
31680 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
31690 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
316a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
316b0 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73  STYLE.  struct s
316c0 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65  tatfs fsInfo;.#e
316d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72  ndif..  /* If cr
316e0 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  eating a master 
316f0 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75  or main-file jou
31700 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  rnal, this funct
31710 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20  ion will open.  
31720 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69  ** a file-descri
31730 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65  ptor on the dire
31740 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66  ctory too. The f
31750 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79  irst time unixSy
31760 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c  nc().  ** is cal
31770 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  led the director
31780 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
31790 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28  r will be fsync(
317a0 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64  )ed and close()d
317b0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4e  ..  */.  int isN
317c0 65 77 4a 72 6e 6c 20 3d 20 28 69 73 43 72 65 61  ewJrnl = (isCrea
317d0 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
317e0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
317f0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
31800 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
31810 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
31820 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
31830 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
31840 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
31850 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
31860 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
31870 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
31880 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
31890 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
318a0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
318b0 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
318c0 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
318d0 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
318e0 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
318f0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
31900 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  E+2];.  const ch
31910 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74  ar *zName = zPat
31920 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  h;..  /* Check t
31930 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
31940 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
31950 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
31960 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
31970 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
31980 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
31990 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
319a0 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
319b0 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
319c0 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
319d0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
319e0 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
319f0 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
31a00 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
31a10 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
31a20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
31a30 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
31a40 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
31a50 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
31a60 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
31a70 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
31a80 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
31a90 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
31aa0 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
31ab0 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
31ac0 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
31ad0 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
31ae0 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
31af0 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
31b00 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
31b10 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
31b20 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
31b30 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
31b40 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
31b50 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
31b60 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
31b70 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
31b80 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
31b90 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
31ba0 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
31bb0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
31bc0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
31bd0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
31be0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
31bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
31c00 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
31c10 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
31c20 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
31c30 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
31c40 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
31c50 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
31c60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
31c70 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
31c80 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
31c90 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
31ca0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
31cb0 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
31cc0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
31cd0 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
31ce0 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
31cf0 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
31d00 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
31d10 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
31d20 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
31d30 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
31d40 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
31d50 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
31d60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
31d70 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
31d80 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
31d90 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
31da0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
31db0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
31dc0 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
31dd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
31de0 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
31df0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
31e00 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
31e10 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
31e20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
31e30 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63    );..  /* Detec
31e40 74 20 61 20 70 69 64 20 63 68 61 6e 67 65 20 61  t a pid change a
31e50 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 52 4e  nd reset the PRN
31e60 47 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 72  G.  There is a r
31e70 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20  ace condition.  
31e80 2a 2a 20 68 65 72 65 20 73 75 63 68 20 74 68 61  ** here such tha
31e90 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68  t two or more th
31ea0 72 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e 67  reads all trying
31eb0 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
31ec0 65 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  es at.  ** the s
31ed0 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67 68  ame instant migh
31ee0 74 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65 20  t all reset the 
31ef0 50 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74 69  PRNG.  But multi
31f00 70 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a 20  ple resets.  ** 
31f10 61 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20  are harmless..  
31f20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e  */.  if( randomn
31f30 65 73 73 50 69 64 21 3d 6f 73 47 65 74 70 69 64  essPid!=osGetpid
31f40 28 30 29 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f  (0) ){.    rando
31f50 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65 74  mnessPid = osGet
31f60 70 69 64 28 30 29 3b 0a 20 20 20 20 73 71 6c 69  pid(0);.    sqli
31f70 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30  te3_randomness(0
31f80 2c 30 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ,0);.  }.  memse
31f90 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  t(p, 0, sizeof(u
31fa0 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66  nixFile));..  if
31fb0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
31fc0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a  OPEN_MAIN_DB ){.
31fd0 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
31fe0 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70   *pUnused;.    p
31ff0 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
32000 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66  sableFd(zName, f
32010 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
32020 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
32030 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
32040 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
32050 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
32060 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69  ite3_malloc64(si
32070 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
32080 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75  .      if( !pUnu
32090 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sed ){.        r
320a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
320b0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
320c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50  .    }.    p->pP
320d0 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
320e0 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20  d = pUnused;..  
320f0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
32100 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62  lenames are doub
32110 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
32120 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ed if they are n
32130 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20 77  ot.    ** URIs w
32140 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20  ith parameters. 
32150 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e   Hence, they can
32160 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73 65   always be passe
32170 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71  d into.    ** sq
32180 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
32190 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73  ter(). */.    as
321a0 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 53  sert( (flags & S
321b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
321c0 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  || zName[strlen(
321d0 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  zName)+1]==0 );.
321e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e  .  }else if( !zN
321f0 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ame ){.    /* If
32200 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20   zName is NULL, 
32210 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
32220 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  is requesting a 
32230 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  temp file. */.  
32240 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
32250 65 20 26 26 20 21 69 73 4e 65 77 4a 72 6e 6c 29  e && !isNewJrnl)
32260 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47  ;.    rc = unixG
32270 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2d  etTempname(pVfs-
32280 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 6d  >mxPathname, zTm
32290 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
322a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
322b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
322c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
322d0 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20  e = zTmpname;.. 
322e0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20     /* Generated 
322f0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61  temporary filena
32300 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 64  mes are always d
32310 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
32320 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72  nated.    ** for
32330 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f   use by sqlite3_
32340 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
32350 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
32360 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61  zName[strlen(zNa
32370 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d  me)+1]==0 );.  }
32380 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
32390 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
323a0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
323b0 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49  r passed to POSI
323c0 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  X function.  ** 
323d0 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75  open(). These mu
323e0 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64  st be calculated
323f0 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20   even if open() 
32400 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61  is not called, a
32410 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20  s.  ** they may 
32420 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  be stored as par
32430 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  t of the file ha
32440 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79  ndle and used by
32450 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63   the .  ** 'conc
32460 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20  h file' locking 
32470 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20  functions later 
32480 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  on.  */.  if( is
32490 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
324a0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
324b0 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
324c0 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
324d0 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
324e0 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
324f0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
32500 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
32510 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
32520 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
32530 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
32540 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
32550 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
32560 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29  );..  if( fd<0 )
32570 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65  {.    mode_t ope
32580 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  nMode;          
32590 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f      /* Permissio
325a0 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c  ns to create fil
325b0 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69  e with */.    ui
325c0 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20 20  d_t uid;        
325d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
325e0 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66 69  serid for the fi
325f0 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20  le */.    gid_t 
32600 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  gid;            
32610 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70          /* Group
32620 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  id for the file 
32630 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  */.    rc = find
32640 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a  CreateFileMode(z
32650 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70  Name, flags, &op
32660 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67  enMode, &uid, &g
32670 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  id);.    if( rc!
32680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32690 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
326a0 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
326b0 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  sed );.      ass
326c0 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
326d0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65  TE_OPEN_WAL || e
326e0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
326f0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
32700 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
32710 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20  c;.    }.    fd 
32720 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
32730 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
32740 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f  openMode);.    O
32750 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20  STRACE(("OPENX  
32760 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c   %-3d %s 0%o\n",
32770 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e   fd, zName, open
32780 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 61 73 73  Flags));.    ass
32790 65 72 74 28 20 21 69 73 45 78 63 6c 75 73 69 76  ert( !isExclusiv
327a0 65 20 7c 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20  e || (openFlags 
327b0 26 20 4f 5f 43 52 45 41 54 29 21 3d 30 20 29 3b  & O_CREAT)!=0 );
327c0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
327d0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4e 65 77  .      if( isNew
327e0 4a 72 6e 6c 20 26 26 20 65 72 72 6e 6f 3d 3d 45  Jrnl && errno==E
327f0 41 43 43 45 53 20 26 26 20 6f 73 41 63 63 65 73  ACCES && osAcces
32800 73 28 7a 4e 61 6d 65 2c 20 46 5f 4f 4b 29 20 29  s(zName, F_OK) )
32810 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
32820 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65  unable to create
32830 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 63 61 75   a journal becau
32840 73 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  se the directory
32850 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
32860 2a 2a 20 77 72 69 74 61 62 6c 65 2c 20 63 68 61  ** writable, cha
32870 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f  nge the error co
32880 64 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  de to indicate t
32890 68 61 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  hat. */.        
328a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
328b0 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 3b 0a  ONLY_DIRECTORY;.
328c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
328d0 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
328e0 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
328f0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65          /* Faile
32900 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  d to open the fi
32910 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  le for read/writ
32920 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65  e access. Try re
32930 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  ad-only. */.    
32940 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
32950 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
32960 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
32970 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20  _CREATE);.      
32980 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e    openFlags &= ~
32990 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29  (O_RDWR|O_CREAT)
329a0 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
329b0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
329c0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
329d0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
329e0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  RDONLY;.        
329f0 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
32a00 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62          fd = rob
32a10 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
32a20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
32a30 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
32a40 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30    }.    if( fd<0
32a50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
32a60 32 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  2 = unixLogError
32a70 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
32a80 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
32a90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
32aa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32ab0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
32ac0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
32ad0 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hed;.    }..    
32ae0 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65  /* If this proce
32af0 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73  ss is running as
32b00 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65   root and if cre
32b10 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c  ating a new roll
32b20 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  back.    ** jour
32b30 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c  nal or WAL file,
32b40 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68   set the ownersh
32b50 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ip of the journa
32b60 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20  l or WAL to be. 
32b70 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61     ** the same a
32b80 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
32b90 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
32ba0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
32bb0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
32bc0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
32bd0 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
32be0 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e      robustFchown
32bf0 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a  (fd, uid, gid);.
32c00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
32c10 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
32c20 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
32c30 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
32c40 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
32c50 66 28 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  f( p->pPrealloca
32c60 74 65 64 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  tedUnused ){.   
32c70 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65   p->pPreallocate
32c80 64 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  dUnused->fd = fd
32c90 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c  ;.    p->pPreall
32ca0 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e 66 6c  ocatedUnused->fl
32cb0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
32cc0 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  ..  if( isDelete
32cd0 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
32ce0 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a  KS.    zPath = z
32cf0 4e 61 6d 65 3b 0a 23 65 6c 69 66 20 64 65 66 69  Name;.#elif defi
32d00 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 4c 49 4e  ned(SQLITE_UNLIN
32d10 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 29 0a 20  K_AFTER_CLOSE). 
32d20 20 20 20 7a 50 61 74 68 20 3d 20 73 71 6c 69 74     zPath = sqlit
32d30 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
32d40 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
32d50 20 7a 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20   zPath==0 ){.   
32d60 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
32d70 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p, fd, __LINE__)
32d80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
32d90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
32da0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
32db0 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65    osUnlink(zName
32dc0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
32dd0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
32de0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
32df0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65  else{.    p->ope
32e00 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
32e10 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  gs;.  }.#endif. 
32e20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
32e30 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
32e40 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
32e50 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73  G_STYLE.  if( fs
32e60 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66  tatfs(fd, &fsInf
32e70 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
32e80 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
32e90 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f  , errno);.    ro
32ea0 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
32eb0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
32ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
32ed0 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d  OERR_ACCESS;.  }
32ee0 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
32ef0 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49  cmp("msdos", fsI
32f00 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
32f10 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
32f20 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
32f30 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
32f40 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
32f50 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  OS;.  }.  if (0 
32f60 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61  == strncmp("exfa
32f70 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  t", fsInfo.f_fst
32f80 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
32f90 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
32fa0 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
32fb0 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
32fc0 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23  _IS_MSDOS;.  }.#
32fd0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
32fe0 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  up appropriate c
32ff0 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66  trlFlags */.  if
33000 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20  ( isDelete )    
33010 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
33020 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
33030 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20  E_DELETE;.  if( 
33040 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20  isReadonly )    
33050 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
33060 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
33070 52 44 4f 4e 4c 59 3b 0a 20 20 6e 6f 4c 6f 63 6b  RDONLY;.  noLock
33080 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45   = eType!=SQLITE
33090 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 20  _OPEN_MAIN_DB;. 
330a0 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20   if( noLock )   
330b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
330c0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
330d0 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69  FILE_NOLOCK;.  i
330e0 66 28 20 69 73 4e 65 77 4a 72 6e 6c 20 29 20 20  f( isNewJrnl )  
330f0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
33100 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
33110 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66  LE_DIRSYNC;.  if
33120 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
33130 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c  _OPEN_URI ) ctrl
33140 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
33150 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49  E_URI;..#if SQLI
33160 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
33170 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49  G_STYLE.#if SQLI
33180 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
33190 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f  LOCKING.  isAuto
331a0 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69  Proxy = 1;.#endi
331b0 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72  f.  if( isAutoPr
331c0 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e  oxy && (zPath!=N
331d0 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b  ULL) && (!noLock
331e0 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  ) && pVfs->xOpen
331f0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e   ){.    char *en
33200 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28  vforce = getenv(
33210 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  "SQLITE_FORCE_PR
33220 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20  OXY_LOCKING");. 
33230 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20     int useProxy 
33240 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c  = 0;..    /* SQL
33250 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
33260 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73  LOCKING==1 means
33270 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73   force always us
33280 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73  e proxy, 0 means
33290 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75   .    ** never u
332a0 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d  se proxy, NULL m
332b0 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66  eans use proxy f
332c0 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  or non-local fil
332d0 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  es only.  */.   
332e0 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e   if( envforce!=N
332f0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ULL ){.      use
33300 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76  Proxy = atoi(env
33310 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65  force)>0;.    }e
33320 6c 73 65 7b 0a 20 20 20 20 20 20 75 73 65 50 72  lse{.      usePr
33330 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66  oxy = !(fsInfo.f
33340 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c  _flags&MNT_LOCAL
33350 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
33360 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20   useProxy ){.   
33370 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e     rc = fillInUn
33380 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
33390 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
333a0 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  trlFlags);.     
333b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
333c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
333d0 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
333e0 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
333f0 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
33400 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
33410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
33430 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
33440 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
33450 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
33460 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
33470 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
33480 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
33490 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
334a0 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
334b0 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
334c0 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
334d0 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
334e0 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
334f0 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
33500 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
33510 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
33520 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
33530 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
33540 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
33550 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
33560 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
33570 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
33580 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 7a 50  .  .  assert( zP
33590 61 74 68 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b  ath==0 || zPath[
335a0 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 20 20 7c  0]=='/' .      |
335b0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
335c0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
335d0 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
335e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
335f0 4f 55 52 4e 41 4c 20 0a 20 20 29 3b 0a 20 20 72  OURNAL .  );.  r
33600 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
33610 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69  le(pVfs, fd, pFi
33620 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46  le, zPath, ctrlF
33630 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e  lags);..open_fin
33640 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ished:.  if( rc!
33650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33660 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
33670 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55  ->pPreallocatedU
33680 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65  nused);.  }.  re
33690 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
336a0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
336b0 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20  le at zPath. If 
336c0 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75  the dirSync argu
336d0 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73  ment is true, fs
336e0 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72  ync().** the dir
336f0 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
33700 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a  eting the file..
33710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
33720 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  ixDelete(.  sqli
33730 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33740 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e  ,     /* VFS con
33750 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20  taining this as 
33760 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68  the xDelete meth
33770 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
33780 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
33790 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
337a0 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
337b0 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63  */.  int dirSync
337c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
337d0 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63  * If true, fsync
337e0 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  () directory aft
337f0 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65  er deleting file
33800 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
33810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55  = SQLITE_OK;.  U
33820 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
33830 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
33840 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
33850 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
33860 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f  DELETE);.  if( o
33870 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d  sUnlink(zPath)==
33880 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20  (-1) ){.    if( 
33890 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69  errno==ENOENT.#i
338a0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
338b0 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73 73       || osAccess
338c0 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e  (zPath,0)!=0.#en
338d0 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
338e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
338f0 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
33900 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33910 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
33920 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
33930 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b  _DELETE, "unlink
33940 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
33950 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
33960 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
33970 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
33980 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e  NC.  if( (dirSyn
33990 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20  c & 1)!=0 ){.   
339a0 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
339b0 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
339c0 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
339d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
339e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
339f0 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 66 64 2c  ( full_fsync(fd,
33a00 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  0,0) ){.        
33a10 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
33a20 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
33a30 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63  IR_FSYNC, "fsync
33a40 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  ", zPath);.     
33a50 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f   }.      robust_
33a60 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
33a70 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
33a80 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
33a90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
33aa0 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63  OPEN );.      rc
33ab0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33ac0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
33ad0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33ae0 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78  *.** Test the ex
33af0 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63  istence of or ac
33b00 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
33b10 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20   of file zPath. 
33b20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66  The.** test perf
33b30 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  ormed depends on
33b40 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c   the value of fl
33b50 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ags:.**.**     S
33b60 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
33b70 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66  STS: Return 1 if
33b80 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
33b90 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
33ba0 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
33bb0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
33bc0 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e   file is read an
33bd0 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20  d writable..**  
33be0 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
33bf0 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72  _READONLY: Retur
33c00 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
33c10 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a  is readable..**.
33c20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  ** Otherwise ret
33c30 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
33c40 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28   int unixAccess(
33c50 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
33c60 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68  NotUsed,   /* Th
33c70 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  e VFS containing
33c80 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65   this xAccess me
33c90 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
33ca0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
33cb0 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65    /* Path of the
33cc0 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65   file to examine
33cd0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
33ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33cf0 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74   What do we want
33d00 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20   to learn about 
33d10 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20  the zPath file? 
33d20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
33d30 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
33d40 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f  Write result boo
33d50 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  lean here */.){.
33d60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
33d70 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
33d80 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
33d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
33da0 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
33db0 20 61 73 73 65 72 74 28 20 70 52 65 73 4f 75 74   assert( pResOut
33dc0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  !=0 );..  /* The
33dd0 20 73 70 65 63 20 73 61 79 73 20 74 68 65 72 65   spec says there
33de0 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73 69   are three possi
33df0 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20 66  ble values for f
33e00 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79 0a  lags.  But only.
33e10 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65 6d    ** two of them
33e20 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73   are actually us
33e30 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
33e40 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
33e50 43 45 53 53 5f 45 58 49 53 54 53 20 7c 7c 20 66  CESS_EXISTS || f
33e60 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
33e70 45 53 53 5f 52 45 41 44 57 52 49 54 45 20 29 3b  ESS_READWRITE );
33e80 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53  ..  if( flags==S
33e90 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
33ea0 53 54 53 20 29 7b 0a 20 20 20 20 73 74 72 75 63  STS ){.    struc
33eb0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
33ec0 2a 70 52 65 73 4f 75 74 20 3d 20 28 30 3d 3d 6f  *pResOut = (0==o
33ed0 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75  sStat(zPath, &bu
33ee0 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a  f) && buf.st_siz
33ef0 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e>0);.  }else{. 
33f00 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 6f 73     *pResOut = os
33f10 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 57 5f  Access(zPath, W_
33f20 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20 7d  OK|R_OK)==0;.  }
33f30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
33f40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  _OK;.}../*.**.*/
33f50 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6b 46 75  .static int mkFu
33f60 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f  llPathname(.  co
33f70 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
33f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33f90 20 49 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   Input path */. 
33fa0 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20 20   char *zOut,    
33fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fc0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
33fd0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 20  r */.  int nOut 
33fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ff0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
34000 74 65 64 20 73 69 7a 65 20 6f 66 20 62 75 66 66  ted size of buff
34010 65 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b 0a 20 20  er zOut */.){.  
34020 69 6e 74 20 6e 50 61 74 68 20 3d 20 73 71 6c 69  int nPath = sqli
34030 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
34040 68 29 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  h);.  int iOff =
34050 20 30 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b   0;.  if( zPath[
34060 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 69  0]!='/' ){.    i
34070 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
34080 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30 20 29 7b 0a  , nOut-2)==0 ){.
34090 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
340a0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
340b0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
340c0 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
340d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66  ;.    }.    iOff
340e0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
340f0 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7a 4f  30(zOut);.    zO
34100 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20 27 2f 27  ut[iOff++] = '/'
34110 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 4f 66  ;.  }.  if( (iOf
34120 66 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f 75 74 20  f+nPath+1)>nOut 
34130 29 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 69 74 65  ){.    /* SQLite
34140 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 78 46   assumes that xF
34150 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 6e 75  ullPathname() nu
34160 6c 2d 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65  l-terminates the
34170 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 0a 20   output buffer. 
34180 20 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 69 74     ** even if it
34190 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
341a0 72 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f 75 74 5b  r.  */.    zOut[
341b0 69 4f 66 66 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  iOff] = '\0';.  
341c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
341d0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
341e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
341f0 72 69 6e 74 66 28 6e 4f 75 74 2d 69 4f 66 66 2c  rintf(nOut-iOff,
34200 20 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c 20 22 25   &zOut[iOff], "%
34210 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 72 65  s", zPath);.  re
34220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34230 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
34240 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
34250 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
34260 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
34270 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
34280 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
34290 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
342a0 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
342b0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
342c0 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
342d0 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
342e0 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
342f0 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
34300 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
34310 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
34320 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
34330 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
34340 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
34350 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
34360 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
34370 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
34380 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
34390 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
343a0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
343b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
343c0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
343d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
343e0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
343f0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
34400 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
34410 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
34420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34430 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
34440 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
34450 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
34460 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
34470 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
34480 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
34490 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56  #if !defined(HAV
344a0 45 5f 52 45 41 44 4c 49 4e 4b 29 20 7c 7c 20 21  E_READLINK) || !
344b0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 53 54  defined(HAVE_LST
344c0 41 54 29 0a 20 20 72 65 74 75 72 6e 20 6d 6b 46  AT).  return mkF
344d0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 50 61 74  ullPathname(zPat
344e0 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a  h, zOut, nOut);.
344f0 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 20 3d  #else.  int rc =
34500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
34510 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 6e  t nByte;.  int n
34520 4c 69 6e 6b 20 3d 20 31 3b 20 20 20 20 20 20 20  Link = 1;       
34530 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
34540 65 72 20 6f 66 20 73 79 6d 62 6f 6c 69 63 20 6c  er of symbolic l
34550 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64 20 73 6f  inks followed so
34560 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   far */.  const 
34570 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 50 61 74  char *zIn = zPat
34580 68 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74  h;      /* Input
34590 20 70 61 74 68 20 66 6f 72 20 65 61 63 68 20 69   path for each i
345a0 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70  teration of loop
345b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c   */.  char *zDel
345c0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
345d0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
345e0 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e==MAX_PATHNAME 
345f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
34600 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
34610 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
34620 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
34630 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
34640 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
34650 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
34660 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
34670 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
34680 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
34690 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
346a0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
346b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
346c0 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
346d0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
346e0 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
346f0 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
34700 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
34710 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
34720 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
34730 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
34740 0a 20 20 64 6f 20 7b 0a 0a 20 20 20 20 2f 2a 20  .  do {..    /* 
34750 43 61 6c 6c 20 73 74 61 74 28 29 20 6f 6e 20 70  Call stat() on p
34760 61 74 68 20 7a 49 6e 2e 20 53 65 74 20 62 4c 69  ath zIn. Set bLi
34770 6e 6b 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  nk to true if th
34780 65 20 70 61 74 68 20 69 73 20 61 20 73 79 6d 62  e path is a symb
34790 6f 6c 69 63 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b  olic.    ** link
347a0 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
347b0 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 6e  wise.  */.    in
347c0 74 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a 20 20 20  t bLink = 0;.   
347d0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
347e0 3b 0a 20 20 20 20 69 66 28 20 6f 73 4c 73 74 61  ;.    if( osLsta
347f0 74 28 7a 49 6e 2c 20 26 62 75 66 29 21 3d 30 20  t(zIn, &buf)!=0 
34800 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
34810 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no!=ENOENT ){.  
34820 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
34830 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
34840 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6c  ANTOPEN_BKPT, "l
34850 73 74 61 74 22 2c 20 7a 49 6e 29 3b 0a 20 20 20  stat", zIn);.   
34860 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
34870 20 20 20 20 20 20 62 4c 69 6e 6b 20 3d 20 53 5f        bLink = S_
34880 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f 64  ISLNK(buf.st_mod
34890 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
348a0 66 28 20 62 4c 69 6e 6b 20 29 7b 0a 20 20 20 20  f( bLink ){.    
348b0 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29 7b    if( zDel==0 ){
348c0 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 20 3d 20  .        zDel = 
348d0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
348e0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Out);.        if
348f0 28 20 7a 44 65 6c 3d 3d 30 20 29 20 72 63 20 3d  ( zDel==0 ) rc =
34900 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
34910 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  PT;.      }else 
34920 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53 51 4c 49  if( ++nLink>SQLI
34930 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20  TE_MAX_SYMLINKS 
34940 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
34950 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
34960 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  BKPT;.      }.. 
34970 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34990 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65 61 64    nByte = osRead
349a0 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65 6c 2c 20  link(zIn, zDel, 
349b0 6e 4f 75 74 2d 31 29 3b 0a 20 20 20 20 20 20 20  nOut-1);.       
349c0 20 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a   if( nByte<0 ){.
349d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
349e0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
349f0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
34a00 2c 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a 49  , "readlink", zI
34a10 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
34a20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
34a30 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27 20 29 7b   zDel[0]!='/' ){
34a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
34a50 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
34a60 66 6f 72 28 6e 20 3d 20 73 71 6c 69 74 65 33 53  for(n = sqlite3S
34a70 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3b 20 6e 3e  trlen30(zIn); n>
34a80 30 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d 21 3d 27  0 && zIn[n-1]!='
34a90 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20 20 20 20  /'; n--);.      
34aa0 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 2b        if( nByte+
34ab0 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  n+1>nOut ){.    
34ac0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
34ad0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
34ae0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
34af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34b00 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a        memmove(&z
34b10 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c 20 6e 42  Del[n], zDel, nB
34b20 79 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  yte+1);.        
34b30 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 65        memcpy(zDe
34b40 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20 20 20 20  l, zIn, n);.    
34b50 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
34b60 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  += n;.          
34b70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
34b80 20 20 20 20 20 20 20 20 20 20 7a 44 65 6c 5b 6e            zDel[n
34b90 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  Byte] = '\0';.  
34ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34bb0 0a 20 20 20 20 20 20 7a 49 6e 20 3d 20 7a 44 65  .      zIn = zDe
34bc0 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  l;.    }..    as
34bd0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
34be0 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a 4f 75 74  _OK || zIn!=zOut
34bf0 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27 2f 27 20   || zIn[0]=='/' 
34c00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
34c10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 49 6e 21  QLITE_OK && zIn!
34c20 3d 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  =zOut ){.      r
34c30 63 20 3d 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61  c = mkFullPathna
34c40 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c 20 6e 4f  me(zIn, zOut, nO
34c50 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ut);.    }.    i
34c60 66 28 20 62 4c 69 6e 6b 3d 3d 30 20 29 20 62 72  f( bLink==0 ) br
34c70 65 61 6b 3b 0a 20 20 20 20 7a 49 6e 20 3d 20 7a  eak;.    zIn = z
34c80 4f 75 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  Out;.  }while( r
34c90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
34ca0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
34cb0 7a 44 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  zDel);.  return 
34cc0 72 63 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20  rc;.#endif   /* 
34cd0 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 20 26 26  HAVE_READLINK &&
34ce0 20 48 41 56 45 5f 4c 53 54 41 54 20 2a 2f 0a 7d   HAVE_LSTAT */.}
34cf0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
34d00 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
34d10 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
34d20 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
34d30 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
34d40 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
34d50 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
34d60 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
34d70 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
34d80 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
34d90 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c  ibrary..*/.#incl
34da0 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74  ude <dlfcn.h>.st
34db0 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
34dc0 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
34dd0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73  s *NotUsed, cons
34de0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
34df0 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
34e00 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
34e10 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e  .  return dlopen
34e20 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44  (zFilename, RTLD
34e30 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42  _NOW | RTLD_GLOB
34e40 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  AL);.}../*.** SQ
34e50 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
34e60 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61  function immedia
34e70 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c  tely after a cal
34e80 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29  l to unixDlSym()
34e90 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65   or.** unixDlOpe
34ea0 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72  n() fails (retur
34eb0 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  ns a null pointe
34ec0 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65  r). If a more de
34ed0 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20  tailed error.** 
34ee0 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c  message is avail
34ef0 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74  able, it is writ
34f00 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20  ten to zBufOut. 
34f10 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73  If no error mess
34f20 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  age.** is availa
34f30 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20  ble, zBufOut is 
34f40 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20  left unmodified 
34f50 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20  and SQLite uses 
34f60 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72  a default.** err
34f70 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73  or message..*/.s
34f80 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
34f90 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
34fa0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
34fb0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
34fc0 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  fOut){.  const c
34fd0 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
34fe0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
34ff0 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e  tUsed);.  unixEn
35000 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45  terMutex();.  zE
35010 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a  rr = dlerror();.
35020 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
35030 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
35040 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
35050 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
35060 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
35070 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
35080 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d  void (*unixDlSym
35090 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
350a0 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20  tUsed, void *p, 
350b0 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29  const char*zSym)
350c0 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20  )(void){.  /* . 
350d0 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65   ** GCC with -pe
350e0 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61  dantic-errors sa
350f0 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73  ys that C90 does
35100 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69   not allow a voi
35110 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61  d* to be.  ** ca
35120 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  st into a pointe
35130 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
35140 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69    And yet the li
35150 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f  brary dlsym() ro
35160 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72  utine.  ** retur
35170 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68  ns a void* which
35180 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
35190 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
351a0 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77  on.  So how do w
351b0 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d  e.  ** use dlsym
351c0 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  () with -pedanti
351d0 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20  c-errors?.  **. 
351e0 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62   ** Variable x b
351f0 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20  elow is defined 
35200 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  to be a pointer 
35210 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61  to a function ta
35220 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65  king.  ** parame
35230 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63  ters void* and c
35240 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72  onst char* and r
35250 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74  eturning a point
35260 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
35270 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61  ..  ** We initia
35280 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e  lize x by assign
35290 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72  ing it a pointer
352a0 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20   to the dlsym() 
352b0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28  function..  ** (
352c0 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  That assignment 
352d0 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e  requires a cast.
352e0 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20  )  Then we call 
352f0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
35300 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20  t.  ** x points 
35310 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  to.  .  **.  ** 
35320 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  This work-around
35330 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20   is unlikely to 
35340 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
35350 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65  n any system whe
35360 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c  re.  ** you real
35370 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61  ly cannot cast a
35380 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
35390 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42  r into void*.  B
353a0 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a  ut then, on the.
353b0 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c    ** other hand,
353c0 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f   dlsym() will no
353d0 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61  t work on such a
353e0 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20   system either, 
353f0 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  so we have.  ** 
35400 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20  not really lost 
35410 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  anything..  */. 
35420 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69   void (*(*x)(voi
35430 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
35440 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  (void);.  UNUSED
35450 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
35460 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64  ed);.  x = (void
35470 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  (*(*)(void*,cons
35480 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29  t char*))(void))
35490 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20  dlsym;.  return 
354a0 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d  (*x)(p, zSym);.}
354b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
354c0 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
354d0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
354e0 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
354f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
35500 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c  R(NotUsed);.  dl
35510 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
35520 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
35530 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
35540 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
35550 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
35560 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
35570 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
35580 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
35590 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
355a0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
355b0 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
355c0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
355d0 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
355e0 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
355f0 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
35600 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
35610 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
35620 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
35630 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
35640 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
35650 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
35660 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65  NotUsed);.  asse
35670 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e  rt((size_t)nBuf>
35680 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  =(sizeof(time_t)
35690 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a  +sizeof(int)));.
356a0 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
356b0 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
356c0 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
356d0 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
356e0 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
356f0 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
35700 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
35710 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
35720 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
35730 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
35740 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
35750 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
35760 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
35770 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
35780 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
35790 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
357a0 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
357b0 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
357c0 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
357d0 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
357e0 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
357f0 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
35800 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
35810 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
35820 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
35830 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
35840 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
35850 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
35860 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
35870 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
35880 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
35890 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
358a0 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
358b0 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
358c0 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
358d0 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
358e0 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b  uence.  This mak
358f0 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
35900 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
35910 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
35920 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 61  , 0, nBuf);.  ra
35930 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73  ndomnessPid = os
35940 47 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69 66  Getpid(0);  .#if
35950 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
35960 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e  _TEST) && !defin
35970 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
35980 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a 20  ANDOMNESS).  {. 
35990 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a     int fd, got;.
359a0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
359b0 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
359c0 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30  om", O_RDONLY, 0
359d0 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
359e0 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20  ){.      time_t 
359f0 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74  t;.      time(&t
35a00 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
35a10 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66  zBuf, &t, sizeof
35a20 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (t));.      memc
35a30 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
35a40 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73  t)], &randomness
35a50 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64  Pid, sizeof(rand
35a60 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20 20  omnessPid));.   
35a70 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
35a80 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64  f(t)+sizeof(rand
35a90 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69 7a  omnessPid)<=(siz
35aa0 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  e_t)nBuf );.    
35ab0 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28    nBuf = sizeof(
35ac0 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64  t) + sizeof(rand
35ad0 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20 20  omnessPid);.    
35ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b  }else{.      do{
35af0 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64   got = osRead(fd
35b00 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d  , zBuf, nBuf); }
35b10 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
35b20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
35b30 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
35b40 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
35b50 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  __);.    }.  }.#
35b60 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
35b70 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  Buf;.}.../*.** S
35b80 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
35b90 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
35ba0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
35bb0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
35bc0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
35bd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
35be0 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  oseconds we want
35bf0 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68   to sleep..** Th
35c00 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
35c10 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
35c20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20  microseconds of 
35c30 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a  sleep actually.*
35c40 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
35c50 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
35c60 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
35c70 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68  , a number which
35c80 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65  .** might be gre
35c90 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
35ca0 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  al to the argume
35cb0 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73  nt, but not less
35cc0 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67  .** than the arg
35cd0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
35ce0 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73   int unixSleep(s
35cf0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
35d00 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  sed, int microse
35d10 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56  conds){.#if OS_V
35d20 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
35d30 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20  timespec sp;..  
35d40 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72  sp.tv_sec = micr
35d50 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30  oseconds / 10000
35d60 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63  00;.  sp.tv_nsec
35d70 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
35d80 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30   % 1000000) * 10
35d90 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28  00;.  nanosleep(
35da0 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e  &sp, NULL);.  UN
35db0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
35dc0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
35dd0 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
35de0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
35df0 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
35e00 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65  VE_USLEEP.  usle
35e10 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  ep(microseconds)
35e20 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
35e30 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
35e40 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
35e50 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  onds;.#else.  in
35e60 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63  t seconds = (mic
35e70 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39  roseconds+999999
35e80 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65  )/1000000;.  sle
35e90 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  ep(seconds);.  U
35ea0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
35eb0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
35ec0 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
35ed0 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
35ee0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
35ef0 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
35f00 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
35f10 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
35f20 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
35f30 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
35f40 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
35f50 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
35f60 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
35f70 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
35f80 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
35f90 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
35fa0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
35fb0 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
35fc0 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
35fd0 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
35fe0 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
35ff0 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
36000 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
36010 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
36020 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
36030 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
36040 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
36050 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
36060 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
36070 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
36080 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
36090 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
360a0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
360b0 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
360c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
360d0 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
360e0 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
360f0 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
36100 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
36110 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
36120 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
36130 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
36140 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
36150 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
36160 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
36170 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
36180 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
36190 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
361a0 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
361b0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
361c0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
361d0 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
361e0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
361f0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
36200 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
36210 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
36220 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
36230 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
36240 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
36250 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
36260 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  ITE_OK;.#if defi
36270 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
36280 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
36290 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
362a0 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
362b0 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)t)*1000 + unix
362c0 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
362d0 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
362e0 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
362f0 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
36300 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
36310 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
36320 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
36330 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
36340 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
36350 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
36360 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
36370 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
36380 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67 65 74 74  ow;.  (void)gett
36390 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20  imeofday(&sNow, 
363a0 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 66  0);  /* Cannot f
363b0 61 69 6c 20 67 69 76 65 6e 20 76 61 6c 69 64 20  ail given valid 
363c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 2a  arguments */.  *
363d0 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
363e0 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
363f0 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
36400 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  sec + sNow.tv_us
36410 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a  ec/1000;.#endif.
36420 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
36430 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
36440 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
36450 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
36460 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
36470 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
36480 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
36490 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
364a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
364b0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
364c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
364d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
364e0 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
364f0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
36500 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
36510 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
36520 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
36530 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
36540 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
36550 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
36560 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
36570 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
36580 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
36590 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
365a0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
365b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
365c0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73  nixCurrentTime(s
365d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
365e0 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  sed, double *prN
365f0 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ow){.  sqlite3_i
36600 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e  nt64 i = 0;.  in
36610 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t rc;.  UNUSED_P
36620 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
36630 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75  );.  rc = unixCu
36640 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30  rrentTimeInt64(0
36650 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  , &i);.  *prNow 
36660 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
36670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
36680 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e  else.# define un
36690 69 78 43 75 72 72 65 6e 74 54 69 6d 65 20 30 0a  ixCurrentTime 0.
366a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
366b0 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  e xGetLastError(
366c0 29 20 6d 65 74 68 6f 64 20 69 73 20 64 65 73 69  ) method is desi
366d0 67 6e 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61  gned to return a
366e0 20 62 65 74 74 65 72 0a 2a 2a 20 6c 6f 77 2d 6c   better.** low-l
366f0 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61  evel error messa
36700 67 65 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e  ge when operatin
36710 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d  g-system problem
36720 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72  s come up.** dur
36730 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61  ing SQLite opera
36740 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74 68 65 20  tion.  Only the 
36750 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63  integer return c
36760 6f 64 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ode is currently
36770 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61  .** used..*/.sta
36780 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c  tic int unixGetL
36790 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
367a0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
367b0 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61  nt NotUsed2, cha
367c0 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20  r *NotUsed3){.  
367d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
367e0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55  (NotUsed);.  UNU
367f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
36800 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45  tUsed2);.  UNUSE
36810 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
36820 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed3);.  return 
36830 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  errno;.}.../*.**
36840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36850 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71  ****** End of sq
36860 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
36870 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
36880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
36890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
368a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
368b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
368c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
368d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
368e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
368f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
36930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36940 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
36950 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  Proxy Locking **
36960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
36980 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
36990 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f  ng is a "uber-lo
369a0 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e  cking-method" in
369b0 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74   this sense:  It
369c0 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68   uses the.** oth
369d0 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  er locking metho
369e0 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20  ds on secondary 
369f0 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f  lock files.  Pro
36a00 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a  xy locking is a.
36a10 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76  ** meta-layer ov
36a20 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72  er top of the pr
36a30 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
36a40 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76  implemented abov
36a50 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20  e.  For.** this 
36a60 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
36a70 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
36a80 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f  ents of proxy lo
36a90 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65  cking is deferre
36aa0 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20  d.** until late 
36ab0 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72  in the file (her
36ac0 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20  e) after all of 
36ad0 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65  the other I/O me
36ae0 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65  thods have.** be
36af0 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20  en defined - so 
36b00 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69  that the primiti
36b10 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ve locking metho
36b20 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ds are available
36b30 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20  .** as services 
36b40 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65  to help with the
36b50 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
36b60 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
36b70 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  ..**.****.**.** 
36b80 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  The default lock
36b90 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53  ing schemes in S
36ba0 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72  QLite use byte-r
36bb0 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ange locks on th
36bc0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
36bd0 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  le to coordinate
36be0 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e   safe, concurren
36bf0 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  t access by mult
36c00 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  iple readers.** 
36c10 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74  and writers [htt
36c20 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c  p://sqlite.org/l
36c30 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20  ockingv3.html]. 
36c40 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c   The five file l
36c50 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  ocking.** states
36c60 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44   (UNLOCKED, PEND
36c70 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53  ING, SHARED, RES
36c80 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45  ERVED, EXCLUSIVE
36c90 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
36ca0 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65  d.** as POSIX re
36cb0 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73  ad & write locks
36cc0 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20   over fixed set 
36cd0 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69  of locations (vi
36ce0 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20  a fsctl),.** on 
36cf0 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79  AFP and SMB only
36d00 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d   exclusive byte-
36d10 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
36d20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73  available via fs
36d30 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57  ctl.** with _IOW
36d40 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
36d50 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
36d60 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65  B2) to track the
36d70 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a   same 5 states..
36d80 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61  ** To simulate a
36d90 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20   F_RDLCK on the 
36da0 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e  shared range, on
36db0 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20   AFP a randomly 
36dc0 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72  selected.** addr
36dd0 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65  ess in the share
36de0 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
36df0 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f   for a SHARED lo
36e00 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a  ck, the entire.*
36e10 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  * shared range i
36e20 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45  s taken for an E
36e30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a  XCLUSIVE lock):.
36e40 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49  **.**      PENDI
36e50 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30  NG_BYTE        0
36e60 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20  x40000000.**    
36e70 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
36e80 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
36e90 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
36ea0 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
36eb0 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
36ec0 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
36ed0 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
36ee0 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
36ef0 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
36f00 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
36f10 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
36f20 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
36f30 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
36f40 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
36f50 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
36f60 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
36f70 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
36f80 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
36f90 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
36fa0 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
36fb0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
36fc0 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
36fd0 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
36fe0 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
36ff0 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
37000 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
37010 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
37020 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
37030 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
37040 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
37050 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
37060 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
37070 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
37080 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
37090 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
370a0 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
370b0 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
370c0 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
370d0 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
370e0 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
370f0 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
37100 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
37110 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
37120 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
37130 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
37140 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
37150 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
37160 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
37170 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
37180 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
37190 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
371a0 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
371b0 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
371c0 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
371d0 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
371e0 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
371f0 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
37200 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
37210 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
37220 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
37230 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
37240 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
37250 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
37260 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
37270 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
37280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
37290 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
372a0 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
372b0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
372c0 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  me, SQLITE_FCNTL
372d0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
372e0 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  LE,.**          
372f0 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72               <pr
37300 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75  oxy_path> | ":au
37310 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74  to:");.**  sqlit
37320 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
37330 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
37340 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43  TE_FCNTL_GET_LOC
37350 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
37360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37370 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61 74       &<proxy_pat
37380 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51  h>);.**.**.** SQ
37390 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20  L pragmas.**.** 
373a0 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
373b0 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
373c0 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20  le=<proxy_path> 
373d0 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41  | :auto:.**  PRA
373e0 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
373f0 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a  ock_proxy_file.*
37400 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20  *.** Specifying 
37410 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74  ":auto:" means t
37420 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
37430 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74  a conch file wit
37440 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  h a matching.** 
37450 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74  host ID in it, t
37460 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e  he proxy path in
37470 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
37480 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74  will be used, ot
37490 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f  herwise.** a pro
374a0 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  xy path based on
374b0 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70   the user's temp
374c0 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e   dir.** (via con
374d0 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
374e0 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e  USER_TEMP_DIR,..
374f0 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .)) will be used
37500 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75   and the.** actu
37510 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61  al proxy file na
37520 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  me is generated 
37530 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e  from the name an
37540 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a  d path of the.**
37550 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
37560 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
37570 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61  .**       For da
37580 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73  tabase path "/Us
37590 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a  ers/me/foo.db" .
375a0 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63  **       The loc
375b0 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22  k path will be "
375c0 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70  <tmpdir>/sqlitep
375d0 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f  locks/_Users_me_
375e0 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a  foo.db:auto:").*
375f0 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b  *.** Once a lock
37600 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67   proxy is config
37610 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62  ured for a datab
37620 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
37630 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65  it can not.** be
37640 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65   removed, howeve
37650 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74  r it may be swit
37660 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
37670 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76  ent proxy path v
37680 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20  ia.** the above 
37690 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74  APIs (assuming t
376a0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
376b0 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20   not being held 
376c0 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f  by another.** co
376d0 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63  nnection or proc
376e0 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ess). .**.**.** 
376f0 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  How proxy lockin
37700 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  g works.** -----
37710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37720 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66  --.**.** Proxy f
37730 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69  ile locking reli
37740 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20  es primarily on 
37750 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69  two new supporti
37760 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a  ng files: .**.**
37770 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65     *  conch file
37780 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73   to limit access
37790 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
377a0 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c   file to a singl
377b0 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61  e host.**      a
377c0 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20  t a time.**.**  
377d0 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74   *  proxy file t
377e0 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79  o act as a proxy
377f0 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72   for the advisor
37800 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79  y locks normally
37810 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f  .**      taken o
37820 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
37830 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  *.** The conch f
37840 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70  ile - to use a p
37850 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74  roxy file, sqlit
37860 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f  e must first "ho
37870 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a  ld the conch".**
37880 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71   by taking an sq
37890 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65  lite-style share
378a0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
378b0 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e  nch file, readin
378c0 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
378d0 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20  s and comparing 
378e0 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75  the host's uniqu
378f0 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62  e host ID (see b
37900 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a  elow) and lock.*
37910 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61  * proxy path aga
37920 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20  inst the values 
37930 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
37940 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20  nch.  The conch 
37950 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65  file is.** store
37960 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  d in the same di
37970 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64  rectory as the d
37980 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
37990 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a   the file name.*
379a0 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61  * is patterned a
379b0 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
379c0 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22  e file name as "
379d0 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d  .<databasename>-
379e0 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68  conch"..** If th
379f0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65  e conch file doe
37a00 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
37a10 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  its contents do 
37a20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a  not match the.**
37a30 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20   host ID and/or 
37a40 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e  proxy path, then
37a50 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63   the lock is esc
37a60 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63  alated to an exc
37a70 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61  lusive.** lock a
37a80 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  nd the conch fil
37a90 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70  e contents is up
37aa0 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68  dated with the h
37ab0 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79  ost ID and proxy
37ac0 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65  .** path and the
37ad0 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61   lock is downgra
37ae0 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20  ded to a shared 
37af0 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20  lock again.  If 
37b00 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20  the conch.** is 
37b10 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
37b20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20  process (with a 
37b30 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68  shared lock), th
37b40 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
37b50 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  .** will fail an
37b60 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  d SQLITE_BUSY is
37b70 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
37b80 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
37b90 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  - a single-byte 
37ba0 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c  file used for al
37bb0 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20  l advisory file 
37bc0 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  locks.** normall
37bd0 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64  y taken on the d
37be0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20  atabase file.   
37bf0 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20  This allows for 
37c00 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  safe sharing.** 
37c10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
37c20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c  file for multipl
37c30 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  e readers and wr
37c40 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  iters on the sam
37c50 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63  e.** host (the c
37c60 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61  onch ensures tha
37c70 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74  t they all use t
37c80 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f  he same local lo
37c90 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20  ck file)..**.** 
37ca0 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c  Requesting the l
37cb0 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e  ock proxy does n
37cc0 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  ot immediately t
37cd0 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69  ake the conch, i
37ce0 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b  t is.** only tak
37cf0 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  en when the firs
37d00 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63  t request to loc
37d10 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
37d20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68  is made.  .** Th
37d30 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73  is matches the s
37d40 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20  emantics of the 
37d50 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b  traditional lock
37d60 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68  ing behavior, wh
37d70 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61  ere.** opening a
37d80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
37d90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
37da0 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c  oes not take a l
37db0 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68  ock on it..** Th
37dc0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  e shared lock an
37dd0 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  d an open file d
37de0 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61  escriptor are ma
37df0 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a  intained until .
37e00 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
37e10 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
37e20 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a  e is closed. .**
37e30 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
37e40 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  le and the lock 
37e50 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64  file are never d
37e60 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f  eleted so they o
37e70 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  nly need.** to b
37e80 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  e created the fi
37e90 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72  rst time they ar
37ea0 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  e used..**.** Co
37eb0 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
37ec0 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ons.** ---------
37ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
37ee0 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45  **  SQLITE_PREFE
37ef0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
37f00 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61  **.**       Data
37f10 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73  base files acces
37f20 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c  sed on non-local
37f30 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72   file systems ar
37f40 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d  e.**       autom
37f50 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75  atically configu
37f60 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  red for proxy lo
37f70 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65  cking, lock file
37f80 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e  s are.**       n
37f90 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
37fa0 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ly using the sam
37fb0 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20  e logic as.**   
37fc0 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
37fd0 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74  proxy_file=":aut
37fe0 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53  o:".**    .**  S
37ff0 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
38000 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e  G.**.**       En
38010 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e  ables the loggin
38020 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61  g of error messa
38030 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20  ges during host 
38040 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  id file.**      
38050 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63   retrieval and c
38060 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c  reation.**.**  L
38070 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a  OCKPROXYDIR.**.*
38080 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65  *       Override
38090 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69  s the default di
380a0 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72  rectory used for
380b0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
380c0 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  s that.**       
380d0 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61  are named automa
380e0 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20  tically via the 
380f0 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67  ":auto:" setting
38100 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44  .**.**  SQLITE_D
38110 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
38120 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a  PERMISSIONS.**.*
38130 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69  *       Permissi
38140 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ons to use when 
38150 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63  creating a direc
38160 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67  tory for storing
38170 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f   the.**       lo
38180 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20  ck proxy files, 
38190 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c  only used when L
381a0 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e  OCKPROXYDIR is n
381b0 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a  ot set..**    .*
381c0 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74  *    .** As ment
381d0 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65  ioned above, whe
381e0 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  n compiled with 
381f0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
38200 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20  OXY_LOCKING,.** 
38210 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69  setting the envi
38220 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
38230 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
38240 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31  OXY_LOCKING to 1
38250 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70   will.** force p
38260 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
38270 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72  be used for ever
38280 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
38290 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a  opened, and 0.**
382a0 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f   will force auto
382b0 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b  matic proxy lock
382c0 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ing to be disabl
382d0 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ed for all datab
382e0 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78  ase.** files (ex
382f0 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67  plicitly calling
38300 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
38310 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
38320 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
38330 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
38340 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
38350 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
38360 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
38370 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
38380 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
38390 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
383a0 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
383b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
383c0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
383d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
383e0 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  _STYLE../*.** Th
383f0 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
38400 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
38410 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
38420 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
38430 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
38440 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
38450 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
38460 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
38470 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
38480 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
38490 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
384a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
384b0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
384c0 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
384d0 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
384e0 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
384f0 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
38500 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
38510 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
38520 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
38530 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
38540 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
38550 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
38560 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
38570 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
38580 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
38590 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
385a0 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
385b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
385c0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
385d0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  i