/ Hex Artifact Content
Login

Artifact 661b48c533c762452f6046a167679b8cd501b217:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0c80: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0c90: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0cb0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0cc0: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0cd0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0ce0: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0cf0: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0d00: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0d10: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0d30: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0d40: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0d50: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0d60: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0d70: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0d80: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0d90: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0da0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0db0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0dc0: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0dd0: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0de0: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0df0: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0e00: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0e10: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0e20: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0e30: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0e40: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0e50: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0e60: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0e70: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0e80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0e90: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0ea0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0eb0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
0ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0ed0: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
0ee0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0ef0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
0f00: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
0f10: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
0f20: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
0f30: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
0f40: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0f50: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
0f60: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
0f70: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
0f80: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
0f90: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
0fa0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0fb0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0fc0: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0fd0: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0fe0: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0ff0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1000: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1010: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1020: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1040: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1060: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1070: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
1080: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
1090: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
10a0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
10b0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
10c0: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10d0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
10e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
10f0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1100: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1110: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1120: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1130: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1140: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1160: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1170: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1190: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
11a0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
11b0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
11c0: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c  HNAME 512../* Al
11d0: 77 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65  ways cast the ge
11e0: 74 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79  tpid() return ty
11f0: 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  pe for compatibi
1200: 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72  lity with.** ker
1210: 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56  nel modules in V
1220: 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69  xWorks. */.#defi
1230: 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28  ne osGetpid(X) (
1240: 70 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a  pid_t)getpid()..
1250: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1260: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1270: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1280: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1290: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
12a0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
12b0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
12c0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
12d0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
12e0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
12f0: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1300: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1310: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1320: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1330: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1340: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1350: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1360: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1370: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1380: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
13a0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
13b0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
13c0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
13d0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
13e0: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
13f0: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1400: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1410: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1420: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1430: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1440: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1450: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1460: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1470: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1480: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1490: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
14a0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
14b0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
14c0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
14d0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
14e0: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
14f0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1500: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1510: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1520: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1530: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1540: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1550: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1560: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1570: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1580: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
15b0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
15c0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
15e0: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
15f0: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1600: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1610: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1620: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1630: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1640: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1650: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1660: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1670: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1680: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1690: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
16a0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
16b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
16c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16d0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
16e0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
16f0: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1700: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1710: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1720: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1730: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1740: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1770: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1780: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1790: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
17c0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
17d0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1810: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1820: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1840: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1850: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1860: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1870: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1880: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1890: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
18a0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
18b0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
18e0: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
18f0: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1900: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1910: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1920: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1930: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1940: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1950: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1970: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1980: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
19a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
19d0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1a00: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1a10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1a20: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a40: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1a50: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1a70: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a80: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ab0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1ac0: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1ad0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ae0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1af0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1b00: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1b10: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1b20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1b30: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1b40: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1b50: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1b60: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1b80: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1b90: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ba0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1bb0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1bc0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1bf0: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1c10: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1c20: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1c40: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1c50: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1c60: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1c80: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1c90: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1cc0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1cd0: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1d00: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1d10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1d30: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1d40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1d60: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1d70: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1d80: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1d90: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1da0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1db0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1dc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1dd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1de0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1df0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1e00: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e10: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e20: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1e30: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1e40: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1e50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e60: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1e70: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1e80: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1e90: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1ea0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1eb0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1ec0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1ed0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1ee0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1ef0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f00: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f20: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1f30: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1f40: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1f50: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1f60: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1f70: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1f80: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fa0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fd0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ff0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2000: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2010: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2020: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2040: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2060: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2070: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2080: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2090: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
20a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
20b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
20d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
20e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
20f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2100: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2110: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2120: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2130: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2140: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2150: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2160: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2170: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2180: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2190: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
21a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
21b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
21c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
21d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
21e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
21f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2200: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2210: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2220: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2230: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2240: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2250: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2260: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2270: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2280: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2290: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
22a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
22b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
22c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
22d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
22e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
22f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2300: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2310: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2320: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2330: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2340: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2350: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2360: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2370: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2380: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2390: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
23a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
23b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
23c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
23d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
23e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
23f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2400: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2410: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2420: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2430: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2440: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2450: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2460: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2470: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2480: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2490: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
24a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
24b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
24d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
24e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
24f0: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2500: 45 5f 57 41 52 4e 45 44 20 20 20 20 30 78 30 31  E_WARNED    0x01
2510: 30 30 20 20 20 20 20 2f 2a 20 76 65 72 69 66 79  00     /* verify
2520: 44 62 46 69 6c 65 28 29 20 77 61 72 6e 69 6e 67  DbFile() warning
2530: 73 20 69 73 73 75 65 64 20 2a 2f 0a 23 64 65 66  s issued */.#def
2540: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 42 4c 4f  ine UNIXFILE_BLO
2550: 43 4b 20 20 20 20 20 30 78 30 32 30 30 20 20 20  CK     0x0200   
2560: 20 20 2f 2a 20 4e 65 78 74 20 53 48 4d 20 6c 6f    /* Next SHM lo
2570: 63 6b 20 6d 69 67 68 74 20 62 6c 6f 63 6b 20 2a  ck might block *
2580: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  /../*.** Include
2590: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
25a0: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
25b0: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
25c0: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
25d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  h"../*.** Define
25e0: 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20   various macros 
25f0: 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67  that are missing
2600: 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65   from some syste
2610: 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ms..*/.#ifndef O
2620: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
2630: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
2640: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
2650: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
2660: 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52  FS.# undef O_LAR
2670: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2680: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2690: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e  ndif.#ifndef O_N
26a0: 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65  OFOLLOW.# define
26b0: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65   O_NOFOLLOW 0.#e
26c0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42  ndif.#ifndef O_B
26d0: 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f  INARY.# define O
26e0: 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66  _BINARY 0.#endif
26f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
2700: 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c  adid macro resol
2710: 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61  ves to the threa
2720: 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55  d-id or to 0.  U
2730: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
2740: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
2750: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51   only..*/.#if SQ
2760: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
2770: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
2780: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
2790: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68  #else.#define th
27a0: 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a  readid 0.#endif.
27b0: 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d  ./*.** HAVE_MREM
27c0: 41 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74  AP defaults to t
27d0: 72 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64  rue on Linux and
27e0: 20 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72   false everywher
27f0: 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  e else..*/.#if !
2800: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45  defined(HAVE_MRE
2810: 4d 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65  MAP).# if define
2820: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
2830: 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55  defined(_GNU_SOU
2840: 52 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48  RCE).#  define H
2850: 41 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65  AVE_MREMAP 1.# e
2860: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41  lse.#  define HA
2870: 56 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e  VE_MREMAP 0.# en
2880: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  dif.#endif../*.*
2890: 2a 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c  * Explicitly cal
28a0: 6c 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72  l the 64-bit ver
28b0: 73 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20  sion of lseek() 
28c0: 6f 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65  on Android. Othe
28d0: 72 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a  rwise, lseek().*
28e0: 2a 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20  * is the 32-bit 
28f0: 76 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66  version, even if
2900: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
2910: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
2920: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e  ..*/.#ifdef __AN
2930: 44 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65  DROID__.# define
2940: 20 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23   lseek lseek64.#
2950: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66  endif../*.** Dif
2960: 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74  ferent Unix syst
2970: 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e  ems declare open
2980: 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  () in different 
2990: 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a  ways.  Same use.
29a0: 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  ** open(const ch
29b0: 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e  ar*,int,mode_t).
29c0: 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65    Others use ope
29d0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
29e0: 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64  t,...)..** The d
29f0: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70  ifference is imp
2a00: 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e  ortant when usin
2a10: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  g a pointer to t
2a20: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  he function..**.
2a30: 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61  ** The safest wa
2a40: 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  y to deal with t
2a50: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f  he problem is to
2a60: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73   always use this
2a70: 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63   wrapper.** whic
2a80: 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65  h always has the
2a90: 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e   same well-defin
2aa0: 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ed interface..*/
2ab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
2ac0: 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  xOpen(const char
2ad0: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *zFile, int fla
2ae0: 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20  gs, int mode){. 
2af0: 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69   return open(zFi
2b00: 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29  le, flags, mode)
2b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f  ;.}../*.** On so
2b20: 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c  me systems, call
2b30: 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69  s to fchown() wi
2b40: 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73  ll trigger a mes
2b50: 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69  sage in a securi
2b60: 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65  ty.** log if the
2b70: 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d  y come from non-
2b80: 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20  root processes. 
2b90: 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e   So avoid callin
2ba0: 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a  g fchown() if.**
2bb0: 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   we are not runn
2bc0: 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a  ing as root..*/.
2bd0: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
2be0: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
2bf0: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
2c00: 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  gid){.#if OS_VXW
2c10: 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 30 3b  ORKS.  return 0;
2c20: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
2c30: 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20  geteuid() ? 0 : 
2c40: 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69  fchown(fd,uid,gi
2c50: 64 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  d);.#endif.}../*
2c60: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
2c70: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
2c80: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
2c90: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
2ca0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
2cb0: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
2cc0: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
2cd0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2ce0: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2cf0: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2d00: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2d10: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2d20: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2d30: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2d40: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2d50: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2d60: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2d70: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2d80: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2d90: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2da0: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2db0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2dc0: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
2dd0: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
2de0: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
2df0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e10: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
2e20: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
2e30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
2e40: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
2e50: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
2e60: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
2e70: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
2e80: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
2e90: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
2ea0: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
2eb0: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
2ec0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
2ed0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
2ee0: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
2ef0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
2f00: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
2f10: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
2f20: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
2f30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
2f40: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
2f50: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2f60: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
2f70: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
2f80: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
2f90: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
2fa0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
2fb0: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
2fc0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2fd0: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
2fe0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
2ff0: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
3000: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3010: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
3020: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3030: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
3040: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3050: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
3060: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3070: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
3080: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
3090: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
30a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
30b0: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
30c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
30d0: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
30e0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
30f0: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
3100: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3110: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3120: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3130: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
3140: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
3150: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
3160: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
3170: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
3180: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
3190: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
31a0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
31b0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
31c0: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
31d0: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
31e0: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
31f0: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
3200: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
3210: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
3220: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
3230: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
3240: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
3250: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3260: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3270: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3280: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
3290: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
32a0: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
32b0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
32c0: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
32d0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
32e0: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
32f0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
3300: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3310: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
3320: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
3330: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
3340: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3350: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
3360: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
3370: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
3380: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
3390: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
33a0: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
33b0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
33c0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
33d0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
33e0: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
33f0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
3400: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
3410: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3420: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
3430: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3440: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
3450: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3460: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
3470: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
3480: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
3490: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
34a0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
34b0: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
34c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
34d0: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
34e0: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
34f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3500: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
3510: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3520: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
3530: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3540: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3550: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3560: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
3570: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3580: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
3590: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
35a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
35b0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
35c0: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
35d0: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
35e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
35f0: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
3600: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3610: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3620: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3630: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3640: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3650: 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73  osPread64   ((ss
3660: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
3670: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3680: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
3690: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
36a0: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
36b0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
36c0: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
36d0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
36e0: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
36f0: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3700: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3710: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3720: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3730: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
3740: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3750: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3760: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
3770: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3780: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
3790: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
37a0: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
37b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
37c0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
37d0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
37e0: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
37f0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3800: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
3810: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
3840: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3850: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3860: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3870: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3880: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3890: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
38a0: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
38b0: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
38c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
38d0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
38e0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
38f0: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3900: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3910: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3920: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3930: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
3940: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
3950: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  t)..  { "fchmod"
3960: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3970: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
3980: 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  mod,     0  },.#
3990: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
39a0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
39b0: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
39c0: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
39d0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
39e0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
39f0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3a00: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3a10: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3a20: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3a30: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3a40: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3a50: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3a60: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3a70: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3a80: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3a90: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3aa0: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3ab0: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3ac0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3ad0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ae0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3af0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3b00: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3b10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3b20: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3b30: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3b40: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3b50: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3b60: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3b70: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3b80: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3b90: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3ba0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3bb0: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3bc0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3bd0: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3be0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3bf0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3c00: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c10: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3c20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c30: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3c40: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3c50: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3c60: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3c70: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3c80: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3c90: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ca0: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3cb0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3cc0: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3cd0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3ce0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3cf0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
3d00: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3d10: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3d20: 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20  r)posixFchown,  
3d30: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3d40: 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e  osFchown    ((in
3d50: 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67  t(*)(int,uid_t,g
3d60: 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  id_t))aSyscall[2
3d70: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3d80: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3d90: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
3da0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
3db0: 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22  IZE>0.  { "mmap"
3dc0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3dd0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61  _syscall_ptr)mma
3de0: 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  p,     0 },.#def
3df0: 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69  ine osMmap ((voi
3e00: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3e10: 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f  _t,int,int,int,o
3e20: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ff_t))aSyscall[2
3e30: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
3e40: 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20  { "munmap",     
3e50: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3e60: 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20  ll_ptr)munmap,  
3e70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3e80: 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28  fine osMunmap ((
3e90: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
3ea0: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3eb0: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
3ec0: 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
3ed0: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
3ee0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3ef0: 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20  all_ptr)mremap, 
3f00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3f10: 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22  lse.  { "mremap"
3f20: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3f30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3f50: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3f60: 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f 69  e osMremap ((voi
3f70: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3f80: 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e  _t,size_t,int,..
3f90: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  .))aSyscall[23].
3fa0: 70 43 75 72 72 65 6e 74 29 0a 20 20 7b 20 22 67  pCurrent).  { "g
3fb0: 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73  etpagesize",  (s
3fc0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3fd0: 74 72 29 75 6e 69 78 47 65 74 70 61 67 65 73 69  tr)unixGetpagesi
3fe0: 7a 65 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65  ze, 0 },.#define
3ff0: 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28   osGetpagesize (
4000: 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53  (int(*)(void))aS
4010: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
4020: 65 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b  ent)..#endif..};
4030: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
4040: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
4050: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
4060: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
4070: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
4080: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
4090: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
40a0: 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56   the.** "unix" V
40b0: 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  FSes.  Return SQ
40c0: 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63  LITE_OK opon suc
40d0: 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69  cessfully updati
40e0: 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  ng the.** system
40f0: 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f   call pointer, o
4100: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
4110: 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  D if there is no
4120: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a   configurable.**
4130: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
4140: 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
4150: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53  tic int unixSetS
4160: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4170: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4180: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
4190: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
41a0: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
41b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
41d0: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
41e0: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
41f0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
4200: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
4210: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
4220: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
4230: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
4240: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
4250: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4260: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
4270: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
4280: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
4290: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
42a0: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
42b0: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
42c0: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
42d0: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
42e0: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
42f0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
4300: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
4310: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
4320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
4330: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
4340: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
4350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4360: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
4370: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
4380: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
4390: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
43a0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
43b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
43c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
43d0: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
43e0: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
43f0: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
4400: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
4410: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
4420: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4430: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
4440: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
4450: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
4460: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
4470: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
4480: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
4490: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
44a0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
44b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
44c0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
44d0: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
44e0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
44f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
4500: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
4510: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
4520: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
4530: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
4540: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
4550: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4560: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
4570: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4580: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4590: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
45a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
45b0: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
45c0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
45d0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
45e0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
45f0: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
4600: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
4610: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
4620: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
4630: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
4640: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
4650: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
4660: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69  _syscall_ptr uni
4670: 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xGetSystemCall(.
4680: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
4690: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
46a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
46b0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
46c0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
46d0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
46e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
46f0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
4700: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
4710: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
4720: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
4730: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4740: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
4750: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4760: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
4770: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
4780: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
4790: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
47a0: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
47b0: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
47c0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
47d0: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
47e0: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
47f0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4800: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
4810: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
4820: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
4830: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
4840: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
4850: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
4860: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
4870: 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74  ar *unixNextSyst
4880: 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76  emCall(sqlite3_v
4890: 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  fs *p, const cha
48a0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
48b0: 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53   i = -1;..  UNUS
48c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
48d0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
48e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
48f0: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
4900: 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l)-1; i++){.    
4910: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
4920: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
4930: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
4940: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
4950: 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53  or(i++; i<ArrayS
4960: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69  ize(aSyscall); i
4970: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79  ++){.    if( aSy
4980: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4990: 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  t!=0 ) return aS
49a0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b  yscall[i].zName;
49b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
49c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  .}../*.** Do not
49d0: 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65   accept any file
49e0: 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73   descriptor less
49f0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
4a00: 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  , in order to av
4a10: 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64  oid.** opening d
4a20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 69  atabase file usi
4a30: 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ng file descript
4a40: 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ors that are com
4a50: 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a  monly used for .
4a60: 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  ** standard inpu
4a70: 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65  t, output, and e
4a80: 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  rror..*/.#ifndef
4a90: 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f   SQLITE_MINIMUM_
4aa0: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a  FILE_DESCRIPTOR.
4ab0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
4ac0: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
4ad0: 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66  CRIPTOR 3.#endif
4ae0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f  ../*.** Invoke o
4af0: 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75  pen().  Do so mu
4b00: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e  ltiple times, un
4b10: 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73 75  til it either su
4b20: 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69  cceeds or.** fai
4b30: 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73  ls for some reas
4b40: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49  on other than EI
4b50: 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  NTR..**.** If th
4b60: 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20  e file creation 
4b70: 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74 68  mode "m" is 0 th
4b80: 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68 65  en set it to the
4b90: 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20   default for.** 
4ba0: 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66  SQLite.  The def
4bb0: 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44  ault is SQLITE_D
4bc0: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
4bd0: 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c  ISSIONS (normall
4be0: 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f  y.** 0644) as mo
4bf0: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73 79  dified by the sy
4c00: 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20  stem umask.  If 
4c10: 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  m is not 0, then
4c20: 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c  .** make the fil
4c30: 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20  e creation mode 
4c40: 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e  be exactly m ign
4c50: 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e  oring the umask.
4c60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72  .**.** The m par
4c70: 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e  ameter will be n
4c80: 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65  on-zero only whe
4c90: 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c  n creating -wal,
4ca0: 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e   -journal,.** an
4cb0: 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57  d -shm files.  W
4cc0: 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c  e want those fil
4cd0: 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63  es to have *exac
4ce0: 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a  tly* the same.**
4cf0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20   permissions as 
4d00: 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
4d10: 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74  atabase, unadult
4d20: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75 6d  erated by the um
4d30: 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  ask..** In that 
4d40: 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62 61  way, if a databa
4d50: 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72  se file is -rw-r
4d60: 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72  w-rw or -rw-rw-r
4d70: 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e  -, and a.** tran
4d80: 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20  saction crashes 
4d90: 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e  and leaves behin
4da0: 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20  d hot journals, 
4db0: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63  then any.** proc
4dc0: 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c 65  ess that is able
4dd0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
4de0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61   database will a
4df0: 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a  lso be able to.*
4e00: 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f  * recover the ho
4e10: 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73  t journals..*/.s
4e20: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4e30: 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
4e40: 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65   *z, int f, mode
4e50: 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b  _t m){.  int fd;
4e60: 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d  .  mode_t m2 = m
4e70: 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45   ? m : SQLITE_DE
4e80: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
4e90: 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28  SSIONS;.  while(
4ea0: 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  1){.#if defined(
4eb0: 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66  O_CLOEXEC).    f
4ec0: 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f  d = osOpen(z,f|O
4ed0: 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65  _CLOEXEC,m2);.#e
4ee0: 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f  lse.    fd = osO
4ef0: 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e  pen(z,f,m2);.#en
4f00: 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30  dif.    if( fd<0
4f10: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
4f20: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e  rno==EINTR ) con
4f30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65  tinue;.      bre
4f40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
4f50: 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e  ( fd>=SQLITE_MIN
4f60: 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49  IMUM_FILE_DESCRI
4f70: 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20  PTOR ) break;.  
4f80: 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20    osClose(fd);. 
4f90: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
4fa0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a  QLITE_WARNING, .
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fc0: 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e  "attempt to open
4fd0: 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20   \"%s\" as file 
4fe0: 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20  descriptor %d", 
4ff0: 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d  z, fd);.    fd =
5000: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f   -1;.    if( osO
5010: 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c  pen("/dev/null",
5020: 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b   f, m)<0 ) break
5030: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d  ;.  }.  if( fd>=
5040: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d  0 ){.    if( m!=
5050: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
5060: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a  t stat statbuf;.
5070: 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
5080: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d  t(fd, &statbuf)=
5090: 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74  =0 .       && st
50a0: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  atbuf.st_size==0
50b0: 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74  .       && (stat
50c0: 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37  buf.st_mode&0777
50d0: 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20  )!=m .      ){. 
50e0: 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28         osFchmod(
50f0: 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, m);.      }.
5100: 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
5110: 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26  d(FD_CLOEXEC) &&
5120: 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f   (!defined(O_CLO
5130: 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58  EXEC) || O_CLOEX
5140: 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e  EC==0).    osFcn
5150: 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
5160: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
5170: 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
5180: 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
5190: 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d  }.  return fd;.}
51a0: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
51b0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
51c0: 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
51d0: 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
51e0: 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
51f0: 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
5200: 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75  to protect the u
5210: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64  nixInodeInfo and
5220: 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  .** vxworksFileI
5230: 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  d objects used b
5240: 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  y this file, all
5250: 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
5260: 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d   .** shared by m
5270: 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
5280: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
5290: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
52a0: 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
52b0: 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
52c0: 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
52d0: 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
52e0: 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
52f0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
5300: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
5310: 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
5320: 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
5330: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
5340: 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
5350: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5360: 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74   );.**   unixEnt
5370: 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61  erLeave().*/.sta
5380: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74  tic void unixEnt
5390: 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
53a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
53b0: 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
53c0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
53d0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
53e0: 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
53f0: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
5400: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
5410: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
5420: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5430: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5440: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
5450: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5460: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
5470: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f  unixMutexHeld(vo
5480: 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
5490: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
54a0: 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
54b0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
54c0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
54d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
54e0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
54f0: 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48  OS_TRACE./*.** H
5500: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
5510: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
5520: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
5530: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
5540: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
5550: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
5560: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
5570: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
5580: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
5590: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
55a0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
55b0: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
55c0: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
55d0: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
55e0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
55f0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
5600: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
5610: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
5620: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
5630: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
5640: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
5650: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
5660: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
5670: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
5680: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
5690: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
56a0: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
56b0: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
56c0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
56d0: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
56e0: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
56f0: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
5700: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
5710: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
5720: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5730: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
5740: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
5750: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
5760: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
5770: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
5780: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
5790: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
57a0: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
57b0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
57c0: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
57d0: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
57e0: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
57f0: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
5800: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
5810: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
5820: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
5830: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
5840: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
5850: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
5860: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
5870: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
5880: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
5890: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
58a0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
58b0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
58c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
58d0: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
58e0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
58f0: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
5900: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
5910: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
5920: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
5930: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
5940: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
5950: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
5960: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
5970: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
5980: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
5990: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
59a0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
59b0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
59c0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
59d0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
59e0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
59f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
5a00: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
5a10: 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e  T );.  s = osFcn
5a20: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
5a30: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
5a40: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
5a50: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
5a60: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
5a70: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
5a80: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
5a90: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
5aa0: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
5ab0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
5ac0: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
5ad0: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
5ae0: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
5af0: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
5b00: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
5b10: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
5b20: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
5b30: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
5b40: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63  2 = *p;.    osFc
5b50: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
5b60: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
5b70: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
5b80: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
5b90: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
5ba0: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
5bb0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
5bc0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
5bd0: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
5be0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
5bf0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
5c00: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
5c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5c20: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
5c30: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5c40: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
5c50: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
5c60: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
5c70: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
5c80: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
5c90: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
5ca0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
5cb0: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
5cc0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
5cd0: 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66  turn s;.}.#undef
5ce0: 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65   osFcntl.#define
5cf0: 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61   osFcntl lockTra
5d00: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
5d10: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
5d20: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  /../*.** Retry f
5d30: 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73  truncate() calls
5d40: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
5d50: 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c  o EINTR.**.** Al
5d60: 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e  l calls to ftrun
5d70: 63 61 74 65 28 29 20 77 69 74 68 69 6e 20 74 68  cate() within th
5d80: 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  is file should b
5d90: 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68 0a 2a  e made through.*
5da0: 2a 20 74 68 69 73 20 77 72 61 70 70 65 72 2e 20  * this wrapper. 
5db0: 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69 64 20   On the Android 
5dc0: 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61 73 73  platform, bypass
5dd0: 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20 62 65  ing the logic be
5de0: 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61  low.** could lea
5df0: 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74 20 64  d to a corrupt d
5e00: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
5e10: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
5e20: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
5e30: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
5e40: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64  {.  int rc;.#ifd
5e50: 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20  ef __ANDROID__. 
5e60: 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20   /* On Android, 
5e70: 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c 77 61  ftruncate() alwa
5e80: 79 73 20 75 73 65 73 20 33 32 2d 62 69 74 20 6f  ys uses 32-bit o
5e90: 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69 66 20  ffsets, even if 
5ea0: 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53  .  ** _FILE_OFFS
5eb0: 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65  ET_BITS=64 is de
5ec0: 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  fined. This mean
5ed0: 73 20 69 74 20 69 73 20 75 6e 73 61 66 65 20 74  s it is unsafe t
5ee0: 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a  o attempt to.  *
5ef0: 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  * truncate a fil
5f00: 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61  e to any size la
5f10: 72 67 65 72 20 74 68 61 6e 20 32 47 69 42 2e 20  rger than 2GiB. 
5f20: 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20  Silently ignore 
5f30: 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 61 74  any.  ** such at
5f40: 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66  tempts.  */.  if
5f50: 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e  ( sz>(sqlite3_in
5f60: 74 36 34 29 30 78 37 46 46 46 46 46 46 46 20 29  t64)0x7FFFFFFF )
5f70: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
5f80: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  E_OK;.  }else.#e
5f90: 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20  ndif.  do{ rc = 
5fa0: 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a  osFtruncate(h,sz
5fb0: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
5fc0: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
5fd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5ff0: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
6000: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
6010: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
6020: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
6030: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
6040: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
6050: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
6060: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
6070: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
6080: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
6090: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
60a0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
60b0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
60c0: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
60d0: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
60e0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
60f0: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
6100: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
6110: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
6120: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
6130: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
6140: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
6150: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
6160: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
6170: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
6180: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
6190: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
61a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
61b0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
61c0: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
61d0: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
61e0: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
61f0: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
6200: 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41 74 20  {.#if 0.  /* At 
6210: 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 63  one point this c
6220: 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d  ode was not comm
6230: 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20 74 68  ented out. In th
6240: 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61 6e 63  eory, this branc
6250: 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 65  h.  ** should ne
6260: 76 65 72 20 62 65 20 68 69 74 2c 20 61 73 20 74  ver be hit, as t
6270: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
6280: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
6290: 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20 61 20  ed after.  ** a 
62a0: 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64 20  locking-related 
62b0: 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66  function (i.e. f
62c0: 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65 74 75  cntl()) has retu
62d0: 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69  rned non-zero wi
62e0: 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  th.  ** the valu
62f0: 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20 74 68  e of errno as th
6300: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
6310: 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74 65 6d  . Since a system
6320: 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c 65 64   call has failed
6330: 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68 6f  ,.  ** errno sho
6340: 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e  uld be non-zero.
6350: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70 69  .  **.  ** Despi
6360: 74 65 20 74 68 69 73 2c 20 69 66 20 65 72 72 6e  te this, if errn
6370: 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f  o really is zero
6380: 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74  , we still don't
6390: 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 0a   want to return.
63a0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20    ** SQLITE_OK. 
63b0: 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  The system call 
63c0: 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d  failed, and *som
63d0: 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  e* SQLite error 
63e0: 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20 70  should be.  ** p
63f0: 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20 74  ropagated back t
6400: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f  o the caller. Co
6410: 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62 72  mmenting this br
6420: 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20 65  anch out means e
6430: 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c  rrno==0.  ** wil
6440: 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  l be handled by 
6450: 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20 63  the "default:" c
6460: 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  ase below..  */.
6470: 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72    case 0: .    r
6480: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6490: 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20  .#endif..  case 
64a0: 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45  EAGAIN:.  case E
64b0: 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65  TIMEDOUT:.  case
64c0: 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45   EBUSY:.  case E
64d0: 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f  INTR:.  case ENO
64e0: 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61  LCK:  .    /* ra
64f0: 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65  ndom NFS retry e
6500: 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72  rror, unless dur
6510: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
6520: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
6530: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
6540: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
6550: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
6560: 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65  t says */.    re
6570: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
6580: 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41  ;.    .  case EA
6590: 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41  CCES: .    /* EA
65a0: 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47  CCES is like EAG
65b0: 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69  AIN during locki
65c0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62  ng operations, b
65d0: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72  ut not any other
65e0: 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20   time*/.    if( 
65f0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6600: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
6610: 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28  K) || .        (
6620: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
6630: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
6640: 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  CK) || .        
6650: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6660: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
6670: 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  OCK) ||.        
6680: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6690: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
66a0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20  CKRESERVEDLOCK) 
66b0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
66c0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
66d0: 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66   }.    /* else f
66e0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
66f0: 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20   case EPERM: .  
6700: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6710: 50 45 52 4d 3b 0a 20 20 20 20 0a 23 69 66 20 45  PERM;.    .#if E
6720: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
6730: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
6740: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
6750: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
6760: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
6770: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
6780: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
6790: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
67a0: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
67b0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
67c0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
67d0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
67e0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
67f0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
6800: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
6810: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
6820: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
6830: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
6840: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
6850: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
6860: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
6870: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
6880: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
6890: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
68a0: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
68b0: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
68c0: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
68d0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65  se ENOENT:.#ifde
68e0: 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20 20  f ESTALE        
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6900: 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64 65  ESTALE is not de
6910: 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69 78  fined on Interix
6920: 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61   systems */.  ca
6930: 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69  se ESTALE:.#endi
6940: 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  f.  case ENOSYS:
6950: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
6960: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
6970: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
6980: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
6990: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
69a0: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
69b0: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
69c0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  ;.  }.}.../*****
69d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
6a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
6a30: 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  in Unique File I
6a40: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
6a50: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
6a70: 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73  On most versions
6a80: 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e   of unix, we can
6a90: 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49 44   get a unique ID
6aa0: 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63   for a file by c
6ab0: 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20  oncatenating.** 
6ac0: 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65  the device numbe
6ad0: 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20  r and the inode 
6ae0: 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69  number.  But thi
6af0: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
6b00: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f  on VxWorks..** O
6b10: 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69  n VxWorks, a uni
6b20: 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74  que file id must
6b30: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
6b40: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
6b50: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ame..**.** A poi
6b60: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
6b70: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
6b80: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63  wing structure c
6b90: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 0a  an be used as a.
6ba0: 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49  ** unique file I
6bb0: 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45  D in VxWorks.  E
6bc0: 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
6bd0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 63  this structure c
6be0: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70  ontains.** a cop
6bf0: 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63  y of the canonic
6c00: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68  al filename.  Th
6c10: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65  ere is also a re
6c20: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20  ference count.  
6c30: 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75 72  .** The structur
6c40: 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77  e is reclaimed w
6c50: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
6c60: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74  f pointers to it
6c70: 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72   drops to.** zer
6c80: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  o..**.** There a
6c90: 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61  re never very ma
6ca0: 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74  ny files open at
6cb0: 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f   one time and lo
6cc0: 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a  okups are not.**
6cd0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63   a performance-c
6ce0: 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f  ritical path, so
6cf0: 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e   it is sufficien
6d00: 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a  t to put these.*
6d10: 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20  * structures on 
6d20: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a  a linked list..*
6d30: 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  /.struct vxworks
6d40: 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63  FileId {.  struc
6d50: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6d60: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
6d70: 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68   in a list of th
6d80: 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  em all */.  int 
6d90: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
6da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6db0: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
6dc0: 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f  s to this one */
6dd0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
6e00: 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  e zCanonicalName
6e10: 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63  [] string */.  c
6e20: 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e  har *zCanonicalN
6e30: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ame;         /* 
6e40: 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  Canonical filena
6e50: 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53  me */.};..#if OS
6e60: 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20  _VXWORKS./* .** 
6e70: 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e  All unique filen
6e80: 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ames are held on
6e90: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68   a linked list h
6ea0: 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  eaded by this.**
6eb0: 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74   variable:.*/.st
6ec0: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
6ed0: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
6ee0: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a  ksFileList = 0;.
6ef0: 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20  ./*.** Simplify 
6f00: 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  a filename into 
6f10: 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f  its canonical fo
6f20: 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20  rm.** by making 
6f30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  the following ch
6f40: 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20  anges:.**.**  * 
6f50: 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61  removing any tra
6f60: 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63  iling and duplic
6f70: 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ate /.**  * conv
6f80: 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73  ert /./ into jus
6f90: 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  t /.**  * conver
6fa0: 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41  t /A/../ where A
6fb0: 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e   is any simple n
6fc0: 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  ame into just /.
6fd0: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72  **.** Changes ar
6fe0: 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e  e made in-place.
6ff0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
7000: 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a   name length..**
7010: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
7020: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20   filename is in 
7030: 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75  z[0..n-1].  Retu
7040: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
7050: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69  .** characters i
7060: 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64  n the simplified
7070: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
7080: 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70   int vxworksSimp
7090: 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a  lifyName(char *z
70a0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
70b0: 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  i, j;.  while( n
70c0: 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f  >1 && z[n-1]=='/
70d0: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f  ' ){ n--; }.  fo
70e0: 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
70f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
7100: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
7110: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29  f( z[i+1]=='/' )
7120: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7130: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
7140: 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69   && i+2<n && z[i
7150: 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +2]=='/' ){.    
7160: 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20      i += 1;.    
7170: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7180: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7190: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
71a0: 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +3<n && z[i+2]==
71b0: 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27  '.' && z[i+3]=='
71c0: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  /' ){.        wh
71d0: 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d  ile( j>0 && z[j-
71e0: 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20  1]!='/' ){ j--; 
71f0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
7200: 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  0 ){ j--; }.    
7210: 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
7220: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7240: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
7250: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
7260: 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a   return j;.}../*
7270: 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75  .** Find a uniqu
7280: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68  e file ID for th
7290: 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65  e given absolute
72a0: 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75   pathname.  Retu
72b0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
72c0: 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  to the vxworksFi
72d0: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68  leId object.  Th
72e0: 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68  is pointer is th
72f0: 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65  e unique.** file
7300: 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   ID..**.** The n
7310: 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Ref field of the
7320: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
7330: 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65  bject is increme
7340: 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  nted before.** t
7350: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74  he object is ret
7360: 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78  urned.  A new vx
7370: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7380: 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  ct is created.**
7390: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
73a0: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66  e global list if
73b0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
73c0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
73d0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
73e0: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
73f0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  LL..*/.static st
7400: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7410: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46  Id *vxworksFindF
7420: 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72  ileId(const char
7430: 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29   *zAbsoluteName)
7440: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
7450: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20  ksFileId *pNew; 
7460: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63          /* searc
7470: 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69  h key and new fi
7480: 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63  le ID */.  struc
7490: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
74a0: 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f  *pCandidate;   /
74b0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
74c0: 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  er existing file
74d0: 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b   IDs */.  int n;
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7500: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f   Length of zAbso
7510: 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20  luteName string 
7520: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41  */..  assert( zA
7530: 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d  bsoluteName[0]==
7540: 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e  '/' );.  n = (in
7550: 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75  t)strlen(zAbsolu
7560: 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20  teName);.  pNew 
7570: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
7580: 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  64( sizeof(*pNew
7590: 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69  ) + (n+1) );.  i
75a0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
75b0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a  urn 0;.  pNew->z
75c0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20  CanonicalName = 
75d0: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
75e0: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e  .  memcpy(pNew->
75f0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7600: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e  zAbsoluteName, n
7610: 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72  +1);.  n = vxwor
7620: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70  ksSimplifyName(p
7630: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
7640: 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53  ame, n);..  /* S
7650: 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
7660: 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74  sting entry that
7670: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61   matching the ca
7680: 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20  nonical name..  
7690: 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63  ** If found, inc
76a0: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
76b0: 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72  ence count and r
76c0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
76d0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73  to.  ** the exis
76e0: 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20  ting file ID..  
76f0: 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
7700: 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61  tex();.  for(pCa
7710: 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46  ndidate=vxworksF
7720: 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64  ileList; pCandid
7730: 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d  ate; pCandidate=
7740: 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78  pCandidate->pNex
7750: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e  t){.    if( pCan
7760: 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e  didate->nName==n
7770: 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70   .     && memcmp
7780: 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61  (pCandidate->zCa
7790: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65  nonicalName, pNe
77a0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
77b0: 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  e, n)==0.    ){.
77c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
77d0: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
77e0: 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52    pCandidate->nR
77f0: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69  ef++;.       uni
7800: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
7810: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61        return pCa
7820: 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20  ndidate;.    }. 
7830: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63   }..  /* No matc
7840: 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65  h was found.  We
7850: 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77   will make a new
7860: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e   file ID */.  pN
7870: 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
7880: 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b  pNew->nName = n;
7890: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
78a0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
78b0: 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ;.  vxworksFileL
78c0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e  ist = pNew;.  un
78d0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
78e0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
78f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
7900: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
7910: 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72  count on a vxwor
7920: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
7930: 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62    Free.** the ob
7940: 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65  ject when the re
7950: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
7960: 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  aches zero..*/.s
7970: 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72  tatic void vxwor
7980: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
7990: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
79a0: 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e  leId *pId){.  un
79b0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
79c0: 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e    assert( pId->n
79d0: 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e  Ref>0 );.  pId->
79e0: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49  nRef--;.  if( pI
79f0: 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  d->nRef==0 ){.  
7a00: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
7a10: 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20  FileId **pp;.   
7a20: 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73   for(pp=&vxworks
7a30: 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26  FileList; *pp &&
7a40: 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20   *pp!=pId; pp = 
7a50: 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
7a60: 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  {}.    assert( *
7a70: 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a  pp==pId );.    *
7a80: 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b  pp = pId->pNext;
7a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7aa0: 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  e(pId);.  }.  un
7ab0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7ac0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
7ad0: 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  XWORKS */./*****
7ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
7af0: 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44  f Unique File ID
7b00: 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79   Utility Used By
7b10: 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a   VxWorks *******
7b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
7b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b70: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
7b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
7bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7be0: 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64  ******* Posix Ad
7bf0: 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a  visory Locking *
7c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
7c20: 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  * POSIX advisory
7c30: 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65   locks are broke
7c40: 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e  n by design.  AN
7c50: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
7c60: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
7c70: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
7c80: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
7c90: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
7ca0: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
7cb0: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
7cc0: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
7cd0: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
7ce0: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
7cf0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
7d00: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
7d10: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
7d20: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
7d30: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
7d40: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
7d50: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
7d60: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
7d70: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
7d80: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
7d90: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
7da0: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
7db0: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
7dc0: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
7dd0: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
7de0: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
7df0: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
7e00: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
7e10: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
7e20: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
7e30: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
7e40: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
7e50: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
7e60: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
7e70: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
7e80: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
7e90: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
7ea0: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
7eb0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
7ec0: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
7ed0: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
7ee0: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
7ef0: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
7f00: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
7f10: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
7f20: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
7f30: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
7f40: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
7f50: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
7f60: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
7f70: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
7f80: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
7f90: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7fa0: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
7fb0: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
7fc0: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
7fd0: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
7fe0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
7ff0: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
8000: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
8010: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
8020: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  * This means tha
8030: 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  t we cannot use 
8040: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73  POSIX locks to s
8050: 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20  ynchronize file 
8060: 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20  access.** among 
8070: 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64  competing thread
8080: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72  s of the same pr
8090: 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f  ocess.  POSIX lo
80a0: 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69  cks will work fi
80b0: 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f  ne.** to synchro
80c0: 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20  nize access for 
80d0: 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72  threads in separ
80e0: 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62  ate processes, b
80f0: 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64  ut not.** thread
8100: 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  s within the sam
8110: 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  e process..**.**
8120: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
8130: 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c  the problem, SQL
8140: 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67  ite has to manag
8150: 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74  e file locks int
8160: 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74  ernally.** on it
8170: 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72  s own.  Whenever
8180: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
8190: 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61  is opened, we ha
81a0: 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a  ve to find the.*
81b0: 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65  * specific inode
81c0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
81d0: 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65   file (the inode
81e0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
81f0: 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20  y the.** st_dev 
8200: 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64  and st_ino field
8210: 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74  s of the stat st
8220: 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74  ructure that fst
8230: 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a  at() fills in).*
8240: 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20  * and check for 
8250: 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78  locks already ex
8260: 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69  isting on that i
8270: 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b  node.  When lock
8280: 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64  s are.** created
8290: 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20   or removed, we 
82a0: 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20  have to look at 
82b0: 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c  our own internal
82c0: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a   record of the.*
82d0: 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69  * locks to see i
82e0: 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  f another thread
82f0: 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   has previously 
8300: 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  set a lock on th
8310: 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65  at same.** inode
8320: 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20  ..**.** (Aside: 
8330: 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65  The use of inode
8340: 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71   numbers as uniq
8350: 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20  ue IDs does not 
8360: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
8370: 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c  .** For VxWorks,
8380: 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20   we have to use 
8390: 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  the alternative 
83a0: 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d  unique ID system
83b0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e   based on.** can
83c0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
83d0: 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  and implemented 
83e0: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
83f0: 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a  division.).**.**
8400: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   The sqlite3_fil
8410: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
8420: 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67  POSIX is no long
8430: 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67  er just an integ
8440: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
8450: 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f  iptor.  It is no
8460: 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  w a structure th
8470: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74  at holds the int
8480: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
8490: 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f  criptor and a po
84a0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63  inter to a struc
84b0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
84c0: 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  bes the internal
84d0: 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  .** locks on the
84e0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
84f0: 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20  node.  There is 
8500: 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  one locking stru
8510: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f  cture.** per ino
8520: 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61  de, so if the sa
8530: 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e  me inode is open
8540: 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75  ed twice, both u
8550: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
8560: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
8570: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
8580: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
8590: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
85a0: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
85b0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
85c0: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
85d0: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
85e0: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
85f0: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
8600: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
8610: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
8620: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
8630: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
8640: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
8650: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
8660: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
8670: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
8680: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
8690: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
86a0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
86b0: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
86c0: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
86d0: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
86e0: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
86f0: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
8700: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
8710: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
8720: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
8730: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
8740: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
8750: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
8760: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
8770: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
8780: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
8790: 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61  te..**.** But wa
87a0: 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79  it:  there are y
87b0: 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73  et more problems
87c0: 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69   with POSIX advi
87d0: 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  sory locks..**.*
87e0: 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61  * If you close a
87f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8800: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
8810: 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
8820: 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f  locks,.** all lo
8830: 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  cks on that file
8840: 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20   that are owned 
8850: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  by the current p
8860: 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65  rocess are.** re
8870: 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b  leased.  To work
8880: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
8890: 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49  blem, each unixI
88a0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a  nodeInfo object.
88b0: 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63  ** maintains a c
88c0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
88d0: 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f  er of pending lo
88e0: 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65  cks on tha inode
88f0: 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74  ..** When an att
8900: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
8910: 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c  close an unixFil
8920: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
8930: 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c  ** other unixFil
8940: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  e open on the sa
8950: 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72  me inode that ar
8960: 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c  e holding locks,
8970: 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20   the call.** to 
8980: 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65  close() the file
8990: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64   descriptor is d
89a0: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
89b0: 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63  l of the locks c
89c0: 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69  lear..** The uni
89d0: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
89e0: 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73  ture keeps a lis
89f0: 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69  t of file descri
8a00: 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ptors that need 
8a10: 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20  to.** be closed 
8a20: 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73  and that list is
8a30: 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65   walked (and cle
8a40: 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c  ared) when the l
8a50: 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61  ast lock.** clea
8a60: 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e  rs..**.** Yet an
8a70: 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20  other problem:  
8a80: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20  LinuxThreads do 
8a90: 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69  not play well wi
8aa0: 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a  th posix locks..
8ab0: 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72  **.** Many older
8ac0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e   versions of lin
8ad0: 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78  ux use the Linux
8ae0: 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20  Threads library 
8af0: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20  which is.** not 
8b00: 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e  posix compliant.
8b10: 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72    Under LinuxThr
8b20: 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65  eads, a lock cre
8b30: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a  ated by thread.*
8b40: 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f  * A cannot be mo
8b50: 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69  dified or overri
8b60: 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72  dden by a differ
8b70: 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a  ent thread B..**
8b80: 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63   Only thread A c
8b90: 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f  an modify the lo
8ba0: 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68  ck.  Locking beh
8bb0: 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74  avior is correct
8bc0: 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69  .** if the appli
8bd0: 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e  ation uses the n
8be0: 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69  ewer Native Posi
8bf0: 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79  x Thread Library
8c00: 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69   (NPTL).** on li
8c10: 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20  nux - with NPTL 
8c20: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
8c30: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  y thread A can o
8c40: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
8c50: 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42   in thread B.  B
8c60: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
8c70: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f  ay to know at co
8c80: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68  mpile-time which
8c90: 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69  .** threading li
8ca0: 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75  brary is being u
8cb0: 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69  sed.  So there i
8cc0: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
8cd0: 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74   at.** compile-t
8ce0: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
8cf0: 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ot thread A can 
8d00: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f  override locks o
8d10: 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  n thread B..** O
8d20: 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72  ne has to do a r
8d30: 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f  un-time check to
8d40: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65   discover the be
8d50: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a  havior of the.**
8d60: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
8d70: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75  ..**.** SQLite u
8d80: 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c  sed to support L
8d90: 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75  inuxThreads.  Bu
8da0: 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69  t support for Li
8db0: 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61  nuxThreads.** wa
8dc0: 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e  s dropped beginn
8dd0: 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e  ing with version
8de0: 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20   3.7.0.  SQLite 
8df0: 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20  will still work 
8e00: 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72  with.** LinuxThr
8e10: 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68  eads provided th
8e20: 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20  at (1) there is 
8e30: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
8e40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
8e50: 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  per database fil
8e60: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  e in the same pr
8e70: 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61  ocess and (2) da
8e80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8e90: 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76  ns.** do not mov
8ea0: 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  e across threads
8eb0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ..*/../*.** An i
8ec0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
8ed0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
8ee0: 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65  re serves as the
8ef0: 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20   key used.** to 
8f00: 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75  locate a particu
8f10: 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  lar unixInodeInf
8f20: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72  o object..*/.str
8f30: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b  uct unixFileId {
8f40: 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20  .  dev_t dev;   
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8f60: 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20  * Device number 
8f70: 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
8f80: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
8f90: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
8fa0: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
8fb0: 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a  D for vxworks. *
8fc0: 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20  /.#else.  ino_t 
8fd0: 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  ino;            
8fe0: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
8ff0: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
9000: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
9010: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
9020: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
9030: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
9040: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
9050: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
9060: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
9070: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
9080: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
9090: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
90a0: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
90b0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
90c0: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
90d0: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
90e0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
90f0: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
9100: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
9110: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
9120: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
9130: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
9140: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
9150: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
9160: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
9170: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
9180: 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  g to it..*/.stru
9190: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
91a0: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
91b0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
91c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b       /* The look
91d0: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
91e0: 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  nShared;        
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9200: 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20  umber of SHARED 
9210: 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
9220: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
9230: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
9240: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
9250: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
9260: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75  LOCK etc. */.  u
9270: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72  nsigned char bPr
9280: 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f  ocessLock;     /
9290: 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70  * An exclusive p
92a0: 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68  rocess lock is h
92b0: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  eld */.  int nRe
92c0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
92d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
92e0: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
92f0: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
9300: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
9310: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
9320: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
9330: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
9340: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64  d with this inod
9350: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
9360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9370: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9380: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
9390: 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  file locks */.  
93a0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
93b0: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
93c0: 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64  /* Unused file d
93d0: 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c  escriptors to cl
93e0: 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ose */.  unixIno
93f0: 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  deInfo *pNext;  
9400: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
9410: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
9420: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
9430: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
9440: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
9450: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
9460: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23  ubly linked */.#
9470: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
9480: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
9490: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
94a0: 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20  ong sharedByte; 
94b0: 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75   /* for AFP simu
94c0: 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63  lated shared loc
94d0: 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  k */.#endif.#if 
94e0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d  OS_VXWORKS.  sem
94f0: 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20  _t *pSem;       
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9510: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
9520: 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  phore */.  char 
9530: 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54  aSemName[MAX_PAT
9540: 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61  HNAME+2];  /* Na
9550: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
9560: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  hore */.#endif.}
9570: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73  ;../*.** A lists
9580: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
9590: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a  eInfo objects..*
95a0: 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f  /.static unixIno
95b0: 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73  deInfo *inodeLis
95c0: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  t = 0;../*.**.**
95d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
95e0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28   unixLogError_x(
95f0: 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  ), is only ever 
9600: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
9610: 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45  acro.** unixLogE
9620: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74  rror()..**.** It
9630: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
9640: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
9650: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
9660: 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61  ion and errno ha
9670: 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49  s been.** set. I
9680: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
9690: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
96a0: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
96b0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
96c0: 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e  e of.** errno an
96d0: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
96e0: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
96f0: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
9700: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
9710: 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
9720: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
9730: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
9740: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
9750: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
9760: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
9770: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
9780: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
9790: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
97a0: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
97b0: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
97c0: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
97d0: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
97e0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
97f0: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
9800: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65  hat.** failed (e
9810: 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f  .g. "unlink", "o
9820: 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73  pen") and the as
9830: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
9840: 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66  stem path,.** if
9850: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
9860: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c   unixLogError(a,
9870: 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67  b,c)     unixLog
9880: 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c  ErrorAtLine(a,b,
9890: 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  c,__LINE__).stat
98a0: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72  ic int unixLogEr
98b0: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
98c0: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98e0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
98f0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
9900: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
9910: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
9920: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
9930: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
9940: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
9950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9960: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
9970: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
9980: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
99b0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
99c0: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
99d0: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  d */.){.  char *
99e0: 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  zErr;           
99f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73            /* Mes
9a00: 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72  sage from strerr
9a10: 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65  or() or equivale
9a20: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72  nt */.  int iErr
9a30: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20  no = errno;     
9a40: 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
9a50: 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e   syscall error n
9a60: 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49  umber */..  /* I
9a70: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
9a80: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
9a90: 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53   (SQLITE_THREADS
9aa0: 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73  AFE==0), then us
9ab0: 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72  e.  ** the strer
9ac0: 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  ror() function t
9ad0: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d  o obtain the hum
9ae0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an-readable erro
9af0: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65  r message.  ** e
9b00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72  quivalent to err
9b10: 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  no. Otherwise, u
9b20: 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  se strerror_r().
9b30: 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54  .  */ .#if SQLIT
9b40: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
9b50: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52  defined(HAVE_STR
9b60: 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20  ERROR_R).  char 
9b70: 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73  aErr[80];.  mems
9b80: 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65  et(aErr, 0, size
9b90: 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72  of(aErr));.  zEr
9ba0: 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20  r = aErr;..  /* 
9bb0: 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  If STRERROR_R_CH
9bc0: 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74  AR_P (set by aut
9bd0: 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f  oconf scripts) o
9be0: 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64  r __USE_GNU is d
9bf0: 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73  efined,.  ** ass
9c00: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
9c10: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
9c20: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20   GNU version of 
9c30: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61  strerror_r() tha
9c40: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  t.  ** returns a
9c50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
9c60: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
9c70: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
9c80: 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20  e. That pointer 
9c90: 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20  .  ** may point 
9ca0: 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74  to aErr[], or it
9cb0: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f   may point to so
9cc0: 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67  me static storag
9cd0: 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20  e somewhere. .  
9ce0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
9cf0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
9d00: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
9d10: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
9d20: 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f  of .  ** strerro
9d30: 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77  r_r(), which alw
9d40: 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72  ays writes an er
9d50: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
9d60: 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20   aErr[]..  **.  
9d70: 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69  ** If the code i
9d80: 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d  ncorrectly assum
9d90: 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  es that it is th
9da0: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
9db0: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61  that is.  ** ava
9dc0: 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f  ilable, the erro
9dd0: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f  r message will o
9de0: 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79  ften be an empty
9df0: 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20   string. Not a. 
9e00: 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d   ** huge problem
9e10: 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f  . Incorrectly co
9e20: 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68  ncluding that th
9e30: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73  e GNU version is
9e40: 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a   available .  **
9e50: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
9e60: 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68   segfault though
9e70: 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
9e80: 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  ed(STRERROR_R_CH
9e90: 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64  AR_P) || defined
9ea0: 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45  (__USE_GNU).  zE
9eb0: 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20  rr = .# endif.  
9ec0: 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e  strerror_r(iErrn
9ed0: 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28  o, aErr, sizeof(
9ee0: 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66  aErr)-1);..#elif
9ef0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
9f00: 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  FE.  /* This is 
9f10: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
9f20: 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72  ld, but strerror
9f30: 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69  _r() is not avai
9f40: 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72  lable. */.  zErr
9f50: 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f   = "";.#else.  /
9f60: 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65  * Non-threadsafe
9f70: 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65   build, use stre
9f80: 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72  rror(). */.  zEr
9f90: 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72  r = strerror(iEr
9fa0: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rno);.#endif..  
9fb0: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
9fc0: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c  Path = "";.  sql
9fd0: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
9fe0: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78  ,.      "os_unix
9ff0: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
a000: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
a010: 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a  iLine, iErrno, z
a020: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72  Func, zPath, zEr
a030: 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  r.  );..  return
a040: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
a050: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
a060: 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
a070: 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74  * We assume that
a080: 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20   close() almost 
a090: 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69  always works, si
a0a0: 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69  nce it is only i
a0b0: 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b  n a.** very sick
a0c0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20   application or 
a0d0: 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70  on a very sick p
a0e0: 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20  latform that it 
a0f0: 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49  might fail..** I
a100: 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20  f it does fail, 
a110: 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20  simply leak the 
a120: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
a130: 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a   but do log the.
a140: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
a150: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
a160: 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72  not safe to retr
a170: 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20  y close() after 
a180: 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a  EINTR since the.
a190: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
a1a0: 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c  or might have al
a1b0: 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65  ready been reuse
a1c0: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72  d by another thr
a1d0: 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f  ead..** So we do
a1e0: 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20  n't even try to 
a1f0: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20  recover from an 
a200: 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67  EINTR.  Just log
a210: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e   the error.** an
a220: 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74  d move on..*/.st
a230: 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74  atic void robust
a240: 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20  _close(unixFile 
a250: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69  *pFile, int h, i
a260: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66  nt lineno){.  if
a270: 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a  ( osClose(h) ){.
a280: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
a290: 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f  AtLine(SQLITE_IO
a2a0: 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73  ERR_CLOSE, "clos
a2b0: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
a2c0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
a2d0: 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20   ? pFile->zPath 
a2e0: 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  : 0, lineno);.  
a2f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
a300: 68 65 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  he pFile->lastEr
a310: 72 6e 6f 2e 20 20 44 6f 20 74 68 69 73 20 69 6e  rno.  Do this in
a320: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 73   a subroutine as
a330: 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 0a 2a   that provides.*
a340: 2a 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  * a convenient p
a350: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
a360: 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  eakpoint..*/.sta
a370: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 4c 61  tic void storeLa
a380: 73 74 45 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65  stErrno(unixFile
a390: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 72 72   *pFile, int err
a3a0: 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61  or){.  pFile->la
a3b0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b  stErrno = error;
a3c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
a3d0: 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
a3e0: 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20  tors accumuated 
a3f0: 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  in the unixInode
a400: 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69  Info->pUnused li
a410: 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  st..*/ .static v
a420: 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  oid closePending
a430: 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Fds(unixFile *pF
a440: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
a450: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
a460: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
a470: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
a480: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
a490: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
a4a0: 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  =pInode->pUnused
a4b0: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
a4c0: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
a4d0: 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  ext;.    robust_
a4e0: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e  close(pFile, p->
a4f0: 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
a500: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a510: 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65  p);.  }.  pInode
a520: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
a530: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
a540: 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  a unixInodeInfo 
a550: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
a560: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
a570: 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  y findInodeInfo(
a580: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
a590: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
a5a0: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
a5b0: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
a5c0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
a5d0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a5e0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
a5f0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
a600: 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69  aseInodeInfo(uni
a610: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
a620: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a630: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
a640: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
a650: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
a660: 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
a670: 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20  S(pInode) ){.   
a680: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b   pInode->nRef--;
a690: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
a6a0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
a6b0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
a6c0: 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b  ->pShmNode==0 );
a6d0: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
a6e0: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
a6f0: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
a700: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
a710: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
a720: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
a730: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
a740: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d    pInode->pPrev-
a750: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
a760: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
a770: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
a780: 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d  ert( inodeList==
a790: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
a7a0: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
a7b0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
a7c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a7d0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a  Inode->pNext ){.
a7e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a7f0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
a800: 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Prev==pInode );.
a810: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
a820: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
a830: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20  Inode->pPrev;.  
a840: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a850: 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29  te3_free(pInode)
a860: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
a870: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
a880: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
a890: 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f  cate the unixIno
a8a0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  deInfo object th
a8b0: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
a8c0: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
a8d0: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
a8e0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
a8f0: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
a900: 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74  turn value might
a910: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
a920: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
a930: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
a940: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
a950: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
a960: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
a970: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
a980: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
a990: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
a9a0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
a9b0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
a9c0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
a9d0: 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49  c int findInodeI
a9e0: 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  nfo(.  unixFile 
a9f0: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
aa00: 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
aa10: 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73  le with file des
aa20: 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  c used in the ke
aa30: 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  y */.  unixInode
aa40: 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20  Info **ppInode  
aa50: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
aa60: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
aa70: 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f  o object here */
aa80: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
aab0: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
aac0: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
aaf0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
ab00: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
ab10: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
ab20: 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b  Id;      /* Look
ab30: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
ab40: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a  nixInodeInfo */.
ab50: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
ab60: 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
ab70: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
ab80: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
ab90: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
aba0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20  o *pInode = 0;  
abb0: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
abc0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
abd0: 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ject */..  asser
abe0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
abf0: 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  () );..  /* Get 
ac00: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
ac10: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
ac20: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
ac30: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
ac40: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
ac50: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
ac60: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
ac70: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73  le->h;.  rc = os
ac80: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
ac90: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
aca0: 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
acb0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
acc0: 72 6e 6f 29 3b 0a 23 69 66 64 65 66 20 45 4f 56  rno);.#ifdef EOV
acd0: 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70  ERFLOW.    if( p
ace0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
acf0: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
ad00: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
ad10: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
ad20: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
ad30: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
ad40: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
ad50: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
ad60: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
ad70: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
ad80: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
ad90: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
ada0: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
adb0: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
adc0: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
add0: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
ade0: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
adf0: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
ae00: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
ae10: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
ae20: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
ae30: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
ae40: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
ae50: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
ae60: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
ae70: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
ae80: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
ae90: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
aea0: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
aeb0: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
aec0: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
aed0: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
aee0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
aef0: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
af00: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
af10: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
af20: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
af30: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
af40: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
af50: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
af60: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
af70: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
af80: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
af90: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
afa0: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
afb0: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
afc0: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
afd0: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
afe0: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
aff0: 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  .    do{ rc = os
b000: 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  Write(fd, "S", 1
b010: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
b020: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
b030: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
b040: 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
b050: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
b060: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  errno);.      re
b070: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
b080: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
b090: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
b0a0: 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28  tatbuf);.    if(
b0b0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
b0c0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
b0d0: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
b0e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b0f0: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
b100: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d   }.#endif..  mem
b110: 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20  set(&fileId, 0, 
b120: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b  sizeof(fileId));
b130: 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20  .  fileId.dev = 
b140: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
b150: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
b160: 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46   fileId.pId = pF
b170: 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a  ile->pId;.#else.
b180: 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73    fileId.ino = s
b190: 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23  tatbuf.st_ino;.#
b1a0: 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d  endif.  pInode =
b1b0: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68   inodeList;.  wh
b1c0: 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d  ile( pInode && m
b1d0: 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26  emcmp(&fileId, &
b1e0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
b1f0: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20  sizeof(fileId)) 
b200: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
b210: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
b220: 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d   }.  if( pInode=
b230: 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  =0 ){.    pInode
b240: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
b250: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e  c64( sizeof(*pIn
b260: 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ode) );.    if( 
b270: 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  pInode==0 ){.   
b280: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b290: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
b2a0: 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c    memset(pInode,
b2b0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f   0, sizeof(*pIno
b2c0: 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  de));.    memcpy
b2d0: 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  (&pInode->fileId
b2e0: 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  , &fileId, sizeo
b2f0: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20  f(fileId));.    
b300: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31  pInode->nRef = 1
b310: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e  ;.    pInode->pN
b320: 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ext = inodeList;
b330: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72  .    pInode->pPr
b340: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
b350: 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64  inodeList ) inod
b360: 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  eList->pPrev = p
b370: 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65  Inode;.    inode
b380: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  List = pInode;. 
b390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f   }else{.    pIno
b3a0: 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  de->nRef++;.  }.
b3b0: 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e    *ppInode = pIn
b3c0: 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ode;.  return SQ
b3d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b3e0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
b3f0: 20 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20   pFile has been 
b400: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
b410: 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77 61 73  ked since it was
b420: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a   first opened..*
b430: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
b440: 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69  eHasMoved(unixFi
b450: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20  le *pFile){.#if 
b460: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74  OS_VXWORKS.  ret
b470: 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  urn pFile->pInod
b480: 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70  e!=0 && pFile->p
b490: 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  Id!=pFile->pInod
b4a0: 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23  e->fileId.pId;.#
b4b0: 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74  else.  struct st
b4c0: 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e  at buf;.  return
b4d0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d   pFile->pInode!=
b4e0: 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74  0 &&.      (osSt
b4f0: 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  at(pFile->zPath,
b500: 20 26 62 75 66 29 21 3d 30 20 7c 7c 20 62 75 66   &buf)!=0 || buf
b510: 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e  .st_ino!=pFile->
b520: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
b530: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  no);.#endif.}...
b540: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e  /*.** Check a un
b550: 69 78 46 69 6c 65 20 74 68 61 74 20 69 73 20 61  ixFile that is a
b560: 20 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69   database.  Veri
b570: 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  fy the following
b580: 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72  :.**.** (1) Ther
b590: 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
b5a0: 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68   hard link on th
b5b0: 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68  e file.** (2) Th
b5c0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  e file is not a 
b5d0: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a  symbolic link.**
b5e0: 20 28 33 29 20 54 68 65 20 66 69 6c 65 20 68 61   (3) The file ha
b5f0: 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d  s not been renam
b600: 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a  ed or unlinked.*
b610: 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74  *.** Issue sqlit
b620: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b630: 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61  RNING,...) messa
b640: 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ges if anything 
b650: 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f  is not right..*/
b660: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72  .static void ver
b670: 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69  ifyDbFile(unixFi
b680: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74  le *pFile){.  st
b690: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
b6a0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
b6b0: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b6c0: 26 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  & UNIXFILE_WARNE
b6d0: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  D ){.    /* One 
b6e0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 66  or more of the f
b6f0: 6f 6c 6c 6f 77 69 6e 67 20 77 61 72 6e 69 6e 67  ollowing warning
b700: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b710: 65 65 6e 20 69 73 73 75 65 64 2e 20 20 44 6f 20  een issued.  Do 
b720: 6e 6f 74 0a 20 20 20 20 2a 2a 20 72 65 70 65 61  not.    ** repea
b730: 74 20 74 68 65 6d 20 73 6f 20 61 73 20 6e 6f 74  t them so as not
b740: 20 74 6f 20 63 6c 75 74 74 65 72 20 74 68 65 20   to clutter the 
b750: 65 72 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20 20  error log */.   
b760: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
b770: 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c  c = osFstat(pFil
b780: 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69  e->h, &buf);.  i
b790: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
b7a0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b7b0: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e  TE_WARNING, "can
b7c0: 6e 6f 74 20 66 73 74 61 74 20 64 62 20 66 69 6c  not fstat db fil
b7d0: 65 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  e %s", pFile->zP
b7e0: 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ath);.    pFile-
b7f0: 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
b800: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20  IXFILE_WARNED;. 
b810: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b820: 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e   if( buf.st_nlin
b830: 6b 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e  k==0 && (pFile->
b840: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
b850: 46 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  FILE_DELETE)==0 
b860: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b870: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b880: 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65  G, "file unlinke
b890: 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73  d while open: %s
b8a0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
b8b0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  ;.    pFile->ctr
b8c0: 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
b8d0: 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72  LE_WARNED;.    r
b8e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
b8f0: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20   buf.st_nlink>1 
b900: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b910: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b920: 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e  G, "multiple lin
b930: 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c  ks to file: %s",
b940: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
b950: 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
b960: 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
b970: 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74  _WARNED;.    ret
b980: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  urn;.  }.  if( f
b990: 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c  ileHasMoved(pFil
b9a0: 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e) ){.    sqlite
b9b0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
b9c0: 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61  NING, "file rena
b9d0: 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20  med while open: 
b9e0: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
b9f0: 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  h);.    pFile->c
ba00: 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
ba10: 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20  FILE_WARNED;.   
ba20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a   return;.  }.}..
ba30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ba40: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
ba50: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
ba60: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
ba70: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
ba80: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
ba90: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
baa0: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
bab0: 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
bac0: 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
bad0: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
bae0: 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
baf0: 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
bb00: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
bb10: 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
bb20: 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
bb30: 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
bb40: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
bb50: 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
bb60: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68  tatic int unixCh
bb70: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
bb80: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
bb90: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
bba0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bbb0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
bbc0: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
bbd0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
bbe0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
bbf0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
bc00: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
bc10: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
bc20: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
bc30: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
bc40: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
bc50: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
bc60: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
bc70: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
bc80: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
bc90: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
bca0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
bcb0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
bcc0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
bcd0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
bce0: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
bcf0: 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
bd00: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
bd10: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
bd20: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
bd30: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
bd40: 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47  */.#ifndef __DJG
bd50: 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65  PP__.  if( !rese
bd60: 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e  rved && !pFile->
bd70: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
bd80: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75  Lock ){.    stru
bd90: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
bda0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
bdb0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
bdc0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bdd0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
bde0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
bdf0: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
be00: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
be10: 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46    if( osFcntl(pF
be20: 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  ile->h, F_GETLK,
be30: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
be40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
be50: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
be60: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72  LOCK;.      stor
be70: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
be80: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 20  , errno);.    } 
be90: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
bea0: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
beb0: 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
bec0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 1;.    }.  }.#
bed0: 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c  endif.  .  unixL
bee0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
bef0: 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
bf00: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
bf10: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
bf20: 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
bf30: 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
bf40: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
bf50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bf60: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
bf70: 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f   a system-lock o
bf80: 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65  n the file pFile
bf90: 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a  .  The lock is .
bfa0: 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ** described by 
bfb0: 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pLock..**.** If 
bfc0: 74 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70  the pFile was op
bfd0: 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20  ened read/write 
bfe0: 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20  from unix-excl, 
bff0: 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f  then the only lo
c000: 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69  ck.** ever obtai
c010: 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73  ned is an exclus
c020: 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74  ive lock, and it
c030: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61   is obtained exa
c040: 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ctly once.** the
c050: 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20   first time any 
c060: 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
c070: 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65  d.  All subseque
c080: 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e  nt system lockin
c090: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20  g.** operations 
c0a0: 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20  become no-ops.  
c0b0: 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  Locking operatio
c0c0: 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20  ns still happen 
c0d0: 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69  internally,.** i
c0e0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64  n order to coord
c0f0: 69 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74  inate access bet
c100: 77 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61  ween separate da
c110: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
c120: 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ns.** within thi
c130: 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61  s process, but a
c140: 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61  ll of that is ha
c150: 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  ndled in memory 
c160: 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  and the.** opera
c170: 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73  ting system does
c180: 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65   not participate
c190: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
c1a0: 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d  ction is a pass-
c1b0: 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c  through to fcntl
c1c0: 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69  (F_SETLK) if pFi
c1d0: 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61  le is using.** a
c1e0: 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61  ny VFS other tha
c1f0: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72  n "unix-excl" or
c200: 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65   if pFile is ope
c210: 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63  ned on "unix-exc
c220: 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61  l".** and is rea
c230: 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65  d-only..**.** Ze
c240: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
c250: 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c  f the call compl
c260: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
c270: 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61  y, or -1 if a ca
c280: 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29  ll.** to fcntl()
c290: 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20   fails. In this 
c2a0: 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73  case, errno is s
c2b0: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  et appropriately
c2c0: 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a   (by fcntl())..*
c2d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
c2e0: 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69  xFileLock(unixFi
c2f0: 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63  le *pFile, struc
c300: 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b  t flock *pLock){
c310: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
c320: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
c330: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
c340: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
c350: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
c360: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
c370: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  e!=0 );.  if( ((
c380: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
c390: 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c   & UNIXFILE_EXCL
c3a0: 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  )!=0 || pInode->
c3b0: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20  bProcessLock).  
c3c0: 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72   && ((pFile->ctr
c3d0: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
c3e0: 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20  E_RDONLY)==0).  
c3f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  ){.    if( pInod
c400: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
c410: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
c420: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
c430: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
c440: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b  ode->nLock==0 );
c450: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
c460: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
c470: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
c480: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
c490: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
c4a0: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
c4b0: 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ZE;.      lock.l
c4c0: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
c4d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63  .      rc = osFc
c4e0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
c4f0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
c500: 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20       if( rc<0 ) 
c510: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
c520: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
c530: 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  sLock = 1;.     
c540: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
c550: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c560: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
c570: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
c580: 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65   = osFcntl(pFile
c590: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c  ->h, F_SETLK, pL
c5a0: 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ock);.  }.  retu
c5b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c5c0: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
c5d0: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
c5e0: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
c5f0: 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
c600: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
c610: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
c620: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
c630: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
c640: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
c650: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
c660: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
c670: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
c680: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
c690: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
c6a0: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
c6b0: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
c6c0: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
c6d0: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
c6e0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
c6f0: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
c700: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
c710: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
c720: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
c730: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
c740: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
c750: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
c760: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
c770: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
c780: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
c790: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
c7a0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
c7b0: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
c7c0: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
c7d0: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
c7e0: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
c7f0: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
c800: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
c810: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
c820: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
c830: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
c840: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
c850: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
c860: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
c870: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c880: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
c890: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
c8a0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
c8b0: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
c8c0: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
c8d0: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
c8e0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
c8f0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
c900: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
c910: 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  k){.  /* The fol
c920: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
c930: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
c940: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
c950: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
c960: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
c970: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
c980: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
c990: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
c9a0: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
c9b0: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
c9c0: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
c9d0: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
c9e0: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
c9f0: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
ca00: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
ca10: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
ca20: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
ca30: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
ca40: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
ca50: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
ca60: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
ca70: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
ca80: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
ca90: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
caa0: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
cab0: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
cac0: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
cad0: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
cae0: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
caf0: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
cb00: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
cb10: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
cb20: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
cb30: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
cb40: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
cb50: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
cb60: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
cb70: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
cb80: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
cb90: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
cba0: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
cbb0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
cbc0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
cbd0: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
cbe0: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
cbf0: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
cc00: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
cc10: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
cc20: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
cc30: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
cc40: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
cc50: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
cc60: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
cc70: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
cc80: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
cc90: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
cca0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
ccb0: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
ccc0: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
ccd0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
cce0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
ccf0: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
cd00: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
cd10: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
cd20: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
cd30: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
cd40: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
cd50: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
cd60: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
cd70: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
cd80: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
cd90: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
cda0: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
cdb0: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
cdc0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
cdd0: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
cde0: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
cdf0: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
ce00: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
ce10: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
ce20: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
ce30: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
ce40: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
ce50: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
ce60: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
ce70: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
ce80: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
ce90: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
cea0: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
ceb0: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
cec0: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
ced0: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
cee0: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
cef0: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
cf00: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
cf10: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
cf20: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
cf30: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
cf40: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
cf50: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
cf60: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
cf70: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
cf80: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
cf90: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
cfa0: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
cfb0: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
cfc0: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
cfd0: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
cfe0: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
cff0: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
d000: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
d010: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
d020: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
d030: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
d040: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
d050: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
d060: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
d070: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
d080: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
d090: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
d0a0: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
d0b0: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
d0c0: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
d0d0: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
d0e0: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
d0f0: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
d100: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
d110: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
d120: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
d130: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
d140: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
d150: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
d160: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
d170: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
d180: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
d190: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
d1a0: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
d1b0: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45  k lock;.  int tE
d1c0: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
d1d0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
d1e0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
d1f0: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
d200: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
d210: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
d220: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
d230: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
d240: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
d250: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
d260: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46     azFileLock(pF
d270: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
d280: 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e  leLock), pFile->
d290: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
d2a0: 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28  .      osGetpid(
d2b0: 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0)));..  /* If t
d2c0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
d2d0: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
d2e0: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
d2f0: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
d300: 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
d310: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
d320: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
d330: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
d340: 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
d350: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
d360: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
d370: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
d380: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
d390: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
d3a0: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
d3b0: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
d3c0: 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c  held) (unix)\n",
d3d0: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
d3e0: 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
d3f0: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
d400: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d410: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
d420: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
d430: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
d440: 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20  s correct..  ** 
d450: 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
d460: 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
d470: 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
d480: 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
d490: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
d4a0: 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
d4b0: 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
d4c0: 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
d4d0: 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
d4e0: 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
d4f0: 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
d500: 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
d510: 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
d520: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
d530: 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
d540: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
d550: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
d560: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d570: 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
d580: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
d590: 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
d5a0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
d5b0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
d5c0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
d5d0: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
d5e0: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
d5f0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
d600: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
d610: 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
d620: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
d630: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
d640: 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
d650: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
d660: 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
d670: 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
d680: 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
d690: 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
d6a0: 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
d6b0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
d6c0: 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
d6d0: 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
d6e0: 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
d6f0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
d700: 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f  .          (pIno
d710: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
d720: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
d730: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
d740: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
d750: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
d760: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
d770: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ock;.  }..  /* I
d780: 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
d790: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
d7a0: 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
d7b0: 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
d7c0: 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
d7d0: 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
d7e0: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
d7f0: 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
d800: 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
d810: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
d820: 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OK..  */.  if( e
d830: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d840: 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20  _LOCK && .      
d850: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d860: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d870: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
d880: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
d890: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
d8a0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
d8b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
d8c0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
d8d0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
d8e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
d8f0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
d900: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
d910: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
d920: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
d930: 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
d940: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
d950: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
d960: 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ock;.  }...  /* 
d970: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
d980: 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
d990: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
d9a0: 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
d9b0: 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
d9c0: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
d9d0: 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
d9e0: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
d9f0: 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
da00: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
da10: 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  */.  lock.l_len 
da20: 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77  = 1L;.  lock.l_w
da30: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
da40: 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  ;.  if( eFileLoc
da50: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
da60: 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
da70: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
da80: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
da90: 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
daa0: 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c  LOCK).  ){.    l
dab0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46  ock.l_type = (eF
dac0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
dad0: 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57  LOCK?F_RDLCK:F_W
dae0: 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  RLCK);.    lock.
daf0: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
db00: 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20  G_BYTE;.    if( 
db10: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
db20: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
db30: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
db40: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
db50: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
db60: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
db70: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
db80: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
db90: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
dba0: 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
dbb0: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
dbc0: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
dbd0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
dbe0: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
dbf0: 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
dc00: 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
dc10: 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
dc20: 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
dc30: 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
dc40: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
dc50: 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
dc60: 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
dc70: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
dc80: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
dc90: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
dca0: 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
dcb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
dcc0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
dcd0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
dce0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
dcf0: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  ;..    /* Now ge
dd00: 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
dd10: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
dd20: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
dd30: 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ST;.    lock.l_l
dd40: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
dd50: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
dd60: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
dd70: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
dd80: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
dd90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
dda0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
ddb0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
ddc0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
ddd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f     }..    /* Dro
dde0: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
ddf0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
de00: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
de10: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
de20: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
de30: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
de40: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
de50: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
de60: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
de70: 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ck) && rc==SQLIT
de80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
de90: 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70   This could happ
dea0: 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72  en with a networ
deb0: 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  k mount */.     
dec0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ded0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
dee0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
def0: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28   .    }..    if(
df00: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
df10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
df20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
df30: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
df40: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
df50: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
df60: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  d_lock;.    }els
df70: 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
df80: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
df90: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
dfa0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
dfb0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
dfc0: 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
dfd0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
dfe0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
dff0: 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
e000: 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
e010: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
e020: 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
e030: 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
e040: 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
e050: 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
e060: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
e070: 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
e080: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
e090: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
e0a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
e0b0: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
e0c0: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
e0d0: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
e0e0: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
e0f0: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
e100: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
e110: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
e120: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
e130: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
e140: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
e150: 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
e160: 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ock );.    lock.
e170: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
e180: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
e190: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
e1a0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  ED_LOCK || eFile
e1b0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
e1c0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20  LOCK );.    if( 
e1d0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
e1e0: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
e1f0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e200: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
e210: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e220: 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65   = 1L;.    }else
e230: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
e240: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
e250: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
e260: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
e270: 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  IZE;.    }..    
e280: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e290: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
e2a0: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
e2b0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
e2c0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
e2d0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
e2e0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
e2f0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
e300: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
e310: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  SY ){.        st
e320: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
e330: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
e340: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e350: 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   ..#ifdef SQLITE
e360: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20  _DEBUG.  /* Set 
e370: 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
e380: 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on-counter chang
e390: 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73  e checking flags
e3a0: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   when.  ** trans
e3b0: 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20  itioning from a 
e3c0: 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45  SHARED to a RESE
e3d0: 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20  RVED lock.  The 
e3e0: 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d  change.  ** from
e3f0: 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
e400: 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65  VED marks the be
e410: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72  ginning of a nor
e420: 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f  mal.  ** write o
e430: 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20  peration (not a 
e440: 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot journal roll
e450: 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  back)..  */.  if
e460: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
e470: 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69     && pFile->eFi
e480: 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
e490: 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c  OCK.   && eFileL
e4a0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
e4b0: 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c  CK.  ){.    pFil
e4c0: 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
e4d0: 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
e4e0: 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
e4f0: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
e500: 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d  alWrite = 1;.  }
e510: 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20  .#endif...  if( 
e520: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e530: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
e540: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
e550: 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
e560: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
e570: 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
e580: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
e590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
e5a0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
e5b0: 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
e5c0: 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
e5d0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
e5e0: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
e5f0: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
e600: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
e610: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
e620: 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29   %d %s %s (unix)
e630: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
e640: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
e650: 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ock), .      rc=
e660: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
e670: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
e680: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e690: 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69  /*.** Add the fi
e6a0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
e6b0: 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c  ed by file handl
e6c0: 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63  e pFile to the c
e6d0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
e6e0: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
e6f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
e700: 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69  PendingFd(unixFi
e710: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
e720: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
e730: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
e740: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
e750: 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e  dFd *p = pFile->
e760: 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e  pUnused;.  p->pN
e770: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55  ext = pInode->pU
e780: 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d  nused;.  pInode-
e790: 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20  >pUnused = p;.  
e7a0: 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
e7b0: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20   pFile->pUnused 
e7c0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  = 0;.}../*.** Lo
e7d0: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
e7e0: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
e7f0: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
e800: 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
e810: 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
e820: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
e830: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
e840: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
e850: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
e860: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
e870: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
e880: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
e890: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
e8a0: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
e8b0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
e8c0: 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61  op..** .** If ha
e8d0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73  ndleNFSUnlock is
e8e0: 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64   true, then on d
e8f0: 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58  owngrading an EX
e900: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20  CLUSIVE_LOCK to 
e910: 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79  SHARED.** the by
e920: 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69  te range is divi
e930: 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73  ded into 2 parts
e940: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70   and the first p
e950: 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  art is unlocked 
e960: 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61  then.** set to a
e970: 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e   read lock, then
e980: 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20   the other part 
e990: 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b  is simply unlock
e9a0: 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ed.  This works 
e9b0: 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67  .** around a bug
e9c0: 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b   in BSD NFS lock
e9d0: 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20  d (also seen on 
e9e0: 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68  MacOSX 10.3+) th
e9f0: 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20  at fails to .** 
ea00: 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65  remove the write
ea10: 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f   lock on a regio
ea20: 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  n when a read lo
ea30: 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74  ck is set..*/.st
ea40: 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e  atic int posixUn
ea50: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
ea60: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
ea70: 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65  Lock, int handle
ea80: 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e  NFSUnlock){.  un
ea90: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
eaa0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
eab0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
eac0: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
ead0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
eae0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
eaf0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  K;..  assert( pF
eb00: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
eb10: 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
eb20: 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
eb30: 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
eb40: 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
eb50: 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c  Lock,.      pFil
eb60: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
eb70: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
eb80: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
eb90: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
eba0: 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
ebb0: 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
ebc0: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
ebd0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
ebe0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ebf0: 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
ec00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ec10: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
ec20: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
ec30: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
ec40: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
ec50: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
ec60: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
ec70: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
ec80: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
ec90: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
eca0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
ecb0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
ecc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
ecd0: 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
ece0: 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
ecf0: 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
ed00: 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
ed10: 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
ed20: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
ed30: 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
ed40: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
ed50: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
ed60: 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
ed70: 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
ed80: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
ed90: 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
eda0: 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
edb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
edc0: 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
edd0: 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
ede0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
edf0: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
ee00: 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
ee10: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
ee20: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
ee30: 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
ee40: 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
ee50: 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
ee60: 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
ee70: 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
ee80: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
ee90: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
eea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69  ..    */.    pFi
eeb0: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
eec0: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
eed0: 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
eee0: 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
eef0: 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
ef00: 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
ef10: 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
ef20: 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
ef30: 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
ef40: 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
ef50: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
ef60: 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
ef70: 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
ef80: 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
ef90: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
efa0: 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
efb0: 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
efc0: 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
efd0: 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
efe0: 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
eff0: 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
f000: 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
f010: 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
f020: 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
f030: 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
f040: 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
f050: 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
f060: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
f070: 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  {.#if !defined(_
f080: 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51  _APPLE__) || !SQ
f090: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
f0a0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
f0b0: 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55  (void)handleNFSU
f0c0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73  nlock;.      ass
f0d0: 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e  ert( handleNFSUn
f0e0: 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  lock==0 );.#endi
f0f0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
f100: 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
f110: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
f120: 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66  G_STYLE.      if
f130: 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
f140: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  k ){.        int
f150: 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20   tErrno;        
f160: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
f170: 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d  code from system
f180: 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a   call errors */.
f190: 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69          off_t di
f1a0: 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53  vSize = SHARED_S
f1b0: 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  IZE - 1;.       
f1c0: 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   .        lock.l
f1d0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
f1e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f1f0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f200: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f210: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
f220: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
f230: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
f240: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
f250: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f260: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  File, &lock)==(-
f270: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
f280: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
f290: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
f2a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f2b0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  CK;.          if
f2c0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
f2d0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
f2e0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f2f0: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
f300: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f310: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
f320: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
f330: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
f340: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
f350: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
f360: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
f370: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
f380: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
f390: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
f3a0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
f3b0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
f3c0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f3d0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
f3e0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
f3f0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
f400: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f410: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
f420: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
f430: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
f440: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
f450: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
f460: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
f470: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
f480: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
f490: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
f4a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
f4b0: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
f4c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
f4d0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
f4e0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
f4f0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
f500: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
f510: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
f520: 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53  HARED_FIRST+divS
f530: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  ize;.        loc
f540: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
f550: 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20  _SIZE-divSize;. 
f560: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
f570: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f580: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
f590: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
f5a0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
f5b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
f5c0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
f5d0: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
f5e0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72              stor
f600: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
f610: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
f620: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f630: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
f640: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f650: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
f660: 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
f670: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
f680: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
f690: 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  YLE */.      {. 
f6a0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
f6b0: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
f6c0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
f6d0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f6e0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
f6f0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f700: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
f710: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
f720: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69  _SIZE;.        i
f730: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f740: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
f750: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
f760: 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c   theory, the cal
f770: 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63  l to unixFileLoc
f780: 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  k() cannot fail 
f790: 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a  because another.
f7a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
f7b0: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
f7c0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
f7d0: 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73  lock. If it does
f7e0: 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  , this .        
f7f0: 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74    ** indicates t
f800: 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
f810: 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
f820: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69  lowing the locki
f830: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
f840: 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69  protocol. If thi
f850: 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72  s happens, retur
f860: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
f870: 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67  DLOCK. Returning
f880: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
f890: 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20  LITE_BUSY would 
f8a0: 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65  confuse the uppe
f8b0: 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63  r layer (in prac
f8c0: 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a  tice it causes .
f8d0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
f8e0: 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e  assert to fail).
f8f0: 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72   */ .          r
f900: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
f910: 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _RDLOCK;.       
f920: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f930: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
f940: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
f950: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
f960: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f970: 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
f980: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
f990: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
f9a0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
f9b0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f9c0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
f9d0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
f9e0: 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
f9f0: 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
fa00: 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
fa10: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
fa20: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
fa30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  =0 ){.      pIno
fa40: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
fa50: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
fa60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
fa70: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
fa80: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  UNLOCK;.      st
fa90: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
faa0: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
fab0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
fac0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
fad0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
fae0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
faf0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
fb00: 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
fb10: 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
fb20: 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
fb30: 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
fb40: 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
fb50: 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
fb60: 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
fb70: 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
fb80: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
fb90: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
fba0: 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
fbb0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
fbc0: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
fbd0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
fbe0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
fbf0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
fc00: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
fc10: 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
fc20: 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20  = 0L;.      if( 
fc30: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
fc40: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
fc50: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
fc60: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
fc70: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
fc80: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
fc90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
fca0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  OCK;.        sto
fcb0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
fcc0: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
fcd0: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
fce0: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
fcf0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
fd00: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
fd10: 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
fd20: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
fd30: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
fd40: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
fd50: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
fd60: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
fd70: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
fd80: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
fd90: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
fda0: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
fdb0: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
fdc0: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
fdd0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
fde0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
fdf0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
fe00: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
fe10: 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
fe20: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
fe30: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
fe40: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
fe50: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
fe60: 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a   }..end_unlock:.
fe70: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
fe80: 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
fe90: 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
fea0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
feb0: 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
fec0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
fed0: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
fee0: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
fef0: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
ff00: 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
ff10: 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
ff20: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
ff30: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
ff40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
ff50: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
ff60: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
ff70: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
ff80: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
ff90: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
ffa0: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
ffb0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
ffc0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
ffd0: 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
ffe0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
fff0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23  nt eFileLock){.#
10000 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
10010 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65  AP_SIZE>0.  asse
10020 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
10030 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28  HARED_LOCK || ((
10040 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e  unixFile *)id)->
10050 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
10060 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
10070 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
10080 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d  eFileLock, 0);.}
10090 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
100a0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
100b0 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66  tic int unixMapf
100c0 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
100d0 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73  d, i64 nByte);.s
100e0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55  tatic void unixU
100f0 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  nmapfile(unixFil
10100 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a  e *pFd);.#endif.
10110 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10120 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
10130 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
10140 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
10150 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
10160 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
10170 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
10180 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
10190 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
101a0 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
101b0 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
101c0 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
101d0 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
101e0 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
101f0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
10200 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
10210 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
10220 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
10230 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
10240 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
10250 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
10260 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
10270 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
10280 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
10290 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
102a0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
102b0 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
102c0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
102d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
102e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
102f0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
10300 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69  MAP_SIZE>0.  uni
10310 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  xUnmapfile(pFile
10320 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
10330 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
10340 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
10350 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
10360 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
10370 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
10380 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b   }.#if OS_VXWORK
10390 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  S.  if( pFile->p
103a0 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  Id ){.    if( pF
103b0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
103c0 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
103d0 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
103e0 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a  nk(pFile->pId->z
103f0 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
10400 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b      }.    vxwork
10410 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
10420 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
10430 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a  pFile->pId = 0;.
10440 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
10450 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f  f SQLITE_UNLINK_
10460 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66  AFTER_CLOSE.  if
10470 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
10480 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
10490 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e  LETE ){.    osUn
104a0 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74  link(pFile->zPat
104b0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
104c0 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70  free(*(char**)&p
104d0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
104e0 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
104f0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
10500 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
10510 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
10520 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  e->h));.  OpenCo
10530 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
10540 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
10550 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d  >pUnused);.  mem
10560 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
10570 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
10580 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10590 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
105a0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
105b0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
105c0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
105d0 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
105e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
105f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
10600 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
10610 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  .  verifyDbFile(
10620 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e  pFile);.  unixUn
10630 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
10640 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
10650 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69  tex();..  /* uni
10660 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20  xFile.pInode is 
10670 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72  always valid her
10680 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  e. Otherwise, a 
10690 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a  different close.
106a0 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e    ** routine (e.
106b0 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29  g. nolockClose()
106c0 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65  ) would be calle
106d0 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a  d instead..  */.
106e0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
106f0 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30  >pInode->nLock>0
10700 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   || pFile->pInod
10710 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
10720 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  =0 );.  if( ALWA
10730 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  YS(pFile->pInode
10740 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ) && pFile->pIno
10750 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
10760 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
10770 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
10780 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
10790 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
107a0 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
107b0 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
107c0 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
107d0 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
107e0 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
107f0 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
10800 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  r to pInode->pUn
10810 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77  used list.  It w
10820 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
10830 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20  ally closed .   
10840 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
10850 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
10860 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65  d..    */.    se
10870 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
10880 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
10890 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
108a0 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
108b0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
108c0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
108d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
108e0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  /************** 
108f0 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78  End of the posix
10900 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69   advisory lock i
10910 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
10980 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
109e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
109f0 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a  No-op Locking **
10a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a20 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61  .**.** Of the va
10a30 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d  rious locking im
10a40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76  plementations av
10a50 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73  ailable, this is
10a60 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73   by far the.** s
10a70 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e  implest:  lockin
10a80 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e  g is ignored.  N
10a90 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
10aa0 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61  e to lock the da
10ab0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66  tabase.** file f
10ac0 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  or reading or wr
10ad0 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iting..**.** Thi
10ae0 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
10af0 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
10b00 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e  r use on read-on
10b10 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  ly databases.** 
10b20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74  (ex: databases t
10b30 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69  hat are burned i
10b40 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20  nto CD-ROM, for 
10b50 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61  example.)  It ca
10b60 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65  n.** also be use
10b70 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61  d if the applica
10b80 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d  tion employs som
10b90 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61  e external mecha
10ba0 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65  nism to.** preve
10bb0 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  nt simultaneous 
10bc0 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61  access of the sa
10bd0 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  me database by t
10be0 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61  wo or more.** da
10bf0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10c00 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69  ns.  But there i
10c10 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b  s a serious risk
10c20 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20   of database.** 
10c30 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68  corruption if th
10c40 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
10c50 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61  is used in situa
10c60 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74  tions where mult
10c70 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  iple.** database
10c80 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
10c90 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
10ca0 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
10cb0 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a  e at the same.**
10cc0 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72   time and one or
10cd0 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63   more of those c
10ce0 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77  onnections are w
10cf0 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74  riting..*/..stat
10d00 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65  ic int nolockChe
10d10 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
10d20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
10d30 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f  Used, int *pResO
10d40 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
10d50 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
10d60 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  ;.  *pResOut = 0
10d70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10d80 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
10d90 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71  nt nolockLock(sq
10da0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
10db0 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
10dc0 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
10dd0 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
10de0 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
10df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10e00 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
10e10 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
10e20 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
10e30 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
10e40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10e50 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
10e60 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
10e70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10e80 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66  *.** Close the f
10e90 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
10ea0 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73  nt nolockClose(s
10eb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
10ec0 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73   {.  return clos
10ed0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
10ee0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
10ef0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
10f00 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70  e no-op lock imp
10f10 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
10f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f30 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f80 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
10f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
10ff0 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b  in dot-file Lock
11000 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74  **.**.** The dot
11030 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  file locking imp
11040 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
11050 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
11060 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a  f separate lock.
11070 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79  ** files (really
11080 20 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f   a directory) to
11090 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
110a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
110b0 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20    This works.** 
110c0 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76  on just about ev
110d0 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
110e0 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
110f0 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
11100 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
11110 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
11120 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
11130 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
11140 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
11150 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
11160 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
11170 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
11180 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
11190 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
111a0 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
111b0 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
111c0 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
111d0 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
111e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
111f0 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
11200 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
11210 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
11220 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
11230 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
11240 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
11250 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
11260 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
11270 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
11280 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
11290 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
112a0 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
112b0 72 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72  reating a subdir
112c0 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61  ectory in the sa
112d0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a  me directory as.
112e0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
112f0 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
11300 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
11310 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
11320 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
11330 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61  e existence of a
11340 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
11350 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
11360 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
11370 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79  other.** lock ty
11380 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
11390 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
113a0 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
113b0 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
113c0 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
113d0 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
113e0 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
113f0 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
11400 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
11410 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a  ock directory..*
11420 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
11430 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
11440 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11450 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
11460 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
11470 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
11480 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
11490 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
114a0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
114b0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
114c0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
114d0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
114e0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
114f0 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
11500 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
11510 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
11520 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
11530 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
11540 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
11550 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
11560 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
11570 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
11580 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
11590 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
115a0 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
115b0 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
115c0 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
115d0 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
115e0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
115f0 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
11600 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
11610 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
11620 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
11630 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
11640 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
11650 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11660 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11670 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
11680 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
11690 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
116a0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
116b0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
116c0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
116d0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
116e0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
116f0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
11700 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
11710 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
11720 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
11730 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
11740 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
11750 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
11760 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
11770 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
11780 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  LOCK ){.    /* E
11790 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65  ither this conne
117a0 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74  ction or some ot
117b0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
117c0 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
117d0 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  ss.    ** holds 
117e0 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
117f0 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  le.  No need to 
11800 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a  check further. *
11810 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  /.    reserved =
11820 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
11830 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20   /* The lock is 
11840 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79  held if and only
11850 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65   if the lockfile
11860 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63   exists */.    c
11870 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  onst char *zLock
11880 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  File = (const ch
11890 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
118a0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72  ngContext;.    r
118b0 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65  eserved = osAcce
118c0 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29  ss(zLockFile, 0)
118d0 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ==0;.  }.  OSTRA
118e0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
118f0 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
11900 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
11910 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
11920 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
11930 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
11940 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11950 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
11960 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
11970 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
11980 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
11990 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
119a0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
119b0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
119c0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
119d0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
119e0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
119f0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
11a00 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
11a10 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
11a20 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
11a30 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
11a40 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
11a50 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
11a60 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
11a70 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
11a80 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
11a90 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
11aa0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
11ab0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
11ac0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
11ad0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
11ae0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
11af0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
11b00 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
11b10 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
11b20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
11b30 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
11b40 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
11b50 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
11b60 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
11b70 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
11b80 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
11b90 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
11ba0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
11bb0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
11bc0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
11bd0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11be0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
11bf0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
11c00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11c10 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11c20 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11c30 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11c40 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11c50 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
11c60 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
11c70 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
11c80 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
11c90 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
11ca0 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
11cb0 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
11cc0 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
11cd0 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
11ce0 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
11cf0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
11d00 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11d10 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11d20 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
11d30 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11d40 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
11d50 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
11d60 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
11d70 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
11d80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11d90 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
11da0 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
11db0 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
11dc0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
11dd0 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
11de0 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
11df0 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
11e00 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
11e10 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
11e20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
11e30 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
11e40 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
11e50 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
11e60 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
11e70 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
11e80 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
11e90 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
11ea0 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
11eb0 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
11ec0 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
11ed0 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
11ee0 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
11ef0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
11f00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
11f10 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
11f20 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
11f30 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c   rc = osMkdir(zL
11f40 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a  ockFile, 0777);.
11f50 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
11f60 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
11f70 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c  pen/create the l
11f80 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ock directory */
11f90 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
11fa0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
11fb0 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
11fc0 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
11fd0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
11fe0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
11ff0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12000 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12010 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
12020 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
12030 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12040 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
12050 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
12060 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
12070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12080 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12090 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69  } .  .  /* got i
120a0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
120b0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
120c0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
120d0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
120e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
120f0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
12100 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
12110 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
12120 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
12130 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
12140 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
12150 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
12160 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
12170 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
12180 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
12190 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
121a0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
121b0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
121c0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
121d0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
121e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
121f0 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b  ** When the lock
12200 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65  ing level reache
12210 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74  s NO_LOCK, delet
12220 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e  e the lock file.
12230 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
12240 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  otlockUnlock(sql
12250 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12260 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
12270 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12280 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
12290 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
122a0 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
122b0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
122c0 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  text;.  int rc;.
122d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
122e0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
122f0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
12300 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
12310 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
12320 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
12330 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
12340 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
12350 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
12360 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
12370 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
12380 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
12390 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
123a0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
123b0 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
123c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
123d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
123e0 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f   To downgrade to
123f0 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20   shared, simply 
12400 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
12410 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68  nal notion of th
12420 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  e.  ** lock stat
12430 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d  e.  No need to m
12440 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c  ess with the fil
12450 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  e on disk..  */.
12460 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
12470 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
12480 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
12490 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
124a0 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
124b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
124c0 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75  .  /* To fully u
124d0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
124e0 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  se, delete the l
124f0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73  ock file */.  as
12500 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
12510 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63  =NO_LOCK );.  rc
12520 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b   = osRmdir(zLock
12530 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c  File);.  if( rc<
12540 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  0 && errno==ENOT
12550 44 49 52 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c  DIR ) rc = osUnl
12560 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a  ink(zLockFile);.
12570 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
12580 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
12590 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30  rrno;.    rc = 0
125a0 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54  ;.    if( ENOENT
125b0 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   != tErrno ){.  
125c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
125d0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
125e0 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
125f0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
12600 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
12610 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
12620 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
12630 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
12640 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12650 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
12660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
12680 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
12690 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
126a0 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
126b0 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
126c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
126d0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
126e0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
126f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12700 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  OK;.  if( id ){.
12710 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
12720 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12730 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b  )id;.    dotlock
12740 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
12750 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  CK);.    sqlite3
12760 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
12770 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
12780 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
12790 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
127a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a  return rc;.}./**
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d   End of the dot-
127d0 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  file lock implem
127e0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
127f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
128a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128b0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66  ******** Begin f
128c0 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  lock Locking ***
128d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
128f0 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63  .** Use the floc
12900 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  k() system call 
12910 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  to do file locki
12920 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  ng..**.** flock(
12930 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  ) locking is lik
12940 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69  e dot-file locki
12950 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76  ng in that the v
12960 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67  arious.** fine-g
12970 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  rain locking lev
12980 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  els supported by
12990 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c   SQLite are coll
129a0 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20  apsed into.** a 
129b0 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65  single exclusive
129c0 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72   lock.  In other
129d0 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20   words, SHARED, 
129e0 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a  RESERVED, and.**
129f0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61   PENDING locks a
12a00 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  re the same thin
12a10 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56  g as an EXCLUSIV
12a20 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a  E lock.  SQLite.
12a30 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77  ** still works w
12a40 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c  hen you do this,
12a50 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79   but concurrency
12a60 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63   is reduced sinc
12a70 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e.** only a sing
12a80 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62  le process can b
12a90 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  e reading the da
12aa0 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65  tabase at a time
12ab0 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69  ..**.** Omit thi
12ac0 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c  s section if SQL
12ad0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
12ae0 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e  NG_STYLE is turn
12af0 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 53 51  ed off.*/.#if SQ
12b00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
12b10 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
12b20 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63   Retry flock() c
12b30 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77  alls that fail w
12b40 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66  ith EINTR.*/.#if
12b50 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63  def EINTR.static
12b60 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63   int robust_floc
12b70 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  k(int fd, int op
12b80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
12b90 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64  o{ rc = flock(fd
12ba0 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  ,op); }while( rc
12bb0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
12bc0 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
12bd0 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  c;.}.#else.# def
12be0 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  ine robust_flock
12bf0 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29  (a,b) flock(a,b)
12c00 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f  .#endif.     ../
12c10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12c20 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
12c30 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
12c40 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
12c50 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
12c60 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
12c70 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
12c80 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
12c90 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
12ca0 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
12cb0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
12cc0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
12cd0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
12ce0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
12cf0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
12d00 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
12d10 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
12d20 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
12d30 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
12d40 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65  tic int flockChe
12d50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
12d60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12d70 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
12d80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12d90 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
12da0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
12db0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12dc0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
12dd0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12de0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
12df0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
12e00 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
12e10 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
12e20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  );.  .  /* Check
12e30 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
12e40 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
12e50 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
12e60 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
12e70 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
12e80 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
12e90 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
12ea0 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
12eb0 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
12ec0 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
12ed0 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
12ee0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
12ef0 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
12f00 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
12f10 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74  int lrc = robust
12f20 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
12f30 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
12f40 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72  NB);.    if( !lr
12f50 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f  c ){.      /* go
12f60 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
12f70 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c  ck it */.      l
12f80 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
12f90 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
12fa0 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28  _UN);.      if (
12fb0 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20   lrc ) {.       
12fc0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
12fd0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rno;.        /* 
12fe0 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69  unlock failed wi
12ff0 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  th an error */. 
13000 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c         lrc = SQL
13010 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
13020 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
13030 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
13040 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
13050 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
13060 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
13070 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
13080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13090 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
130a0 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
130b0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
130c0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
130d0 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
130e0 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
130f0 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
13100 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
13110 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
13120 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
13130 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
13140 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c   .      if( IS_L
13150 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
13160 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
13170 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
13180 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
13190 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
131a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
131b0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
131c0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
131d0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
131e0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
131f0 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d));..#ifdef SQL
13200 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
13210 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
13220 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
13230 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
13240 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
13250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13260 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
13270 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13280 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13290 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
132a0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
132b0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
132c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
132d0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
132e0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
132f0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
13300 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
13310 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
13320 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
13330 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
13340 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
13350 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
13360 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
13370 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
13380 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
13390 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
133a0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
133b0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
133c0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
133d0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
133e0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
133f0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
13400 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
13410 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
13420 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
13430 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
13440 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
13450 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
13460 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
13470 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
13480 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
13490 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
134a0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
134b0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
134c0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
134d0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
134e0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
134f0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
13500 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
13510 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
13520 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
13530 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
13540 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
13550 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
13560 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
13570 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
13580 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
13590 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
135a0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
135b0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
135c0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
135d0 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
135e0 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
135f0 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
13600 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
13610 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
13620 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
13630 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
13640 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
13650 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
13660 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
13670 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
13680 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
13690 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
136a0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
136b0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
136c0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
136d0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
136e0 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
136f0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13700 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13710 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13720 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
13730 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13740 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
13750 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
13760 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
13770 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
13780 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
13790 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
137a0 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
137b0 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
137c0 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
137d0 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
137e0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
137f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13800 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
13810 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13820 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
13830 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13840 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
13850 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
13860 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
13870 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
13880 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
13890 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
138a0 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
138b0 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
138c0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
138d0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
138e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
138f0 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
13900 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
13910 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
13920 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
13930 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rno);.    }.  } 
13940 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
13950 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
13960 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
13970 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
13980 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13990 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
139a0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
139b0 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
139c0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
139d0 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
139e0 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
139f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
13a00 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
13a10 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
13a20 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
13a30 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
13a40 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
13a50 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
13a60 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
13a70 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
13a80 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13a90 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
13aa0 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
13ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
13ac0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
13ad0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
13ae0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
13af0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
13b00 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
13b10 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
13b20 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
13b30 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
13b40 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
13b50 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
13b60 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
13b70 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
13b80 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
13b90 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
13ba0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
13bb0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
13bc0 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
13bd0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
13be0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
13bf0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
13c00 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
13c10 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
13c20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13c30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
13c40 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
13c50 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29  d pid=%d (flock)
13c60 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
13c70 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
13c80 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
13c90 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
13ca0 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
13cb0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
13cc0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
13cd0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
13ce0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
13cf0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
13d00 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
13d10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13d20 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
13d30 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
13d40 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
13d50 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
13d60 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
13d70 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
13d80 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
13d90 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13da0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
13db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13dc0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
13dd0 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
13de0 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
13df0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
13e00 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
13e10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
13e20 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13e30 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
13e40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
13e50 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
13e60 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13e70 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
13e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
13e90 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
13ea0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
13eb0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
13ec0 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
13ed0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
13ee0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
13ef0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
13f00 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
13f10 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
13f20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13f30 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
13f40 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f  ){.    flockUnlo
13f50 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
13f60 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
13f70 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
13f80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13f90 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13fa0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
13fb0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
13fc0 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  WORK */../******
13fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
13fe0 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c  d of the flock l
13ff0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
14000 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
14010 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
14020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14060 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
14070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
140c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140d0 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53  ** Begin Named S
140e0 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67  emaphore Locking
140f0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
14100 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
14110 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
14120 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
14130 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57  supported on VxW
14140 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  orks..**.** Sema
14150 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
14160 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61   like dot-lock a
14170 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74  nd flock in that
14180 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a   it really only.
14190 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c  ** supports EXCL
141a0 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20  USIVE locking.  
141b0 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  Only a single pr
141c0 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f  ocess can read o
141d0 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64  r write.** the d
141e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
141f0 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65  a time.  This re
14200 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20  duces potential 
14210 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74  concurrency, but
14220 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f  .** makes the lo
14230 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14240 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a  n much easier..*
14250 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
14260 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
14270 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
14280 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
14290 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
142a0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
142b0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
142c0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
142d0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
142e0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
142f0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
14300 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
14310 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
14320 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
14330 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
14340 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
14350 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
14360 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
14370 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
14380 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
14390 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43  static int semXC
143a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
143b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
143c0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
143d0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
143e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
143f0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
14400 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14410 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14420 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14430 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
14440 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14450 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
14460 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14470 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
14480 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
14490 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
144a0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
144b0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
144c0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
144d0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
144e0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
144f0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
14500 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
14510 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
14520 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
14530 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d  erved ){.    sem
14540 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
14550 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
14560 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79  .    if( sem_try
14570 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
14580 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
14590 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
145a0 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20    if( EAGAIN != 
145b0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
145c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
145d0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
145e0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
145f0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
14600 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
14610 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
14620 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
14630 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
14640 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f          /* someo
14650 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20  ne else has the 
14660 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65  lock when we are
14670 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20   in NO_LOCK */. 
14680 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
14690 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  = (pFile->eFileL
146a0 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43  ock < SHARED_LOC
146b0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
146c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
146d0 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74  we could have it
146e0 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a   if we want it *
146f0 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74  /.      sem_post
14700 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pSem);.    }.  
14710 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
14720 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
14730 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46   %d (sem)\n", pF
14740 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
14750 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73  rved));..  *pRes
14760 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
14770 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14780 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
14790 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
147a0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
147b0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
147c0 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
147d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
147e0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
147f0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
14800 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
14810 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
14820 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
14830 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
14840 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
14850 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
14860 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
14870 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
14880 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
14890 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
148a0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
148b0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
148c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
148d0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
148e0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
148f0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
14900 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
14910 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
14920 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
14930 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
14940 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
14950 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
14960 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
14970 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
14980 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
14990 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
149a0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
149b0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
149c0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
149d0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
149e0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
149f0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
14a00 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14a10 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
14a20 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
14a30 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  VE.**.** Semapho
14a40 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65  re locks only re
14a50 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43  ally support EXC
14a60 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57  LUSIVE locks.  W
14a70 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64  e track intermed
14a80 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61  iate.** lock sta
14a90 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
14aa0 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
14ab0 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73  e, but all locks
14ac0 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62   SHARED or.** ab
14ad0 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45  ove are really E
14ae0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61  XCLUSIVE locks a
14af0 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f  nd exclude all o
14b00 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66  ther processes f
14b10 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68  rom.** access th
14b20 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
14b30 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
14b40 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
14b50 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
14b60 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
14b70 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
14b80 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
14b90 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
14ba0 69 6e 74 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c  int semXLock(sql
14bb0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14bc0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
14bd0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14be0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
14bf0 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
14c00 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
14c10 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63  ->pSem;.  int rc
14c20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
14c30 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
14c40 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
14c50 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
14c60 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
14c70 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
14c80 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
14c90 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
14ca0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
14cb0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
14cc0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14cd0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63  FileLock;.    rc
14ce0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14cf0 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
14d00 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
14d10 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20   lock semaphore 
14d20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74  now but bail out
14d30 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f   when already lo
14d40 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73  cked. */.  if( s
14d50 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
14d60 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==-1 ){.    rc =
14d70 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
14d80 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
14d90 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67  ock;.  }..  /* g
14da0 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
14db0 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
14dc0 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
14dd0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
14de0 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c  ock;.. sem_end_l
14df0 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ock:.  return rc
14e00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
14e10 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
14e20 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
14e30 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
14e40 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
14e50 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
14e60 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
14e70 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
14e80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
14e90 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
14ea0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14eb0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
14ec0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
14ed0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
14ee0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
14ef0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
14f00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
14f10 65 6d 58 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  emXUnlock(sqlite
14f20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14f30 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14f40 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14f50 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14f60 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
14f70 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
14f80 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Sem;..  assert( 
14f90 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  pFile );.  asser
14fa0 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54  t( pSem );.  OST
14fb0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
14fc0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
14fd0 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
14fe0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
14ff0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15000 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f  le->eFileLock, o
15010 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
15020 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
15030 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
15040 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
15050 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
15060 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
15070 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
15080 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
150a0 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
150b0 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
150c0 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
150d0 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
150e0 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
150f0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
15100 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
15110 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
15120 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
15130 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15140 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
15150 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ly unlock. */.  
15160 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53  if ( sem_post(pS
15170 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  em)==-1 ) {.    
15180 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d  int rc, tErrno =
15190 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
151a0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
151b0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
151c0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
151d0 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
151e0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
151f0 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
15200 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
15210 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
15220 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
15230 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
15240 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
15250 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
15260 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
15270 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
15280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
15290 6d 58 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  mXClose(sqlite3_
152a0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
152b0 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
152c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
152d0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
152e0 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20   semXUnlock(id, 
152f0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73  NO_LOCK);.    as
15300 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15310 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
15320 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
15330 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
15340 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
15350 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73  utex();.    clos
15360 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
15370 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
15380 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
15390 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
153a0 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  /./*.** Named se
153b0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
153c0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
153d0 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  e on VxWorks..**
153e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
153f0 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65   End of the name
15400 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
15410 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
15420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15430 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
15480 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
15490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
154e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
154f0 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67  egin AFP Locking
15500 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
15510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15520 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20  **.**.** AFP is 
15530 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67  the Apple Filing
15540 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20   Protocol.  AFP 
15550 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c  is a network fil
15560 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a  esystem found.**
15570 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74   on Apple Macint
15580 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20  osh computers - 
15590 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58  both OS9 and OSX
155a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61  ..**.** Third-pa
155b0 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  rty implementati
155c0 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61  ons of AFP are a
155d0 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74  vailable.  But t
155e0 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  his code here.**
155f0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f   only works on O
15600 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SX..*/..#if defi
15610 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
15620 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
15630 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
15640 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69  .** The afpLocki
15650 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
15660 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
15670 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
15680 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65  ic state.*/.type
15690 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
156a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
156b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
156c0 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
156d0 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74  gContext {.  int
156e0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e   reserved;.  con
156f0 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  st char *dbPath;
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15710 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
15720 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72   file */.};..str
15730 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
15740 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  kPB2.{.  unsigne
15750 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
15760 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  et;        /* of
15770 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
15780 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  te to lock */.  
15790 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
157a0 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  ng length;      
157b0 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65    /* nbr of byte
157c0 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  s to lock */.  u
157d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
157e0 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b  g retRangeStart;
157f0 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62   /* nbr of 1st b
15800 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75  yte locked if su
15810 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e  ccessful */.  un
15820 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f  signed char unLo
15830 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  ckFlag;         
15840 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30  /* 1 = unlock, 0
15850 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73   = lock */.  uns
15860 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74  igned char start
15870 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  EndFlag;       /
15880 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f  * 1=rel to end o
15890 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f  f fork, 0=rel to
158a0 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20   start */.  int 
158b0 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
158d0 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73   file desc to as
158e0 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69  soc this lock wi
158f0 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  th */.};..#defin
15900 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  e afpfsByteRange
15910 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20  Lock2FSCTL      
15920 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c    _IOWR('z', 23,
15930 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
15940 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a  eLockPB2)../*.**
15950 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
15960 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f  ty for setting o
15970 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74  r clearing a bit
15980 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61  -range lock on a
15990 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73  n.** AFP filesys
159a0 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75  tem..** .** Retu
159b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
159c0 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f  success, SQLITE_
159d0 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e  BUSY on failure.
159e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
159f0 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e  fpSetLock(.  con
15a00 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
15a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15a20 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
15a30 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20  to be locked or 
15a40 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  unlocked */.  un
15a50 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a70 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
15a80 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a  ptor on path */.
15a90 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
15aa0 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20  long offset,    
15ab0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74   /* First byte t
15ac0 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
15ad0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
15ae0 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20  ong length,     
15af0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
15b00 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
15b10 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  int setLockFlag 
15b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15b30 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f  * True to set lo
15b40 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c  ck.  False to cl
15b50 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  ear lock */.){. 
15b60 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
15b70 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69  eLockPB2 pb;.  i
15b80 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e  nt err;.  .  pb.
15b90 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74  unLockFlag = set
15ba0 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31  LockFlag ? 0 : 1
15bb0 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46  ;.  pb.startEndF
15bc0 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66  lag = 0;.  pb.of
15bd0 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20  fset = offset;. 
15be0 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e   pb.length = len
15bf0 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20  gth; .  pb.fd = 
15c00 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f  pFile->h;.  .  O
15c10 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
15c20 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25  OCK [%s] for %d%
15c30 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a  s in range %llx:
15c40 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73  %llx\n", .    (s
15c50 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a  etLockFlag?"ON":
15c60 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68  "OFF"), pFile->h
15c70 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74  , (pb.fd==-1?"[t
15c80 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a  estval-1]":""),.
15c90 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67      offset, leng
15ca0 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  th));.  err = fs
15cb0 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
15cc0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
15cd0 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
15ce0 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
15cf0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
15d00 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
15d10 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
15d20 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69  ("AFPSETLOCK fai
15d30 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
15d40 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  %s' %d %s\n",.  
15d50 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
15d60 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f   tErrno, strerro
15d70 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66  r(tErrno)));.#if
15d80 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
15d90 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
15da0 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
15db0 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
15dc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
15dd0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
15de0 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
15e00 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
15e10 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
15e20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
15e30 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
15e40 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
15e50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
15e60 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15e70 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
15e80 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
15e90 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
15ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
15eb0 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20  rn rc;.  } else 
15ec0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15ed0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
15ee0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15ef0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
15f00 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
15f10 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
15f20 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
15f30 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
15f40 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
15f50 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
15f60 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
15f70 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
15f80 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
15f90 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
15fa0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
15fb0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15fc0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
15fd0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
15fe0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
15ff0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
16000 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
16010 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b  tic int afpCheck
16020 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
16030 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16040 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
16050 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16060 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
16070 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
16080 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16090 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
160a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
160b0 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69  context;.  .  Si
160c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
160d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
160e0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
160f0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
16100 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
16110 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c   context = (afpL
16120 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
16130 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
16140 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f  ontext;.  if( co
16150 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
16160 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
16170 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
16180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16190 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
161a0 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
161b0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
161c0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
161d0 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
161e0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
161f0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
16200 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
16210 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
16220 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
16230 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
16240 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
16250 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
16260 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
16270 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
16280 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
16290 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
162a0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
162b0 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
162c0 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
162d0 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
162e0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
162f0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
16300 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
16310 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
16320 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
16330 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
16340 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
16350 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
16360 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
16370 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
16380 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
16390 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
163a0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
163b0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
163c0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
163d0 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
163e0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
163f0 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
16400 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
16410 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
16420 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
16430 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
16440 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
16450 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16460 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
16470 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
16480 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
16490 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
164a0 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
164b0 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c   %d %d %d (afp)\
164c0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
164d0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
164e0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
164f0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
16500 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
16510 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
16520 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
16530 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
16540 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
16550 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
16560 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
16570 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
16580 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
16590 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
165a0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
165b0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
165c0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
165d0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
165e0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
165f0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
16600 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
16610 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
16620 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
16630 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
16640 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
16650 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
16660 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
16670 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
16680 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
16690 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
166a0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
166b0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
166c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
166d0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
166e0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
166f0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
16700 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
16710 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
16720 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
16730 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
16740 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
16750 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
16760 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
16770 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
16780 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
16790 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
167a0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
167b0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
167c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
167d0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
167e0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
167f0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
16800 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
16810 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
16820 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
16830 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73  ic int afpLock(s
16840 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16850 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
16860 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16870 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
16880 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16890 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
168a0 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
168b0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
168c0 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
168d0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
168e0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
168f0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
16900 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
16910 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
16920 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
16930 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
16940 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
16950 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
16960 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
16970 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
16980 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
16990 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
169a0 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
169b0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
169c0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
169d0 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
169e0 64 20 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  d , osGetpid(0))
169f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
16a00 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
16a10 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
16a20 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
16a30 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
16a40 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
16a50 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
16a60 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63   the afp_end_loc
16a70 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
16a80 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
16a90 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
16aa0 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
16ab0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
16ac0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
16ad0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
16ae0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
16af0 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
16b00 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c   held) (afp)\n",
16b10 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
16b20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
16b30 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
16b40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16b50 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
16b60 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
16b70 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
16b80 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28   correct.  **  (
16b90 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
16ba0 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
16bb0 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
16bc0 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
16bd0 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
16be0 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
16bf0 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
16c00 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
16c10 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
16c20 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
16c30 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
16c40 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
16c50 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
16c60 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
16c70 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
16c80 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
16c90 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
16ca0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
16cb0 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
16cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
16cd0 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
16ce0 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
16cf0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16d00 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
16d10 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
16d20 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
16d30 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
16d40 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
16d50 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
16d60 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
16d70 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
16d80 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
16d90 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
16da0 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
16db0 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
16dc0 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
16dd0 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
16de0 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
16df0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
16e00 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
16e10 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
16e20 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
16e30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
16e40 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
16e50 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
16e60 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
16e70 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
16e80 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
16e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16ea0 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
16eb0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
16ec0 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
16ed0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
16ee0 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
16ef0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
16f00 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
16f10 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
16f20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
16f30 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
16f40 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
16f50 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
16f60 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
16f70 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
16f80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
16f90 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
16fa0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16fb0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
16fc0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
16fd0 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
16fe0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
16ff0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
17000 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17010 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
17020 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
17030 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
17040 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
17050 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
17060 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
17070 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
17080 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
17090 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
170a0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
170b0 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
170c0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
170d0 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
170e0 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
170f0 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
17100 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
17110 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
17120 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
17130 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
17140 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
17150 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
17160 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
17170 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
17180 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
17190 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
171a0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
171b0 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
171c0 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
171d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
171e0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
171f0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17200 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
17210 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
17220 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
17230 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
17240 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
17250 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
17260 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
17270 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
17280 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
17290 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
172a0 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
172b0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
172c0 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
172d0 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
172e0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
172f0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17300 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
17310 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
17320 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67  no = 0;.    long
17330 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
17340 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
17350 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
17360 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
17370 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
17380 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
17390 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
173a0 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
173b0 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
173c0 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
173d0 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
173e0 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
173f0 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
17400 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
17410 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
17420 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
17430 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
17440 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
17450 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
17460 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
17470 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
17480 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
17490 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
174a0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
174b0 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
174c0 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
174d0 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
174e0 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
174f0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
17500 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
17510 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
17520 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
17530 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
17540 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
17550 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
17560 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
17570 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17580 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
17590 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
175a0 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
175b0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
175c0 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73  rc1) ) {.      s
175d0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
175e0 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b  ile, lrc1Errno);
175f0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
17600 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
17610 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
17620 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
17630 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
17640 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
17650 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
17660 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
17670 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
17680 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
17690 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
176a0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
176b0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
176c0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
176d0 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
176e0 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
176f0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17700 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
17710 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
17720 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
17730 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
17740 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
17750 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
17760 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
17770 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
17780 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
17790 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
177a0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
177b0 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
177c0 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
177d0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
177e0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
177f0 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
17800 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
17810 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
17820 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
17830 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
17840 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
17850 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
17860 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
17870 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
17880 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
17890 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
178a0 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
178b0 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
178c0 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
178d0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
178e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
178f0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
17900 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
17910 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
17920 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
17930 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
17940 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17950 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
17960 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
17970 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
17980 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
17990 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
179a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
179b0 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
179c0 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
179d0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
179e0 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
179f0 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
17a00 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
17a10 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
17a20 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
17a30 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
17a40 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
17a50 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
17a60 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
17a70 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
17a80 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
17a90 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
17aa0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
17ab0 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
17ac0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17ad0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17ae0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
17b10 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17b20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
17b30 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
17b40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
17b50 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
17b60 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
17b70 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
17b80 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
17b90 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
17ba0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17bb0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
17bc0 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
17bf0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
17c00 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
17c10 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
17c20 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17c30 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c50 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
17c60 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
17c70 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
17c80 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
17c90 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
17ca0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
17cb0 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
17cc0 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
17cd0 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
17ce0 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
17cf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17d00 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
17d10 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  d & SQLITE_IOERR
17d20 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
17d30 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17d50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
17d60 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
17d70 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
17d80 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
17d90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
17da0 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
17db0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17dc0 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
17dd0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
17de0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
17df0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17e00 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
17e10 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
17e20 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
17e30 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
17e40 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
17e50 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
17e60 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
17e70 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
17e80 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
17e90 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
17ea0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
17eb0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
17ec0 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
17ed0 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
17ee0 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
17ef0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
17f00 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
17f10 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
17f20 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
17f30 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
17f40 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
17f50 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
17f60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17f70 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
17f80 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
17f90 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
17fa0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
17fb0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
17fc0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
17fd0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
17fe0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
17ff0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
18000 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
18010 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
18020 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
18030 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
18040 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
18050 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18060 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
18070 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
18080 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
18090 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
180a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
180b0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
180c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
180d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
180e0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
180f0 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
18100 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
18110 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
18120 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
18130 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
18140 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
18150 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
18160 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
18170 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
18180 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
18190 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
181a0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
181b0 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
181c0 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
181d0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
181e0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
181f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18200 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
18210 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
18220 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
18230 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
18240 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
18250 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
18260 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
18270 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
18280 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
18290 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
182a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
182b0 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
182c0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
182d0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
182e0 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
182f0 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
18300 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
18310 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
18320 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
18330 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
18340 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
18350 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69  leLock );.    Si
18360 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18370 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
18380 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
18390 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
183a0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
183b0 30 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20  0);.    .#ifdef 
183c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
183d0 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
183e0 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
183f0 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
18400 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
18410 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
18420 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
18430 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
18440 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
18450 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
18460 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
18470 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
18480 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
18490 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
184a0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
184b0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
184c0 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
184d0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
184e0 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
184f0 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
18500 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
18510 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
18520 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
18530 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
18540 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
18550 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
18560 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
18570 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
18580 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
18590 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
185a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
185b0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
185c0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
185d0 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
185e0 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
185f0 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
18600 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
18610 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
18620 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
18630 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
18640 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18650 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
18660 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18670 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18680 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18690 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
186a0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
186b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
186c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
186d0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
186e0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
186f0 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
18700 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
18710 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
18720 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
18730 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
18740 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
18750 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
18760 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
18770 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
18780 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18790 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
187a0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
187b0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
187c0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
187d0 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
187e0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
187f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
18800 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
18810 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
18820 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
18830 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18840 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18850 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
18860 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
18870 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
18880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18890 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
188a0 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
188b0 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
188c0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
188d0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
188e0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
188f0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
18900 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
18910 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
18920 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
18930 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
18940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18950 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18960 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
18970 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18980 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
18990 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
189a0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
189b0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
189c0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
189d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
189e0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
189f0 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
18a00 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
18a10 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
18a20 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
18a30 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
18a40 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
18a50 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
18a60 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
18a70 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
18a80 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
18a90 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
18aa0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
18ab0 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
18ac0 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
18ad0 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
18ae0 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
18af0 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
18b00 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
18b10 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
18b20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18b30 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
18b40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18b50 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
18b60 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18b70 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
18b80 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
18b90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18ba0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18bb0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18bc0 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
18bd0 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
18be0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
18bf0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
18c00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
18c10 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
18c20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18c30 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
18c40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18c50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18c60 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
18c70 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
18c80 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
18c90 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
18ca0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
18cb0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
18cc0 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
18cd0 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
18ce0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
18cf0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
18d00 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18d10 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
18d20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
18d30 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
18d40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
18d50 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61  se a file & clea
18d60 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63  nup AFP specific
18d70 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
18d80 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
18d90 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  afpClose(sqlite3
18da0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
18db0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18dc0 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
18dd0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
18de0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
18df0 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63  id;.    afpUnloc
18e00 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
18e10 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
18e20 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ex();.    if( pF
18e30 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70  ile->pInode && p
18e40 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
18e50 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
18e60 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
18e70 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
18e80 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
18e90 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
18ea0 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74  ust.      ** yet
18eb0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
18ec0 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
18ed0 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
18ee0 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
18ef0 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
18f00 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65  r to pInode->aPe
18f10 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
18f20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
18f30 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
18f40 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
18f50 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
18f60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
18f70 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
18f80 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
18f90 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
18fa0 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  File);.    sqlit
18fb0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
18fc0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
18fd0 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e      rc = closeUn
18fe0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
18ff0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
19000 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19010 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
19020 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19030 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
19040 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
19050 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
19060 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
19070 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
19080 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
19090 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
190a0 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
190b0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
190c0 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
190d0 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
190e0 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
190f0 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75  ailable.  If you
19100 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66   don't compile f
19110 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74  or a mac, then t
19120 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a  he "unix-afp".**
19130 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69   VFS is not avai
19140 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  lable..**.******
19150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
19160 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c  End of the AFP l
19170 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
19180 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
19190 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
191a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191e0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
191f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
19240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19250 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53  ****** Begin NFS
19260 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
19270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20  *********/..#if 
19290 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
192a0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
192b0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
192c0 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74  E./*. ** Lower t
192d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
192e0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
192f0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
19300 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
19310 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65  ck. ** must be e
19320 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
19330 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a   SHARED_LOCK.. *
19340 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  *. ** If the loc
19350 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
19360 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
19370 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
19380 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65  or below. ** the
19390 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
193a0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
193b0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
193c0 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  p.. */.static in
193d0 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  t nfsUnlock(sqli
193e0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
193f0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
19400 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f  return posixUnlo
19410 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
19420 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
19430 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
19440 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
19450 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
19460 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
19470 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
19480 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
19490 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
194a0 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
194b0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
194c0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
194d0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
194e0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
194f0 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
19500 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
19510 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
19520 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
19530 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
19540 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
19550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19560 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
19570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
195b0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
195c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19600 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
19610 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
19620 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
19630 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
19640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19650 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
19660 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
19670 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
19680 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
19690 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
196a0 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
196b0 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
196c0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
196d0 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
196e0 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
196f0 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
19700 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
19710 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
19720 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
19730 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
19740 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
19750 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
19760 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
19770 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
19780 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
19790 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
197a0 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
197b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
197c0 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
197d0 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
197e0 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
197f0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
19800 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
19810 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
19820 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
19830 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
19840 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
19850 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
19860 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
19870 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
19880 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
19890 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
198a0 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
198b0 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
198c0 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
198d0 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
198e0 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79 20 66  READ.** in any f
198f0 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20  orm by default, 
19900 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  we will not atte
19910 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  mpt to define _X
19920 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20  OPEN_SOURCE..** 
19930 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34  See tickets #274
19940 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a  1 and #2681..**.
19950 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
19960 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
19970 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
19980 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72   read the lastEr
19990 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
199a0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
199b0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
199c0 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
199d0 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
199e0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
199f0 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
19a00 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
19a10 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72  got;.  int prior
19a20 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69   = 0;.#if (!defi
19a30 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
19a40 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
19a50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
19a60 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
19a70 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
19a80 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28    assert( cnt==(
19a90 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a  cnt&0x1ffff) );.
19aa0 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e    assert( id->h>
19ab0 32 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78  2 );.  cnt &= 0x
19ac0 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66  1ffff;.  do{.#if
19ad0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19ae0 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
19af0 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
19b00 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
19b10 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
19b20 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
19b30 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
19b40 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
19b50 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
19b60 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19b70 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
19b80 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19b90 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
19ba0 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
19bb0 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
19bc0 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
19bd0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
19be0 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
19bf0 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  t-- );.    if( n
19c00 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
19c10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
19c20 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
19c30 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
19c40 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
19c50 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20  e*)id, errno);. 
19c60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19c70 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
19c80 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
19c90 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
19ca0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
19cb0 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
19cc0 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
19cd0 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
19ce0 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
19cf0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
19d00 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
19d10 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
19d20 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
19d30 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
19d40 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
19d50 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
19d60 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20  (unixFile*)id,  
19d70 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
19d80 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
19d90 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
19da0 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
19db0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
19dc0 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
19dd0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
19de0 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
19df0 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
19e00 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
19e10 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
19e20 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
19e30 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
19e40 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
19e50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
19e60 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
19e70 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
19e80 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
19e90 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
19ea0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
19eb0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
19ec0 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
19ed0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
19ee0 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
19ef0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
19f00 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
19f10 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
19f20 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
19f30 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
19f40 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
19f50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19f60 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
19f70 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
19f80 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
19f90 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
19fa0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
19fb0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
19fc0 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
19fd0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
19fe0 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
19ff0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1a000 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1a010 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1a020 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1a030 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1a040 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1a050 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1a060 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1a070 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1a080 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1a090 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1a0a0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
1a0b0 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
1a0c0 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
1a0d0 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
1a0e0 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
1a0f0 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
1a100 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
1a110 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1a120 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
1a130 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
1a140 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75  f this read requ
1a150 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
1a160 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
1a170 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
1a180 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
1a190 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
1a1a0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
1a1b0 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
1a1c0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
1a1d0 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
1a1e0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1a1f0 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1a200 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
1a210 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1a220 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20  fset], amt);.   
1a230 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a240 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1a250 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
1a260 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1a270 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1a280 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
1a290 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1a2a0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1a2b0 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
1a2c0 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
1a2d0 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
1a2e0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
1a2f0 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
1a300 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
1a310 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67  .  }.#endif..  g
1a320 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
1a330 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1a340 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
1a350 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
1a360 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a370 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
1a380 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
1a390 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
1a3a0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
1a3b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a3c0 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
1a3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65  }else{.    store
1a3e0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1a3f0 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20   0);   /* not a 
1a400 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1a410 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
1a420 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
1a430 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
1a440 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
1a450 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
1a460 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d  f)[got], 0, amt-
1a470 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  got);.    return
1a480 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1a490 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a  ORT_READ;.  }.}.
1a4a0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1a4b0 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d  o seek the file-
1a4c0 64 65 73 63 72 69 70 74 6f 72 20 70 61 73 73 65  descriptor passe
1a4d0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1a4e0 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62  rgument to.** ab
1a4f0 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f  solute offset iO
1a500 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  ff, then attempt
1a510 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62   to write nBuf b
1a520 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f  ytes of data fro
1a530 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e  m.** pBuf to it.
1a540 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1a550 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61  urs, return -1 a
1a560 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e  nd set *piErrno.
1a570 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
1a580 72 65 74 75 72 6e 20 74 68 65 20 61 63 74 75 61  return the actua
1a590 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
1a5a0 73 20 77 72 69 74 74 65 6e 20 28 77 68 69 63 68  s written (which
1a5b0 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68 61   may be less tha
1a5c0 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73  n.** nBuf)..*/.s
1a5d0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1a5e0 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20  dWriteFd(.  int 
1a5f0 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
1a600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a610 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1a620 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
1a630 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20  i64 iOff,       
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a650 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74  /* File offset t
1a660 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
1a670 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  at */.  const vo
1a680 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1a690 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
1a6a0 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62  data from this b
1a6b0 75 66 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c  uffer to the fil
1a6c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c  e */.  int nBuf,
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1a6f0 66 20 62 75 66 66 65 72 20 70 42 75 66 20 69 6e  f buffer pBuf in
1a700 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
1a710 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20  *piErrno        
1a720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a730 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72  UT: Error number
1a740 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73   if error occurs
1a750 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1a760 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1a770 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1a780 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 79  e returned by sy
1a790 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  stem call */..  
1a7a0 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e  assert( nBuf==(n
1a7b0 42 75 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a  Buf&0x1ffff) );.
1a7c0 20 20 61 73 73 65 72 74 28 20 66 64 3e 32 20 29    assert( fd>2 )
1a7d0 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78 31 66  ;.  nBuf &= 0x1f
1a7e0 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41  fff;.  TIMER_STA
1a7f0 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  RT;..#if defined
1a800 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f  (USE_PREAD).  do
1a810 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77  { rc = (int)osPw
1a820 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e  rite(fd, pBuf, n
1a830 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69  Buf, iOff); }whi
1a840 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1a850 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69  o==EINTR );.#eli
1a860 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1a870 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 72 63 20  EAD64).  do{ rc 
1a880 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 36  = (int)osPwrite6
1a890 34 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  4(fd, pBuf, nBuf
1a8a0 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65 28 20  , iOff);}while( 
1a8b0 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1a8c0 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64  INTR);.#else.  d
1a8d0 6f 7b 0a 20 20 20 20 69 36 34 20 69 53 65 65 6b  o{.    i64 iSeek
1a8e0 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69 4f 66   = lseek(fd, iOf
1a8f0 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  f, SEEK_SET);.  
1a900 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a910 72 28 20 69 53 65 65 6b 2d 2d 20 29 3b 0a 0a 20  r( iSeek-- );.. 
1a920 20 20 20 69 66 28 20 69 53 65 65 6b 21 3d 69 4f     if( iSeek!=iO
1a930 66 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ff ){.      if( 
1a940 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72  piErrno ) *piErr
1a950 6e 6f 20 3d 20 28 69 53 65 65 6b 3d 3d 2d 31 20  no = (iSeek==-1 
1a960 3f 20 65 72 72 6e 6f 20 3a 20 30 29 3b 0a 20 20  ? errno : 0);.  
1a970 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1a980 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
1a990 57 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20  Write(fd, pBuf, 
1a9a0 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28  nBuf);.  }while(
1a9b0 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1a9c0 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
1a9d0 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
1a9e0 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
1a9f0 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
1aa00 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63   %llu\n", fd, rc
1aa10 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c  , iOff, TIMER_EL
1aa20 41 50 53 45 44 29 29 3b 0a 0a 20 20 69 66 28 20  APSED));..  if( 
1aa30 72 63 3c 30 20 26 26 20 70 69 45 72 72 6e 6f 20  rc<0 && piErrno 
1aa40 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72 72  ) *piErrno = err
1aa50 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  no;.  return rc;
1aa60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .}.../*.** Seek 
1aa70 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
1aa80 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
1aa90 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
1aaa0 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
1aab0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1aac0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1aad0 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
1aae0 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
1aaf0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
1ab00 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
1ab10 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
1ab20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
1ab30 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1ab40 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1ab50 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1ab60 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
1ab70 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
1ab80 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
1ab90 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
1aba0 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e 20   cnt){.  return 
1abb0 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 69  seekAndWriteFd(i
1abc0 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70 42  d->h, offset, pB
1abd0 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61  uf, cnt, &id->la
1abe0 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a  stErrno);.}.../*
1abf0 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
1ac00 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
1ac10 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
1ac20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1ac30 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
1ac40 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
1ac50 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
1ac60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1ac70 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
1ac80 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
1ac90 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1aca0 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1acb0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1acc0 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
1acd0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1ace0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
1acf0 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
1ad00 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
1ad10 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
1ad20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1ad30 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1ad40 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
1ad50 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
1ad60 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
1ad70 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
1ad80 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
1ad90 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
1ada0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1adb0 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
1adc0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
1add0 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
1ade0 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
1adf0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
1ae00 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
1ae10 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
1ae20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   );.#endif..#ifd
1ae30 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ae40 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1ae50 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1ae60 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1ae70 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1ae80 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
1ae90 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1aea0 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1aeb0 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1aec0 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
1aed0 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1aee0 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
1aef0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
1af00 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
1af10 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
1af20 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
1af30 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
1af40 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
1af50 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
1af60 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
1af70 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1af80 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  rite ){.    pFil
1af90 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b  e->dbUpdate = 1;
1afa0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1afb0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
1afc0 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ied */.    if( o
1afd0 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66  ffset<=24 && off
1afe0 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20  set+amt>=27 ){. 
1aff0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1b000 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b     char oldCntr[
1b010 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4];.      Simula
1b020 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1b030 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
1b040 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
1b050 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34  , 24, oldCntr, 4
1b060 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1b070 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1b080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b090 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64  =4 || memcmp(old
1b0a0 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70  Cntr, &((char*)p
1b0b0 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c  Buf)[24-offset],
1b0c0 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)!=0 ){.      
1b0d0 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1b0e0 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20  trChng = 1;  /* 
1b0f0 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1b100 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e  counter has chan
1b110 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ged */.      }. 
1b120 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1b130 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1b140 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1b150 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1b160 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
1b170 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1b180 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1b190 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1b1a0 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1b1b0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1b1c0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1b1d0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1b1e0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1b1f0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1b200 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1b210 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1b220 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1b230 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1b240 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
1b250 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b260 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1b270 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1b280 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1b290 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1b2a0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1b2b0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1b2c0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1b2d0 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
1b2e0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1b2f0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1b300 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1b310 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1b320 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1b330 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1b340 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30  ..  while( amt>0
1b350 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65   && (wrote = see
1b360 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1b370 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1b380 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d  mt))>0 ){.    am
1b390 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
1b3a0 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b  offset += wrote;
1b3b0 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
1b3c0 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
1b3d0 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74  ];.  }.  Simulat
1b3e0 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65  eIOError(( wrote
1b3f0 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b  =(-1), amt=1 ));
1b400 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1b410 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65  ullError(( wrote
1b420 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20  =0, amt=1 ));.. 
1b430 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
1b440 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26    if( wrote<0 &&
1b450 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1b460 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20  o!=ENOSPC ){.   
1b470 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1b480 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
1b490 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
1b4a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1b4b0 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
1b4c0 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  e{.      storeLa
1b4d0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30  stErrno(pFile, 0
1b4e0 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  ); /* not a syst
1b4f0 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1b500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b510 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
1b520 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b530 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1b540 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1b550 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1b560 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
1b570 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
1b580 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
1b590 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
1b5a0 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
1b5b0 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
1b5c0 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
1b5d0 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
1b5e0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
1b5f0 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
1b600 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
1b610 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1b620 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73  * We do not trus
1b630 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f  t systems to pro
1b640 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66  vide a working f
1b650 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d  datasync().  Som
1b660 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20  e do..** Others 
1b670 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61  do no.  To be sa
1b680 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63  fe, we will stic
1b690 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69 67  k with the (slig
1b6a0 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20  htly slower).** 
1b6b0 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20  fsync(). If you 
1b6c0 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73  know that your s
1b6d0 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f  ystem does suppo
1b6e0 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63  rt fdatasync() c
1b6f0 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65  orrectly,.** the
1b700 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65  n simply compile
1b710 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e   with -Dfdatasyn
1b720 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72 20 2d  c=fdatasync or -
1b730 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a  DHAVE_FDATASYNC.
1b740 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1b750 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 48  fdatasync) && !H
1b760 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20  AVE_FDATASYNC.# 
1b770 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63  define fdatasync
1b780 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f   fsync.#endif../
1b790 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45  *.** Define HAVE
1b7a0 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20  _FULLFSYNC to 0 
1b7b0 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 1 depending o
1b7c0 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
1b7d0 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53  .** the F_FULLFS
1b7e0 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66  YNC macro is def
1b7f0 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59  ined.  F_FULLFSY
1b800 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  NC is currently.
1b810 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  ** only availabl
1b820 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20  e on Mac OS X.  
1b830 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63  But that could c
1b840 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  hange..*/.#ifdef
1b850 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64   F_FULLFSYNC.# d
1b860 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
1b870 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64  SYNC 1.#else.# d
1b880 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
1b890 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  SYNC 0.#endif...
1b8a0 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28  /*.** The fsync(
1b8b0 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f  ) system call do
1b8c0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61  es not work as a
1b8d0 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e  dvertised on man
1b8e0 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d  y.** unix system
1b8f0 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
1b900 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61  g procedure is a
1b910 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b  n attempt to mak
1b920 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74  e.** it work bet
1b930 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ter..**.** The S
1b940 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61  QLITE_NO_SYNC ma
1b950 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c  cro disables all
1b960 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73   fsync()s.  This
1b970 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f   is useful.** fo
1b980 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77  r testing when w
1b990 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68  e want to run th
1b9a0 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73  rough the test s
1b9b0 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a  uite quickly..**
1b9c0 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c   You are strongl
1b9d0 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20  y advised *not* 
1b9e0 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53  to deploy with S
1b9f0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a  QLITE_NO_SYNC.**
1ba00 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65   enabled, howeve
1ba10 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51  r, since with SQ
1ba20 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61  LITE_NO_SYNC ena
1ba30 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73  bled, an OS cras
1ba40 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  h.** or power fa
1ba50 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c  ilure will likel
1ba60 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61  y corrupt the da
1ba70 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ba80 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74  ** SQLite sets t
1ba90 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1baa0 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   if the size of 
1bab0 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68  the file is unch
1bac0 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64  anged..** The id
1bad0 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e  ea behind dataOn
1bae0 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68  ly is that it sh
1baf0 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20  ould only write 
1bb00 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  the file content
1bb10 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74  .** to disk, not
1bb20 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20   the inode.  We 
1bb30 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c  only set dataOnl
1bb40 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69  y if the file si
1bb50 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e  ze is .** unchan
1bb60 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69  ged since the fi
1bb70 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20  le size is part 
1bb80 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48  of the inode.  H
1bb90 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20  owever, .** Ted 
1bba0 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68  Ts'o tells us th
1bbb0 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77  at fdatasync() w
1bbc0 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74  ill also write t
1bbd0 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a  he inode if the.
1bbe0 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73  ** file size has
1bbf0 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f   changed.  The o
1bc00 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65  nly real differe
1bc10 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74  nce between fdat
1bc20 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66  async().** and f
1bc30 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c  sync(), Ted tell
1bc40 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64  s us, is that fd
1bc50 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e  atasync() will n
1bc60 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20  ot flush the.** 
1bc70 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69  inode if the mti
1bc80 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f  me or owner or o
1bc90 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69  ther inode attri
1bca0 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67  butes have chang
1bcb0 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63  ed..** We only c
1bcc0 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69  are about the fi
1bcd0 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65  le size, not the
1bce0 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72   other file attr
1bcf0 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73  ibutes, so.** as
1bd00 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69   far as SQLite i
1bd10 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20  s concerned, an 
1bd20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61  fdatasync() is a
1bd30 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a  lways adequate..
1bd40 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73  ** So, we always
1bd50 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29   use fdatasync()
1bd60 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61   if it is availa
1bd70 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ble, regardless 
1bd80 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  of.** the value 
1bd90 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  of the dataOnly 
1bda0 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  flag..*/.static 
1bdb0 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69  int full_fsync(i
1bdc0 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53  nt fd, int fullS
1bdd0 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c  ync, int dataOnl
1bde0 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  y){.  int rc;.. 
1bdf0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1be00 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c  g "ifdef/elif/el
1be10 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74  se/" block has t
1be20 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72  he same structur
1be30 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e  e as.  ** the on
1be40 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72  e below. It is r
1be50 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73  eplicated here s
1be60 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63  olely to avoid c
1be70 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20  luttering .  ** 
1be80 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65  up the real code
1be90 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44   with the UNUSED
1bea0 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63  _PARAMETER() mac
1beb0 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ros..  */.#ifdef
1bec0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1bed0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1bee0 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44  ER(fd);.  UNUSED
1bef0 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
1bf00 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
1bf10 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1bf20 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  y);.#elif HAVE_F
1bf30 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45  ULLFSYNC.  UNUSE
1bf40 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1bf50 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55  Only);.#else.  U
1bf60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1bf70 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
1bf80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1bf90 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a  taOnly);.#endif.
1bfa0 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
1bfb0 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
1bfc0 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f   that we do a no
1bfd0 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64  rmal fsync() and
1bfe0 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e   .  ** FULLSYNC.
1bff0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64    This is used d
1c000 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f  uring testing to
1c010 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1c020 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  s procedure.  **
1c030 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74   gets called wit
1c040 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72  h the correct ar
1c050 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69  guments..  */.#i
1c060 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1c070 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1c080 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  ) sqlite3_fullsy
1c090 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  nc_count++;.  sq
1c0a0 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1c0b0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
1c0c0 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
1c0d0 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
1c0e0 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
1c0f0 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
1c100 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
1c110 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1c120 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c  _SYNC.  rc = SQL
1c130 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41  ITE_OK;.#elif HA
1c140 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69  VE_FULLFSYNC.  i
1c150 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  f( fullSync ){. 
1c160 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
1c170 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c  fd, F_FULLFSYNC,
1c180 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
1c190 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20    rc = 1;.  }.  
1c1a0 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53  /* If the FULLFS
1c1b0 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c  YNC failed, fall
1c1c0 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74   back to attempt
1c1d0 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a  ing an fsync()..
1c1e0 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27    ** It shouldn'
1c1f0 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f  t be possible fo
1c200 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66  r fullfsync to f
1c210 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ail on the local
1c220 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74   .  ** file syst
1c230 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20  em (on OSX), so 
1c240 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65  failure indicate
1c250 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43  s that FULLFSYNC
1c260 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70  .  ** isn't supp
1c270 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66  orted for this f
1c280 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20  ile system. So, 
1c290 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63  attempt an fsync
1c2a0 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20   .  ** and (for 
1c2b0 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20  now) ignore the 
1c2c0 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75  overhead of a su
1c2d0 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20  perfluous fcntl 
1c2e0 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27  call.  .  ** It'
1c2f0 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64  d be better to d
1c300 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20  etect fullfsync 
1c310 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64  support once and
1c320 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65   avoid .  ** the
1c330 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72   fcntl call ever
1c340 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63  y time sync is c
1c350 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  alled..  */.  if
1c360 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e  ( rc ) rc = fsyn
1c370 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65  c(fd);..#elif de
1c380 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1c390 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28  .  /* fdatasync(
1c3a0 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27  ) on HFS+ doesn'
1c3b0 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20  t yet flush the 
1c3c0 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20  file size if it 
1c3d0 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c  changed correctl
1c3e0 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e  y.  ** so curren
1c3f0 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74  tly we default t
1c400 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74  o the macro that
1c410 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61   redefines fdata
1c420 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20  sync to fsync.  
1c430 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28  */.  rc = fsync(
1c440 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63  fd);.#else .  rc
1c450 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29   = fdatasync(fd)
1c460 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
1c470 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26  .  if( rc==-1 &&
1c480 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20   errno==ENOTSUP 
1c490 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e  ){.    rc = fsyn
1c4a0 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  c(fd);.  }.#endi
1c4b0 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
1c4c0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64  */.#endif /* ifd
1c4d0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1c4e0 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  C elif HAVE_FULL
1c4f0 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20  FSYNC */..  if( 
1c500 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63  OS_VXWORKS && rc
1c510 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  != -1 ){.    rc 
1c520 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1c530 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
1c540 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  pen a file descr
1c550 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72  iptor to the dir
1c560 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
1c570 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65  g file zFilename
1c580 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
1c590 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20  ul, *pFd is set 
1c5a0 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69  to the opened fi
1c5b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
1c5c0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  d.** SQLITE_OK i
1c5d0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
1c5e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1c5f0 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f  either SQLITE_NO
1c600 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  MEM.** or SQLITE
1c610 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74  _CANTOPEN is ret
1c620 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69  urned and *pFd i
1c630 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65  s set to an unde
1c640 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a  fined.** value..
1c650 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74  **.** The direct
1c660 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
1c670 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 20  tor is used for 
1c680 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d  only one thing -
1c690 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61   to.** fsync() a
1c6a0 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61   directory to ma
1c6b0 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63 72 65  ke sure file cre
1c6c0 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69  ation and deleti
1c6d0 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65  on events.** are
1c6e0 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b   flushed to disk
1c6f0 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73 20 61  .  Such fsyncs a
1c700 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e  re not needed on
1c710 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61   newer.** journa
1c720 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73  ling filesystems
1c730 2c 20 62 75 74 20 61 72 65 20 72 65 71 75 69 72  , but are requir
1c740 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65  ed on older file
1c750 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54  systems..**.** T
1c760 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1c770 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73  be overridden us
1c780 69 6e 67 20 74 68 65 20 78 53 65 74 53 79 73 43  ing the xSetSysC
1c790 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  all interface..*
1c7a0 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f  * The ability to
1c7b0 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 72   override this r
1c7c0 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64 65 64  outine was added
1c7d0 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74   in support of t
1c7e0 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73  he.** chromium s
1c7f0 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67  andbox.  Opening
1c800 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 73 20   a directory is 
1c810 61 20 73 65 63 75 72 69 74 79 20 72 69 73 6b 20  a security risk 
1c820 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29  (we are.** told)
1c830 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76   so making it ov
1c840 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77  errideable allow
1c850 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73  s the chromium s
1c860 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70  andbox to.** rep
1c870 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  lace this routin
1c880 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73  e with a harmles
1c890 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b  s no-op.  To mak
1c8a0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  e this routine.*
1c8b0 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61  * a no-op, repla
1c8c0 63 65 20 69 74 20 77 69 74 68 20 61 20 73 74 75  ce it with a stu
1c8d0 62 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 53  b that returns S
1c8e0 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61  QLITE_OK but lea
1c8f0 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20  ves.** *pFd set 
1c900 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  to a negative nu
1c910 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  mber..**.** If S
1c920 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1c930 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72  rned, the caller
1c940 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1c950 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74  for closing.** t
1c960 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1c970 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c  or *pFd using cl
1c980 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ose()..*/.static
1c990 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f   int openDirecto
1c9a0 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ry(const char *z
1c9b0 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70  Filename, int *p
1c9c0 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  Fd){.  int ii;. 
1c9d0 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20   int fd = -1;.  
1c9e0 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41  char zDirname[MA
1c9f0 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a  X_PATHNAME+1];..
1ca00 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1ca10 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
1ca20 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c   zDirname, "%s",
1ca30 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66   zFilename);.  f
1ca40 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65  or(ii=(int)strle
1ca50 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e  n(zDirname); ii>
1ca60 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69  1 && zDirname[ii
1ca70 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20  ]!='/'; ii--);. 
1ca80 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20   if( ii>0 ){.   
1ca90 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20   zDirname[ii] = 
1caa0 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72  '\0';.    fd = r
1cab0 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e  obust_open(zDirn
1cac0 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
1cad0 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20  BINARY, 0);.    
1cae0 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
1caf0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
1cb00 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
1cb10 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b   fd, zDirname));
1cb20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46  .    }.  }.  *pF
1cb30 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e  d = fd;.  return
1cb40 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f   (fd>=0?SQLITE_O
1cb50 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  K:unixLogError(S
1cb60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
1cb70 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69  KPT, "open", zDi
1cb80 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rname));.}../*.*
1cb90 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
1cba0 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
1cbb0 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
1cbc0 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
1cbd0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  k..**.** If data
1cbe0 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74  Only==0 then bot
1cbf0 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  h the file itsel
1cc00 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61  f and its metada
1cc10 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65  ta (file.** size
1cc20 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65  , access time, e
1cc30 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20  tc) are synced. 
1cc40 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20   If dataOnly!=0 
1cc50 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  then only the.**
1cc60 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79   file data is sy
1cc70 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65  nced..**.** Unde
1cc80 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b  r Unix, also mak
1cc90 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
1cca0 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1ccb0 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  for the file.** 
1ccc0 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
1ccd0 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68   by fsync-ing th
1cce0 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
1ccf0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69   contains the fi
1cd00 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20  le..** If we do 
1cd10 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20  not do this and 
1cd20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70  we encounter a p
1cd30 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
1cd40 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65  e directory.** e
1cd50 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
1cd60 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65  rnal might not e
1cd70 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65  xist after we re
1cd80 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a  boot.  The next.
1cd90 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63  ** SQLite to acc
1cda0 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ess the file wil
1cdb0 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20  l not know that 
1cdc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  the journal exis
1cdd0 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ts (because.** t
1cde0 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
1cdf0 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1ce00 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65  al was never cre
1ce10 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72  ated) and the tr
1ce20 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c  ansaction.** wil
1ce30 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  l not roll back 
1ce40 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69  - possibly leadi
1ce50 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
1ce60 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
1ce70 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e  atic int unixSyn
1ce80 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
1ce90 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
1cea0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
1ceb0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1cec0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
1ced0 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d  int isDataOnly =
1cee0 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53   (flags&SQLITE_S
1cef0 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20  YNC_DATAONLY);. 
1cf00 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20   int isFullsync 
1cf10 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  = (flags&0x0F)==
1cf20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1cf30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
1cf40 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  at one of SQLITE
1cf50 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20  _SYNC_NORMAL or 
1cf60 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20  FULL was passed 
1cf70 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61  */.  assert((fla
1cf80 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1cf90 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20  _SYNC_NORMAL.   
1cfa0 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30     || (flags&0x0
1cfb0 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
1cfc0 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  FULL.  );..  /* 
1cfd0 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
1cfe0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
1cff0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1d000 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
1d010 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
1d020 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
1d030 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
1d040 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
1d050 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
1d060 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
1d070 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1d080 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65  _FULL );..  asse
1d090 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
1d0a0 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20  STRACE(("SYNC   
1d0b0 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
1d0c0 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c  >h));.  rc = ful
1d0d0 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68  l_fsync(pFile->h
1d0e0 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73  , isFullsync, is
1d0f0 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d  DataOnly);.  Sim
1d100 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
1d110 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  =1 );.  if( rc )
1d120 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
1d130 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
1d140 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75  o);.    return u
1d150 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1d160 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20  TE_IOERR_FSYNC, 
1d170 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46  "full_fsync", pF
1d180 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
1d190 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e  ..  /* Also fsyn
1d1a0 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  c the directory 
1d1b0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
1d1c0 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59  ile if the DIRSY
1d1d0 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20  NC flag.  ** is 
1d1e0 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20  set.  This is a 
1d1f0 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65  one-time occurre
1d200 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65  nce.  Many syste
1d210 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49  ms (examples: AI
1d220 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62  X).  ** are unab
1d230 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69  le to fsync a di
1d240 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f  rectory, so igno
1d250 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65  re errors on the
1d260 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69   fsync..  */.  i
1d270 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
1d280 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
1d290 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e  IRSYNC ){.    in
1d2a0 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54  t dirfd;.    OST
1d2b0 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25  RACE(("DIRSYNC %
1d2c0 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  s (have_fullfsyn
1d2d0 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
1d2e0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  )\n", pFile->zPa
1d2f0 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  th,.            
1d300 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
1d310 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20  isFullsync));.  
1d320 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
1d330 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50  ectory(pFile->zP
1d340 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20  ath, &dirfd);.  
1d350 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d360 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d 30 20  _OK && dirfd>=0 
1d370 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73  ){.      full_fs
1d380 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29  ync(dirfd, 0, 0)
1d390 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
1d3a0 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66  lose(pFile, dirf
1d3b0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
1d3c0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1d3d0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1d3e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1d3f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1d400 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1d410 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45  ags &= ~UNIXFILE
1d420 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20  _DIRSYNC;.  }.  
1d430 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d440 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
1d450 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
1d460 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
1d470 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1d480 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
1d490 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e  _file *id, i64 n
1d4a0 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c  Byte){.  unixFil
1d4b0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1d4c0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1d4d0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
1d4e0 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
1d4f0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1d500 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
1d510 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a  RUNCATE );..  /*
1d520 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
1d530 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
1d540 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
1d550 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
1d560 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
1d570 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
1d580 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
1d590 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
1d5a0 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
1d5b0 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
1d5c0 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
1d5d0 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
1d5e0 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
1d5f0 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
1d600 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
1d610 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
1d620 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
1d630 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
1d640 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
1d650 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1d660 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1d670 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74  }..  rc = robust
1d680 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1d690 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  ->h, nByte);.  i
1d6a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f  f( rc ){.    sto
1d6b0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1d6c0 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  e, errno);.    r
1d6d0 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1d6e0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1d6f0 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1d700 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1d710 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  ath);.  }else{.#
1d720 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d730 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  UG.    /* If we 
1d740 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
1d750 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
1d760 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
1d770 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a  opposed to.    *
1d780 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1d790 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1d7a0 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1d7b0 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1d7c0 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61  n a.    ** norma
1d7d0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1d7e0 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65   and we truncate
1d7f0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1d800 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a  o length,.    **
1d810 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c   that effectivel
1d820 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1d830 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54  ange counter.  T
1d840 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1d850 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73  .    ** when res
1d860 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73  toring a databas
1d870 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b  e using the back
1d880 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65  up API from a ze
1d890 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  ro-length.    **
1d8a0 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a   source..    */.
1d8b0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
1d8c0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
1d8d0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
1d8e0 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1d8f0 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20  trChng = 1;.    
1d900 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
1d910 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1d920 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74  ZE>0.    /* If t
1d930 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  he file was just
1d940 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20   truncated to a 
1d950 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  size smaller tha
1d960 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a  n the currently.
1d970 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65      ** mapped re
1d980 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
1d990 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
1d9a0 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
1d9b0 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20   SQLite will.   
1d9c0 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61   ** use read() a
1d9d0 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63  nd write() to ac
1d9e0 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64  cess data beyond
1d9f0 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d   this point from
1da00 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a   now on.  .    *
1da10 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c  /.    if( nByte<
1da20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1da30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1da40 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
1da50 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1da60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1da70 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
1da80 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
1da90 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1daa0 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
1dab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1dac0 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
1dad0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1dae0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
1daf0 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
1db00 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
1db10 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f  ( id );.  rc = o
1db20 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c  sFstat(((unixFil
1db30 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
1db40 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1db50 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1db60 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1db70 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
1db80 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72  unixFile*)id, er
1db90 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
1dba0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1dbb0 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
1dbc0 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
1dbd0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
1dbe0 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
1dbf0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
1dc00 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
1dc10 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
1dc20 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
1dc30 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
1dc40 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
1dc50 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
1dc60 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
1dc70 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
1dc80 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
1dc90 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
1dca0 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
1dcb0 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
1dcc0 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
1dcd0 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
1dce0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
1dcf0 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
1dd00 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
1dd10 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
1dd20 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
1dd30 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
1dd40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1dd50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1dd60 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1dd70 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1dd80 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
1dd90 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
1dda0 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
1ddb0 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
1ddc0 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
1ddd0 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
1dde0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
1ddf0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
1de00 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1de10 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1de20 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  );.#endif../* .*
1de30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1de40 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
1de50 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46  dle the SQLITE_F
1de60 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a  CNTL_SIZE_HINT .
1de70 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ** file-control 
1de80 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61  operation.  Enla
1de90 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rge the database
1dea0 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69   to nBytes in si
1deb0 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75  ze.** (rounded u
1dec0 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  p to the next ch
1ded0 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74  unk-size).  If t
1dee0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
1def0 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73  lready.** nBytes
1df00 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73   or larger, this
1df10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1df20 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1df30 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74  nt fcntlSizeHint
1df40 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1df50 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1df60 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1df70 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20  nk>0 ){.    i64 
1df80 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
1df90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
1dfa0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1dfb0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
1dfc0 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  at buf;         
1dfd0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1dfe0 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75  hold return valu
1dff0 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f  es of fstat() */
1e000 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46  .   .    if( osF
1e010 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
1e020 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  buf) ){.      re
1e030 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e040 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a  R_FSTAT;.    }..
1e050 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42      nSize = ((nB
1e060 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75  yte+pFile->szChu
1e070 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73  nk-1) / pFile->s
1e080 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1e090 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66  >szChunk;.    if
1e0a0 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66  ( nSize>(i64)buf
1e0b0 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66  .st_size ){..#if
1e0c0 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
1e0d0 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
1e0e0 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
1e0f0 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20  LOCATE.      /* 
1e100 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69  The code below i
1e110 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72  s handling the r
1e120 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f  eturn value of o
1e130 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20  sFallocate() .  
1e140 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79      ** correctly
1e150 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  . posix_fallocat
1e160 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  e() is defined t
1e170 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  o "returns zero 
1e180 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20  on success, .   
1e190 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f     ** or an erro
1e1a0 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69  r number on  fai
1e1b0 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d  lure". See the m
1e1c0 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61 69  anpage for detai
1e1d0 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ls. */.      int
1e1e0 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a   err;.      do{.
1e1f0 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73          err = os
1e200 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d  Fallocate(pFile-
1e210 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c  >h, buf.st_size,
1e220 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69   nSize-buf.st_si
1e230 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  ze);.      }whil
1e240 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b  e( err==EINTR );
1e250 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29  .      if( err )
1e260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e270 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73  OERR_WRITE;.#els
1e280 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  e.      /* If th
1e290 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61  e OS does not ha
1e2a0 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  ve posix_falloca
1e2b0 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57  te(), fake it. W
1e2c0 72 69 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a  rite a .      **
1e2d0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20   single byte to 
1e2e0 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e  the last byte in
1e2f0 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74   each block that
1e300 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a   falls entirely.
1e310 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20        ** within 
1e320 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67  the extended reg
1e330 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65  ion. Then, if re
1e340 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65  quired, a single
1e350 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61   byte.      ** a
1e360 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d  t offset (nSize-
1e370 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73  1), to set the s
1e380 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1e390 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20  correctly..     
1e3a0 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 69   ** This is a si
1e3b0 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20  milar technique 
1e3c0 74 6f 20 74 68 61 74 20 75 73 65 64 20 62 79 20  to that used by 
1e3d0 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73  glibc on systems
1e3e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64  .      ** that d
1e3f0 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61  o not have a rea
1e400 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61  l fallocate() ca
1e410 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
1e420 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75     int nBlk = bu
1e430 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f  f.st_blksize;  /
1e440 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c  * File-system bl
1e450 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ock size */.    
1e460 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
1e470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e480 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1e490 20 77 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b   written by seek
1e4a0 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  AndWrite */.    
1e4b0 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20    i64 iWrite;   
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e4d0 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20   Next offset to 
1e4e0 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20  write to */..   
1e4f0 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62 75     iWrite = ((bu
1e500 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42  f.st_size + 2*nB
1e510 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42  lk - 1)/nBlk)*nB
1e520 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 61 73 73 65  lk-1;.      asse
1e530 72 74 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e  rt( iWrite>=buf.
1e540 73 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20  st_size );.     
1e550 20 61 73 73 65 72 74 28 20 28 69 57 72 69 74 65   assert( (iWrite
1e560 2f 6e 42 6c 6b 29 3d 3d 28 28 62 75 66 2e 73 74  /nBlk)==((buf.st
1e570 5f 73 69 7a 65 2b 6e 42 6c 6b 2d 31 29 2f 6e 42  _size+nBlk-1)/nB
1e580 6c 6b 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  lk) );.      ass
1e590 65 72 74 28 20 28 28 69 57 72 69 74 65 2b 31 29  ert( ((iWrite+1)
1e5a0 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20  %nBlk)==0 );.   
1e5b0 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f     for(/*no-op*/
1e5c0 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 3b 20  ; iWrite<nSize; 
1e5d0 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a  iWrite+=nBlk ){.
1e5e0 20 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d          nWrite =
1e5f0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
1e600 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c  ile, iWrite, "",
1e610 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
1e620 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74   nWrite!=1 ) ret
1e630 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1e640 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a  _WRITE;.      }.
1e650 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
1e660 3d 3d 30 20 7c 7c 20 28 6e 53 69 7a 65 25 6e 42  ==0 || (nSize%nB
1e670 6c 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  lk) ){.        n
1e680 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
1e690 72 69 74 65 28 70 46 69 6c 65 2c 20 6e 53 69 7a  rite(pFile, nSiz
1e6a0 65 2d 31 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20  e-1, "", 1);.   
1e6b0 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21       if( nWrite!
1e6c0 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
1e6d0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1e6e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1e6f0 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51     }.  }..#if SQ
1e700 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1e710 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65  ZE>0.  if( pFile
1e720 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
1e730 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e  && nByte>pFile->
1e740 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1e750 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20  int rc;.    if( 
1e760 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d  pFile->szChunk<=
1e770 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  0 ){.      if( r
1e780 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1e790 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
1e7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
1e7b0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1e7c0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
1e7d0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1e7e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1e7f0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
1e800 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
1e810 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
1e820 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1e830 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
1e840 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  le, nByte);.    
1e850 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
1e860 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1e870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1e880 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
1e890 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69  initially negati
1e8a0 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ve then this is 
1e8b0 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70  a query.  Set *p
1e8c0 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30  Arg to.** 1 or 0
1e8d0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1e8e0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74  ether or not bit
1e8f0 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e   mask of pFile->
1e900 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74  ctrlFlags is set
1e910 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ..**.** If *pArg
1e920 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   is 0 or 1, then
1e930 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68   clear or set th
1e940 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46  e mask bit of pF
1e950 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a  ile->ctrlFlags..
1e960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1e970 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46  nixModeBit(unixF
1e980 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
1e990 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
1e9a0 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
1e9b0 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
1e9c0 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
1e9d0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
1e9e0 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
1e9f0 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
1ea00 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
1ea10 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
1ea20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
1ea30 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
1ea40 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
1ea50 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
1ea60 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
1ea70 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
1ea80 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
1ea90 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a  r *zBuf);../*.**
1eaa0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   Information and
1eab0 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f   control of an o
1eac0 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
1ead0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1eae0 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  nixFileControl(s
1eaf0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1eb00 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
1eb10 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  Arg){.  unixFile
1eb20 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1eb30 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63  ile*)id;.  switc
1eb40 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
1eb50 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
1eb60 41 4c 5f 42 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20  AL_BLOCK: {.    
1eb70 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 63 74 72 6c    /* pFile->ctrl
1eb80 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
1eb90 45 5f 42 4c 4f 43 4b 3b 20 2f 2f 20 44 65 66 65  E_BLOCK; // Defe
1eba0 72 72 65 64 20 66 65 61 74 75 72 65 20 2a 2f 0a  rred feature */.
1ebb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ebc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1ebd0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1ebe0 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
1ebf0 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1ec00 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c  rg = pFile->eFil
1ec10 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74  eLock;.      ret
1ec20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ec30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1ec40 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f  LITE_FCNTL_LAST_
1ec50 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
1ec60 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1ec70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
1ec80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ec90 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1eca0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1ecb0 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
1ecc0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a  .      pFile->sz
1ecd0 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29  Chunk = *(int *)
1ece0 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75  pArg;.      retu
1ecf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ed00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1ed10 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1ed20 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  INT: {.      int
1ed30 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   rc;.      Simul
1ed40 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1ed50 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  (1);.      rc = 
1ed60 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46  fcntlSizeHint(pF
1ed70 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72  ile, *(i64 *)pAr
1ed80 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  g);.      Simula
1ed90 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1eda0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
1edb0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   rc;.    }.    c
1edc0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1edd0 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
1ede0 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69        unixModeBi
1edf0 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c  t(pFile, UNIXFIL
1ee00 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
1ee10 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
1ee20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ee30 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1ee40 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ee50 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1ee60 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69  ITE: {.      uni
1ee70 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  xModeBit(pFile, 
1ee80 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28  UNIXFILE_PSOW, (
1ee90 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
1eea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eeb0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1eec0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1eed0 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  VFSNAME: {.     
1eee0 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
1eef0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1ef00 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56  ("%s", pFile->pV
1ef10 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  fs->zName);.    
1ef20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ef30 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1ef40 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ef50 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
1ef60 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
1ef70 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
1ef80 6c 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56  loc64( pFile->pV
1ef90 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
1efa0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69  ;.      if( zTFi
1efb0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  le ){.        un
1efc0 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46  ixGetTempname(pF
1efd0 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
1efe0 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a  hname, zTFile);.
1eff0 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
1f000 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
1f010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1f020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f030 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1f040 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f  QLITE_FCNTL_HAS_
1f050 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a  MOVED: {.      *
1f060 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c  (int*)pArg = fil
1f070 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29  eHasMoved(pFile)
1f080 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1f090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1f0a0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1f0b0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63  MAP_SIZE>0.    c
1f0c0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f0d0 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
1f0e0 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74      i64 newLimit
1f0f0 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a   = *(i64*)pArg;.
1f100 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
1f110 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1f120 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c  if( newLimit>sql
1f130 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f140 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20  .mxMmap ){.     
1f150 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71     newLimit = sq
1f160 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f170 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  g.mxMmap;.      
1f180 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  }.      *(i64*)p
1f190 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
1f1a0 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
1f1b0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
1f1c0 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
1f1d0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
1f1e0 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
1f1f0 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
1f200 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1f210 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
1f220 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
1f230 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
1f240 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  {.          unix
1f250 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
1f260 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1f270 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
1f280 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  le, -1);.       
1f290 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1f2a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f2b0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1f2c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1f2d0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
1f2e0 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
1f2f0 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
1f300 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
1f310 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
1f320 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1f330 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
1f340 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
1f350 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
1f360 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
1f370 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
1f380 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
1f390 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
1f3a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1f3b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
1f3c0 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
1f3d0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1f3e0 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
1f3f0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1f400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f410 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
1f420 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1f430 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1f440 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1f450 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f460 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
1f470 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
1f480 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
1f490 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1f4a0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1f4b0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1f4c0 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
1f4d0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1f4e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1f4f0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1f500 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1f510 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1f520 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1f530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f540 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1f550 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
1f560 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
1f570 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
1f580 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1f590 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
1f5a0 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
1f5b0 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
1f5c0 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
1f5d0 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
1f5e0 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
1f5f0 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
1f600 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
1f610 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
1f620 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
1f630 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
1f640 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
1f650 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
1f660 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
1f670 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
1f680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
1f690 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
1f6a0 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
1f6b0 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
1f6c0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e  .*/.#ifndef __QN
1f6d0 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69  XNTO__ .static i
1f6e0 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1f6f0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1f700 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1f710 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1f720 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1f730 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1f740 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65  ECTOR_SIZE;.}.#e
1f750 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1f760 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f  following versio
1f770 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53  n of unixSectorS
1f780 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a  ize() is optimiz
1f790 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23  ed for QNX..*/.#
1f7a0 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
1f7b0 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64  .#include <sys/d
1f7c0 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c  cmd_blk.h>.#incl
1f7d0 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73  ude <sys/statvfs
1f7e0 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .h>.static int u
1f7f0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
1f800 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1f810 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1f820 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1f830 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  id;.  if( pFile-
1f840 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30  >sectorSize == 0
1f850 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1f860 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20  tatvfs fsInfo;. 
1f870 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65        .    /* Se
1f880 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e  t defaults for n
1f890 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c  on-supported fil
1f8a0 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20  esystems */.    
1f8b0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1f8c0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1f8d0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1f8e0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1f8f0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f900 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73   = 0;.    if( fs
1f910 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c  tatvfs(pFile->h,
1f920 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
1f930 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
1f940 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f950 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ze;.    }..    i
1f960 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1f970 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74  o.f_basetype, "t
1f980 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70  mp") ) {.      p
1f990 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f9a0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1f9b0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1f9c0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1f9d0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1f9e0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1f9f0 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a  MIC4K |       /*
1fa00 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73   All ram filesys
1fa10 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61  tem writes are a
1fa20 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
1fa30 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1fa40 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1fa50 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1fa60 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1fa70 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1faa0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1fab0 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1fac0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1fad0 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1fae0 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1faf0 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1fb00 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1fb30 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1fb40 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1fb50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1fb60 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
1fb70 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29  etype, "etfs") )
1fb80 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1fb90 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1fba0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1fbb0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1fbc0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1fbd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73  .        /* etfs
1fbe0 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72   cluster size wr
1fbf0 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1fc00 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c  */.        (pFil
1fc10 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
1fc20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
1fc30 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a  AP_ATOMIC512) |.
1fc40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1fc50 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1fc60 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
1fc70 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1fc80 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
1fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcb0 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
1fcc0 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
1fcd0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1fce0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1fcf0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1fd00 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1fd10 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd40 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1fd50 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1fd60 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1fd70 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1fd80 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1fd90 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx6") ){.      
1fda0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1fdb0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1fdc0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1fdd0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1fde0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1fdf0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1fe00 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f  OMIC |         /
1fe10 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d  * All filesystem
1fe20 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
1fe30 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1fe40 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1fe50 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1fe60 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1fe70 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1fe80 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1feb0 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1fec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1fed0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1fee0 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1fef0 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1ff00 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1ff10 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1ff40 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1ff50 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1ff60 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
1ff70 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
1ff80 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a  ype, "qnx4") ){.
1ff90 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1ffa0 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1ffb0 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1ffc0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1ffd0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1ffe0 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
1fff0 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
20000 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
20010 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
20020 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
20030 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20040 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
20050 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
20060 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
20070 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
20080 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
20090 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
200a0 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
200b0 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200e0 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
200f0 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
20100 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
20110 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
20120 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f  .f_basetype, "do
20130 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
20140 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
20150 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
20160 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
20170 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20180 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
20190 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
201a0 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
201b0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
201c0 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
201d0 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
201e0 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
201f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
20200 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
20210 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
20220 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
20230 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
20240 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
20250 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
20260 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20280 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
20290 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
202a0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
202b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
202c0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
202d0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
202e0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
202f0 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20  _ATOMIC512 |    
20300 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20    /* blocks are 
20310 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
20320 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
20330 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
20340 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
20350 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
20360 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
20390 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
203a0 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
203b0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  0;.    }.  }.  /
203c0 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65  * Last chance ve
203d0 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20  rification.  If 
203e0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
203f0 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65  isn't a multiple
20400 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65   of 512.  ** the
20410 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64  n it isn't valid
20420 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .*/.  if( pFile-
20430 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31  >sectorSize % 51
20440 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  2 != 0 ){.    pF
20450 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
20460 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
20470 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
20480 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
20490 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
204a0 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
204b0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
204c0 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
204d0 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f  __QNXNTO__ */../
204e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
204f0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
20500 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
20510 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
20520 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f  VFS is set up to
20530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
20540 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
20550 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61  VERWRITE by defa
20560 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ult..** However,
20570 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20   that choice is 
20580 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69  controversial si
20590 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20  nce technically 
205a0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
205b0 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f  * file system do
205c0 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72  es not always pr
205d0 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20  ovide powersafe 
205e0 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e  overwrites.  (In
205f0 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
20600 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c   after a power-l
20610 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73  oss event, parts
20620 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61   of the file tha
20630 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20  t were never.** 
20640 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e  written might en
20650 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72  d up being alter
20660 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e  ed.)  However, n
20670 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72  on-PSOW behavior
20680 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72   is very,.** ver
20690 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73  y rare.  And ass
206a0 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65  erting PSOW make
206b0 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74  s a large reduct
206c0 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e  ion in the amoun
206d0 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64  t.** of required
206e0 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c   I/O for journal
206f0 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74  ing, since a lot
20700 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65   of padding is e
20710 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48  liminated..**  H
20720 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45  ence, while POWE
20730 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
20740 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
20750 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c  , there is a fil
20760 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61  e-control.** ava
20770 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
20780 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75  t off and URI qu
20790 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76  ery parameter av
207a0 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
207b0 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  it off..*/.stati
207c0 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
207d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
207e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
207f0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
20800 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
20810 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
20820 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
20830 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f  _.  if( p->secto
20840 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53  rSize==0 ) unixS
20850 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20  ectorSize(id);. 
20860 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43   rc = p->deviceC
20870 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a  haracteristics;.
20880 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
20890 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
208a0 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20  FILE_PSOW ){.   
208b0 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f   rc |= SQLITE_IO
208c0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
208d0 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72  ERWRITE;.  }.  r
208e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
208f0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
20900 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
20910 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
20920 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ZE>0../*.** Retu
20930 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70 61  rn the system pa
20940 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
20950 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
20960 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
20970 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74  d directly by ot
20980 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73  her code in this
20990 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65   file. .** Inste
209a0 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65  ad, it should be
209b0 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72   called via macr
209c0 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  o osGetpagesize(
209d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
209e0 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65   unixGetpagesize
209f0 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56  (void){.#if OS_V
20a00 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
20a10 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69  1024;.#elif defi
20a20 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29  ned(_BSD_SOURCE)
20a30 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61 67  .  return getpag
20a40 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20  esize();.#else. 
20a50 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73   return (int)sys
20a60 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a  conf(_SC_PAGESIZ
20a70 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65  E);.#endif.}..#e
20a80 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
20a90 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
20aa0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
20ab0 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
20ac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20ad0 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f  MIT_WAL../*.** O
20ae0 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
20af0 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65  present an share
20b00 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  d memory buffer.
20b10 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75    .**.** When mu
20b20 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
20b30 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
20b40 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c   same wal-index,
20b50 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20   each thread.** 
20b60 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78  has its own unix
20b70 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  Shm object, but 
20b80 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74  they all point t
20b90 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
20ba0 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75  nce.** of this u
20bb0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20bc0 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
20bd0 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64  ds, each wal-ind
20be0 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  ex is opened.** 
20bf0 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
20c00 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ocess..**.** Eac
20c10 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  h unixShmNode ob
20c20 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  ject is connecte
20c30 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e  d to a single un
20c40 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
20c50 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ct..** We could 
20c60 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62  coalesce this ob
20c70 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e  ject into unixIn
20c80 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61  odeInfo, but tha
20c90 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20  t would mean.** 
20ca0 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20  every open file 
20cb0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
20cc0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
20cd0 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
20ce0 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69   most.** open fi
20cf0 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20  les) would have 
20d00 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20  to carry around 
20d10 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72  this extra infor
20d20 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74  mation.  So.** t
20d30 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
20d40 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
20d50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
20d60 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
20d70 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65  bject.** and the
20d80 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20d90 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f  ect is created o
20da0 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e  nly when needed.
20db0 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  .**.** unixMutex
20dc0 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
20dd0 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
20de0 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
20df0 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
20e00 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
20e10 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
20e20 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
20e30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
20e40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
20e50 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
20e60 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
20e70 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
20e80 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
20e90 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
20ea0 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
20eb0 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ither unixShmNod
20ec0 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
20ed0 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e  held or unixShmN
20ee0 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
20ef0 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
20f00 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
20f10 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
20f20 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
20f30 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
20f40 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
20f50 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b  ct unixShmNode {
20f60 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
20f70 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a   *pInode;     /*
20f80 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74   unixInodeInfo t
20f90 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48  hat owns this SH
20fa0 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  M node */.  sqli
20fb0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
20fc0 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
20fd0 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
20fe0 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
20ff0 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
21000 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
21010 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c   the mmapped fil
21020 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21040 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
21050 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
21060 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
21070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
21080 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
21090 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
210a0 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  u16 nRegion;    
210b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
210c0 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
210d0 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52  gion */.  u8 isR
210e0 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadonly;        
210f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
21100 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63  read-only */.  c
21110 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20  har **apRegion; 
21120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
21130 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61  ay of mapped sha
21140 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
21150 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ns */.  int nRef
21160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21170 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21180 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
21190 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
211a0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
211b0 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
211c0 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20   /* All unixShm 
211d0 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
211e0 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64   to this */.#ifd
211f0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
21200 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20    u8 exclMask;  
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21220 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
21230 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
21240 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b    u8 sharedMask;
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21260 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
21270 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
21280 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
21290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
212a0 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78  t available unix
212b0 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
212c0 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
212d0 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
212e0 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
212f0 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
21300 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
21310 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
21320 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
21330 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
21340 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
21350 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
21360 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
21370 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
21380 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
21390 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
213a0 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c      unixShm.pFil
213b0 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  e.**    unixShm.
213c0 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
213d0 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
213e0 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75  ad/write.  The u
213f0 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75  nixShm.pFile->mu
21400 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
21410 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
21420 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
21430 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
21440 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20  ruct unixShm {. 
21450 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
21460 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54  hmNode;     /* T
21470 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e  he underlying un
21480 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
21490 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
214a0 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
214b0 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d   /* Next unixShm
214c0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75   with the same u
214d0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
214e0 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20  u8 hasMutex;    
214f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
21500 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68  ue if holding th
21510 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75  e unixShmNode mu
21520 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20  tex */.  u8 id; 
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21540 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
21550 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
21560 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e  hin its unixShmN
21570 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  ode */.  u16 sha
21580 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
21590 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
215a0 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
215b0 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
215c0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
215d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
215e0 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
215f0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
21600 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
21610 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
21620 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53  ine UNIX_SHM_BAS
21630 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
21640 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
21650 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
21660 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
21670 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  ine UNIX_SHM_DMS
21680 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41      (UNIX_SHM_BA
21690 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
216a0 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
216b0 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
216c0 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64  * Apply posix ad
216d0 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
216e0 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20   all bytes from 
216f0 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73  ofst through ofs
21700 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  t+n-1..**.** Loc
21710 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20  ks block if the 
21720 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20  mask is exactly 
21730 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61  UNIX_SHM_C and a
21740 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a  re non-blocking.
21750 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
21760 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
21770 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
21780 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
21790 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ,       /* Open 
217a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
217b0 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20  e WAL file */.  
217c0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
217d0 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43         /* F_UNLC
217e0 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46  K, F_RDLCK, or F
217f0 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
21800 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
21810 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
21820 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
21830 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  range */.  int n
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
21860 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
21870 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
21880 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41   *pShmNode; /* A
21890 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
218a0 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
218b0 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
218c0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
218d0 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  f;        /* The
218e0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
218f0 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
21900 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
21910 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
21920 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
21930 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20  m fcntl() */..  
21940 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
21950 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
21960 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
21970 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
21980 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  */.  pShmNode = 
21990 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
219a0 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72  ShmNode;.  asser
219b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
219c0 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  _held(pShmNode->
219d0 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f  mutex) || pShmNo
219e0 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  de->nRef==0 );..
219f0 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b    /* Shared lock
21a00 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72  s never span mor
21a10 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20  e than one byte 
21a20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  */.  assert( n==
21a30 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46  1 || lockType!=F
21a40 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  _RDLCK );..  /* 
21a50 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e  Locks are within
21a60 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65   range */.  asse
21a70 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51  rt( n>=1 && n<SQ
21a80 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
21a90 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
21aa0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 69  e->h>=0 ){.    i
21ab0 6e 74 20 6c 6b 54 79 70 65 3b 0a 20 20 20 20 2f  nt lkType;.    /
21ac0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
21ad0 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
21ae0 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ers */.    memse
21af0 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&f, 0, sizeof(
21b00 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70  f));.    f.l_typ
21b10 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20  e = lockType;.  
21b20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53    f.l_whence = S
21b30 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c  EEK_SET;.    f.l
21b40 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20  _start = ofst;. 
21b50 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a     f.l_len = n;.
21b60 0a 20 20 20 20 6c 6b 54 79 70 65 20 3d 20 28 70  .    lkType = (p
21b70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
21b80 26 20 55 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b  & UNIXFILE_BLOCK
21b90 29 21 3d 30 20 3f 20 46 5f 53 45 54 4c 4b 57 20  )!=0 ? F_SETLKW 
21ba0 3a 20 46 5f 53 45 54 4c 4b 3b 0a 20 20 20 20 72  : F_SETLK;.    r
21bb0 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d  c = osFcntl(pShm
21bc0 4e 6f 64 65 2d 3e 68 2c 20 6c 6b 54 79 70 65 2c  Node->h, lkType,
21bd0 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28   &f);.    rc = (
21be0 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49  rc!=(-1)) ? SQLI
21bf0 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42  TE_OK : SQLITE_B
21c00 55 53 59 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  USY;.    pFile->
21c10 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e  ctrlFlags &= ~UN
21c20 49 58 46 49 4c 45 5f 42 4c 4f 43 4b 3b 0a 20 20  IXFILE_BLOCK;.  
21c30 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
21c40 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73  he global lock s
21c50 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75  tate and do debu
21c60 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66  g tracing */.#if
21c70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
21c80 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20  .  { u16 mask;. 
21c90 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
21ca0 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20  OCK "));.  mask 
21cb0 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66  = ofst>31 ? 0xff
21cc0 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  ff : (1<<(ofst+n
21cd0 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
21ce0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21cf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  _OK ){.    if( l
21d00 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
21d10 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
21d20 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b  E(("unlock %d ok
21d30 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
21d40 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
21d50 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
21d60 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
21d70 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
21d80 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
21d90 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
21da0 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
21db0 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
21dc0 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
21dd0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21de0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
21df0 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
21e00 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  e->sharedMask |=
21e10 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65   mask;.    }else
21e20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21e30 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43  lockType==F_WRLC
21e40 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  K );.      OSTRA
21e50 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20  CE(("write-lock 
21e60 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
21e70 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21e80 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
21e90 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
21ea0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
21eb0 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ~mask;.    }.  }
21ec0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f  else{.    if( lo
21ed0 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
21ee0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
21ef0 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69  (("unlock %d fai
21f00 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20  led", ofst));.  
21f10 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
21f20 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  Type==F_RDLCK ){
21f30 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21f40 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65  "read-lock faile
21f50 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  d"));.    }else{
21f60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
21f70 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
21f80 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
21f90 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
21fa0 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
21fb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
21fc0 53 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65  STRACE((" - afte
21fd0 72 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78  rwards %03x,%03x
21fe0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
21ff0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
22000 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Mask, pShmNode->
22010 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a  exclMask));.  }.
22020 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
22030 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a   rc;        .}..
22040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22050 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20   minimum number 
22060 6f 66 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69  of 32KB shm regi
22070 6f 6e 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ons that should 
22080 62 65 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20  be mapped at.** 
22090 61 20 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67  a time, assuming
220a0 20 74 68 61 74 20 65 61 63 68 20 6d 61 70 70 69   that each mappi
220b0 6e 67 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e  ng must be an in
220c0 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
220d0 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  f the.** current
220e0 20 73 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a   system page-siz
220f0 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79  e..**.** Usually
22100 2c 20 74 68 69 73 20 69 73 20 31 2e 20 54 68 65  , this is 1. The
22110 20 65 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73   exception seems
22120 20 74 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74   to be systems t
22130 68 61 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72  hat are configur
22140 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b  ed.** to use 64K
22150 42 20 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69  B pages - in thi
22160 73 20 63 61 73 65 20 65 61 63 68 20 6d 61 70 70  s case each mapp
22170 69 6e 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61  ing must cover a
22180 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73  t least two.** s
22190 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73  hm regions..*/.s
221a0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
221b0 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f  mRegionPerMap(vo
221c0 69 64 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a  id){.  int shmsz
221d0 20 3d 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20   = 32*1024;     
221e0 20 20 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65         /* SHM re
221f0 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69  gion size */.  i
22200 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70  nt pgsz = osGetp
22210 61 67 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20  agesize();   /* 
22220 53 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65  System page size
22230 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28   */.  assert( ((
22240 70 67 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30  pgsz-1)&pgsz)==0
22250 20 29 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69   );   /* Page si
22260 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
22270 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28  er of 2 */.  if(
22280 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65   pgsz<shmsz ) re
22290 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
222a0 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a   pgsz/shmsz;.}..
222b0 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
222c0 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20  unixShmNodeList 
222d0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
222e0 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d  ies with unixShm
222f0 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  Node.nRef==0..**
22300 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
22310 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
22320 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
22330 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
22340 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
22350 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
22360 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
22370 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
22380 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c  ShmPurge(unixFil
22390 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53  e *pFd){.  unixS
223a0 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d  hmNode *p = pFd-
223b0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
223c0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
223d0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
223e0 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52    if( p && p->nR
223f0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ef==0 ){.    int
22400 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
22410 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
22420 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p();.    int i;.
22430 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
22440 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f  Inode==pFd->pIno
22450 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  de );.    sqlite
22460 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
22470 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28  mutex);.    for(
22480 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
22490 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70  n; i+=nShmPerMap
224a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
224b0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
224c0 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65  osMunmap(p->apRe
224d0 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65  gion[i], p->szRe
224e0 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gion);.      }el
224f0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
22500 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
22510 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20  gion[i]);.      
22520 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
22530 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
22540 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  gion);.    if( p
22550 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
22560 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64  robust_close(pFd
22570 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  , p->h, __LINE__
22580 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20  );.      p->h = 
22590 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  -1;.    }.    p-
225a0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
225b0 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
225c0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
225d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
225e0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
225f0 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
22600 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  th open database
22610 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a   file pDbFd.  .*
22620 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
22630 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
22640 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69   uses mmapped fi
22650 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  les..**.** The f
22660 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ile used to impl
22670 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d  ement shared-mem
22680 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61  ory is in the sa
22690 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  me directory.** 
226a0 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
226b0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61  base file and ha
226c0 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
226d0 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
226e0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74  base.** file wit
226f0 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66  h the "-shm" suf
22700 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20  fix added.  For 
22710 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
22720 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
22730 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31   is "/home/user1
22740 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e  /config.db" then
22750 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69   the file that i
22760 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d  s created and mm
22770 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61  apped.** for sha
22780 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
22790 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65  be called "/home
227a0 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
227b0 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  -shm".  .**.** A
227c0 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20  nother approach 
227d0 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c  to is to use fil
227e0 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f  es in /dev/shm o
227f0 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e  r /dev/tmp or an
22800 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74  .** some other t
22810 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20  mpfs mount. But 
22820 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64  if a file in a d
22830 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f  ifferent directo
22840 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  ry.** from the d
22850 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
22860 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65  used, then diffe
22870 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d  ring access perm
22880 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20  issions.** or a 
22890 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63  chroot() might c
228a0 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65  ause two differe
228b0 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20  nt processes on 
228c0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61  the same.** data
228d0 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75  base to end up u
228e0 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66  sing different f
228f0 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20  iles for shared 
22900 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61  memory - .** mea
22910 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20  ning that their 
22920 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74  memory would not
22930 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65   really be share
22940 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  d - resulting.**
22950 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72   in database cor
22960 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74  ruption.  Nevert
22970 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70  heless, this tmp
22980 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a  fs file usage.**
22990 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20   can be enabled 
229a0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
229b0 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53  using -DSQLITE_S
229c0 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64  HM_DIRECTORY="/d
229d0 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68  ev/shm".** or th
229e0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54  e equivalent.  T
229f0 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51  he use of the SQ
22a00 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22a10 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  RY compile-time.
22a20 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74  ** option result
22a30 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  s in an incompat
22a40 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51  ible build of SQ
22a50 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66  Lite;  builds of
22a60 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20   SQLite.** that 
22a70 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53  with differing S
22a80 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
22a90 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74  ORY settings att
22aa0 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a  empt to use the.
22ab0 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  ** same database
22ac0 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
22ad0 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65  e time, database
22ae0 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
22af0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
22b00 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48  t. The SQLITE_SH
22b10 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
22b20 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
22b30 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a  is considered.**
22b40 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61   "unsupported" a
22b50 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69  nd may go away i
22b60 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74  n a future SQLit
22b70 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a  e release..**.**
22b80 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
22b90 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
22ba0 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
22bb0 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
22bc0 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
22bd0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
22be0 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
22bf0 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
22c00 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
22c10 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
22c20 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
22c30 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
22c40 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
22c50 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eared..**.** If 
22c60 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
22c70 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46  abase file (pDbF
22c80 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  d) is using the 
22c90 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a  "unix-excl" VFS.
22ca0 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
22cb0 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  at an exclusive 
22cc0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
22cd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22ce0 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f  e and.** that no
22cf0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
22d00 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61   are able to rea
22d10 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64  d or write the d
22d20 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20  atabase.  In.** 
22d30 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f  that case, we do
22d40 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64   not really need
22d50 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
22d60 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   No shared memor
22d70 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65  y.** file is cre
22d80 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65  ated.  The share
22d90 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
22da0 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20   simulated with 
22db0 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  heap memory..*/.
22dc0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
22dd0 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
22de0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29  unixFile *pDbFd)
22df0 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
22e00 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
22e10 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
22e20 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
22e30 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
22e40 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
22e50 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75  Node;   /* The u
22e60 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
22e70 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
22e80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
22e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22ea0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
22eb0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
22ec0 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
22ed0 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20  /* The inode of 
22ee0 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  fd */.  char *zS
22ef0 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
22f00 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
22f10 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65 64  of the file used
22f20 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e   for SHM */.  in
22f30 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20  t nShmFilename; 
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f50 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d   Size of the SHM
22f60 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74   filename in byt
22f70 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  es */..  /* Allo
22f80 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
22f90 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f  he new unixShm o
22fa0 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20  bject. */.  p = 
22fb0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
22fc0 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
22fd0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
22fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22ff0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
23000 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
23010 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
23020 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Shm==0 );..  /* 
23030 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23040 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  a unixShmNode ob
23050 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69  ject already exi
23060 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78  sts. Reuse an ex
23070 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20  isting.  ** one 
23080 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61  if present. Crea
23090 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
230a0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
230b0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
230c0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
230d0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
230e0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64  pShmNode = pInod
230f0 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e->pShmNode;.  i
23100 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
23110 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
23120 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
23130 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61           /* fsta
23140 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74  t() info for dat
23150 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69  abase file */.#i
23160 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  fndef SQLITE_SHM
23170 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 63  _DIRECTORY.    c
23180 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
23190 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50  Path = pDbFd->zP
231a0 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ath;.#endif..   
231b0 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29   /* Call fstat()
231c0 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74   to figure out t
231d0 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
231e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
231f0 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ile. If.    ** a
23200 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20   new *-shm file 
23210 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61  is created, an a
23220 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d  ttempt will be m
23230 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69 74  ade to create it
23240 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
23250 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
23260 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
23270 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d  ( osFstat(pDbFd-
23280 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26 20 70  >h, &sStat) && p
23290 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
232a0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
232b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
232c0 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67  R_FSTAT;.      g
232d0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
232e0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
232f0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
23300 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c  TORY.    nShmFil
23310 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53  ename = sizeof(S
23320 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
23330 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65  ORY) + 31;.#else
23340 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
23350 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72  e = 6 + (int)str
23360 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a  len(zBasePath);.
23370 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
23380 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
23390 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
233a0 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d  pShmNode) + nShm
233b0 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Filename );.    
233c0 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
233d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
233e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
233f0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
23400 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  err;.    }.    m
23410 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20  emset(pShmNode, 
23420 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  0, sizeof(*pShmN
23430 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d  ode)+nShmFilenam
23440 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65  e);.    zShmFile
23450 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  name = pShmNode-
23460 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
23470 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d  ar*)&pShmNode[1]
23480 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
23490 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20  SHM_DIRECTORY.  
234a0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
234b0 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
234c0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a   zShmFilename, .
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234e0 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f       SQLITE_SHM_
234f0 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69  DIRECTORY "/sqli
23500 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20  te-shm-%x-%x",. 
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23520 20 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73      (u32)sStat.s
23530 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61  t_ino, (u32)sSta
23540 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65  t.st_dev);.#else
23550 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
23560 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
23570 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  me, zShmFilename
23580 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73  , "%s-shm", zBas
23590 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  ePath);.    sqli
235a0 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
235b0 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68  DbFd->zPath, zSh
235c0 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  mFilename);.#end
235d0 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
235e0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  >h = -1;.    pDb
235f0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
23600 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
23610 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
23620 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
23630 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  Inode;.    pShmN
23640 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
23650 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
23660 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
23670 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
23680 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
23690 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
236a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
236b0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
236c0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
236d0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  if( pInode->bPro
236e0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
236f0 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61       int openFla
23700 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
23710 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28  CREAT;.      if(
23720 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
23730 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74  lean(pDbFd->zPat
23740 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
23750 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ", 0) ){.       
23760 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
23770 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70  DONLY;.        p
23780 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
23790 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
237a0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
237b0 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  >h = robust_open
237c0 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f  (zShmFilename, o
237d0 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74  penFlags, (sStat
237e0 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b  .st_mode&0777));
237f0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
23800 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20  ode->h<0 ){.    
23810 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
23820 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
23830 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
23840 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  n", zShmFilename
23850 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
23860 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
23870 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
23880 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  If this process 
23890 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  is running as ro
238a0 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ot, make sure th
238b0 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a  at the SHM file.
238c0 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65        ** is owne
238d0 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73  d by the same us
238e0 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65  er that owns the
238f0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
23900 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  se.  Otherwise,.
23910 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
23920 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c  ginal owner will
23930 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
23940 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a  connect..      *
23950 2f 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e  /.      osFchown
23960 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53  (pShmNode->h, sS
23970 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61  tat.st_uid, sSta
23980 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20  t.st_gid);.  .  
23990 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
239a0 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
239b0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
239c0 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
239d0 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20  witch..      ** 
239e0 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
239f0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
23a00 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20  o length. .     
23a10 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
23a20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
23a30 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65  if( unixShmSyste
23a40 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57  mLock(pDbFd, F_W
23a50 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  RLCK, UNIX_SHM_D
23a60 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
23a70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
23a80 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
23a90 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30  e(pShmNode->h, 0
23aa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
23ab0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
23ac0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
23ad0 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74  MOPEN, "ftruncat
23ae0 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  e", zShmFilename
23af0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23b00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
23b10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23b20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
23b30 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
23b40 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 55  DbFd, F_RDLCK, U
23b50 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  NIX_SHM_DMS, 1);
23b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23b70 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d  f( rc ) goto shm
23b80 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
23b90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
23ba0 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
23bb0 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68  on a child of th
23bc0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
23bd0 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  .  p->pShmNode =
23be0 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65   pShmNode;.#ifde
23bf0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
23c00 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64   p->id = pShmNod
23c10 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a  e->nextShmId++;.
23c20 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64  #endif.  pShmNod
23c30 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62  e->nRef++;.  pDb
23c40 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20  Fd->pShm = p;.  
23c50 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
23c60 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65  ;..  /* The refe
23c70 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70  rence count on p
23c80 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65  ShmNode has alre
23c90 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65  ady been increme
23ca0 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20  nted under.  ** 
23cb0 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65  the cover of the
23cc0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
23cd0 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
23ce0 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
23cf0 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
23d00 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63  t unixShm) objec
23d10 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64  t to the pShmNod
23d20 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  e has been set. 
23d30 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  All that is.  **
23d40 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74   left to do is t
23d50 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f  o link the new o
23d60 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c  bject into the l
23d70 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
23d80 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d  ing.  ** at pShm
23d90 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68  Node->pFirst. Th
23da0 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
23db0 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  while holding th
23dc0 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e pShmNode->mute
23dd0 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  x .  ** mutex.. 
23de0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
23df0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
23e00 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
23e10 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
23e20 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
23e30 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
23e40 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
23e50 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
23e60 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
23e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
23e80 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
23e90 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
23ea0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75  hm_open_err:.  u
23eb0 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46  nixShmPurge(pDbF
23ec0 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69  d);       /* Thi
23ed0 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68  s call frees pSh
23ee0 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65  mNode if require
23ef0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
23f00 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65  ree(p);.  unixLe
23f10 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
23f20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23f30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23f40 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
23f50 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
23f60 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20   region iRegion 
23f70 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65  of the .** share
23f80 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d-memory associa
23f90 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  ted with the dat
23fa0 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53  abase file fd. S
23fb0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
23fc0 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d  ions .** are num
23fd0 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66  bered starting f
23fe0 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73  rom zero. Each s
23ff0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
24000 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20  ion is szRegion 
24010 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
24020 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
24030 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
24040 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
24050 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
24060 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
24070 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
24080 69 66 20 74 68 65 20 62 45 78 74 65 6e 64 20 70  if the bExtend p
24090 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e  arameter is 0 an
240a0 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
240b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a  shared-memory.**
240c0 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
240d0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
240e0 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69  by any client, i
240f0 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e  ncluding one run
24100 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70  ning in a.** sep
24110 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20  arate process), 
24120 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20  then *pp is set 
24130 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
24140 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
24150 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69  If .** bExtend i
24160 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
24170 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
24180 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
24190 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a  n has not yet .*
241a0 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
241b0 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  , it is allocate
241c0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
241d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
241e0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
241f0 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  egion has alread
24200 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
24210 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   or is allocated
24220 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c   by.** this call
24230 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62   as described ab
24240 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ove, then it is 
24250 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
24260 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61   processes .** a
24270 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66  ddress space (if
24280 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
24290 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20  dy), *pp is set 
242a0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
242b0 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72  mapped .** memor
242c0 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
242d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
242e0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d  tic int unixShmM
242f0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
24300 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
24310 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
24320 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65  open on database
24330 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
24340 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
24350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24360 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65  gion to retrieve
24370 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
24380 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
24390 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
243a0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
243b0 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20  t bExtend,      
243c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
243d0 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20   True to extend 
243e0 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  file if necessar
243f0 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  y */.  void vola
24400 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20  tile **pp       
24410 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
24420 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  apped memory */.
24430 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
24440 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
24450 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20  *)fd;.  unixShm 
24460 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  *p;.  unixShmNod
24470 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e *pShmNode;.  i
24480 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24490 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65 72  K;.  int nShmPer
244a0 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67  Map = unixShmReg
244b0 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 69  ionPerMap();.  i
244c0 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a  nt nReqRegion;..
244d0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72    /* If the shar
244e0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68  ed-memory file h
244f0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
24500 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
24510 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44  now. */.  if( pD
24520 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a  bFd->pShm==0 ){.
24530 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65      rc = unixOpe
24540 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
24550 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
24560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
24570 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
24580 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
24590 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
245a0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c  >pShmNode;.  sql
245b0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
245c0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
245d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
245e0 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
245f0 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
24600 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
24610 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
24620 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
24630 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
24640 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
24650 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44  Node->h>=0 || pD
24660 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
24670 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
24680 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
24690 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64  de->h<0 || pDbFd
246a0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
246b0 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  ssLock==0 );..  
246c0 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65  /* Minimum numbe
246d0 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72 65 71  r of regions req
246e0 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61 70 70  uired to be mapp
246f0 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67  ed. */.  nReqReg
24700 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b  ion = ((iRegion+
24710 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53  nShmPerMap) / nS
24720 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d  hmPerMap) * nShm
24730 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70  PerMap;..  if( p
24740 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
24750 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20  <nReqRegion ){. 
24760 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b     char **apNew;
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52        /* New apR
24790 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f  egion[] array */
247a0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
247b0 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65   nReqRegion*szRe
247c0 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  gion;   /* Minim
247d0 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65  um required file
247e0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
247f0 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24810 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74 61 74  /* Used by fstat
24820 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e  () */..    pShmN
24830 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20  ode->szRegion = 
24840 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69  szRegion;..    i
24850 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
24860 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
24870 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
24880 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
24890 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
248a0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
248b0 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65  ce..      ** Che
248c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
248d0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
248e0 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
248f0 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
24900 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65  s.      ** large
24910 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61   enough to conta
24920 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
24930 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20   region)..      
24940 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  */.      if( osF
24950 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  stat(pShmNode->h
24960 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
24970 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24980 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a  _IOERR_SHMSIZE;.
24990 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
249a0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
249b0 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73  }.  .      if( s
249c0 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79  Stat.st_size<nBy
249d0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  te ){.        /*
249e0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   The requested m
249f0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65  emory region doe
24a00 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20  s not exist. If 
24a10 62 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74  bExtend is set t
24a20 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c  o.        ** fal
24a30 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20  se, exit early. 
24a40 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20  *pp will be set 
24a50 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
24a60 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
24a70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24a80 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20     if( !bExtend 
24a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
24aa0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
24ab0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
24ac0 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
24ad0 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69  ly, if bExtend i
24ae0 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64 20 74  s true, extend t
24af0 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73  he file. Do this
24b00 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   by.        ** w
24b10 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  riting a single 
24b20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20  byte to the end 
24b30 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70 61 67  of each (OS) pag
24b40 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20  e being.        
24b50 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  ** allocated or 
24b60 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68 6e 69  extended. Techni
24b70 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f  cally, we need o
24b80 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74 68 65  nly write to the
24b90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61 73 74  .        ** last
24ba0 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74   page in order t
24bb0 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c  o extend the fil
24bc0 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67 20 74  e. But writing t
24bd0 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20  o all new.      
24be0 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72 63 65    ** pages force
24bf0 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f  s the OS to allo
24c00 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65 64 69  cate them immedi
24c10 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72 65 64  ately, which red
24c20 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  uces.        ** 
24c30 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66 20 53  the chances of S
24c40 49 47 42 55 53 20 77 68 69 6c 65 20 61 63 63 65  IGBUS while acce
24c50 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70 65 64  ssing the mapped
24c60 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e   region later on
24c70 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24c80 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20       else{.     
24c90 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
24ca0 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39  t int pgsz = 409
24cb0 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  6;.          int
24cc0 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20 20 20   iPg;..         
24cd0 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
24ce0 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65 61   last byte of ea
24cf0 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  ch newly allocat
24d00 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64 20 70  ed or extended p
24d10 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  age */.         
24d20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74 65 20   assert( (nByte 
24d30 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20  % pgsz)==0 );.  
24d40 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d          for(iPg=
24d50 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70  (sStat.st_size/p
24d60 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74 65  gsz); iPg<(nByte
24d70 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a  /pgsz); iPg++){.
24d80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24d90 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 70  seekAndWriteFd(p
24da0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50 67 2a  ShmNode->h, iPg*
24db0 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c 20 22  pgsz + pgsz-1, "
24dc0 22 2c 20 31 2c 20 30 29 21 3d 31 20 29 7b 0a 20  ", 1, 0)!=1 ){. 
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
24de0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
24df0 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
24e00 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
24e10 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
24e20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
24e30 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72 69  RR_SHMSIZE, "wri
24e40 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  te", zFile);.   
24e50 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
24e60 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
24e70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
24e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
24ea0 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
24eb0 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
24ec0 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
24ed0 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
24ee0 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
24ef0 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   apNew = (char *
24f00 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
24f10 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
24f20 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 6e  ode->apRegion, n
24f30 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f 66  ReqRegion*sizeof
24f40 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a  (char *).    );.
24f50 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
24f60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
24f70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
24f80 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
24f90 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
24fa0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
24fb0 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20  egion = apNew;. 
24fc0 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f     while( pShmNo
24fd0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71  de->nRegion<nReq
24fe0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
24ff0 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67  int nMap = szReg
25000 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a  ion*nShmPerMap;.
25010 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
25020 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20     void *pMem;. 
25030 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
25040 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
25050 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70     pMem = osMmap
25060 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20  (0, nMap,.      
25070 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
25080 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f  isReadonly ? PRO
25090 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45  T_READ : PROT_RE
250a0 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a  AD|PROT_WRITE, .
250b0 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f              MAP_
250c0 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65  SHARED, pShmNode
250d0 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69  ->h, szRegion*(i
250e0 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  64)pShmNode->nRe
250f0 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a  gion.        );.
25100 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
25110 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
25120 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
25130 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
25140 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
25150 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64   "mmap", pShmNod
25160 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
25170 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
25180 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
25190 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
251a0 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  {.        pMem =
251b0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
251c0 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  4(szRegion);.   
251d0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30       if( pMem==0
251e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
251f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
25200 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
25210 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
25220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
25230 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73  emset(pMem, 0, s
25240 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
25250 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  }..      for(i=0
25260 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b 20  ; i<nShmPerMap; 
25270 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i++){.        pS
25280 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
25290 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
252a0 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72 2a  on+i] = &((char*
252b0 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a  )pMem)[szRegion*
252c0 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
252d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
252e0 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d 61  ion += nShmPerMa
252f0 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  p;.    }.  }..sh
25300 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
25310 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
25320 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
25330 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65    *pp = pShmNode
25340 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69  ->apRegion[iRegi
25350 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  on];.  }else{.  
25360 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
25370 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
25380 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d  sReadonly && rc=
25390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
253a0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
253b0 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  Y;.  sqlite3_mut
253c0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
253d0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
253e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
253f0 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
25400 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
25410 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
25420 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  nt..**.** Note t
25430 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  hat the relation
25440 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41  ship between SHA
25450 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56  REd and EXCLUSIV
25460 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74  E locks is a lit
25470 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  tle.** different
25480 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f   here than in po
25490 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63  six.  In xShmLoc
254a0 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20  k(), one can go 
254b0 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a  from unlocked.**
254c0 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62   to shared and b
254d0 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f  ack or from unlo
254e0 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  cked to exclusiv
254f0 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74  e and back.  But
25500 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20   one may.** not 
25510 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74  go from shared t
25520 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66  o exclusive or f
25530 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f  rom exclusive to
25540 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74   shared..*/.stat
25550 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f  ic int unixShmLo
25560 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
25570 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
25580 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
25590 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
255a0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
255b0 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
255c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
255d0 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
255e0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
255f0 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
25600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25610 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
25620 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
25630 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
25640 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
25650 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
25660 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
25670 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  lock */.){.  uni
25680 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
25690 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20  unixFile*)fd;   
256a0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
256b0 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
256c0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78  memory */.  unix
256d0 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
256e0 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
256f0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
25700 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
25710 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ked */.  unixShm
25720 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
25730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25740 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
25750 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
25760 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
25770 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
25780 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68  pShmNode;  /* Th
25790 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c  e underlying fil
257a0 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  e iNode */.  int
257b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257d0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
257e0 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25810 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
25820 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
25830 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
25840 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
25850 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
25860 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
25870 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
25880 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
25890 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
258a0 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
258b0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
258c0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
258d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
258e0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
258f0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
25900 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
25910 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
25920 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
25930 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
25940 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
25950 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
25960 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
25970 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
25980 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
25990 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
259a0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
259b0 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
259c0 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
259d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
259e0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
259f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
25a00 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
25a10 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
25a20 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
25a30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
25a40 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
25a50 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
25a60 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
25a70 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
25a80 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
25a90 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  t);.  assert( n>
25aa0 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
25ab0 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
25ac0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
25ad0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
25ae0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
25af0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
25b00 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
25b10 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
25b20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
25b30 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
25b40 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
25b50 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
25b60 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
25b70 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25b80 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25b90 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25ba0 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
25bb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25bc0 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
25bd0 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
25be0 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
25bf0 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
25c00 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
25c10 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
25c20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
25c30 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
25c40 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
25c50 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
25c60 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
25c70 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
25c80 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
25c90 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_UNLCK, ofst+UN
25ca0 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
25cb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25cc0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25cd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
25ce0 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
25cf0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
25d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25d10 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
25d20 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
25d30 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
25d40 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
25d50 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
25d60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
25d70 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
25d80 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
25d90 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
25da0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
25db0 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
25dc0 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
25dd0 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
25de0 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
25df0 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
25e00 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
25e10 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
25e20 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
25e30 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
25e40 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
25e50 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
25e60 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
25e70 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
25e80 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
25e90 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
25ea0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
25eb0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
25ec0 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
25ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25ee0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
25ef0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25f00 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
25f10 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
25f20 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
25f30 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
25f40 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
25f50 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
25f60 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
25f70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25f80 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
25f90 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
25fa0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
25fb0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
25fc0 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
25fd0 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  RDLCK, ofst+UNIX
25fe0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
25ff0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26000 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26010 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
26020 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
26030 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
26040 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
26050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26060 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
26070 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
26080 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
26090 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
260a0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
260b0 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
260c0 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
260d0 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
260e0 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
260f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
26100 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
26110 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
26120 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
26130 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
26140 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
26150 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
26160 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
26170 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
26180 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
26190 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
261a0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
261b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
261c0 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65   .    /* Get the
261d0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
261e0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
261f0 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
26200 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
26210 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
26220 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
26230 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
26240 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26260 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
26270 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
26280 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66  bFd, F_WRLCK, of
26290 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
262a0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
262b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
262c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
262d0 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
262e0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
262f0 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
26300 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
26310 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
26320 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
26330 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
26340 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
26350 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
26360 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25  %d, pid-%d got %
26370 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
26380 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 6f          p->id, o
26390 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d 3e 73  sGetpid(0), p->s
263a0 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
263b0 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75  clMask));.  retu
263c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
263d0 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
263e0 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
263f0 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
26400 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
26410 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
26420 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
26430 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
26440 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
26450 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
26460 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
26470 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
26480 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
26490 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72  void unixShmBarr
264a0 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
264b0 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
264c0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
264d0 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
264e0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
264f0 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  y */.){.  UNUSED
26500 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
26510 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
26520 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ();.  unixLeaveM
26530 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
26540 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
26550 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
26560 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
26570 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
26580 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
26590 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
265a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
265b0 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f  s no shared memo
265c0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
265d0 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  th the connectio
265e0 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  n then this.** r
265f0 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d  outine is a harm
26600 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  less no-op..*/.s
26610 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
26620 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65  mUnmap(.  sqlite
26630 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
26640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26650 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
26660 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
26670 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26690 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d  * Delete shared-
266a0 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a  memory if true *
266b0 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  /.){.  unixShm *
266c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
266d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
266e0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  nnection to be c
266f0 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  losed */.  unixS
26700 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
26710 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
26720 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
26730 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
26740 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70  */.  unixShm **p
26750 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
26760 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
26770 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67  ing over sibling
26780 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
26790 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
267a0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
267b0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
267c0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
267d0 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  e */..  pDbFd = 
267e0 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
267f0 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
26800 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
26810 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26820 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
26830 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73  >pShmNode;..  as
26840 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
26850 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
26860 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
26870 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
26880 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
26890 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  node );..  /* Re
268a0 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
268b0 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
268c0 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
268d0 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
268e0 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
268f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
26900 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
26910 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
26920 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
26930 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
26940 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
26950 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
26960 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
26970 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
26980 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
26990 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
269a0 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
269b0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
269c0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
269d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
269e0 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
269f0 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
26a00 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
26a10 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
26a20 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
26a30 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
26a40 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
26a50 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
26a60 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
26a70 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
26a80 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
26a90 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65   ){.    if( dele
26aa0 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f  teFlag && pShmNo
26ab0 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
26ac0 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e    osUnlink(pShmN
26ad0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
26ae0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 53  .    }.    unixS
26af0 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a  hmPurge(pDbFd);.
26b00 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
26b10 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
26b20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26b30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
26b40 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30  unixShmMap     0
26b50 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
26b60 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
26b70 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69  ine unixShmBarri
26b80 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e  er 0.# define un
26b90 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  ixShmUnmap   0.#
26ba0 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
26bb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
26bc0 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   */..#if SQLITE_
26bd0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
26be0 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 63  /*.** If it is c
26bf0 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20  urrently memory 
26c00 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70 20 66 69  mapped, unmap fi
26c10 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69  le pFd..*/.stati
26c20 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70  c void unixUnmap
26c30 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
26c40 46 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Fd){.  assert( p
26c50 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
26c60 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 70   );.  if( pFd->p
26c70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  MapRegion ){.   
26c80 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70   osMunmap(pFd->p
26c90 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e  MapRegion, pFd->
26ca0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 29 3b  mmapSizeActual);
26cb0 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65  .    pFd->pMapRe
26cc0 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46  gion = 0;.    pF
26cd0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b  d->mmapSize = 0;
26ce0 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
26cf0 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
26d00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
26d10 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 73 69  pt to set the si
26d20 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  ze of the memory
26d30 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e 74 61 69   mapping maintai
26d40 6e 65 64 20 62 79 20 66 69 6c 65 20 0a 2a 2a 20  ned by file .** 
26d50 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 74  descriptor pFd t
26d60 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e 20 41 6e  o nNew bytes. An
26d70 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
26d80 6e 67 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  ng is discarded.
26d90 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
26da0 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  sful, this funct
26db0 69 6f 6e 20 73 65 74 73 20 74 68 65 20 66 6f 6c  ion sets the fol
26dc0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
26dd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 75 6e  :.**.**       un
26de0 69 78 46 69 6c 65 2e 70 4d 61 70 52 65 67 69 6f  ixFile.pMapRegio
26df0 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46  n.**       unixF
26e00 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20  ile.mmapSize.** 
26e10 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d        unixFile.m
26e20 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 0a 2a 2a  mapSizeActual.**
26e30 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63 65 73 73  .** If unsuccess
26e40 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ful, an error me
26e50 73 73 61 67 65 20 69 73 20 6c 6f 67 67 65 64 20  ssage is logged 
26e60 76 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  via sqlite3_log(
26e70 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68 72  ) and.** the thr
26e80 65 65 20 76 61 72 69 61 62 6c 65 73 20 61 62 6f  ee variables abo
26e90 76 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 49  ve are zeroed. I
26ea0 6e 20 74 68 69 73 20 63 61 73 65 20 53 51 4c 69  n this case SQLi
26eb0 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e  te should.** con
26ec0 74 69 6e 75 65 20 61 63 63 65 73 73 69 6e 67 20  tinue accessing 
26ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69  the database usi
26ee0 6e 67 20 74 68 65 20 78 52 65 61 64 28 29 20 61  ng the xRead() a
26ef0 6e 64 20 78 57 72 69 74 65 28 29 0a 2a 2a 20 6d  nd xWrite().** m
26f00 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
26f10 63 20 76 6f 69 64 20 75 6e 69 78 52 65 6d 61 70  c void unixRemap
26f20 66 69 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c 65  file(.  unixFile
26f30 20 2a 70 46 64 2c 20 20 20 20 20 20 20 20 20 20   *pFd,          
26f40 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
26f50 64 65 73 63 72 69 70 74 6f 72 20 6f 62 6a 65 63  descriptor objec
26f60 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77 20  t */.  i64 nNew 
26f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f80 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
26f90 65 64 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ed mapping size 
26fa0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
26fb0 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61 70  ar *zErr = "mmap
26fc0 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 64  ";.  int h = pFd
26fd0 2d 3e 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ->h;            
26fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
26ff0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
27000 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  n on db file */.
27010 20 20 75 38 20 2a 70 4f 72 69 67 20 3d 20 28 75    u8 *pOrig = (u
27020 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
27030 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ion;   /* Pointe
27040 72 20 74 6f 20 63 75 72 72 65 6e 74 20 66 69 6c  r to current fil
27050 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69  e mapping */.  i
27060 36 34 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d 3e  64 nOrig = pFd->
27070 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
27080 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
27090 4f 72 69 67 20 72 65 67 69 6f 6e 20 69 6e 20 62  Orig region in b
270a0 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70 4e  ytes */.  u8 *pN
270b0 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
270d0 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 65  * Location of ne
270e0 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69  w mapping */.  i
270f0 6e 74 20 66 6c 61 67 73 20 3d 20 50 52 4f 54 5f  nt flags = PROT_
27100 52 45 41 44 3b 20 20 20 20 20 20 20 20 20 20 20  READ;           
27110 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
27120 70 61 73 73 20 74 6f 20 6d 6d 61 70 28 29 20 2a  pass to mmap() *
27130 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  /..  assert( pFd
27140 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
27150 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
27160 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  >pFd->mmapSize )
27170 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
27180 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  <=pFd->mmapSizeM
27190 61 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ax );.  assert( 
271a0 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61 73 73 65  nNew>0 );.  asse
271b0 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  rt( pFd->mmapSiz
271c0 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d  eActual>=pFd->mm
271d0 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  apSize );.  asse
271e0 72 74 28 20 4d 41 50 5f 46 41 49 4c 45 44 21 3d  rt( MAP_FAILED!=
271f0 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 46 64  0 );..  if( (pFd
27200 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
27210 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
27220 30 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f  0 ) flags |= PRO
27230 54 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20  T_WRITE;..  if( 
27240 70 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56  pOrig ){.#if HAV
27250 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34  E_MREMAP.    i64
27260 20 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d   nReuse = pFd->m
27270 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20  mapSize;.#else. 
27280 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53     const int szS
27290 79 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61  yspage = osGetpa
272a0 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36  gesize();.    i6
272b0 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d  4 nReuse = (pFd-
272c0 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a  >mmapSize & ~(sz
272d0 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e  Syspage-1));.#en
272e0 64 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71  dif.    u8 *pReq
272f0 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65   = &pOrig[nReuse
27300 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70  ];..    /* Unmap
27310 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68   any pages of th
27320 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
27330 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ng that cannot b
27340 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20  e reused. */.   
27350 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72   if( nReuse!=nOr
27360 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  ig ){.      osMu
27370 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67  nmap(pReq, nOrig
27380 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a  -nReuse);.    }.
27390 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
273a0 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72  .    pNew = osMr
273b0 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  emap(pOrig, nReu
273c0 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50  se, nNew, MREMAP
273d0 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a  _MAYMOVE);.    z
273e0 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a  Err = "mremap";.
273f0 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
27400 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e   osMmap(pReq, nN
27410 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73  ew-nReuse, flags
27420 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
27430 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66   nReuse);.    if
27440 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c  ( pNew!=MAP_FAIL
27450 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ED ){.      if( 
27460 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20  pNew!=pReq ){.  
27470 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
27480 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75  New, nNew - nReu
27490 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  se);.        pNe
274a0 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  w = 0;.      }el
274b0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
274c0 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20   = pOrig;.      
274d0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
274e0 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d      /* The attem
274f0 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  pt to extend the
27500 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
27510 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69  g failed. Free i
27520 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e  t. */.    if( pN
27530 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c  ew==MAP_FAILED |
27540 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  | pNew==0 ){.   
27550 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69     osMunmap(pOri
27560 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  g, nReuse);.    
27570 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
27580 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c  New is still NUL
27590 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  L, try to create
275a0 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77   an entirely new
275b0 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69   mapping. */.  i
275c0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
275d0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28    pNew = osMmap(
275e0 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20  0, nNew, flags, 
275f0 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30  MAP_SHARED, h, 0
27600 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  );.  }..  if( pN
27610 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew==MAP_FAILED )
27620 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  {.    pNew = 0;.
27630 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20      nNew = 0;.  
27640 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53    unixLogError(S
27650 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20  QLITE_OK, zErr, 
27660 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20  pFd->zPath);..  
27670 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70    /* If the mmap
27680 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c  () above failed,
27690 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c   assume that all
276a0 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70   subsequent mmap
276b0 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20  () calls.    ** 
276c0 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61  will probably fa
276d0 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63  il too. Fall bac
276e0 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64  k to using xRead
276f0 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76  /xWrite exclusiv
27700 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ely.    ** in th
27710 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
27720 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
27730 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64  x = 0;.  }.  pFd
27740 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28  ->pMapRegion = (
27750 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70  void *)pNew;.  p
27760 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
27770 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
27780 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a  al = nNew;.}../*
27790 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
277a0 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
277b0 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
277c0 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
277d0 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
277e0 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
277f0 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
27800 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
27810 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
27820 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
27830 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
27840 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
27850 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
27860 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
27870 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
27880 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
27890 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
278a0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
278b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
278c0 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
278d0 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
278e0 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
278f0 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
27900 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
27910 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
27920 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
27930 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
27940 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
27950 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
27960 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
27970 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
27980 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
27990 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
279a0 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
279b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
279c0 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
279d0 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
279e0 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
279f0 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68  L_MMAP_LIMIT, wh
27a00 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
27a10 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
27a20 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
27a30 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
27a40 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20  rs (even if the 
27a50 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a  mapping is not.*
27a60 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61  * recreated as a
27a70 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74   result of outst
27a80 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
27a90 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s) or an SQLite 
27aa0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
27ab0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
27ac0 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
27ad0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
27ae0 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
27af0 69 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65  i64 nMap = nByte
27b00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
27b10 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
27b20 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
27b30 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64  ==0 );.  if( pFd
27b40 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
27b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27b60 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
27b70 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
27b80 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
27b90 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
27ba0 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
27bb0 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f  on */.    rc = o
27bc0 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26  sFstat(pFd->h, &
27bd0 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
27be0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27bf0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
27c00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
27c10 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  AT;.    }.    nM
27c20 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ap = statbuf.st_
27c30 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  size;.  }.  if( 
27c40 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nMap>pFd->mmapSi
27c50 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61  zeMax ){.    nMa
27c60 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  p = pFd->mmapSiz
27c70 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  eMax;.  }..  if(
27c80 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70   nMap!=pFd->mmap
27c90 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
27ca0 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20  nMap>0 ){.      
27cb0 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46  unixRemapfile(pF
27cc0 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65  d, nMap);.    }e
27cd0 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 69 78 55  lse{.      unixU
27ce0 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
27cf0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
27d00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27d10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
27d20 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
27d30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
27d40 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
27d50 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
27d60 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
27d70 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
27d80 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
27d90 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
27da0 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
27db0 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
27dc0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
27dd0 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
27de0 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
27df0 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
27e00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
27e10 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
27e20 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
27e30 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
27e40 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
27e50 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
27e60 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
27e70 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
27e80 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
27e90 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
27ea0 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
27eb0 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
27ec0 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
27ed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
27ee0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
27ef0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
27f00 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
27f10 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72  eventually .** r
27f20 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
27f30 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  ence by calling 
27f40 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a  unixUnfetch()..*
27f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
27f60 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  xFetch(sqlite3_f
27f70 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
27f80 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69  f, int nAmt, voi
27f90 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c  d **pp){.#if SQL
27fa0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
27fb0 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  E>0.  unixFile *
27fc0 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  pFd = (unixFile 
27fd0 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
27fe0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
27ff0 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  se file */.#endi
28000 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69  f.  *pp = 0;..#i
28010 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
28020 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
28030 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  Fd->mmapSizeMax>
28040 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64  0 ){.    if( pFd
28050 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20  ->pMapRegion==0 
28060 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
28070 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
28080 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
28090 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
280a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
280b0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e   }.    if( pFd->
280c0 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66  mmapSize >= iOff
280d0 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a  +nAmt ){.      *
280e0 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64  pp = &((u8 *)pFd
280f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
28100 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ff];.      pFd->
28110 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20  nFetchOut++;.   
28120 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
28130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
28150 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
28160 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
28170 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
28180 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20   releases a .** 
28190 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
281a0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
281b0 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74   call to unixFet
281c0 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
281d0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
281e0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
281f0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
28200 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
28210 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
28220 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
28230 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e  passed to the un
28240 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61  ixFetch() invoca
28250 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c  tion. .**.** Or,
28260 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
28270 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
28280 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
28290 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
282a0 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d  ed .** to inform
282b0 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74   the VFS layer t
282c0 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  hat, according t
282d0 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69  o POSIX, any exi
282e0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a  sting mapping .*
282f0 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76  * may now be inv
28300 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
28310 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a  be unmapped..*/.
28320 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
28330 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
28340 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
28350 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66  f, void *p){.#if
28360 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
28370 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
28380 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
28390 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
283a0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
283b0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
283c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
283d0 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49  R(iOff);..  /* I
283e0 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
283f0 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
28400 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
28410 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
28420 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65   .  ** xFetch re
28430 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66  ferences. Or, if
28440 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69   p!=0 (meaning i
28450 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72  t is an xFetch r
28460 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20  eference),.  ** 
28470 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
28480 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
28490 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f  outstanding.  */
284a0 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30  .  assert( (p==0
284b0 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f  )==(pFd->nFetchO
284c0 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ut==0) );..  /* 
284d0 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74  If p!=0, it must
284e0 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20   match the iOff 
284f0 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65  value. */.  asse
28500 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26  rt( p==0 || p==&
28510 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
28520 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b  Region)[iOff] );
28530 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
28540 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
28550 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
28560 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
28570 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  d);.  }..  asser
28580 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
28590 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20  t>=0 );.#else.  
285a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
285b0 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
285c0 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55  ARAMETER(p);.  U
285d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
285e0 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20  iOff);.#endif.  
285f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  ;.}../*.** Here 
28610 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
28620 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
28630 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
28640 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
28650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
28660 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
28670 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
28680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28690 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
286a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
286b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
286c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
286d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
286e0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
286f0 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
28700 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
28710 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f  s of sqlite3_io_
28720 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
28730 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  that.** implemen
28740 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c  t various file l
28750 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
28760 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74  s.  It also cont
28770 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
28780 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20  .** of "finder" 
28790 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69  functions.  A fi
287a0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
287b0 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20   used to locate 
287c0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
287d0 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ** sqlite3_io_me
287e0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72  thods object for
287f0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
28800 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
28810 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69  e pAppData.** fi
28820 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
28830 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63  e3_vfs VFS objec
28840 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ts are initializ
28850 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72  ed to be pointer
28860 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72  s to.** the corr
28870 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ect finder-funct
28880 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53  ion for that VFS
28890 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e  ..**.** Most fin
288a0 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  der functions re
288b0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
288c0 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
288d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
288e0 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c  object.  The onl
288f0 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69  y interesting fi
28900 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
28910 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
28920 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b  r, which.** look
28930 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73  s at the filesys
28940 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69  tem type and tri
28950 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20  es to guess the 
28960 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  best locking.** 
28970 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68  strategy from th
28980 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69  at..**.** For fi
28990 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c  nder-function F,
289a0 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
289b0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
289c0 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
289d0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
289e0 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
289f0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
28a00 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
28a10 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
28a20 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
28a30 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
28a40 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
28a50 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
28a60 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
28a70 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
28a80 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
28a90 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
28aa0 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
28ab0 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
28ac0 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
28ad0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
28ae0 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
28af0 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
28b00 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
28b10 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
28b20 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
28b30 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
28b40 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
28b50 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
28b60 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
28b70 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
28b80 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
28b90 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
28ba0 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
28bb0 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
28bc0 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
28bd0 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
28be0 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
28bf0 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
28c00 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
28c10 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
28c20 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
28c30 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
28c40 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
28c50 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
28c60 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
28c70 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
28c80 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e  R,METHOD,VERSION
28c90 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f  ,CLOSE,LOCK,UNLO
28ca0 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50  CK,CKLOCK,SHMMAP
28cb0 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63  )     \.static c
28cc0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
28cd0 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
28ce0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f       \.   VERSIO
28d10 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
28d20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
28d30 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d50 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d70 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
28d80 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28da0 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
28db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28dc0 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
28e00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e10 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e40 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
28e50 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
28e60 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
28e70 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28ee0 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
28ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28f00 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28f30 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f50 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28f80 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
28f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28fa0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fc0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28fd0 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ff0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29000 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
29010 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29020 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
29030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29040 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
29070 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
29080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
29090 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
290c0 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
290d0 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
290e0 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
290f0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29100 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d          \.   SHM
29110 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20 20 20  MAP,            
29120 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
29130 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Map */          
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29150 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
29160 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
29170 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
29180 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
291b0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
291c0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
291d0 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20  rrier */        
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291f0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
29200 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mUnmap,         
29210 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
29220 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
29230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29240 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74      \.   unixFet
29250 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
29260 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a       /* xFetch *
29270 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29290 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65     \.   unixUnfe
292a0 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
292b0 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20      /* xUnfetch 
292c0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
292d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292e0 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20    \.};          
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
29340 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29350 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c  ds *FINDER##Impl
29360 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
29370 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20  unixFile *p){   
29380 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  \.  UNUSED_PARAM
29390 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f  ETER(z); UNUSED_
293a0 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20  PARAMETER(p);   
293b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
293d0 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f  .  return &METHO
293e0 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
293f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29420 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
29430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29460 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
29470 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
29480 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
29490 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28  (*const FINDER)(
294a0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
294b0 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20  File *p)    \.  
294c0 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c    = FINDER##Impl
294d0 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72  ;../*.** Here ar
294e0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c  e all of the sql
294f0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29500 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
29510 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69   of the.** locki
29520 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
29530 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  Functions that r
29540 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74  eturn pointers t
29550 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a  o these methods.
29560 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61  ** are also crea
29570 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44  ted..*/.IOMETHOD
29580 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  S(.  posixIoFind
29590 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
295a0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
295b0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69  n name */.  posi
295c0 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  xIoMethods,     
295d0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
295e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
295f0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29610 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
29620 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70   memory and mmap
29630 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   are enabled */.
29640 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
29650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29660 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
29670 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
29680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29690 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
296a0 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20   unixUnlock,    
296b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
296c0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
296d0 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
296e0 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78  vedLock,    /* x
296f0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29700 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
29710 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20  ixShmMap        
29720 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29730 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ap method */.).I
29740 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f  OMETHODS(.  nolo
29750 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
29760 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
29770 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
29780 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  .  nolockIoMetho
29790 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ds,          /* 
297a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
297b0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
297c0 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  /.  3,          
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
297e0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
297f0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
29800 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  nolockClose,    
29810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29820 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
29830 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  nolockLock,     
29840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
29850 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
29860 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  olockUnlock,    
29870 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29880 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29890 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
298a0 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68  vedLock,  /* xCh
298b0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
298c0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
298d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298e0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
298f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
29900 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
29910 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
29920 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29930 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29940 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
29950 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
29960 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29970 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
29980 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
29990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
299a0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
299b0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
299c0 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
299d0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
299e0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
299f0 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
29a00 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29a10 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
29a20 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
29a30 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29a40 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
29a50 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
29a60 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63  edLock, /* xChec
29a70 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29a80 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29aa0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
29ab0 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20  ethod */.)..#if 
29ac0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29ad0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
29ae0 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
29af0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
29b00 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
29b10 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
29b20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
29b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
29b40 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29b50 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29b60 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
29b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29b80 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
29b90 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
29ba0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
29bb0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
29bc0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
29bd0 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
29be0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29bf0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
29c00 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
29c10 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29c20 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
29c30 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
29c40 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock,   /* xCheck
29c50 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29c60 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
29c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c80 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
29c90 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
29ca0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
29cb0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65  .IOMETHODS(.  se
29cc0 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  mIoFinder,      
29cd0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
29ce0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
29cf0 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64  */.  semIoMethod
29d00 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
29d10 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
29d20 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
29d30 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
29d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d50 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29d60 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
29d70 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20    semXClose,    
29d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29d90 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
29da0 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20    semXLock,     
29db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29dc0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29dd0 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20   semXUnlock,    
29de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
29df0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
29e00 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72    semXCheckReser
29e10 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78  vedLock,    /* x
29e20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29e30 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e50 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29e60 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
29e70 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
29e80 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
29e90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29ea0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
29eb0 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46  ETHODS(.  afpIoF
29ec0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29ed0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29ee0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29ef0 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20   afpIoMethods,  
29f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
29f10 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29f20 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
29f30 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
29f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29f50 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
29f60 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66  disabled */.  af
29f70 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  pClose,         
29f80 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
29f90 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  e method */.  af
29fa0 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  pLock,          
29fb0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29fc0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
29fd0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29fe0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29ff0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
2a000 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
2a010 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck,     /* xChec
2a020 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
2a030 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a050 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
2a060 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
2a070 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  f../*.** The pro
2a080 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  xy locking metho
2a090 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65  d is a "super-me
2a0a0 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e  thod" in the sen
2a0b0 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70  se that it.** op
2a0c0 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69  ens secondary fi
2a0d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
2a0e0 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64  or the conch and
2a0f0 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a   lock files and.
2a100 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79  ** it uses proxy
2a110 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c  , dot-file, AFP,
2a120 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63   and flock() loc
2a130 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
2a140 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61  those.** seconda
2a150 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74  ry files.  For t
2a160 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
2a170 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
2a180 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78  plements.** prox
2a190 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63  y locking is loc
2a1a0 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65  ated much furthe
2a1b0 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69  r down in the fi
2a1c0 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  le.  But we need
2a1d0 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
2a1e0 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73  and define the s
2a1f0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a200 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e  s and finder fun
2a210 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f  ction.** for pro
2a220 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e  xy locking here.
2a230 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20    So we forward 
2a240 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20  declare the I/O 
2a250 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20  methods..*/.#if 
2a260 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2a270 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2a280 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2a290 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  E.static int pro
2a2a0 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
2a2b0 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
2a2c0 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
2a2d0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
2a2e0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
2a2f0 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
2a300 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
2a310 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
2a320 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2a330 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
2a340 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28  nt*);.IOMETHODS(
2a350 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72  .  proxyIoFinder
2a360 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2a370 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2a380 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49  name */.  proxyI
2a390 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2a3a0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2a3b0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2a3c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3e0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2a3f0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2a400 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73  d */.  proxyClos
2a410 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2a420 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2a430 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  d */.  proxyLock
2a440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a450 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2a460 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63   */.  proxyUnloc
2a470 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2a480 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2a490 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63  d */.  proxyChec
2a4a0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2a4b0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2a4c0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2a4d0 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a4f0 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2a500 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e  /.).#endif../* n
2a510 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20  fs lockd on OSX 
2a520 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c  10.3+ doesn't cl
2a530 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  ear write locks 
2a540 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
2a550 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64   is set */.#if d
2a560 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2a570 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2a580 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a590 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66  .IOMETHODS(.  nf
2a5a0 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  sIoFinder,      
2a5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
2a5c0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
2a5d0 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f   */.  nfsIoMetho
2a5e0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
2a5f0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2a600 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2a610 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a630 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2a640 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2a650 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a670 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2a680 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
2a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6a0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2a6b0 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c   */.  nfsUnlock,
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6d0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2a6e0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
2a6f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2a700 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2a710 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2a720 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a740 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
2a750 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
2a760 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2a770 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2a780 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a790 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TYLE./* .** This
2a7a0 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
2a7b0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  on attempts to d
2a7c0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73  etermine the bes
2a7d0 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  t locking strate
2a7e0 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  gy .** for the d
2a7f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69  atabase file "fi
2a800 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65  lePath".  It the
2a810 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71  n returns the sq
2a820 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a830 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
2a840 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  implements that 
2a850 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20  strategy..**.** 
2a860 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f  This is for MacO
2a870 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  SX only..*/.stat
2a880 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2a890 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
2a8a0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
2a8b0 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
2a8c0 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
2a8d0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2a8e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2a8f0 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
2a900 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e           /* open
2a910 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72   file object for
2a920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a930 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  le */.){.  stati
2a940 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d  c const struct M
2a950 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e  apping {.    con
2a960 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79  st char *zFilesy
2a970 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  stem;           
2a980 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d     /* Filesystem
2a990 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   type name */.  
2a9a0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
2a9b0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
2a9c0 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f  hods;   /* Appro
2a9d0 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
2a9e0 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61  ethod */.  } aMa
2a9f0 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68  p[] = {.    { "h
2aa00 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
2aa10 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2aa20 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "ufs",    &posi
2aa30 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
2aa40 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61    { "afpfs",  &a
2aa50 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
2aa60 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26     { "smbfs",  &
2aa70 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
2aa80 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20      { "webdav", 
2aa90 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2aaa0 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d   },.    { 0, 0 }
2aab0 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
2aac0 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
2aad0 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  sInfo;.  struct 
2aae0 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
2aaf0 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
2ab00 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
2ab10 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
2ab20 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
2ab30 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
2ab40 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
2ab50 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
2ab60 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
2ab70 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
2ab80 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2ab90 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ods;.  }.  if( s
2aba0 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20  tatfs(filePath, 
2abb0 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29  &fsInfo) != -1 )
2abc0 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f  {.    if( fsInfo
2abd0 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52  .f_flags & MNT_R
2abe0 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72  DONLY ){.      r
2abf0 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2ac00 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
2ac10 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b    for(i=0; aMap[
2ac20 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  i].zFilesystem; 
2ac30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
2ac40 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
2ac50 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70  fstypename, aMap
2ac60 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29  [i].zFilesystem)
2ac70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2ac80 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d  eturn aMap[i].pM
2ac90 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a  ethods;.      }.
2aca0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2acb0 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61  Default case. Ha
2acc0 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f  ndles, amongst o
2acd0 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20  thers, "nfs"..  
2ace0 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e  ** Test byte-ran
2acf0 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63  ge lock using fc
2ad00 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61  ntl(). If the ca
2ad10 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20  ll succeeds, .  
2ad20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  ** assume that t
2ad30 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2ad40 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74  upports POSIX st
2ad50 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f  yle locks. .  */
2ad60 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65  .  lockInfo.l_le
2ad70 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66  n = 1;.  lockInf
2ad80 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  o.l_start = 0;. 
2ad90 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e   lockInfo.l_when
2ada0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
2adb0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65   lockInfo.l_type
2adc0 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66   = F_RDLCK;.  if
2add0 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e  ( osFcntl(pNew->
2ade0 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
2adf0 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
2ae00 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
2ae10 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
2ae20 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a  e, "nfs")==0 ){.
2ae30 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66        return &nf
2ae40 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  sIoMethods;.    
2ae50 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
2ae60 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
2ae70 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  thods;.    }.  }
2ae80 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2ae90 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
2aea0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2aeb0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2aec0 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2aed0 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
2aee0 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
2aef0 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
2af00 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2af10 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2af20 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
2af30 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2af40 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2af50 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56  YLE */..#if OS_V
2af60 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69  XWORKS./*.** Thi
2af70 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
2af80 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73 20  ion for VxWorks 
2af90 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
2afa0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 0a   posix advisory.
2afb0 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  ** locking works
2afc0 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  .  If it does, t
2afd0 68 65 6e 20 74 68 61 74 20 69 73 20 77 68 61 74  hen that is what
2afe0 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 69 74   is used.  If it
2aff0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72   does not.** wor
2b000 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b  k, then fallback
2b010 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70 68   to named semaph
2b020 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ore locking..*/.
2b030 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2b040 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b050 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72  *vxworksIoFinder
2b060 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
2b070 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
2b080 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
2b090 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2b0a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2b0b0 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
2b0c0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
2b0d0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
2b0e0 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
2b0f0 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
2b100 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
2b110 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
2b120 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
2b130 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2b140 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
2b150 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
2b160 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2b170 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
2b180 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2b190 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
2b1a0 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
2b1b0 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
2b1c0 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
2b1d0 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
2b1e0 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
2b1f0 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
2b200 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
2b210 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
2b220 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
2b230 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
2b240 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
2b250 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
2b260 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
2b270 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
2b280 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
2b290 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
2b2a0 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
2b2b0 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
2b2c0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
2b2d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2b2e0 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
2b2f0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2b300 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2b310 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2b320 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f 46  const vxworksIoF
2b330 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
2b340 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
2b350 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49  vxworksIoFinderI
2b360 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
2b370 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f  OS_VXWORKS */../
2b380 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74  *.** An abstract
2b390 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e   type for a poin
2b3a0 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74  ter to an IO met
2b3b0 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
2b3c0 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
2b3d0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2b3e0 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
2b3f0 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
2b400 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
2b410 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
2b420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b460 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2b470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
2b480 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
2b490 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
2b4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2b4b0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
2b4c0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
2b4d0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2b4e0 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
2b4f0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
2b500 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
2b510 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2b520 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2b530 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2b540 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
2b550 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
2b560 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
2b570 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
2b580 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
2b590 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
2b5a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2b5b0 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
2b5c0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
2b5d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
2b5e0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2b5f0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
2b600 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
2b610 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
2b620 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
2b630 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
2b640 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2b650 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
2b660 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
2b670 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74  ened */.  int ct
2b680 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
2b690 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
2b6a0 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c  e UNIXFILE_* val
2b6b0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ues */.){.  cons
2b6c0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2b6d0 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74  hods *pLockingSt
2b6e0 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
2b6f0 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
2b700 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
2b710 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2b720 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2b730 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a  pInode==NULL );.
2b740 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68  .  /* Usually th
2b750 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65  e path zFilename
2b760 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
2b770 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
2b780 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63  me. The.  ** exc
2b790 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f  eption is when o
2b7a0 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79  pening the proxy
2b7b0 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e   "conch" file in
2b7c0 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a   builds that.  *
2b7d0 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70  * include the sp
2b7e0 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b  ecial Apple lock
2b7f0 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f  ing styles..  */
2b800 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2b810 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2b820 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2b830 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28  _STYLE.  assert(
2b840 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
2b850 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27   zFilename[0]=='
2b860 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d  /' .    || pVfs-
2b870 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64  >pAppData==(void
2b880 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
2b890 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61  der );.#else.  a
2b8a0 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2b8b0 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
2b8c0 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64  [0]=='/' );.#end
2b8d0 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b  if..  /* No lock
2b8e0 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65  ing occurs in te
2b8f0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f  mporary files */
2b900 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
2b910 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c  name!=0 || (ctrl
2b920 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2b930 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a  _NOLOCK)!=0 );..
2b940 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
2b950 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
2b960 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  h, zFilename));.
2b970 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20    pNew->h = h;. 
2b980 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56   pNew->pVfs = pV
2b990 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74  fs;.  pNew->zPat
2b9a0 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2b9b0 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2b9c0 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73   = (u8)ctrlFlags
2b9d0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
2b9e0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70  _MMAP_SIZE>0.  p
2b9f0 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  New->mmapSizeMax
2ba00 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
2ba10 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23  Config.szMmap;.#
2ba20 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
2ba30 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2ba40 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ((ctrlFlags & UN
2ba50 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46  IXFILE_URI) ? zF
2ba60 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20  ilename : 0),.  
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c           "psow",
2ba90 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
2baa0 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
2bab0 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2bac0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2bad0 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  PSOW;.  }.  if( 
2bae0 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61  strcmp(pVfs->zNa
2baf0 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d  me,"unix-excl")=
2bb00 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 ){.    pNew->
2bb10 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2bb20 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a  XFILE_EXCL;.  }.
2bb30 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2bb40 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
2bb50 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
2bb60 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
2bb70 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
2bb80 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20  {.    ctrlFlags 
2bb90 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  |= UNIXFILE_NOLO
2bba0 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  CK;.    rc = SQL
2bbb0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
2bbc0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72  endif..  if( ctr
2bbd0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2bbe0 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  E_NOLOCK ){.    
2bbf0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
2bc00 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2bc10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2bc20 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28  LockingStyle = (
2bc30 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29  **(finder_type*)
2bc40 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28  pVfs->pAppData)(
2bc50 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29  zFilename, pNew)
2bc60 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
2bc70 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2bc80 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a  E.    /* Cache z
2bc90 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20  Filename in the 
2bca0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2bcb0 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b  (AFP and dotlock
2bcc0 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20   override) for. 
2bcd0 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20     ** proxyLock 
2bce0 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f  activation is po
2bcf0 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70  ssible (remote p
2bd00 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e  roxy is based on
2bd10 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a   db name).    **
2bd20 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69   zFilename remai
2bd30 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66  ns valid until f
2bd40 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ile is closed, t
2bd50 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20  o support */.   
2bd60 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2bd70 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a  ntext = (void*)z
2bd80 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66  Filename;.#endif
2bd90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63  .  }..  if( pLoc
2bda0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f  kingStyle == &po
2bdb0 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66  sixIoMethods.#if
2bdc0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2bdd0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2bde0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2bdf0 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69  LE.    || pLocki
2be00 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49  ngStyle == &nfsI
2be10 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a  oMethods.#endif.
2be20 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74    ){.    unixEnt
2be30 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
2be40 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
2be50 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
2be60 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
2be70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2be80 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  .      /* If an 
2be90 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2bea0 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  n findInodeInfo(
2beb0 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ), close the fil
2bec0 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20  e descriptor.   
2bed0 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
2bee0 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73  y, before releas
2bef0 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66  ing the mutex. f
2bf00 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d  indInodeInfo() m
2bf10 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
2bf20 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
2bf30 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
2bf40 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
2bf50 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
2bf60 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
2bf70 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
2bf80 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
2bf90 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
2bfa0 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
2bfb0 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
2bfc0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
2bfd0 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
2bfe0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2bff0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2c000 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2c010 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
2c020 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
2c030 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
2c040 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
2c050 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
2c060 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2c070 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
2c080 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2c090 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74  case, it is quit
2c0a0 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a  e safe to close.
2c0b0 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
2c0c0 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61  h - as it is gua
2c0d0 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20  ranteed that no 
2c0e0 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c  posix locks will
2c0f0 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20   be released.   
2c100 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73     ** by doing s
2c110 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o..      **.    
2c120 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f    ** If scenario
2c130 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20   (a) caused the 
2c140 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67  error then thing
2c150 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66  s are not so saf
2c160 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  e. The.      ** 
2c170 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74  implicit assumpt
2c180 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74  ion here is that
2c190 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c   if fstat() fail
2c1a0 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e  s, things are in
2c1b0 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62  .      ** such b
2c1c0 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72  ad shape that dr
2c1d0 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72  opping a lock or
2c1e0 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74   two doesn't mat
2c1f0 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20  ter much..      
2c200 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  */.      robust_
2c210 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2c220 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2c230 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
2c240 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2c250 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  ();.  }..#if SQL
2c260 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2c270 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
2c280 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
2c290 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2c2a0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49  ngStyle == &afpI
2c2b0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2c2c0 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75  /* AFP locking u
2c2d0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2c2e0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2c2f0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2c300 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
2c310 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
2c320 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b    */.    afpLock
2c330 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2c340 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  ;.    pNew->lock
2c350 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
2c360 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
2c370 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43  oc64( sizeof(*pC
2c380 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
2c390 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
2c3a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2c3b0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
2c3c0 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
2c3d0 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
2c3e0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
2c3f0 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
2c400 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
2c410 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
2c420 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
2c430 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
2c440 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
2c450 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
2c460 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
2c470 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
2c480 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2c490 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
2c4a0 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
2c4b0 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
2c4c0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2c4d0 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
2c4e0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2c4f0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2c500 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
2c510 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c530 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
2c540 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
2c550 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2c560 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2c570 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
2c580 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
2c590 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2c5a0 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
2c5b0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2c5c0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2c5d0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
2c5e0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
2c5f0 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
2c600 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2c610 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2c620 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
2c630 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
2c640 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
2c650 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
2c660 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
2c670 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
2c680 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73  ilename;.    ass
2c690 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
2c6a0 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  0 );.    nFilena
2c6b0 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
2c6c0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
2c6d0 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
2c6e0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
2c6f0 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e  _malloc64(nFilen
2c700 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c  ame);.    if( zL
2c710 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ockFile==0 ){.  
2c720 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c730 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2c740 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2c750 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61  snprintf(nFilena
2c760 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22  me, zLockFile, "
2c770 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  %s" DOTLOCK_SUFF
2c780 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  IX, zFilename);.
2c790 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
2c7a0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2c7b0 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a   zLockFile;.  }.
2c7c0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2c7d0 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2c7e0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d  ingStyle == &sem
2c7f0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2c800 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68   /* Named semaph
2c810 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ore locking uses
2c820 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2c830 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2c840 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64  .    ** included
2c850 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69   in the semLocki
2c860 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f  ngContext.    */
2c870 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
2c880 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
2c890 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2c8a0 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2c8b0 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d  e);.    if( (rc=
2c8c0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28  =SQLITE_OK) && (
2c8d0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2c8e0 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  em==NULL) ){.   
2c8f0 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d     char *zSemNam
2c900 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  e = pNew->pInode
2c910 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20  ->aSemName;.    
2c920 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73    int n;.      s
2c930 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2c940 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53  MAX_PATHNAME, zS
2c950 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d  emName, "/%s.sem
2c960 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c970 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2c980 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
2c990 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
2c9a0 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e   n=1; zSemName[n
2c9b0 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20  ]; n++ ).       
2c9c0 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d   if( zSemName[n]
2c9d0 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65  =='/' ) zSemName
2c9e0 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [n] = '_';.     
2c9f0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2ca00 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a  Sem = sem_open(z
2ca10 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54  SemName, O_CREAT
2ca20 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20  , 0666, 1);.    
2ca30 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f    if( pNew->pIno
2ca40 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f  de->pSem == SEM_
2ca50 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
2ca60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2ca70 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
2ca80 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2ca90 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
2caa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2cab0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2cac0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2cad0 0a 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  .  storeLastErrn
2cae0 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20  o(pNew, 0);.#if 
2caf0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
2cb00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cb10 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
2cb20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2cb30 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2cb40 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20  ;.    h = -1;.  
2cb50 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65    osUnlink(zFile
2cb60 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  name);.    pNew-
2cb70 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2cb80 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
2cb90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
2cba0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2cbb0 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
2cbc0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2cbd0 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2cbe0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
2cbf0 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
2cc00 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
2cc10 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
2cc20 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69  ;.    verifyDbFi
2cc30 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20  le(pNew);.  }.  
2cc40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2cc50 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2cc60 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
2cc70 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
2cc80 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
2cc90 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
2cca0 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
2ccb0 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
2ccc0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
2ccd0 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
2cce0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2ccf0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2cd00 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
2cd10 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
2cd20 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
2cd30 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c  .     0,.     0,
2cd40 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22  .     "/var/tmp"
2cd50 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70  ,.     "/usr/tmp
2cd60 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a  ",.     "/tmp",.
2cd70 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a       0        /*
2cd80 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72   List terminator
2cd90 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67   */.  };.  unsig
2cda0 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ned int i;.  str
2cdb0 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
2cdc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
2cdd0 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b   = 0;..  azDirs[
2cde0 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  0] = sqlite3_tem
2cdf0 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69  p_directory;.  i
2ce00 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20  f( !azDirs[1] ) 
2ce10 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
2ce20 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49  nv("SQLITE_TMPDI
2ce30 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69  R");.  if( !azDi
2ce40 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32  rs[2] ) azDirs[2
2ce50 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
2ce60 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  IR");.  for(i=0;
2ce70 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
2ce80 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
2ce90 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
2cea0 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20  [i++]){.    if( 
2ceb0 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zDir==0 ) contin
2cec0 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74  ue;.    if( osSt
2ced0 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29  at(zDir, &buf) )
2cee0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2cef0 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
2cf00 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
2cf10 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41  nue;.    if( osA
2cf20 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20  ccess(zDir, 07) 
2cf30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2cf40 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
2cf50 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zDir;.}../*.
2cf60 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
2cf70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
2cf80 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
2cf90 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
2cfa0 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
2cfb0 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
2cfc0 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
2cfd0 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
2cfe0 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
2cff0 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
2d000 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2d010 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
2d020 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2d030 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2d040 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
2d050 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
2d060 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
2d070 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
2d080 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
2d090 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
2d0a0 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
2d0b0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c   unsigned int i,
2d0c0 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
2d0d0 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74   *zDir;..  /* It
2d0e0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
2d0f0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
2d100 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
2d110 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
2d120 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
2d130 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
2d140 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
2d150 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
2d160 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
2d170 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
2d180 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
2d190 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2d1a0 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a  TE_IOERR );..  z
2d1b0 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69  Dir = unixTempFi
2d1c0 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a  leDir();.  if( z
2d1d0 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20  Dir==0 ) zDir = 
2d1e0 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ".";..  /* Check
2d1f0 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
2d200 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
2d210 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
2d220 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
2d230 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
2d240 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
2d250 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
2d260 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e  */.  if( (strlen
2d270 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28  (zDir) + strlen(
2d280 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
2d290 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e  _PREFIX) + 18) >
2d2a0 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
2d2b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d2c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
2d2d0 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
2d2e0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
2d2f0 31 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  18, zBuf, "%s/"S
2d300 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
2d310 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
2d320 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
2d330 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
2d340 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
2d350 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
2d360 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
2d370 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
2d380 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
2d390 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
2d3a0 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
2d3b0 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
2d3c0 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
2d3d0 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
2d3e0 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20  ;.    zBuf[j+1] 
2d3f0 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f  = 0;.  }while( o
2d400 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d  sAccess(zBuf,0)=
2d410 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
2d420 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
2d430 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2d440 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2d450 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2d460 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
2d470 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
2d480 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
2d490 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
2d4a0 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
2d4b0 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
2d4c0 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
2d4d0 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
2d4e0 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
2d4f0 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
2d500 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
2d510 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
2d520 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
2d530 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
2d540 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
2d550 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
2d560 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
2d570 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
2d580 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
2d590 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
2d5a0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
2d5b0 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
2d5c0 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
2d5d0 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
2d5e0 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
2d5f0 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
2d600 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
2d610 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
2d620 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
2d630 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
2d640 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2d650 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
2d660 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
2d670 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
2d680 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
2d690 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
2d6a0 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
2d6b0 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
2d6c0 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
2d6d0 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
2d6e0 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
2d6f0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
2d700 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
2d710 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
2d720 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
2d730 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
2d740 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
2d750 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
2d760 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
2d770 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
2d780 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
2d790 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
2d7a0 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
2d7b0 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
2d7c0 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
2d7d0 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
2d7e0 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
2d7f0 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
2d800 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2d810 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
2d820 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
2d830 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
2d840 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
2d850 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
2d860 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2d870 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
2d880 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
2d890 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2d8a0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
2d8b0 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
2d8c0 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
2d8d0 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
2d8e0 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
2d8f0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
2d900 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
2d910 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
2d920 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
2d930 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
2d940 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
2d950 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
2d960 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
2d970 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
2d980 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
2d990 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
2d9a0 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
2d9b0 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
2d9c0 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
2d9d0 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
2d9e0 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
2d9f0 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
2da00 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
2da10 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
2da20 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
2da30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2da40 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
2da50 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20  call */..  /* A 
2da60 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  stat() call may 
2da70 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73  fail for various
2da80 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69   reasons. If thi
2da90 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  s happens, it is
2daa0 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72  .  ** almost cer
2dab0 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65  tain that an ope
2dac0 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20  n() call on the 
2dad0 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61  same path will a
2dae0 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46  lso fail..  ** F
2daf0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
2db00 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2db10 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29  rs in the stat()
2db20 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69   call here, it i
2db30 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61  s.  ** ignored a
2db40 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  nd -1 is returne
2db50 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
2db60 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61  ll try to open a
2db70 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64   new file.  ** d
2db80 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
2db90 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c   same path, fail
2dba0 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  , and return an 
2dbb0 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
2dbc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20  .  **.  ** Even 
2dbd0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
2dbe0 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73  open() call does
2dbf0 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f   succeed, the co
2dc00 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20  nsequences of.  
2dc10 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67  ** not searching
2dc20 20 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20   for a reusable 
2dc30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2dc40 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a  are not dire.  *
2dc50 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61  /.  if( 0==osSta
2dc60 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29  t(zPath, &sStat)
2dc70 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64   ){.    unixInod
2dc80 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a  eInfo *pInode;..
2dc90 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2dca0 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ex();.    pInode
2dcb0 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
2dcc0 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
2dcd0 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  && (pInode->file
2dce0 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74  Id.dev!=sStat.st
2dcf0 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20  _dev.           
2dd00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e            || pIn
2dd10 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21  ode->fileId.ino!
2dd20 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29  =sStat.st_ino) )
2dd30 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20  {.       pInode 
2dd40 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
2dd50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2dd60 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55  Inode ){.      U
2dd70 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70  nixUnusedFd **pp
2dd80 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26  ;.      for(pp=&
2dd90 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
2dda0 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66   *pp && (*pp)->f
2ddb0 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d  lags!=flags; pp=
2ddc0 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
2ddd0 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  ;.      pUnused 
2dde0 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28  = *pp;.      if(
2ddf0 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
2de00 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65      *pp = pUnuse
2de10 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  d->pNext;.      
2de20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
2de30 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2de40 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69  }.#endif    /* i
2de50 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  f !OS_VXWORKS */
2de60 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65  .  return pUnuse
2de70 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  d;.}../*.** This
2de80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2de90 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  led by unixOpen(
2dea0 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  ) to determine t
2deb0 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69  he unix permissi
2dec0 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  ons.** to create
2ded0 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e   new files with.
2dee0 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
2def0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2df00 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
2df10 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73  ** and a value s
2df20 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73  uitable for pass
2df30 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64  ing as the third
2df40 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65   argument to ope
2df50 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74  n(2) is.** writt
2df60 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66  en to *pMode. If
2df70 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2df80 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
2df90 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
2dfa0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2dfb0 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64  e value of *pMod
2dfc0 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65  e is not modifie
2dfd0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74  d..**.** In most
2dfe0 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75   cases, this rou
2dff0 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65  tine sets *pMode
2e000 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c   to 0, which wil
2e010 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69  l become.** an i
2e020 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62  ndication to rob
2e030 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72  ust_open() to cr
2e040 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73  eate the file us
2e050 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45  ing.** SQLITE_DE
2e060 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2e070 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20  SSIONS adjusted 
2e080 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  by the umask..**
2e090 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65   But if the file
2e0a0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
2e0b0 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61   a WAL or regula
2e0c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
2e0d0 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  then .** this fu
2e0e0 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74  nction queries t
2e0f0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
2e100 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  or the permissio
2e110 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f  ns on the .** co
2e120 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
2e130 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65  base file and se
2e140 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69  ts *pMode to thi
2e150 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65  s value. Wheneve
2e160 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20  r .** possible, 
2e170 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  WAL and journal 
2e180 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
2e190 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
2e1a0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
2e1b0 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   as the associat
2e1c0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
2e1d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
2e1e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
2e1f0 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73  _NAMES option is
2e200 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
2e210 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66  he.** original f
2e220 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61  ilename is unava
2e230 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33  ilable.  But 8_3
2e240 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75  _NAMES is only u
2e250 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66  sed for.** FAT f
2e260 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70  ilesystems and p
2e270 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f  ermissions do no
2e280 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20  t matter there, 
2e290 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74  so just use.** t
2e2a0 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69  he default permi
2e2b0 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssions..*/.stati
2e2c0 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65  c int findCreate
2e2d0 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
2e2e0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2e2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2e300 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73  ath of file (pos
2e310 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65  sibly) being cre
2e320 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ated */.  int fl
2e330 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2e340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
2e350 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68  gs passed as 4th
2e360 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70   argument to xOp
2e370 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  en() */.  mode_t
2e380 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20   *pMode,        
2e390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2e3a0 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  : Permissions to
2e3b0 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20   open file with 
2e3c0 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64  */.  uid_t *pUid
2e3d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e3e0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64       /* OUT: uid
2e3f0 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66   to set on the f
2e400 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a  ile */.  gid_t *
2e410 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20  pGid            
2e420 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2e430 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   gid to set on t
2e440 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  he file */.){.  
2e450 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2e460 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2e470 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2e480 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a  /.  *pMode = 0;.
2e490 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a    *pUid = 0;.  *
2e4a0 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  pGid = 0;.  if( 
2e4b0 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
2e4c0 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
2e4d0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2e4e0 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  L) ){.    char z
2e4f0 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  Db[MAX_PATHNAME+
2e500 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  1];     /* Datab
2e510 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f  ase file path */
2e520 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20  .    int nDb;   
2e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e540 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e550 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a  valid bytes in z
2e560 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  Db */.    struct
2e570 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
2e580 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
2e590 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64  t of stat() on d
2e5a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2e5b0 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73  .    /* zPath is
2e5c0 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c   a path to a WAL
2e5d0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
2e5e0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
2e5f0 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20  block derives.  
2e600 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f    ** the path to
2e610 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
2e620 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
2e630 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62  om zPath. This b
2e640 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20  lock handles.   
2e650 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
2e660 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74  g naming convent
2e670 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ions:.    **.   
2e680 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2e690 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20  db>-journal".   
2e6a0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2e6b0 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20  db>-wal".    ** 
2e6c0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2e6d0 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a  journalNN".    *
2e6e0 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2e6f0 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a  >-walNN".    **.
2e700 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20      ** where NN 
2e710 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d  is a decimal num
2e720 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69  ber. The NN nami
2e730 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a  ng schemes are .
2e740 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
2e750 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65  he test_multiple
2e760 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20  x.c module..    
2e770 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c  */.    nDb = sql
2e780 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2e790 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66  th) - 1; .#ifdef
2e7a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
2e7b0 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69  _3_NAMES.    whi
2e7c0 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c  le( nDb>0 && sql
2e7d0 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74  ite3Isalnum(zPat
2e7e0 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b  h[nDb]) ) nDb--;
2e7f0 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20  .    if( nDb==0 
2e800 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  || zPath[nDb]!='
2e810 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  -' ) return SQLI
2e820 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20  TE_OK;.#else.   
2e830 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44   while( zPath[nD
2e840 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  b]!='-' ){.     
2e850 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29   assert( nDb>0 )
2e860 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e870 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27  zPath[nDb]!='\n'
2e880 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b   );.      nDb--;
2e890 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2e8a0 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50    memcpy(zDb, zP
2e8b0 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a  ath, nDb);.    z
2e8c0 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a  Db[nDb] = '\0';.
2e8d0 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  .    if( 0==osSt
2e8e0 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20  at(zDb, &sStat) 
2e8f0 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20  ){.      *pMode 
2e900 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20  = sStat.st_mode 
2e910 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70  & 0777;.      *p
2e920 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75  Uid = sStat.st_u
2e930 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20  id;.      *pGid 
2e940 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a  = sStat.st_gid;.
2e950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2e970 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
2e980 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
2e990 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2e9a0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b  DELETEONCLOSE ){
2e9b0 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36  .    *pMode = 06
2e9c0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
2e9d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
2e9e0 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74  en the file zPat
2e9f0 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f  h..** .** Previo
2ea00 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65  usly, the SQLite
2ea10 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74   OS layer used t
2ea20 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  hree functions i
2ea30 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a  n place of this.
2ea40 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ** one:.**.**   
2ea50 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
2ea60 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20  eadWrite();.**  
2ea70 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2ea80 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20  ReadOnly();.**  
2ea90 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2eaa0 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a  Exclusive();.**.
2eab0 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63  ** These calls c
2eac0 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
2ead0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
2eae0 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73  nations of flags
2eaf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64  :.**.**     Read
2eb00 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28  Write() ->     (
2eb10 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
2eb20 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f  TE).**     ReadO
2eb30 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52  nly()  ->     (R
2eb40 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20  EADONLY) .**    
2eb50 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2eb60 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c   -> (READWRITE |
2eb70 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53   CREATE | EXCLUS
2eb80 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  IVE).**.** The o
2eb90 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ld OpenExclusive
2eba0 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f  () accepted a bo
2ebb0 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d  olean argument -
2ebc0 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a   "delFlag". If.*
2ebd0 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65  * true, the file
2ebe0 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   was configured 
2ebf0 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  to be automatica
2ec00 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e  lly deleted when
2ec10 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e   the.** file han
2ec20 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61  dle closed. To a
2ec30 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20  chieve the same 
2ec40 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69  effect using thi
2ec50 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66  s new .** interf
2ec60 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c  ace, add the DEL
2ec70 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20  ETEONCLOSE flag 
2ec80 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
2ec90 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a  ed above for .**
2eca0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2ecb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ecc0 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69  unixOpen(.  sqli
2ecd0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2ece0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ecf0 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68  VFS for which th
2ed00 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20  is is the xOpen 
2ed10 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
2ed20 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2ed30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
2ed40 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  name of file to 
2ed50 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
2ed60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2ed70 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
2ed80 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2ed90 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  or to be filled 
2eda0 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  in */.  int flag
2edb0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2edc0 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c       /* Input fl
2edd0 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  ags to control t
2ede0 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20  he opening */.  
2edf0 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
2ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ee10 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74  Output flags ret
2ee20 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
2ee30 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  core */.){.  uni
2ee40 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78  xFile *p = (unix
2ee50 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
2ee60 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20  int fd = -1;    
2ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ee80 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2ee90 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70  r returned by op
2eea0 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  en() */.  int op
2eeb0 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  enFlags = 0;    
2eec0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2eed0 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65  s to pass to ope
2eee0 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  n() */.  int eTy
2eef0 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
2ef00 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
2ef10 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
2ef20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b  */.  int noLock;
2ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef40 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
2ef50 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  mit locking prim
2ef60 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itives */.  int 
2ef70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2ef80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2ef90 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f  nction Return Co
2efa0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c  de */.  int ctrl
2efb0 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
2efc0 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49         /* UNIXFI
2efd0 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20  LE_* flags */.. 
2efe0 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
2eff0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2f000 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
2f010 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
2f020 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
2f030 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2f040 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
2f050 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
2f060 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2f070 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
2f080 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
2f090 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
2f0a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f0b0 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
2f0c0 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
2f0d0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2f0e0 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66  _READWRITE);.#if
2f0f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2f100 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
2f110 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20  nt isAutoProxy  
2f120 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2f130 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
2f140 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
2f150 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2f160 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
2f170 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2f180 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
2f190 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a  fsInfo;.#endif..
2f1a0 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
2f1b0 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
2f1c0 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
2f1d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2f1e0 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
2f1f0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
2f200 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
2f210 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
2f220 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
2f230 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
2f240 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
2f250 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
2f260 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
2f270 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
2f280 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d  .  int syncDir =
2f290 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
2f2a0 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
2f2b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
2f2c0 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
2f2d0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f2e0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2f2f0 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
2f300 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
2f310 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  AL.  ));..  /* I
2f320 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
2f330 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
2f340 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
2f350 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
2f360 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
2f370 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
2f380 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
2f390 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
2f3a0 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
2f3b0 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
2f3c0 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20  _PATHNAME+2];.  
2f3d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2f3e0 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
2f3f0 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
2f400 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
2f410 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
2f420 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
2f430 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
2f440 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
2f450 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
2f460 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
2f470 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
2f480 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
2f490 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
2f4a0 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
2f4b0 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
2f4c0 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
2f4d0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
2f4e0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
2f4f0 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
2f500 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
2f510 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
2f520 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
2f530 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
2f540 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
2f550 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
2f560 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
2f570 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
2f580 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
2f590 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
2f5a0 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
2f5b0 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
2f5c0 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
2f5d0 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
2f5e0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
2f5f0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
2f600 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
2f610 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
2f620 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
2f630 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
2f640 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
2f650 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
2f660 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
2f670 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
2f680 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2f690 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2f6a0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2f6b0 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
2f6c0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2f6d0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2f6e0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2f6f0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
2f700 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2f710 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2f720 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2f730 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2f740 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
2f750 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
2f760 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
2f770 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
2f780 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
2f790 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
2f7a0 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
2f7b0 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
2f7c0 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
2f7d0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
2f7e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
2f7f0 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
2f800 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
2f810 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
2f820 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f830 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2f840 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f850 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
2f860 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
2f870 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f880 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
2f890 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f8a0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2f8b0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
2f8c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f8d0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
2f8e0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f8f0 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
2f900 2f 2a 20 44 65 74 65 63 74 20 61 20 70 69 64 20  /* Detect a pid 
2f910 63 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74  change and reset
2f920 20 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72   the PRNG.  Ther
2f930 65 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  e is a race cond
2f940 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20  ition.  ** here 
2f950 73 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72  such that two or
2f960 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c   more threads al
2f970 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  l trying to open
2f980 20 64 61 74 61 62 61 73 65 73 20 61 74 0a 20 20   databases at.  
2f990 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74  ** the same inst
2f9a0 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65  ant might all re
2f9b0 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42  set the PRNG.  B
2f9c0 75 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65  ut multiple rese
2f9d0 74 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d  ts.  ** are harm
2f9e0 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  less..  */.  if(
2f9f0 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d   randomnessPid!=
2fa00 6f 73 47 65 74 70 69 64 28 30 29 20 29 7b 0a 20  osGetpid(0) ){. 
2fa10 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64     randomnessPid
2fa20 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 0a   = osGetpid(0);.
2fa30 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
2fa40 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d  omness(0,0);.  }
2fa50 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ..  memset(p, 0,
2fa60 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
2fa70 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  ));..  if( eType
2fa80 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2fa90 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69  IN_DB ){.    Uni
2faa0 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2fab0 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  ed;.    pUnused 
2fac0 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
2fad0 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
2fae0 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
2faf0 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55  ){.      fd = pU
2fb00 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d  nused->fd;.    }
2fb10 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75  else{.      pUnu
2fb20 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
2fb30 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70  lloc64(sizeof(*p
2fb40 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20  Unused));.      
2fb50 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2fb60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2fb70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2fb80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
2fb90 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
2fba0 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74  sed;..    /* Dat
2fbb0 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20  abase filenames 
2fbc0 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  are double-zero 
2fbd0 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68  terminated if th
2fbe0 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a  ey are not.    *
2fbf0 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61  * URIs with para
2fc00 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  meters.  Hence, 
2fc10 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20  they can always 
2fc20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  be passed into. 
2fc30 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72     ** sqlite3_ur
2fc40 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a  i_parameter(). *
2fc50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 66  /.    assert( (f
2fc60 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2fc70 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65  EN_URI) || zName
2fc80 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31  [strlen(zName)+1
2fc90 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65  ]==0 );..  }else
2fca0 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20   if( !zName ){. 
2fcb0 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
2fcc0 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65  s NULL, the uppe
2fcd0 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65  r layer is reque
2fce0 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c  sting a temp fil
2fcf0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
2fd00 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 73 79  (isDelete && !sy
2fd10 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d  ncDir);.    rc =
2fd20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
2fd30 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c  (MAX_PATHNAME+2,
2fd40 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
2fd50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2fd60 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2fd70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2fd80 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  zName = zTmpname
2fd90 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
2fda0 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ted temporary fi
2fdb0 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61  lenames are alwa
2fdc0 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  ys double-zero t
2fdd0 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a  erminated.    **
2fde0 20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69   for use by sqli
2fdf0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
2fe00 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  r(). */.    asse
2fe10 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e  rt( zName[strlen
2fe20 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
2fe30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72  .  }..  /* Deter
2fe40 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f  mine the value o
2fe50 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  f the flags para
2fe60 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
2fe70 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20  POSIX function. 
2fe80 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73   ** open(). Thes
2fe90 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c  e must be calcul
2fea0 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65  ated even if ope
2feb0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2fec0 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20  d, as.  ** they 
2fed0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
2fee0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
2fef0 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65  e handle and use
2ff00 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27  d by the .  ** '
2ff10 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b  conch file' lock
2ff20 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61  ing functions la
2ff30 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66  ter on.  */.  if
2ff40 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
2ff50 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
2ff60 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
2ff70 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46  eadWrite ) openF
2ff80 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
2ff90 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
2ffa0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
2ffb0 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20   O_CREAT;.  if( 
2ffc0 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70  isExclusive ) op
2ffd0 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58  enFlags |= (O_EX
2ffe0 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
2fff0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28    openFlags |= (
30000 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
30010 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64  NARY);..  if( fd
30020 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74  <0 ){.    mode_t
30030 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
30040 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69          /* Permi
30050 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65  ssions to create
30060 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
30070 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20    uid_t uid;    
30080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30090 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68  /* Userid for th
300a0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69  e file */.    gi
300b0 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20  d_t gid;        
300c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
300d0 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66  roupid for the f
300e0 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ile */.    rc = 
300f0 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
30100 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  de(zName, flags,
30110 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64   &openMode, &uid
30120 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28  , &gid);.    if(
30130 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30140 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30150 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20  !p->pUnused );. 
30160 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
30170 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30180 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  WAL || eType==SQ
30190 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
301a0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20  OURNAL );.      
301b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
301c0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
301d0 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
301e0 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
301f0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
30200 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
30210 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
30220 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b  me, openFlags));
30230 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
30240 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26   errno!=EISDIR &
30250 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  & isReadWrite &&
30260 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
30270 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64  .      /* Failed
30280 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
30290 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  e for read/write
302a0 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61   access. Try rea
302b0 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  d-only. */.     
302c0 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
302d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
302e0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
302f0 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65  EATE);.      ope
30300 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44  nFlags &= ~(O_RD
30310 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20  WR|O_CREAT);.   
30320 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
30330 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
30340 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
30350 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
30360 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
30370 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20  = 1;.      fd = 
30380 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
30390 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
303a0 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  enMode);.    }. 
303b0 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
303c0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
303d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
303e0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
303f0 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  en", zName);.   
30400 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
30410 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ished;.    }..  
30420 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f    /* If this pro
30430 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  cess is running 
30440 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63  as root and if c
30450 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f  reating a new ro
30460 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f  llback.    ** jo
30470 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c  urnal or WAL fil
30480 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72  e, set the owner
30490 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72  ship of the jour
304a0 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65  nal or WAL to be
304b0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  .    ** the same
304c0 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
304d0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
304e0 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  /.    if( flags 
304f0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
30500 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
30510 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
30520 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 66        osFchown(f
30530 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20  d, uid, gid);.  
30540 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
30550 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ( fd>=0 );.  if(
30560 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
30570 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66    *pOutFlags = f
30580 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
30590 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20   p->pUnused ){. 
305a0 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66     p->pUnused->f
305b0 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70  d = fd;.    p->p
305c0 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20  Unused->flags = 
305d0 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
305e0 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
305f0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
30600 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a   zPath = zName;.
30610 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
30620 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45  LITE_UNLINK_AFTE
30630 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61  R_CLOSE).    zPa
30640 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  th = sqlite3_mpr
30650 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65  intf("%s", zName
30660 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
30670 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  ==0 ){.      rob
30680 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
30690 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
306a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
306b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65 6c  NOMEM;.    }.#el
306c0 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  se.    osUnlink(
306d0 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zName);.#endif. 
306e0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   }.#if SQLITE_EN
306f0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
30700 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70  LE.  else{.    p
30710 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
30720 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e  enFlags;.  }.#en
30730 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20  dif..  noLock = 
30740 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
30750 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a  EN_MAIN_DB;..  .
30760 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
30770 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
30780 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
30790 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61  STYLE.  if( fsta
307a0 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29  tfs(fd, &fsInfo)
307b0 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73 74   == -1 ){.    st
307c0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c 20  oreLastErrno(p, 
307d0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62 75  errno);.    robu
307e0 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
307f0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72  __LINE__);.    r
30800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30810 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20  RR_ACCESS;.  }. 
30820 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
30830 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66  p("msdos", fsInf
30840 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
30850 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78  5)) {.    ((unix
30860 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73  File*)pFile)->fs
30870 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
30880 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
30890 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d  ;.  }.  if (0 ==
308a0 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22   strncmp("exfat"
308b0 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  , fsInfo.f_fstyp
308c0 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20  ename, 5)) {.   
308d0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
308e0 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20  le)->fsFlags |= 
308f0 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
30900 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e  S_MSDOS;.  }.#en
30910 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70  dif..  /* Set up
30920 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 74 72   appropriate ctr
30930 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20  lFlags */.  if( 
30940 69 73 44 65 6c 65 74 65 20 29 20 20 20 20 20 20  isDelete )      
30950 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
30960 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
30970 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73  DELETE;.  if( is
30980 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20  Readonly )      
30990 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
309a0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44  s |= UNIXFILE_RD
309b0 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f  ONLY;.  if( noLo
309c0 63 6b 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ck )            
309d0 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
309e0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  |= UNIXFILE_NOLO
309f0 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44 69  CK;.  if( syncDi
30a00 72 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r )             
30a10 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
30a20 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
30a30 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  C;.  if( flags &
30a40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
30a50 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20   ) ctrlFlags |= 
30a60 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23  UNIXFILE_URI;..#
30a70 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
30a80 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
30a90 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
30aa0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20  _PROXY_LOCKING. 
30ab0 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31   isAutoProxy = 1
30ac0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69  ;.#endif.  if( i
30ad0 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a  sAutoProxy && (z
30ae0 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28  Path!=NULL) && (
30af0 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73  !noLock) && pVfs
30b00 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63  ->xOpen ){.    c
30b10 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20  har *envforce = 
30b20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46  getenv("SQLITE_F
30b30 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
30b40 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73  NG");.    int us
30b50 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20  eProxy = 0;..   
30b60 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45   /* SQLITE_FORCE
30b70 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d  _PROXY_LOCKING==
30b80 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c  1 means force al
30b90 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20  ways use proxy, 
30ba0 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20  0 means .    ** 
30bb0 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c  never use proxy,
30bc0 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20   NULL means use 
30bd0 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f  proxy for non-lo
30be0 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20  cal files only. 
30bf0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66   */.    if( envf
30c00 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  orce!=NULL ){.  
30c10 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61      useProxy = a
30c20 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b  toi(envforce)>0;
30c30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30c40 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66    useProxy = !(f
30c50 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e  sInfo.f_flags&MN
30c60 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a  T_LOCAL);.    }.
30c70 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79      if( useProxy
30c80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
30c90 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
30ca0 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a  fs, fd, pFile, z
30cb0 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29  Path, ctrlFlags)
30cc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
30cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30ce0 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
30cf0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
30d00 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
30d10 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20  e, ":auto:");.  
30d20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30d30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30d40 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78       /* Use unix
30d50 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75  Close to clean u
30d60 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  p the resources 
30d70 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55  added in fillInU
30d80 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20  nixFile .       
30d90 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20     ** and clear 
30da0 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72  all the structur
30db0 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20  e's references. 
30dc0 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a   Specifically, .
30dd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69            ** pFi
30de0 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c  le->pMethods wil
30df0 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c  l be NULL so sql
30e00 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c  ite3OsClose will
30e10 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20   be a no-op .   
30e20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30e30 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46      unixClose(pF
30e40 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
30e50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30e60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30e70 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
30e80 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ished;.    }.  }
30e90 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20  .#endif.  .  rc 
30ea0 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
30eb0 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
30ec0 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
30ed0 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73  gs);..open_finis
30ee0 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  hed:.  if( rc!=S
30ef0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30f00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
30f10 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20  pUnused);.  }.  
30f20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
30f30 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
30f40 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49  file at zPath. I
30f50 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72  f the dirSync ar
30f60 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
30f70 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64  fsync().** the d
30f80 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64  irectory after d
30f90 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
30fa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30fb0 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71  unixDelete(.  sq
30fc0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
30fd0 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63  ed,     /* VFS c
30fe0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61  ontaining this a
30ff0 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65  s the xDelete me
31000 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
31010 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
31020 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
31030 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
31040 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79  d */.  int dirSy
31050 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
31060 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79   /* If true, fsy
31070 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61  nc() directory a
31080 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69  fter deleting fi
31090 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
310a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
310b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
310c0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
310d0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
310e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
310f0 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28  R_DELETE);.  if(
31100 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29   osUnlink(zPath)
31110 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66  ==(-1) ){.    if
31120 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a  ( errno==ENOENT.
31130 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
31140 20 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65         || osAcce
31150 73 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23  ss(zPath,0)!=0.#
31160 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20  endif.    ){.   
31170 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
31180 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
31190 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
311a0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
311b0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
311c0 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69  RR_DELETE, "unli
311d0 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  nk", zPath);.   
311e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
311f0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
31200 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
31210 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53  SYNC.  if( (dirS
31220 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20  ync & 1)!=0 ){. 
31230 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72     int fd;.    r
31240 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  c = osOpenDirect
31250 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b  ory(zPath, &fd);
31260 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
31270 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53  ITE_OK ){.#if OS
31280 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69  _VXWORKS.      i
31290 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31  f( fsync(fd)==-1
312a0 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69   ).#else.      i
312b0 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23  f( fsync(fd) ).#
312c0 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
312d0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
312e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
312f0 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20  OERR_DIR_FSYNC, 
31300 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b  "fsync", zPath);
31310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
31320 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66  obust_close(0, f
31330 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
31340 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
31350 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
31360 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
31370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
31380 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
31390 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
313a0 54 65 73 74 20 74 68 65 20 65 78 69 73 74 65 6e  Test the existen
313b0 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20  ce of or access 
313c0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66  permissions of f
313d0 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a  ile zPath. The.*
313e0 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64  * test performed
313f0 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
31400 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a  value of flags:.
31410 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
31420 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20  _ACCESS_EXISTS: 
31430 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
31440 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20  file exists.**  
31450 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
31460 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75  _READWRITE: Retu
31470 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
31480 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69   is read and wri
31490 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51  table..**     SQ
314a0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
314b0 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69  ONLY: Return 1 i
314c0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
314d0 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  adable..**.** Ot
314e0 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30  herwise return 0
314f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31500 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71  unixAccess(.  sq
31510 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
31520 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53  ed,   /* The VFS
31530 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
31540 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20   xAccess method 
31550 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
31560 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20  *zPath,      /* 
31570 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65  Path of the file
31580 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20   to examine */. 
31590 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
315a0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
315b0 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c   do we want to l
315c0 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a  earn about the z
315d0 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20  Path file? */.  
315e0 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20  int *pResOut    
315f0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
31600 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20   result boolean 
31610 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
31620 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e   amode = 0;.  UN
31630 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
31640 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c  otUsed);.  Simul
31650 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
31660 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
31670 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69  ACCESS; );.  swi
31680 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
31690 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
316a0 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
316b0 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b     amode = F_OK;
316c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
316d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
316e0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
316f0 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f        amode = W_
31700 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62  OK|R_OK;.      b
31710 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
31720 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
31730 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  D:.      amode =
31740 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   R_OK;.      bre
31750 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
31760 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
31770 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
31780 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
31790 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41   *pResOut = (osA
317a0 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f  ccess(zPath, amo
317b0 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66  de)==0);.  if( f
317c0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
317d0 45 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70  ESS_EXISTS && *p
317e0 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74  ResOut ){.    st
317f0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
31800 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74     if( 0==osStat
31810 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26 26  (zPath, &buf) &&
31820 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20   buf.st_size==0 
31830 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75  ){.      *pResOu
31840 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
31850 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
31860 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
31870 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
31880 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
31890 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68  ull pathname. Th
318a0 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a  e relative path.
318b0 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20  ** is stored as 
318c0 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
318d0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62   string in the b
318e0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
318f0 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a   by.** zPath. .*
31900 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73  *.** zOut points
31910 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
31920 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33  at least sqlite3
31930 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20  _vfs.mxPathname 
31940 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68  bytes .** (in th
31950 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54  is case, MAX_PAT
31960 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68  HNAME bytes). Th
31970 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77  e full-path is w
31980 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69  ritten to.** thi
31990 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  s buffer before 
319a0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
319b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c  atic int unixFul
319c0 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
319d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
319e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
319f0 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
31a00 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
31a10 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
31a20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
31a30 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75  ly relative inpu
31a40 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  t path */.  int 
31a50 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  nOut,           
31a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
31a70 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66  e of output buff
31a80 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
31a90 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20   char *zOut     
31aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31ab0 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
31ac0 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73  */.){..  /* It's
31ad0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
31ae0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
31af0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
31b00 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
31b10 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
31b20 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
31b30 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
31b40 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
31b50 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
31b60 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66   failing. This f
31b70 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61  unction could fa
31b80 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70  il if, for examp
31b90 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72  le, the.  ** cur
31ba0 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
31bb0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
31bc0 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20  unlinked..  */. 
31bd0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
31be0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
31bf0 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65  ERROR );..  asse
31c00 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  rt( pVfs->mxPath
31c10 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41  name==MAX_PATHNA
31c20 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ME );.  UNUSED_P
31c30 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
31c40 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20  .  zOut[nOut-1] 
31c50 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50  = '\0';.  if( zP
31c60 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ath[0]=='/' ){. 
31c70 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
31c80 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20  ntf(nOut, zOut, 
31c90 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  "%s", zPath);.  
31ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
31cb0 43 77 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47  Cwd;.    if( osG
31cc0 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74  etcwd(zOut, nOut
31cd0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
31ce0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
31cf0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
31d00 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77  PEN_BKPT, "getcw
31d10 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  d", zPath);.    
31d20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e  }.    nCwd = (in
31d30 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a  t)strlen(zOut);.
31d40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31d50 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20  intf(nOut-nCwd, 
31d60 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25  &zOut[nCwd], "/%
31d70 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  s", zPath);.  }.
31d80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31d90 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  OK;.}...#ifndef 
31da0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
31db0 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
31dc0 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
31dd0 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
31de0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
31df0 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
31e00 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
31e10 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
31e20 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
31e30 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
31e40 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e  #include <dlfcn.
31e50 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  h>.static void *
31e60 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74  unixDlOpen(sqlit
31e70 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
31e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
31e90 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45  lename){.  UNUSE
31ea0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
31eb0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  sed);.  return d
31ec0 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  lopen(zFilename,
31ed0 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44   RTLD_NOW | RTLD
31ee0 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  _GLOBAL);.}../*.
31ef0 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  ** SQLite calls 
31f00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d  this function im
31f10 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
31f20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c  a call to unixDl
31f30 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78  Sym() or.** unix
31f40 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28  DlOpen() fails (
31f50 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70  returns a null p
31f60 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f  ointer). If a mo
31f70 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f  re detailed erro
31f80 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20  r.** message is 
31f90 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73  available, it is
31fa0 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66   written to zBuf
31fb0 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  Out. If no error
31fc0 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61   message.** is a
31fd0 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75  vailable, zBufOu
31fe0 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  t is left unmodi
31ff0 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20  fied and SQLite 
32000 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a  uses a default.*
32010 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  * error message.
32020 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32030 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69  unixDlError(sqli
32040 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
32050 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
32060 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f   *zBufOut){.  co
32070 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
32080 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32090 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75  ER(NotUsed);.  u
320a0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
320b0 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f  .  zErr = dlerro
320c0 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  r();.  if( zErr 
320d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
320e0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
320f0 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72  ufOut, "%s", zEr
32100 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  r);.  }.  unixLe
32110 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74  aveMutex();.}.st
32120 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78  atic void (*unix
32130 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
32140 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
32150 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a   *p, const char*
32160 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
32170 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74  /* .  ** GCC wit
32180 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
32190 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30  rs says that C90
321a0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
321b0 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20  a void* to be.  
321c0 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70  ** cast into a p
321d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
321e0 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74  tion.  And yet t
321f0 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d  he library dlsym
32200 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  () routine.  ** 
32210 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20  returns a void* 
32220 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
32230 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
32240 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77  unction.  So how
32250 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20   do we.  ** use 
32260 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65  dlsym() with -pe
32270 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20  dantic-errors?. 
32280 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c   **.  ** Variabl
32290 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66  e x below is def
322a0 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69  ined to be a poi
322b0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
322c0 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70  on taking.  ** p
322d0 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20  arameters void* 
322e0 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  and const char* 
322f0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20  and returning a 
32300 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
32310 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69  ction..  ** We i
32320 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61  nitialize x by a
32330 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f  ssigning it a po
32340 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73  inter to the dls
32350 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  ym() function.. 
32360 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e   ** (That assign
32370 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20  ment requires a 
32380 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20  cast.)  Then we 
32390 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f  call the functio
323a0 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f  n that.  ** x po
323b0 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a  ints to.  .  **.
323c0 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61    ** This work-a
323d0 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c  round is unlikel
323e0 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63  y to work correc
323f0 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65  tly on any syste
32400 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75  m where.  ** you
32410 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63   really cannot c
32420 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ast a function p
32430 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64  ointer into void
32440 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e  *.  But then, on
32450 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
32460 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69  hand, dlsym() wi
32470 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73  ll not work on s
32480 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74  uch a system eit
32490 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a  her, so we have.
324a0 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20    ** not really 
324b0 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20  lost anything.. 
324c0 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78   */.  void (*(*x
324d0 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
324e0 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55  ar*))(void);.  U
324f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32500 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20  NotUsed);.  x = 
32510 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a  (void(*(*)(void*
32520 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
32530 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65  oid))dlsym;.  re
32540 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79  turn (*x)(p, zSy
32550 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  m);.}.static voi
32560 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71  d unixDlClose(sq
32570 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
32580 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  ed, void *pHandl
32590 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
325a0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
325b0 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64  .  dlclose(pHand
325c0 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
325d0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
325e0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
325f0 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
32600 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65  define unixDlOpe
32610 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  n  0.  #define u
32620 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  nixDlError 0.  #
32630 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d  define unixDlSym
32640 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75     0.  #define u
32650 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e  nixDlClose 0.#en
32660 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
32670 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
32680 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68  andom data to th
32690 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
326a0 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
326b0 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d  c int unixRandom
326c0 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
326d0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
326e0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
326f0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
32700 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32710 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29   assert((size_t)
32720 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69  nBuf>=(sizeof(ti
32730 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74  me_t)+sizeof(int
32740 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61  )));..  /* We ha
32750 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ve to initialize
32760 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74   zBuf to prevent
32770 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72   valgrind from r
32780 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72  eporting.  ** er
32790 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72  rors.  The repor
327a0 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c  ts issued by val
327b0 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72  grind are incorr
327c0 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20  ect - we would. 
327d0 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20   ** prefer that 
327e0 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62  the randomness b
327f0 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d  e increased by m
32800 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65  aking use of the
32810 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69  .  ** uninitiali
32820 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75  zed space in zBu
32830 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64  f - but valgrind
32840 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20   errors tend to 
32850 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20  worry.  ** some 
32860 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74  users.  Rather t
32870 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65  han argue, it se
32880 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20  ems easier just 
32890 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20  to initialize.  
328a0 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72  ** the whole arr
328b0 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76  ay and silence v
328c0 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66  algrind, even if
328d0 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73   that means less
328e0 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a   randomness.  **
328f0 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73   in the random s
32900 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  eed..  **.  ** W
32910 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69  hen testing, ini
32920 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d  tializing zBuf[]
32930 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20   to zero is all 
32940 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61  we do.  That mea
32950 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20  ns.  ** that we 
32960 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73  always use the s
32970 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  ame random numbe
32980 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69  r sequence.  Thi
32990 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a  s makes the.  **
329a0 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c   tests repeatabl
329b0 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  e..  */.  memset
329c0 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
329d0 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  .  randomnessPid
329e0 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 20   = osGetpid(0); 
329f0 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
32a00 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
32a10 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b      int fd, got;
32a20 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
32a30 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
32a40 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
32a50 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
32a60 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
32a70 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
32a80 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
32a90 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
32aa0 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  f(t));.      mem
32ab0 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
32ac0 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73  (t)], &randomnes
32ad0 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e  sPid, sizeof(ran
32ae0 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20  domnessPid));.  
32af0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
32b00 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e  of(t)+sizeof(ran
32b10 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69  domnessPid)<=(si
32b20 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
32b30 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
32b40 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e  (t) + sizeof(ran
32b50 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20  domnessPid);.   
32b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
32b70 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66  { got = osRead(f
32b80 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
32b90 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
32ba0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
32bb0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
32bc0 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
32bd0 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
32be0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
32bf0 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
32c00 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
32c10 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
32c20 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
32c30 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
32c40 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
32c50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
32c60 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
32c70 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
32c80 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
32c90 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
32ca0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
32cb0 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
32cc0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
32cd0 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
32ce0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
32cf0 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
32d00 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
32d10 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
32d20 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
32d30 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
32d40 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
32d50 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
32d60 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
32d70 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
32d80 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
32d90 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
32da0 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
32db0 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
32dc0 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
32dd0 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
32de0 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
32df0 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
32e00 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
32e10 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
32e20 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
32e30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32e40 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
32e50 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
32e60 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
32e70 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
32e80 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
32e90 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
32ea0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
32eb0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32ec0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
32ed0 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
32ee0 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
32ef0 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
32f00 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
32f10 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
32f20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32f30 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
32f40 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
32f50 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
32f60 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
32f70 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
32f80 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
32f90 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
32fa0 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
32fb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
32fc0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
32fd0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
32fe0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
32ff0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
33000 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
33010 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
33020 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
33030 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
33040 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
33050 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
33060 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
33070 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
33080 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
33090 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
330a0 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
330b0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
330c0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
330d0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
330e0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
330f0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
33100 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
33110 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
33120 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
33130 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
33140 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
33150 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
33160 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
33170 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
33180 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
33190 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
331a0 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
331b0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
331c0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
331d0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
331e0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
331f0 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
33200 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
33210 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
33220 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
33230 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
33240 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
33250 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
33260 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33270 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
33280 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
33290 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
332a0 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
332b0 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
332c0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
332d0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
332e0 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66  LITE_OK;.#if def
332f0 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
33300 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
33310 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
33320 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
33330 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
33340 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
33350 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
33360 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
33370 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
33380 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
33390 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
333a0 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
333b0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
333c0 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
333d0 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
333e0 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
333f0 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
33400 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69  Now;.  if( getti
33410 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
33420 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e  )==0 ){.    *piN
33430 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
33440 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
33450 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
33460 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
33470 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  1000;.  }else{. 
33480 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
33490 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RROR;.  }.#endif
334a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
334b0 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
334c0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
334d0 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
334e0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
334f0 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
33500 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
33510 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
33520 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33530 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33540 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33550 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
33560 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
33570 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
33580 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
33590 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
335a0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
335b0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
335c0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
335d0 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
335e0 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
335f0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
33600 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
33610 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
33620 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
33630 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
33640 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70  tUsed, double *p
33650 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33  rNow){.  sqlite3
33660 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20  _int64 i = 0;.  
33670 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44  int rc;.  UNUSED
33680 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
33690 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78  ed);.  rc = unix
336a0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
336b0 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f  (0, &i);.  *prNo
336c0 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
336d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
336e0 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64  ../*.** We added
336f0 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   the xGetLastErr
33700 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68  or() method with
33710 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f   the intention o
33720 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62  f providing.** b
33730 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20  etter low-level 
33740 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77  error messages w
33750 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79  hen operating-sy
33760 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f  stem problems co
33770 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20  me up.** during 
33780 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e  SQLite operation
33790 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e  .  But so far, n
337a0 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20  one of that has 
337b0 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  been implemented
337c0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  .** in the core.
337d0 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
337e0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
337f0 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20  d.  For now, it 
33800 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70  is merely.** a p
33810 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a  lace-holder..*/.
33820 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
33830 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
33840 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33850 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
33860 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
33870 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33880 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33890 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
338a0 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
338b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
338c0 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
338d0 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a  rn 0;.}.../*.***
338e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
338f0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c  ***** End of sql
33900 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
33910 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
33920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
33930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
33980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
339d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339e0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50  ******** Begin P
339f0 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  roxy Locking ***
33a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
33a20 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
33a30 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63  g is a "uber-loc
33a40 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20  king-method" in 
33a50 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20  this sense:  It 
33a60 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65  uses the.** othe
33a70 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  r locking method
33a80 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c  s on secondary l
33a90 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78  ock files.  Prox
33aa0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a  y locking is a.*
33ab0 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65  * meta-layer ove
33ac0 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69  r top of the pri
33ad0 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69  mitive locking i
33ae0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65  mplemented above
33af0 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72  .  For.** this r
33b00 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
33b10 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
33b20 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  nts of proxy loc
33b30 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
33b40 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69  .** until late i
33b50 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65  n the file (here
33b60 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  ) after all of t
33b70 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74  he other I/O met
33b80 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  hods have.** bee
33b90 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74  n defined - so t
33ba0 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
33bb0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
33bc0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a  s are available.
33bd0 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74  ** as services t
33be0 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20  o help with the 
33bf0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
33c00 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  f proxy locking.
33c10 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  .**.****.**.** T
33c20 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
33c30 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51  ng schemes in SQ
33c40 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61  Lite use byte-ra
33c50 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  nge locks on the
33c60 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
33c70 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  e to coordinate 
33c80 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  safe, concurrent
33c90 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
33ca0 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61  ple readers.** a
33cb0 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70  nd writers [http
33cc0 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f  ://sqlite.org/lo
33cd0 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20  ckingv3.html].  
33ce0 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f  The five file lo
33cf0 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20  cking.** states 
33d00 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49  (UNLOCKED, PENDI
33d10 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  NG, SHARED, RESE
33d20 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29  RVED, EXCLUSIVE)
33d30 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
33d40 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61  .** as POSIX rea
33d50 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  d & write locks 
33d60 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f  over fixed set o
33d70 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61  f locations (via
33d80 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41   fsctl),.** on A
33d90 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20  FP and SMB only 
33da0 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
33db0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61  ange locks are a
33dc0 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63  vailable via fsc
33dd0 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52  tl.** with _IOWR
33de0 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
33df0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
33e00 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  2) to track the 
33e10 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a  same 5 states..*
33e20 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  * To simulate a 
33e30 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73  F_RDLCK on the s
33e40 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20  hared range, on 
33e50 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73  AFP a randomly s
33e60 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65  elected.** addre
33e70 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  ss in the shared
33e80 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
33e90 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63  for a SHARED loc
33ea0 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  k, the entire.**
33eb0 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
33ec0 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58   taken for an EX
33ed0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a  CLUSIVE lock):.*
33ee0 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e  *.**      PENDIN
33ef0 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78  G_BYTE        0x
33f00 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20  40000000.**     
33f10 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
33f20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
33f30 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
33f40 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
33f50 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
33f60 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
33f70 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
33f80 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
33f90 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
33fa0 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
33fb0 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
33fc0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
33fd0 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
33fe0 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
33ff0 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
34000 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
34010 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
34020 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
34030 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
34040 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
34050 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
34060 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
34070 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
34080 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
34090 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
340a0 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
340b0 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
340c0 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
340d0 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
340e0 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
340f0 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
34100 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
34110 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
34120 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
34130 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
34140 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
34150 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
34160 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
34170 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
34180 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
34190 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
341a0 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
341b0 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
341c0 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
341d0 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
341e0 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
341f0 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
34200 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
34210 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
34220 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
34230 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
34240 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
34250 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
34260 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
34270 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
34280 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
34290 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
342a0 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
342b0 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
342c0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
342d0 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
342e0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
342f0 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
34300 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
34310 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
34320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
34330 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
34340 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
34350 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
34360 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
34370 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
34380 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  E,.**           
34390 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f              <pro
343a0 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74  xy_path> | ":aut
343b0 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65  o:");.**  sqlite
343c0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
343d0 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
343e0 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b  E_FCNTL_GET_LOCK
343f0 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
34400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34410 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61 74 68      &<proxy_path
34420 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c  >);.**.**.** SQL
34430 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20   pragmas.**.**  
34440 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
34450 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
34460 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c  e=<proxy_path> |
34470 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47   :auto:.**  PRAG
34480 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
34490 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a  ck_proxy_file.**
344a0 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22  .** Specifying "
344b0 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68  :auto:" means th
344c0 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61  at if there is a
344d0 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68   conch file with
344e0 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68   a matching.** h
344f0 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68  ost ID in it, th
34500 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20  e proxy path in 
34510 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
34520 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68  ill be used, oth
34530 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78  erwise.** a prox
34540 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20  y path based on 
34550 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20  the user's temp 
34560 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66  dir.** (via conf
34570 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
34580 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e  SER_TEMP_DIR,...
34590 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  )) will be used 
345a0 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61  and the.** actua
345b0 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d  l proxy file nam
345c0 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
345d0 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64  rom the name and
345e0 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20   path of the.** 
345f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
34600 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
34610 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61 74  **       For dat
34620 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73 65  abase path "/Use
34630 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a  rs/me/foo.db" .*
34640 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b  *       The lock
34650 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c   path will be "<
34660 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c  tmpdir>/sqlitepl
34670 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66  ocks/_Users_me_f
34680 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a  oo.db:auto:").**
34690 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20  .** Once a lock 
346a0 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75  proxy is configu
346b0 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61  red for a databa
346c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69  se connection, i
346d0 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20  t can not.** be 
346e0 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72  removed, however
346f0 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74 63   it may be switc
34700 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  hed to a differe
34710 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76 69  nt proxy path vi
34720 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41  a.** the above A
34730 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  PIs (assuming th
34740 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20  e conch file is 
34750 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62  not being held b
34760 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e  y another.** con
34770 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65  nection or proce
34780 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48  ss). .**.**.** H
34790 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ow proxy locking
347a0 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   works.** ------
347b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
347c0 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69  -.**.** Proxy fi
347d0 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65  le locking relie
347e0 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74  s primarily on t
347f0 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e  wo new supportin
34800 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20  g files: .**.** 
34810 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20    *  conch file 
34820 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20  to limit access 
34830 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
34840 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65  file to a single
34850 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74   host.**      at
34860 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20   a time.**.**   
34870 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f  *  proxy file to
34880 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79 20   act as a proxy 
34890 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72 79  for the advisory
348a0 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a   locks normally.
348b0 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e  **      taken on
348c0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
348d0 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  .** The conch fi
348e0 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72  le - to use a pr
348f0 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65  oxy file, sqlite
34900 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c   must first "hol
34910 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20  d the conch".** 
34920 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c  by taking an sql
34930 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64  ite-style shared
34940 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
34950 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67  ch file, reading
34960 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
34970 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74   and comparing t
34980 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65  he host's unique
34990 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65   host ID (see be
349a0 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a  low) and lock.**
349b0 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 69   proxy path agai
349c0 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 73  nst the values s
349d0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  tored in the con
349e0 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66  ch.  The conch f
349f0 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64  ile is.** stored
34a00 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
34a10 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64 61  ectory as the da
34a20 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
34a30 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a  the file name.**
34a40 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61 66   is patterned af
34a50 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ter the database
34a60 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e   file name as ".
34a70 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63  <databasename>-c
34a80 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65  onch"..** If the
34a90 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73   conch file does
34aa0 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69   not exist, or i
34ab0 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e  ts contents do n
34ac0 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20  ot match the.** 
34ad0 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70  host ID and/or p
34ae0 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20  roxy path, then 
34af0 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61  the lock is esca
34b00 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c  lated to an excl
34b10 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e  usive.** lock an
34b20 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  d the conch file
34b30 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64   contents is upd
34b40 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f  ated with the ho
34b50 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a  st ID and proxy.
34b60 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20  ** path and the 
34b70 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64  lock is downgrad
34b80 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ed to a shared l
34b90 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74  ock again.  If t
34ba0 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68  he conch.** is h
34bb0 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70  eld by another p
34bc0 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73  rocess (with a s
34bd0 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65  hared lock), the
34be0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
34bf0 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64  ** will fail and
34c00 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
34c10 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
34c20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d  The proxy file -
34c30 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66   a single-byte f
34c40 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c  ile used for all
34c50 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c   advisory file l
34c60 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79  ocks.** normally
34c70 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
34c80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54  tabase file.   T
34c90 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73  his allows for s
34ca0 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f  afe sharing.** o
34cb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
34cc0 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65  ile for multiple
34cd0 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69   readers and wri
34ce0 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ters on the same
34cf0 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f  .** host (the co
34d00 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74  nch ensures that
34d10 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68   they all use th
34d20 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63  e same local loc
34d30 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52  k file)..**.** R
34d40 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f  equesting the lo
34d50 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f  ck proxy does no
34d60 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61  t immediately ta
34d70 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74  ke the conch, it
34d80 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65   is.** only take
34d90 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  n when the first
34da0 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b   request to lock
34db0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
34dc0 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69  s made.  .** Thi
34dd0 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65  s matches the se
34de0 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74  mantics of the t
34df0 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69  raditional locki
34e00 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65  ng behavior, whe
34e10 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20  re.** opening a 
34e20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20  connection to a 
34e30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f  database file do
34e40 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f  es not take a lo
34e50 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65  ck on it..** The
34e60 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
34e70 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65   an open file de
34e80 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69  scriptor are mai
34e90 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a  ntained until .*
34ea0 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * the connection
34eb0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
34ec0 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a   is closed. .**.
34ed0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c  ** The proxy fil
34ee0 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66  e and the lock f
34ef0 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65  ile are never de
34f00 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e  leted so they on
34f10 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ly need.** to be
34f20 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72   created the fir
34f30 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65  st time they are
34f40 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   used..**.** Con
34f50 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
34f60 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ns.** ----------
34f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
34f80 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  *  SQLITE_PREFER
34f90 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a  _PROXY_LOCKING.*
34fa0 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62  *.**       Datab
34fb0 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73  ase files access
34fc0 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  ed on non-local 
34fd0 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65  file systems are
34fe0 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61  .**       automa
34ff0 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72  tically configur
35000 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ed for proxy loc
35010 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73  king, lock files
35020 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61   are.**       na
35030 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
35040 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  y using the same
35050 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20   logic as.**    
35060 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70     PRAGMA lock_p
35070 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f  roxy_file=":auto
35080 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51  :".**    .**  SQ
35090 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
350a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61  .**.**       Ena
350b0 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67  bles the logging
350c0 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67   of error messag
350d0 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69  es during host i
350e0 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  d file.**       
350f0 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72  retrieval and cr
35100 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f  eation.**.**  LO
35110 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a  CKPROXYDIR.**.**
35120 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73         Overrides
35130 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72   the default dir
35140 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20  ectory used for 
35150 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73  lock proxy files
35160 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61   that.**       a
35170 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74  re named automat
35180 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22  ically via the "
35190 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a  :auto:" setting.
351a0 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45  **.**  SQLITE_DE
351b0 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
351c0 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a  ERMISSIONS.**.**
351d0 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f         Permissio
351e0 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63  ns to use when c
351f0 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74  reating a direct
35200 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ory for storing 
35210 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63  the.**       loc
35220 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f  k proxy files, o
35230 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f  nly used when LO
35240 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f  CKPROXYDIR is no
35250 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a  t set..**    .**
35260 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69      .** As menti
35270 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e  oned above, when
35280 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
35290 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
352a0 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73  XY_LOCKING,.** s
352b0 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72  etting the envir
352c0 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
352d0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
352e0 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20  XY_LOCKING to 1 
352f0 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72  will.** force pr
35300 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62  oxy locking to b
35310 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79  e used for every
35320 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
35330 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20  pened, and 0.** 
35340 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d  will force autom
35350 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69  atic proxy locki
35360 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ng to be disable
35370 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  d for all databa
35380 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70  se.** files (exp
35390 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67 20  licitly calling 
353a0 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
353b0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
353c0 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
353d0 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
353e0 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
353f0 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
35400 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
35410 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
35420 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
35430 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
35440 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
35450 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
35460 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
35470 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
35480 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
35490 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
354a0 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
354b0 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
354c0 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
354d0 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
354e0 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
354f0 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
35500 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
35510 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
35520 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
35530 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
35540 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
35550 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
35560 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
35570 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
35580 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
35590 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
355a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
355b0 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
355c0 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
355d0 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
355e0 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
355f0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
35600 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
35610 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
35620 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
35630 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
35640 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
35650 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
35660 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
35670 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
35680 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
35690 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
356a0 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
356b0 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
356c0 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20 20    int nFails;   
356d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
356e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 63  * Number of conc
356f0 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75 72 65  h taking failure
35700 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
35710 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
35720 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
35730 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
35740 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
35750 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
35760 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
35770 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
35780 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
35790 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
357a0 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
357b0 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
357c0 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
357d0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
357e0 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
357f0 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
35800 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
35810 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
35820 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
35830 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
35840 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
35850 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
35860 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
35870 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
35880 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
35890 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
358a0 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
358b0 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
358c0 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
358d0 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
358e0 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
358f0 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
35900 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
35910 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
35920 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
35930 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
35940 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
35950 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
35960 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
35970 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
35980 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
35990 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
359a0 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
359b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
359c0 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
359d0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
359e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
359f0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
35a00 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73     }.    len = s
35a10 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73  trlcat(lPath, "s
35a20 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61  qliteplocks", ma
35a30 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23  xLen);    .  }.#
35a40 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74   else.  len = st
35a50 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74  rlcpy(lPath, "/t
35a60 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  mp/", maxLen);.#
35a70 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20   endif.#endif.. 
35a80 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31   if( lPath[len-1
35a90 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65  ]!='/' ){.    le
35aa0 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
35ab0 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  h, "/", maxLen);
35ac0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61  .  }.  .  /* tra
35ad0 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61  nsform the db pa
35ae0 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63  th to a unique c
35af0 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  ache name */.  d
35b00 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  bLen = (int)strl
35b10 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f  en(dbPath);.  fo
35b20 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20  r( i=0; i<dbLen 
35b30 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e  && (i+len+7)<(in
35b40 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  t)maxLen; i++){.
35b50 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
35b60 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
35b70 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
35b80 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
35b90 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
35ba0 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
35bb0 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
35bc0 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43  axLen);.  OSTRAC
35bd0 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
35be0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
35bf0 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
35c00 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28 30  Path, osGetpid(0
35c10 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )));.  return SQ
35c20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a  LITE_OK;.}../* .
35c30 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20   ** Creates the 
35c40 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e  lock file and an
35c50 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74  y missing direct
35c60 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74  ories in lockPat
35c70 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h. */.static int
35c80 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
35c90 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
35ca0 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e  *lockPath){.  in
35cb0 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72  t i, len;.  char
35cc0 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d   buf[MAXPATHLEN]
35cd0 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20  ;.  int start = 
35ce0 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c  0;.  .  assert(l
35cf0 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a  ockPath!=NULL);.
35d00 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61    /* try to crea
35d10 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72  te all the inter
35d20 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f 72  mediate director
35d30 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28  ies */.  len = (
35d40 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50  int)strlen(lockP
35d50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d  ath);.  buf[0] =
35d60 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20   lockPath[0];.  
35d70 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b  for( i=1; i<len;
35d80 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20   i++ ){.    if( 
35d90 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27  lockPath[i] == '
35da0 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61 72 74  /' && (i - start
35db0 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f   > 0) ){.      /
35dc0 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20  * only mkdir if 
35dd0 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20  leaf dir != "." 
35de0 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a  or "/" or ".." *
35df0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73 74  /.      if( i-st
35e00 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72  art>2 || (i-star
35e10 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72  t==1 && buf[star
35e20 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66  t] != '.' && buf
35e30 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20  [start] != '/') 
35e40 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d  .         || (i-
35e50 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b  start==2 && buf[
35e60 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
35e70 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d   buf[start+1] !=
35e80 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20   '.') ){.       
35e90 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20   buf[i]='\0';.  
35ea0 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b 64 69        if( osMkdi
35eb0 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45  r(buf, SQLITE_DE
35ec0 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
35ed0 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20  ERMISSIONS) ){. 
35ee0 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72           int err
35ef0 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  =errno;.        
35f00 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53    if( err!=EEXIS
35f10 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  T ) {.          
35f20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
35f30 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c  TELOCKPATH  FAIL
35f40 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20  ED creating %s, 
35f50 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
35f60 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72 6f         "'%s' pro
35f70 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
35f80 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
35f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fa0 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72  buf, strerror(er
35fb0 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f 73  r), lockPath, os
35fc0 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20  Getpid(0)));.   
35fd0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
35fe0 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  err;.          }
35ff0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36000 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69   }.      start=i
36010 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75  +1;.    }.    bu
36020 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[i] = lockPath[
36030 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  i];.  }.  OSTRAC
36040 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
36050 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
36060 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
36070 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f 73 47 65  , lockPath, osGe
36080 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74  tpid(0)));.  ret
36090 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
360a0 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
360b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
360c0 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
360d0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
360e0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
360f0 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
36100 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
36110 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
36120 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
36130 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
36140 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
36150 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
36160 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
36170 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
36180 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
36190 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
361a0 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
361b0 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
361c0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
361d0 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
361e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
361f0 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
36200 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
36210 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
36220 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
36230 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
36240 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
36250 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
36260 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
36270 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
36280 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
36290 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
362a0 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
362b0 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
362c0 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  1;.  unixFile *p
362d0 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
362e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
362f0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
36300 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
36310 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d   sqlite3_vfs dum
36320 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72  myVfs;.  int ter
36330 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  rno = 0;.  UnixU
36340 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
36350 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31   = NULL;..  /* 1
36360 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f  . first try to o
36370 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
36380 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74  ile.  ** 2. if t
36390 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74  hat fails, and t
363a0 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69  his is a lock fi
363b0 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20  le (not-conch), 
363c0 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  try creating.  *
363d0 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  * the parent dir
363e0 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65  ectories and the
363f0 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a  n try again..  *
36400 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 3. if that fai
36410 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ls, try to open 
36420 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e  the file read-on
36430 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73  ly.  ** otherwis
36440 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69  e return BUSY (i
36450 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20  f lock file) or 
36460 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65  CANTOPEN for the
36470 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f   conch file.  */
36480 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e  .  pUnused = fin
36490 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68  dReusableFd(path
364a0 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20  , openFlags);.  
364b0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
364c0 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
364d0 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >fd;.  }else{.  
364e0 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
364f0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a  te3_malloc64(siz
36500 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
36510 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
36520 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
36530 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
36540 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
36550 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20  d<0 ){.    fd = 
36560 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
36570 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  , openFlags, 0);
36580 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
36590 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  rno;.    if( fd<
365a0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45  0 && errno==ENOE
365b0 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65  NT && islockfile
365c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
365d0 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
365e0 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54  h(path) == SQLIT
365f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36600 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
36610 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
36620 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
36630 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64    }.  }.  if( fd
36640 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c  <0 ){.    openFl
36650 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  ags = O_RDONLY;.
36660 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
36670 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
36680 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65  lags, 0);.    te
36690 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
366a0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
366b0 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69      if( islockfi
366c0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  le ){.      retu
366d0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
366e0 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
366f0 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20   (terrno) {.    
36700 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20    case EACCES:. 
36710 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
36720 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
36730 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20   case EIO: .    
36740 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
36750 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a  E_IOERR_LOCK; /*
36760 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
36770 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a  is the conch */.
36780 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
36790 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
367a0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
367b0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
367c0 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  .  pNew = (unixF
367d0 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ile *)sqlite3_ma
367e0 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70  lloc64(sizeof(*p
367f0 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  New));.  if( pNe
36800 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72  w==NULL ){.    r
36810 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
36820 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63  ;.    goto end_c
36830 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d  reate_proxy;.  }
36840 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
36850 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
36860 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  le));.  pNew->op
36870 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
36880 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ags;.  memset(&d
36890 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65  ummyVfs, 0, size
368a0 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20  of(dummyVfs));. 
368b0 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61   dummyVfs.pAppDa
368c0 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74  ta = (void*)&aut
368d0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20  olockIoFinder;. 
368e0 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20   dummyVfs.zName 
368f0 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e  = "dummy";.  pUn
36900 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  used->fd = fd;. 
36910 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20   pUnused->flags 
36920 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70  = openFlags;.  p
36930 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  New->pUnused = p
36940 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20  Unused;.  .  rc 
36950 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
36960 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20  (&dummyVfs, fd, 
36970 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
36980 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20  New, path, 0);. 
36990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
369a0 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c  OK ){.    *ppFil
369b0 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65  e = pNew;.    re
369c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
369d0 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70    }.end_create_p
369e0 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75  roxy:    .  robu
369f0 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66  st_close(pNew, f
36a00 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
36a10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
36a20 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  w);.  sqlite3_fr
36a30 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72  ee(pUnused);.  r
36a40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
36a50 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
36a60 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
36a70 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
36a80 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
36a90 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
36aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68  */.int sqlite3_h
36ab0 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23  ostid_num = 0;.#
36ac0 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50  endif..#define P
36ad0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20  ROXY_HOSTIDLEN  
36ae0 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66    16  /* conch f
36af0 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67  ile host id leng
36b00 74 68 20 2a 2f 0a 0a 23 69 66 64 65 66 20 48 41  th */..#ifdef HA
36b10 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 0a 2f  VE_GETHOSTUUID./
36b20 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66  * Not always def
36b30 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ined in the head
36b40 65 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20  ers as it ought 
36b50 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20  to be */.extern 
36b60 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28  int gethostuuid(
36b70 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74  uuid_t id, const
36b80 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
36b90 20 2a 77 61 69 74 29 3b 0a 23 65 6e 64 69 66 0a   *wait);.#endif.
36ba0 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74  ./* get the host
36bb0 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75   ID via gethostu
36bc0 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d  uid(), pHostID m
36bd0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f  ust point to PRO
36be0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a  XY_HOSTIDLEN .**
36bf0 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62   bytes of writab
36c00 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  le memory..*/.st
36c10 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
36c20 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64  tHostID(unsigned
36c30 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20   char *pHostID, 
36c40 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20  int *pError){.  
36c50 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53  assert(PROXY_HOS
36c60 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66  TIDLEN == sizeof
36c70 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d  (uuid_t));.  mem
36c80 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20  set(pHostID, 0, 
36c90 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
36ca0 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 45  ;.#ifdef HAVE_GE
36cb0 54 48 4f 53 54 55 55 49 44 0a 20 20 7b 0a 20 20  THOSTUUID.  {.  
36cc0 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
36cd0 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20  c timeout = {1, 
36ce0 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d  0}; /* 1 sec tim
36cf0 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  eout */.    if( 
36d00 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73  gethostuuid(pHos
36d10 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29  tID, &timeout) )
36d20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20  {.      int err 
36d30 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
36d40 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
36d50 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65       *pError = e
36d60 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
36d70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36d80 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  IOERR;.    }.  }
36d90 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
36da0 50 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72  PARAMETER(pError
36db0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
36dc0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
36dd0 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
36de0 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
36df0 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
36e00 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
36e10 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
36e20 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29  hostid_num != 0)
36e30 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d  {.    pHostID[0]
36e40 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49   = (char)(pHostI
36e50 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71  D[0] + (char)(sq
36e60 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
36e70 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23   & 0xFF));.  }.#
36e80 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72  endif.  .  retur
36e90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
36ea0 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  /* The conch fil
36eb0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68  e contains the h
36ec0 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61  eader, host id a
36ed0 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
36ee0 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  h. */.#define PR
36ef0 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
36f00 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68   2   /* 1-byte h
36f10 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68  eader, 16-byte h
36f20 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a  ost id, path */.
36f30 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45  #define PROXY_HE
36f40 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f  ADERLEN    1   /
36f50 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61  * conch file hea
36f60 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64  der length */.#d
36f70 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48  efine PROXY_PATH
36f80 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f  INDEX    (PROXY_
36f90 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
36fa0 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69  HOSTIDLEN).#defi
36fb0 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  ne PROXY_MAXCONC
36fc0 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41  HLEN  (PROXY_HEA
36fd0 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
36fe0 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45  TIDLEN+MAXPATHLE
36ff0 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73  N)../* .** Takes
37000 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66   an open conch f
37010 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20  ile, copies the 
37020 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65  contents to a ne
37030 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20  w path and then 
37040 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63  moves .** it bac
37050 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72  k.  The newly cr
37060 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c  eated file's fil
37070 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
37080 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a  assigned to the.
37090 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74  ** conch file st
370a0 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61  ructure and fina
370b0 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  lly the original
370c0 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63   conch file desc
370d0 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c  riptor is .** cl
370e0 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a  osed.  Returns z
370f0 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75  ero if successfu
37100 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
37110 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68   proxyBreakConch
37120 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
37130 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
37140 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c  ostID){.  proxyL
37150 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
37160 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
37170 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
37180 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
37190 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
371a0 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
371b0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
371c0 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41  char tPath[MAXPA
371d0 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62  THLEN];.  char b
371e0 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
371f0 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63  HLEN];.  char *c
37200 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  Path = pCtx->con
37210 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69  chFilePath;.  si
37220 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30  ze_t readLen = 0
37230 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c  ;.  size_t pathL
37240 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65  en = 0;.  char e
37250 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a  rrmsg[64] = "";.
37260 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
37270 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20   int rc = -1;.  
37280 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
37290 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f  (myHostID);..  /
372a0 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  * create a new p
372b0 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74  ath by replace t
372c0 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f  he trailing '-co
372d0 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61  nch' with '-brea
372e0 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20  k' */.  pathLen 
372f0 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c  = strlcpy(tPath,
37300 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c   cPath, MAXPATHL
37310 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c  EN);.  if( pathL
37320 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c  en>MAXPATHLEN ||
37330 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20   pathLen<6 || . 
37340 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50      (strlcpy(&tP
37350 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20  ath[pathLen-5], 
37360 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35  "break", 6) != 5
37370 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
37380 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
37390 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
373a0 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e  "path error (len
373b0 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c   %d)",(int)pathL
373c0 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
373d0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
373e0 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63  .  /* read the c
373f0 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  onch content */.
37400 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72    readLen = osPr
37410 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
37420 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58  , buf, PROXY_MAX
37430 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
37440 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58  if( readLen<PROX
37450 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20  Y_PATHINDEX ){. 
37460 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
37470 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
37480 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20  g),errmsg,"read 
37490 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
374a0 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20  (int)readLen);. 
374b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
374c0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
374d0 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
374e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72  the temporary br
374f0 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64  eak file */.  fd
37500 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74   = robust_open(t
37510 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f  Path, (O_RDWR|O_
37520 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 30  CREAT|O_EXCL), 0
37530 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
37540 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
37550 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
37560 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63  msg), errmsg, "c
37570 72 65 61 74 65 20 66 61 69 6c 65 64 20 28 25 64  reate failed (%d
37580 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
37590 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
375a0 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  ck;.  }.  if( os
375b0 50 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20  Pwrite(fd, buf, 
375c0 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28  readLen, 0) != (
375d0 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20  ssize_t)readLen 
375e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
375f0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
37600 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
37610 22 77 72 69 74 65 20 66 61 69 6c 65 64 20 28 25  "write failed (%
37620 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
37630 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
37640 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ock;.  }.  if( r
37650 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61  ename(tPath, cPa
37660 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  th) ){.    sqlit
37670 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
37680 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
37690 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c  sg, "rename fail
376a0 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
376b0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
376c0 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
376d0 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74  rc = 0;.  fprint
376e0 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65  f(stderr, "broke
376f0 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25   stale lock on %
37700 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20  s\n", cPath);.  
37710 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
37720 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  le, conchFile->h
37730 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63  , __LINE__);.  c
37740 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64  onchFile->h = fd
37750 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f  ;.  conchFile->o
37760 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
37770 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e  R | O_CREAT;..en
37780 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69  d_breaklock:.  i
37790 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
377a0 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
377b0 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b  osUnlink(tPath);
377c0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
377d0 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f  ose(pFile, fd, _
377e0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
377f0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
37800 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62  rr, "failed to b
37810 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20  reak stale lock 
37820 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50  on %s, %s\n", cP
37830 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20  ath, errmsg);.  
37840 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
37850 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65  ../* Take the re
37860 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20  quested lock on 
37870 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61  the conch file a
37880 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65  nd break a stale
37890 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a   lock if the .**
378a0 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
378b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
378c0 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75  proxyConchLock(u
378d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
378e0 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c  uuid_t myHostID,
378f0 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a   int lockType){.
37900 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
37910 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
37920 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
37930 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
37940 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
37950 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
37960 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
37970 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
37980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
37990 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20  t nTries = 0;.  
379a0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
379b0 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20  conchModTime;.  
379c0 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68  .  memset(&conch
379d0 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65  ModTime, 0, size
379e0 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29  of(conchModTime)
379f0 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  );.  do {.    rc
37a00 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
37a10 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
37a20 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
37a30 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
37a40 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b  ;.    nTries ++;
37a50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
37a60 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
37a70 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b    /* If the lock
37a80 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a   failed (busy):.
37a90 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79         * 1st try
37aa0 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69  : get the mod ti
37ab0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c  me of the conch,
37ac0 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74   wait 0.5s and t
37ad0 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20  ry again. .     
37ae0 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69    * 2nd try: fai
37af0 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d  l if the mod tim
37b00 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73  e changed or hos
37b10 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e  t id is differen
37b20 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20  t, wait .       
37b30 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73  *           10 s
37b40 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ec and try again
37b50 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72  .       * 3rd tr
37b60 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  y: break the loc
37b70 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64  k unless the mod
37b80 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65   time has change
37b90 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d..       */.   
37ba0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
37bb0 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73  uf;.      if( os
37bc0 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d  Fstat(conchFile-
37bd0 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
37be0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
37bf0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
37c00 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
37c10 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
37c20 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
37c30 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
37c40 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ries==1 ){.     
37c50 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20     conchModTime 
37c60 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
37c70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65  ec;.        usle
37c80 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77  ep(500000); /* w
37c90 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20  ait 0.5 sec and 
37ca0 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
37cb0 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  in*/.        con
37cc0 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d  tinue;  .      }
37cd0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
37ce0 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20  nTries>1 );.    
37cf0 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69    if( conchModTi
37d00 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66  me.tv_sec != buf
37d10 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
37d20 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20  _sec || .       
37d30 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74    conchModTime.t
37d40 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74  v_nsec != buf.st
37d50 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73  _mtimespec.tv_ns
37d60 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ec ){.        re
37d70 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
37d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37d90 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65  .      if( nTrie
37da0 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20  s==2 ){  .      
37db0 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58    char tBuf[PROX
37dc0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
37dd0 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
37de0 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
37df0 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52  ile->h, tBuf, PR
37e00 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c  OXY_MAXCONCHLEN,
37e10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
37e20 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20   len<0 ){.      
37e30 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
37e40 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
37e50 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
37e60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
37e70 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LOCK;.        }.
37e80 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
37e90 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
37ea0 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61  && tBuf[0]==(cha
37eb0 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
37ec0 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20  SION){.         
37ed0 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
37ee0 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  the lock if the 
37ef0 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20  host id doesn't 
37f00 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
37f10 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70     if( 0!=memcmp
37f20 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41  (&tBuf[PROXY_HEA
37f30 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49  DERLEN], myHostI
37f40 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  D, PROXY_HOSTIDL
37f50 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EN) ){.         
37f60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37f70 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
37f80 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
37f90 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64  {.          /* d
37fa0 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c  on't break the l
37fb0 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61  ock on short rea
37fc0 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d  d or a version m
37fd0 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  ismatch */.     
37fe0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
37ff0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
38000 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65   }.        uslee
38010 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20  p(10000000); /* 
38020 77 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20  wait 10 sec and 
38030 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
38040 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  in */.        co
38050 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d  ntinue; .      }
38060 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73  .      .      as
38070 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20  sert( nTries==3 
38080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
38090 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
380a0 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
380b0 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tID) ){.        
380c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
380d0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b          if( lock
380e0 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Type==EXCLUSIVE_
380f0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
38100 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
38110 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
38120 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
38130 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45  conchFile, SHARE
38140 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
38150 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
38160 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
38170 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
38180 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
38190 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
381a0 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
381b0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
381c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
381d0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
381e0 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73  E_BUSY && nTries
381f0 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  <3 );.  .  retur
38200 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
38210 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
38220 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
38230 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
38240 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
38250 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
38260 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
38270 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
38280 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
38290 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
382a0 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
382b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
382c0 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
382d0 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
382e0 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
382f0 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
38300 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
38310 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
38320 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
38330 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
38340 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
38350 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
38360 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
38370 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
38380 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
38390 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
383a0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
383b0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
383c0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
383d0 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
383e0 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b  >conchHeld!=0 ){
383f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
38400 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
38410 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
38420 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
38430 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75  conchFile;.    u
38440 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a  uid_t myHostID;.
38450 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d      int pError =
38460 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61   0;.    char rea
38470 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  dBuf[PROXY_MAXCO
38480 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  NCHLEN];.    cha
38490 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41  r lockPath[MAXPA
384a0 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  THLEN];.    char
384b0 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d   *tempLockPath =
384c0 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
384d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
384e0 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e     int createCon
384f0 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
38500 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b  hostIdMatch = 0;
38510 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e  .    int readLen
38520 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72   = 0;.    int tr
38530 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
38540 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e  ;.    int forceN
38550 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ewLockPath = 0;.
38560 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45      .    OSTRACE
38570 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
38580 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
38590 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
385a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
385b0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
385c0 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
385d0 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut